@weppy/roblox-mcp 2.16.2 → 2.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +9 -1
- package/dashboard/dist/assets/AssetsPage-BRZSoLQp.css +1 -0
- package/dashboard/dist/assets/{AssetsPage-_CPMetwm.js → AssetsPage-ClzgrkC_.js} +9 -14
- package/dashboard/dist/assets/ChangelogPage-B1CY41my.css +1 -0
- package/dashboard/dist/assets/ChangelogPage-CRXXHovV.js +1 -0
- package/dashboard/dist/assets/ConfirmModal-Dz7mVKLZ.js +1 -0
- package/dashboard/dist/assets/ConnectionPage-B3fGIK2X.css +1 -0
- package/dashboard/dist/assets/ConnectionPage-CKKn3lt0.js +6 -0
- package/dashboard/dist/assets/ControlsPage-Ch6He2CV.js +1 -0
- package/dashboard/dist/assets/CurrentPlaceScope-COd50R0N.css +1 -0
- package/dashboard/dist/assets/CurrentPlaceScope-DhPCqaMU.js +1 -0
- package/dashboard/dist/assets/{GameChangeDetail-CCQ8h1ft.js → GameChangeDetail-CZuYgFvS.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-D6WxKFnG.js → InfoLabel-BGeOUBIl.js} +1 -1
- package/dashboard/dist/assets/OverviewPage-B-CtTLEP.js +1 -0
- package/dashboard/dist/assets/OverviewPage-CviBL36S.css +1 -0
- package/dashboard/dist/assets/PageHeader-CYbeZdtL.js +6 -0
- package/dashboard/dist/assets/PageHeader-ip0Enk1k.css +1 -0
- package/dashboard/dist/assets/PlaytestAiPromptExamples-DHVX0Ljy.css +1 -0
- package/dashboard/dist/assets/PlaytestAiPromptExamples-flhav1EU.js +1 -0
- package/dashboard/dist/assets/PlaytestPage-C092tN-C.js +127 -0
- package/dashboard/dist/assets/PlaytestPage-C3Vjgtlg.css +1 -0
- package/dashboard/dist/assets/SettingsPage-BO1WqaOl.css +1 -0
- package/dashboard/dist/assets/{SettingsPage-B_9NwPEF.js → SettingsPage-bEHQn_8W.js} +1 -1
- package/dashboard/dist/assets/{StatusBadge-Ddzg1cSk.js → StatusBadge-BmR5_DsF.js} +1 -1
- package/dashboard/dist/assets/SyncPage-BFz_XQ40.js +1 -0
- package/dashboard/dist/assets/SyncPage-BgbrC3SP.css +1 -0
- package/dashboard/dist/assets/Tabs-C7TenrZD.js +1 -0
- package/dashboard/dist/assets/Tabs-CPTkUoYi.css +1 -0
- package/dashboard/dist/assets/TierPromoPanel-C02VRkHz.js +1 -0
- package/dashboard/dist/assets/TierPromoPanel-Ch583WAw.css +1 -0
- package/dashboard/dist/assets/ToolsPage-ApMAWvg3.css +1 -0
- package/dashboard/dist/assets/ToolsPage-CJeoFakm.js +1 -0
- package/dashboard/dist/assets/{TooltipText-B1An7dUI.js → TooltipText-sb-BSgUg.js} +1 -1
- package/dashboard/dist/assets/{UiStudioPage-CWQgLMHO.js → UiStudioPage-C5dYQMax.js} +3 -3
- package/dashboard/dist/assets/UiStudioPage-CSK5gQMN.css +1 -0
- package/dashboard/dist/assets/WhatsNewPage-C_z4g3oa.js +1 -0
- package/dashboard/dist/assets/WhatsNewPage-WMbbAUsL.css +1 -0
- package/dashboard/dist/assets/bot-oMwejCZF.js +6 -0
- package/dashboard/dist/assets/check-EdHXSSef.js +6 -0
- package/dashboard/dist/assets/{copy-B03ftJiE.js → copy-CePVq0VI.js} +1 -1
- package/dashboard/dist/assets/index-DchewB5y.js +874 -0
- package/dashboard/dist/assets/index-VXvX8jPK.css +1 -0
- package/dashboard/dist/assets/sample-requests-BeoPIWbH.css +1 -0
- package/dashboard/dist/assets/{sample-requests-r6iFLFba.js → sample-requests-CQvn7a4-.js} +1 -1
- package/dashboard/dist/assets/trash-2-8V3SCC8q.js +6 -0
- package/dashboard/dist/assets/{useLiveUptime-CnfGQ_vS.js → useLiveUptime-BeZ9TLyF.js} +1 -1
- package/dashboard/dist/assets/useSettings-D5XHMODc.js +1 -0
- package/dashboard/dist/assets/useSettings-I6BaXsZq.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/index.js +218 -126
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/dashboard/dist/assets/AssetsPage-BVUpssWN.css +0 -1
- package/dashboard/dist/assets/ChangelogPage-B9Ct115r.css +0 -1
- package/dashboard/dist/assets/ChangelogPage-BpTjHwvr.js +0 -1
- package/dashboard/dist/assets/ConfirmModal-BSbhJt6x.js +0 -1
- package/dashboard/dist/assets/ConnectionPage-BMIbBueG.js +0 -11
- package/dashboard/dist/assets/ConnectionPage-Ca5WLCm3.css +0 -1
- package/dashboard/dist/assets/ContentScopedDialog-D92wgDaU.js +0 -1
- package/dashboard/dist/assets/ContentScopedDialog-DCgVfmeB.css +0 -1
- package/dashboard/dist/assets/ControlsPage-C828Cgwo.js +0 -6
- package/dashboard/dist/assets/CurrentPlaceScope-BFYSAg2T.js +0 -1
- package/dashboard/dist/assets/CurrentPlaceScope-D-0g0WrM.css +0 -1
- package/dashboard/dist/assets/OverviewPage-B8RMrIaQ.js +0 -1
- package/dashboard/dist/assets/OverviewPage-Dsfl-NRT.css +0 -1
- package/dashboard/dist/assets/PageHeader-CrhjZjgp.css +0 -1
- package/dashboard/dist/assets/PageHeader-Xrn6BpcL.js +0 -6
- package/dashboard/dist/assets/PlaytestPage-C-WO2SsY.css +0 -1
- package/dashboard/dist/assets/PlaytestPage-CrCurhRT.js +0 -11
- package/dashboard/dist/assets/SettingsPage-BR71s-WH.css +0 -1
- package/dashboard/dist/assets/SyncPage-BNadN0NU.js +0 -1
- package/dashboard/dist/assets/SyncPage-sHUpW30U.css +0 -1
- package/dashboard/dist/assets/Tabs-CIszXeoU.css +0 -1
- package/dashboard/dist/assets/Tabs-DZDOsT6_.js +0 -1
- package/dashboard/dist/assets/ToolsPage-B4t6LvfV.css +0 -1
- package/dashboard/dist/assets/ToolsPage-bHm2QbDR.js +0 -1
- package/dashboard/dist/assets/UiStudioPage-Ds-eaGvd.css +0 -1
- package/dashboard/dist/assets/WhatsNewPage-D-iibgAc.js +0 -1
- package/dashboard/dist/assets/WhatsNewPage-wF04BABp.css +0 -1
- package/dashboard/dist/assets/index-BDzb8NjS.css +0 -1
- package/dashboard/dist/assets/index-Ygt1Wh6v.js +0 -778
- package/dashboard/dist/assets/sample-requests-DmUwqmFE.css +0 -1
- package/dashboard/dist/assets/useSettings-BrnGUYZY.js +0 -1
- package/dashboard/dist/assets/useSettings-Ce19GEW2.css +0 -1
|
@@ -1,778 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-B8RMrIaQ.js","assets/InfoLabel-D6WxKFnG.js","assets/PageHeader-Xrn6BpcL.js","assets/PageHeader-CrhjZjgp.css","assets/StatusBadge-Ddzg1cSk.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-B1An7dUI.js","assets/GameChangeDetail-CCQ8h1ft.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-CnfGQ_vS.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-BMIbBueG.js","assets/ConfirmModal-BSbhJt6x.js","assets/ConfirmModal.module-DJksQHBd.js","assets/ConfirmModal-uqFW3py_.css","assets/copy-B03ftJiE.js","assets/ConnectionPage-Ca5WLCm3.css","assets/SyncPage-BNadN0NU.js","assets/CurrentPlaceScope-BFYSAg2T.js","assets/CurrentPlaceScope-D-0g0WrM.css","assets/SyncPage-sHUpW30U.css","assets/AssetsPage-_CPMetwm.js","assets/AssetsPage-BVUpssWN.css","assets/ChangelogPage-BpTjHwvr.js","assets/ContentScopedDialog-D92wgDaU.js","assets/ContentScopedDialog-DCgVfmeB.css","assets/Tabs-DZDOsT6_.js","assets/Tabs-CIszXeoU.css","assets/ChangelogPage-B9Ct115r.css","assets/PlaytestPage-CrCurhRT.js","assets/PlaytestPage-C-WO2SsY.css","assets/UiStudioPage-CWQgLMHO.js","assets/sample-requests-r6iFLFba.js","assets/sample-requests-DmUwqmFE.css","assets/UiStudioPage-Ds-eaGvd.css","assets/ToolsPage-bHm2QbDR.js","assets/ToolsPage-B4t6LvfV.css","assets/ControlsPage-C828Cgwo.js","assets/useSettings-BrnGUYZY.js","assets/useSettings-Ce19GEW2.css","assets/WhatsNewPage-D-iibgAc.js","assets/WhatsNewPage-wF04BABp.css","assets/SettingsPage-B_9NwPEF.js","assets/SettingsPage-BR71s-WH.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
var Lh=Object.defineProperty;var zh=(i,n,r)=>n in i?Lh(i,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[n]=r;var Ia=(i,n,r)=>zh(i,typeof n!="symbol"?n+"":n,r);function fp(i,n){for(var r=0;r<n.length;r++){const d=n[r];if(typeof d!="string"&&!Array.isArray(d)){for(const u in d)if(u!=="default"&&!(u in i)){const p=Object.getOwnPropertyDescriptor(d,u);p&&Object.defineProperty(i,u,p.get?p:{enumerable:!0,get:()=>d[u]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))d(u);new MutationObserver(u=>{for(const p of u)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&d(g)}).observe(document,{childList:!0,subtree:!0});function r(u){const p={};return u.integrity&&(p.integrity=u.integrity),u.referrerPolicy&&(p.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?p.credentials="include":u.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function d(u){if(u.ep)return;u.ep=!0;const p=r(u);fetch(u.href,p)}})();function Sp(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var kl={exports:{}},ts={},wl={exports:{}},xe={};/**
|
|
3
|
-
* @license React
|
|
4
|
-
* react.production.min.js
|
|
5
|
-
*
|
|
6
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
7
|
-
*
|
|
8
|
-
* This source code is licensed under the MIT license found in the
|
|
9
|
-
* LICENSE file in the root directory of this source tree.
|
|
10
|
-
*/var Ac;function Hh(){if(Ac)return xe;Ac=1;var i=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),k=Symbol.for("react.lazy"),b=Symbol.iterator;function D(C){return C===null||typeof C!="object"?null:(C=b&&C[b]||C["@@iterator"],typeof C=="function"?C:null)}var U={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B=Object.assign,z={};function N(C,L,ye){this.props=C,this.context=L,this.refs=z,this.updater=ye||U}N.prototype.isReactComponent={},N.prototype.setState=function(C,L){if(typeof C!="object"&&typeof C!="function"&&C!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,C,L,"setState")},N.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function le(){}le.prototype=N.prototype;function W(C,L,ye){this.props=C,this.context=L,this.refs=z,this.updater=ye||U}var ae=W.prototype=new le;ae.constructor=W,B(ae,N.prototype),ae.isPureReactComponent=!0;var Y=Array.isArray,pe=Object.prototype.hasOwnProperty,De={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function X(C,L,ye){var F,oe={},ue=null,Pe=null;if(L!=null)for(F in L.ref!==void 0&&(Pe=L.ref),L.key!==void 0&&(ue=""+L.key),L)pe.call(L,F)&&!E.hasOwnProperty(F)&&(oe[F]=L[F]);var Ae=arguments.length-2;if(Ae===1)oe.children=ye;else if(1<Ae){for(var Ue=Array(Ae),gt=0;gt<Ae;gt++)Ue[gt]=arguments[gt+2];oe.children=Ue}if(C&&C.defaultProps)for(F in Ae=C.defaultProps,Ae)oe[F]===void 0&&(oe[F]=Ae[F]);return{$$typeof:i,type:C,key:ue,ref:Pe,props:oe,_owner:De.current}}function Se(C,L){return{$$typeof:i,type:C.type,key:L,ref:C.ref,props:C.props,_owner:C._owner}}function ce(C){return typeof C=="object"&&C!==null&&C.$$typeof===i}function Te(C){var L={"=":"=0",":":"=2"};return"$"+C.replace(/[=:]/g,function(ye){return L[ye]})}var we=/\/+/g;function Ce(C,L){return typeof C=="object"&&C!==null&&C.key!=null?Te(""+C.key):L.toString(36)}function Me(C,L,ye,F,oe){var ue=typeof C;(ue==="undefined"||ue==="boolean")&&(C=null);var Pe=!1;if(C===null)Pe=!0;else switch(ue){case"string":case"number":Pe=!0;break;case"object":switch(C.$$typeof){case i:case n:Pe=!0}}if(Pe)return Pe=C,oe=oe(Pe),C=F===""?"."+Ce(Pe,0):F,Y(oe)?(ye="",C!=null&&(ye=C.replace(we,"$&/")+"/"),Me(oe,L,ye,"",function(gt){return gt})):oe!=null&&(ce(oe)&&(oe=Se(oe,ye+(!oe.key||Pe&&Pe.key===oe.key?"":(""+oe.key).replace(we,"$&/")+"/")+C)),L.push(oe)),1;if(Pe=0,F=F===""?".":F+":",Y(C))for(var Ae=0;Ae<C.length;Ae++){ue=C[Ae];var Ue=F+Ce(ue,Ae);Pe+=Me(ue,L,ye,Ue,oe)}else if(Ue=D(C),typeof Ue=="function")for(C=Ue.call(C),Ae=0;!(ue=C.next()).done;)ue=ue.value,Ue=F+Ce(ue,Ae++),Pe+=Me(ue,L,ye,Ue,oe);else if(ue==="object")throw L=String(C),Error("Objects are not valid as a React child (found: "+(L==="[object Object]"?"object with keys {"+Object.keys(C).join(", ")+"}":L)+"). If you meant to render a collection of children, use an array instead.");return Pe}function et(C,L,ye){if(C==null)return C;var F=[],oe=0;return Me(C,F,"","",function(ue){return L.call(ye,ue,oe++)}),F}function at(C){if(C._status===-1){var L=C._result;L=L(),L.then(function(ye){(C._status===0||C._status===-1)&&(C._status=1,C._result=ye)},function(ye){(C._status===0||C._status===-1)&&(C._status=2,C._result=ye)}),C._status===-1&&(C._status=0,C._result=L)}if(C._status===1)return C._result.default;throw C._result}var Oe={current:null},_={transition:null},de={ReactCurrentDispatcher:Oe,ReactCurrentBatchConfig:_,ReactCurrentOwner:De};function K(){throw Error("act(...) is not supported in production builds of React.")}return xe.Children={map:et,forEach:function(C,L,ye){et(C,function(){L.apply(this,arguments)},ye)},count:function(C){var L=0;return et(C,function(){L++}),L},toArray:function(C){return et(C,function(L){return L})||[]},only:function(C){if(!ce(C))throw Error("React.Children.only expected to receive a single React element child.");return C}},xe.Component=N,xe.Fragment=r,xe.Profiler=u,xe.PureComponent=W,xe.StrictMode=d,xe.Suspense=h,xe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=de,xe.act=K,xe.cloneElement=function(C,L,ye){if(C==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+C+".");var F=B({},C.props),oe=C.key,ue=C.ref,Pe=C._owner;if(L!=null){if(L.ref!==void 0&&(ue=L.ref,Pe=De.current),L.key!==void 0&&(oe=""+L.key),C.type&&C.type.defaultProps)var Ae=C.type.defaultProps;for(Ue in L)pe.call(L,Ue)&&!E.hasOwnProperty(Ue)&&(F[Ue]=L[Ue]===void 0&&Ae!==void 0?Ae[Ue]:L[Ue])}var Ue=arguments.length-2;if(Ue===1)F.children=ye;else if(1<Ue){Ae=Array(Ue);for(var gt=0;gt<Ue;gt++)Ae[gt]=arguments[gt+2];F.children=Ae}return{$$typeof:i,type:C.type,key:oe,ref:ue,props:F,_owner:Pe}},xe.createContext=function(C){return C={$$typeof:g,_currentValue:C,_currentValue2:C,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},C.Provider={$$typeof:p,_context:C},C.Consumer=C},xe.createElement=X,xe.createFactory=function(C){var L=X.bind(null,C);return L.type=C,L},xe.createRef=function(){return{current:null}},xe.forwardRef=function(C){return{$$typeof:y,render:C}},xe.isValidElement=ce,xe.lazy=function(C){return{$$typeof:k,_payload:{_status:-1,_result:C},_init:at}},xe.memo=function(C,L){return{$$typeof:v,type:C,compare:L===void 0?null:L}},xe.startTransition=function(C){var L=_.transition;_.transition={};try{C()}finally{_.transition=L}},xe.unstable_act=K,xe.useCallback=function(C,L){return Oe.current.useCallback(C,L)},xe.useContext=function(C){return Oe.current.useContext(C)},xe.useDebugValue=function(){},xe.useDeferredValue=function(C){return Oe.current.useDeferredValue(C)},xe.useEffect=function(C,L){return Oe.current.useEffect(C,L)},xe.useId=function(){return Oe.current.useId()},xe.useImperativeHandle=function(C,L,ye){return Oe.current.useImperativeHandle(C,L,ye)},xe.useInsertionEffect=function(C,L){return Oe.current.useInsertionEffect(C,L)},xe.useLayoutEffect=function(C,L){return Oe.current.useLayoutEffect(C,L)},xe.useMemo=function(C,L){return Oe.current.useMemo(C,L)},xe.useReducer=function(C,L,ye){return Oe.current.useReducer(C,L,ye)},xe.useRef=function(C){return Oe.current.useRef(C)},xe.useState=function(C){return Oe.current.useState(C)},xe.useSyncExternalStore=function(C,L,ye){return Oe.current.useSyncExternalStore(C,L,ye)},xe.useTransition=function(){return Oe.current.useTransition()},xe.version="18.3.1",xe}var xc;function Gl(){return xc||(xc=1,wl.exports=Hh()),wl.exports}/**
|
|
11
|
-
* @license React
|
|
12
|
-
* react-jsx-runtime.production.min.js
|
|
13
|
-
*
|
|
14
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
15
|
-
*
|
|
16
|
-
* This source code is licensed under the MIT license found in the
|
|
17
|
-
* LICENSE file in the root directory of this source tree.
|
|
18
|
-
*/var Rc;function Mh(){if(Rc)return ts;Rc=1;var i=Gl(),n=Symbol.for("react.element"),r=Symbol.for("react.fragment"),d=Object.prototype.hasOwnProperty,u=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function g(y,h,v){var k,b={},D=null,U=null;v!==void 0&&(D=""+v),h.key!==void 0&&(D=""+h.key),h.ref!==void 0&&(U=h.ref);for(k in h)d.call(h,k)&&!p.hasOwnProperty(k)&&(b[k]=h[k]);if(y&&y.defaultProps)for(k in h=y.defaultProps,h)b[k]===void 0&&(b[k]=h[k]);return{$$typeof:n,type:y,key:D,ref:U,props:b,_owner:u.current}}return ts.Fragment=r,ts.jsx=g,ts.jsxs=g,ts}var Ic;function Oh(){return Ic||(Ic=1,kl.exports=Mh()),kl.exports}var w=Oh(),Cn={},Cl={exports:{}},Dt={},Al={exports:{}},xl={};/**
|
|
19
|
-
* @license React
|
|
20
|
-
* scheduler.production.min.js
|
|
21
|
-
*
|
|
22
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
23
|
-
*
|
|
24
|
-
* This source code is licensed under the MIT license found in the
|
|
25
|
-
* LICENSE file in the root directory of this source tree.
|
|
26
|
-
*/var Dc;function Nh(){return Dc||(Dc=1,(function(i){function n(_,de){var K=_.length;_.push(de);e:for(;0<K;){var C=K-1>>>1,L=_[C];if(0<u(L,de))_[C]=de,_[K]=L,K=C;else break e}}function r(_){return _.length===0?null:_[0]}function d(_){if(_.length===0)return null;var de=_[0],K=_.pop();if(K!==de){_[0]=K;e:for(var C=0,L=_.length,ye=L>>>1;C<ye;){var F=2*(C+1)-1,oe=_[F],ue=F+1,Pe=_[ue];if(0>u(oe,K))ue<L&&0>u(Pe,oe)?(_[C]=Pe,_[ue]=K,C=ue):(_[C]=oe,_[F]=K,C=F);else if(ue<L&&0>u(Pe,K))_[C]=Pe,_[ue]=K,C=ue;else break e}}return de}function u(_,de){var K=_.sortIndex-de.sortIndex;return K!==0?K:_.id-de.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;i.unstable_now=function(){return p.now()}}else{var g=Date,y=g.now();i.unstable_now=function(){return g.now()-y}}var h=[],v=[],k=1,b=null,D=3,U=!1,B=!1,z=!1,N=typeof setTimeout=="function"?setTimeout:null,le=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function ae(_){for(var de=r(v);de!==null;){if(de.callback===null)d(v);else if(de.startTime<=_)d(v),de.sortIndex=de.expirationTime,n(h,de);else break;de=r(v)}}function Y(_){if(z=!1,ae(_),!B)if(r(h)!==null)B=!0,at(pe);else{var de=r(v);de!==null&&Oe(Y,de.startTime-_)}}function pe(_,de){B=!1,z&&(z=!1,le(X),X=-1),U=!0;var K=D;try{for(ae(de),b=r(h);b!==null&&(!(b.expirationTime>de)||_&&!Te());){var C=b.callback;if(typeof C=="function"){b.callback=null,D=b.priorityLevel;var L=C(b.expirationTime<=de);de=i.unstable_now(),typeof L=="function"?b.callback=L:b===r(h)&&d(h),ae(de)}else d(h);b=r(h)}if(b!==null)var ye=!0;else{var F=r(v);F!==null&&Oe(Y,F.startTime-de),ye=!1}return ye}finally{b=null,D=K,U=!1}}var De=!1,E=null,X=-1,Se=5,ce=-1;function Te(){return!(i.unstable_now()-ce<Se)}function we(){if(E!==null){var _=i.unstable_now();ce=_;var de=!0;try{de=E(!0,_)}finally{de?Ce():(De=!1,E=null)}}else De=!1}var Ce;if(typeof W=="function")Ce=function(){W(we)};else if(typeof MessageChannel<"u"){var Me=new MessageChannel,et=Me.port2;Me.port1.onmessage=we,Ce=function(){et.postMessage(null)}}else Ce=function(){N(we,0)};function at(_){E=_,De||(De=!0,Ce())}function Oe(_,de){X=N(function(){_(i.unstable_now())},de)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(_){_.callback=null},i.unstable_continueExecution=function(){B||U||(B=!0,at(pe))},i.unstable_forceFrameRate=function(_){0>_||125<_?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Se=0<_?Math.floor(1e3/_):5},i.unstable_getCurrentPriorityLevel=function(){return D},i.unstable_getFirstCallbackNode=function(){return r(h)},i.unstable_next=function(_){switch(D){case 1:case 2:case 3:var de=3;break;default:de=D}var K=D;D=de;try{return _()}finally{D=K}},i.unstable_pauseExecution=function(){},i.unstable_requestPaint=function(){},i.unstable_runWithPriority=function(_,de){switch(_){case 1:case 2:case 3:case 4:case 5:break;default:_=3}var K=D;D=_;try{return de()}finally{D=K}},i.unstable_scheduleCallback=function(_,de,K){var C=i.unstable_now();switch(typeof K=="object"&&K!==null?(K=K.delay,K=typeof K=="number"&&0<K?C+K:C):K=C,_){case 1:var L=-1;break;case 2:L=250;break;case 5:L=1073741823;break;case 4:L=1e4;break;default:L=5e3}return L=K+L,_={id:k++,callback:de,priorityLevel:_,startTime:K,expirationTime:L,sortIndex:-1},K>C?(_.sortIndex=K,n(v,_),r(h)===null&&_===r(v)&&(z?(le(X),X=-1):z=!0,Oe(Y,K-C))):(_.sortIndex=L,n(h,_),B||U||(B=!0,at(pe))),_},i.unstable_shouldYield=Te,i.unstable_wrapCallback=function(_){var de=D;return function(){var K=D;D=de;try{return _.apply(this,arguments)}finally{D=K}}}})(xl)),xl}var Ec;function _h(){return Ec||(Ec=1,Al.exports=Nh()),Al.exports}/**
|
|
27
|
-
* @license React
|
|
28
|
-
* react-dom.production.min.js
|
|
29
|
-
*
|
|
30
|
-
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
31
|
-
*
|
|
32
|
-
* This source code is licensed under the MIT license found in the
|
|
33
|
-
* LICENSE file in the root directory of this source tree.
|
|
34
|
-
*/var jc;function qh(){if(jc)return Dt;jc=1;var i=Gl(),n=_h();function r(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,a=1;a<arguments.length;a++)t+="&args[]="+encodeURIComponent(arguments[a]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var d=new Set,u={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(u[e]=t,e=0;e<t.length;e++)d.add(t[e])}var y=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h=Object.prototype.hasOwnProperty,v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,k={},b={};function D(e){return h.call(b,e)?!0:h.call(k,e)?!1:v.test(e)?b[e]=!0:(k[e]=!0,!1)}function U(e,t,a,o){if(a!==null&&a.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:a!==null?!a.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function B(e,t,a,o){if(t===null||typeof t>"u"||U(e,t,a,o))return!0;if(o)return!1;if(a!==null)switch(a.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function z(e,t,a,o,s,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=s,this.mustUseProperty=a,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new z(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new z(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new z(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new z(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new z(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new z(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new z(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new z(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new z(e,5,!1,e.toLowerCase(),null,!1,!1)});var le=/[\-:]([a-z])/g;function W(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(le,W);N[t]=new z(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(le,W);N[t]=new z(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(le,W);N[t]=new z(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new z("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!0,!0)});function ae(e,t,a,o){var s=N.hasOwnProperty(t)?N[t]:null;(s!==null?s.type!==0:o||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(B(t,a,s,o)&&(a=null),o||s===null?D(t)&&(a===null?e.removeAttribute(t):e.setAttribute(t,""+a)):s.mustUseProperty?e[s.propertyName]=a===null?s.type===3?!1:"":a:(t=s.attributeName,o=s.attributeNamespace,a===null?e.removeAttribute(t):(s=s.type,a=s===3||s===4&&a===!0?"":""+a,o?e.setAttributeNS(o,t,a):e.setAttribute(t,a))))}var Y=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,pe=Symbol.for("react.element"),De=Symbol.for("react.portal"),E=Symbol.for("react.fragment"),X=Symbol.for("react.strict_mode"),Se=Symbol.for("react.profiler"),ce=Symbol.for("react.provider"),Te=Symbol.for("react.context"),we=Symbol.for("react.forward_ref"),Ce=Symbol.for("react.suspense"),Me=Symbol.for("react.suspense_list"),et=Symbol.for("react.memo"),at=Symbol.for("react.lazy"),Oe=Symbol.for("react.offscreen"),_=Symbol.iterator;function de(e){return e===null||typeof e!="object"?null:(e=_&&e[_]||e["@@iterator"],typeof e=="function"?e:null)}var K=Object.assign,C;function L(e){if(C===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);C=t&&t[1]||""}return`
|
|
35
|
-
`+C+e}var ye=!1;function F(e,t){if(!e||ye)return"";ye=!0;var a=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(j){var o=j}Reflect.construct(e,[],t)}else{try{t.call()}catch(j){o=j}e.call(t.prototype)}else{try{throw Error()}catch(j){o=j}e()}}catch(j){if(j&&o&&typeof j.stack=="string"){for(var s=j.stack.split(`
|
|
36
|
-
`),l=o.stack.split(`
|
|
37
|
-
`),c=s.length-1,m=l.length-1;1<=c&&0<=m&&s[c]!==l[m];)m--;for(;1<=c&&0<=m;c--,m--)if(s[c]!==l[m]){if(c!==1||m!==1)do if(c--,m--,0>m||s[c]!==l[m]){var S=`
|
|
38
|
-
`+s[c].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=c&&0<=m);break}}}finally{ye=!1,Error.prepareStackTrace=a}return(e=e?e.displayName||e.name:"")?L(e):""}function oe(e){switch(e.tag){case 5:return L(e.type);case 16:return L("Lazy");case 13:return L("Suspense");case 19:return L("SuspenseList");case 0:case 2:case 15:return e=F(e.type,!1),e;case 11:return e=F(e.type.render,!1),e;case 1:return e=F(e.type,!0),e;default:return""}}function ue(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case E:return"Fragment";case De:return"Portal";case Se:return"Profiler";case X:return"StrictMode";case Ce:return"Suspense";case Me:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Te:return(e.displayName||"Context")+".Consumer";case ce:return(e._context.displayName||"Context")+".Provider";case we:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case et:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case at:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function Pe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ue(t);case 8:return t===X?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Ae(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ue(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gt(e){var t=Ue(e)?"checked":"value",a=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof a<"u"&&typeof a.get=="function"&&typeof a.set=="function"){var s=a.get,l=a.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(c){o=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:a.enumerable}),{getValue:function(){return o},setValue:function(c){o=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ya(e){e._valueTracker||(e._valueTracker=gt(e))}function dt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var a=t.getValue(),o="";return e&&(o=Ue(e)?e.checked?"true":"false":e.value),e=o,e!==a?(t.setValue(e),!0):!1}function Gt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Lo(e,t){var a=t.checked;return K({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:a??e._wrapperState.initialChecked})}function ps(e,t){var a=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;a=Ae(t.value!=null?t.value:a),e._wrapperState={initialChecked:o,initialValue:a,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function sa(e,t){t=t.checked,t!=null&&ae(e,"checked",t,!1)}function hi(e,t){sa(e,t);var a=Ae(t.value),o=t.type;if(a!=null)o==="number"?(a===0&&e.value===""||e.value!=a)&&(e.value=""+a):e.value!==""+a&&(e.value=""+a);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?zo(e,t.type,a):t.hasOwnProperty("defaultValue")&&zo(e,t.type,Ae(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function gs(e,t,a){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,a||t===e.value||(e.value=t),e.defaultValue=t}a=e.name,a!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,a!==""&&(e.name=a)}function zo(e,t,a){(t!=="number"||Gt(e.ownerDocument)!==e)&&(a==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+a&&(e.defaultValue=""+a))}var lo=Array.isArray;function La(e,t,a,o){if(e=e.options,t){t={};for(var s=0;s<a.length;s++)t["$"+a[s]]=!0;for(a=0;a<e.length;a++)s=t.hasOwnProperty("$"+e[a].value),e[a].selected!==s&&(e[a].selected=s),s&&o&&(e[a].defaultSelected=!0)}else{for(a=""+Ae(a),t=null,s=0;s<e.length;s++){if(e[s].value===a){e[s].selected=!0,o&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function mi(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(r(91));return K({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function hs(e,t){var a=t.value;if(a==null){if(a=t.children,t=t.defaultValue,a!=null){if(t!=null)throw Error(r(92));if(lo(a)){if(1<a.length)throw Error(r(93));a=a[0]}t=a}t==null&&(t=""),a=t}e._wrapperState={initialValue:Ae(a)}}function na(e,t){var a=Ae(t.value),o=Ae(t.defaultValue);a!=null&&(a=""+a,a!==e.value&&(e.value=a),t.defaultValue==null&&e.defaultValue!==a&&(e.defaultValue=a)),o!=null&&(e.defaultValue=""+o)}function za(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function yi(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function uo(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?yi(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Tt,Ot=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,a,o,s){MSApp.execUnsafeLocalFunction(function(){return e(t,a,o,s)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Tt=Tt||document.createElement("div"),Tt.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Tt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ha(e,t){if(t){var a=e.firstChild;if(a&&a===e.lastChild&&a.nodeType===3){a.nodeValue=t;return}}e.textContent=t}var ra={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qn=["Webkit","ms","Moz","O"];Object.keys(ra).forEach(function(e){qn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ra[t]=ra[e]})});function Kt(e,t,a){return t==null||typeof t=="boolean"||t===""?"":a||typeof t!="number"||t===0||ra.hasOwnProperty(e)&&ra[e]?(""+t).trim():t+"px"}function fi(e,t){e=e.style;for(var a in t)if(t.hasOwnProperty(a)){var o=a.indexOf("--")===0,s=Kt(a,t[a],o);a==="float"&&(a="cssFloat"),o?e.setProperty(a,s):e[a]=s}}var ms=K({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Ho(e,t){if(t){if(ms[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function Si(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Mo=null;function Ma(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Oo=null,la=null,da=null;function ys(e){if(e=_i(e)){if(typeof Oo!="function")throw Error(r(280));var t=e.stateNode;t&&(t=Os(t),Oo(e.stateNode,e.type,t))}}function vi(e){la?da?da.push(e):da=[e]:la=e}function fs(){if(la){var e=la,t=da;if(da=la=null,ys(e),t)for(e=0;e<t.length;e++)ys(t[e])}}function bi(e,t){return e(t)}function co(){}var Oa=!1;function Ss(e,t,a){if(Oa)return e(t,a);Oa=!0;try{return bi(e,t,a)}finally{Oa=!1,(la!==null||da!==null)&&(co(),fs())}}function po(e,t){var a=e.stateNode;if(a===null)return null;var o=Os(a);if(o===null)return null;a=o[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(o=!o.disabled)||(e=e.type,o=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!o;break e;default:e=!1}if(e)return null;if(a&&typeof a!="function")throw Error(r(231,t,typeof a));return a}var f=!1;if(y)try{var A={};Object.defineProperty(A,"passive",{get:function(){f=!0}}),window.addEventListener("test",A,A),window.removeEventListener("test",A,A)}catch{f=!1}function T(e,t,a,o,s,l,c,m,S){var j=Array.prototype.slice.call(arguments,3);try{t.apply(a,j)}catch(O){this.onError(O)}}var H=!1,G=null,re=!1,me=null,ee={onError:function(e){H=!0,G=e}};function ie(e,t,a,o,s,l,c,m,S){H=!1,G=null,T.apply(ee,arguments)}function Q(e,t,a,o,s,l,c,m,S){if(ie.apply(this,arguments),H){if(H){var j=G;H=!1,G=null}else throw Error(r(198));re||(re=!0,me=j)}}function J(e){var t=e,a=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(a=t.return),e=t.return;while(e)}return t.tag===3?a:null}function ve(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Re(e){if(J(e)!==e)throw Error(r(188))}function nt(e){var t=e.alternate;if(!t){if(t=J(e),t===null)throw Error(r(188));return t!==e?null:e}for(var a=e,o=t;;){var s=a.return;if(s===null)break;var l=s.alternate;if(l===null){if(o=s.return,o!==null){a=o;continue}break}if(s.child===l.child){for(l=s.child;l;){if(l===a)return Re(s),e;if(l===o)return Re(s),t;l=l.sibling}throw Error(r(188))}if(a.return!==o.return)a=s,o=l;else{for(var c=!1,m=s.child;m;){if(m===a){c=!0,a=s,o=l;break}if(m===o){c=!0,o=s,a=l;break}m=m.sibling}if(!c){for(m=l.child;m;){if(m===a){c=!0,a=l,o=s;break}if(m===o){c=!0,o=l,a=s;break}m=m.sibling}if(!c)throw Error(r(189))}}if(a.alternate!==o)throw Error(r(190))}if(a.tag!==3)throw Error(r(188));return a.stateNode.current===a?e:t}function Ne(e){return e=nt(e),e!==null?Ee(e):null}function Ee(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Ee(e);if(t!==null)return t;e=e.sibling}return null}var Ye=n.unstable_scheduleCallback,fa=n.unstable_cancelCallback,go=n.unstable_shouldYield,$t=n.unstable_requestPaint,Le=n.unstable_now,Pi=n.unstable_getCurrentPriorityLevel,Sa=n.unstable_ImmediatePriority,ua=n.unstable_UserBlockingPriority,va=n.unstable_NormalPriority,No=n.unstable_LowPriority,Ie=n.unstable_IdlePriority,Be=null,ht=null;function ho(e){if(ht&&typeof ht.onCommitFiberRoot=="function")try{ht.onCommitFiberRoot(Be,e,void 0,(e.current.flags&128)===128)}catch{}}var ze=Math.clz32?Math.clz32:Bn,Na=Math.log,vs=Math.LN2;function Bn(e){return e>>>=0,e===0?32:31-(Na(e)/vs|0)|0}var bs=64,Ps=4194304;function ki(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ks(e,t){var a=e.pendingLanes;if(a===0)return 0;var o=0,s=e.suspendedLanes,l=e.pingedLanes,c=a&268435455;if(c!==0){var m=c&~s;m!==0?o=ki(m):(l&=c,l!==0&&(o=ki(l)))}else c=a&~s,c!==0?o=ki(c):l!==0&&(o=ki(l));if(o===0)return 0;if(t!==0&&t!==o&&(t&s)===0&&(s=o&-o,l=t&-t,s>=l||s===16&&(l&4194240)!==0))return t;if((o&4)!==0&&(o|=a&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0<t;)a=31-ze(t),s=1<<a,o|=e[a],t&=~s;return o}function Jp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function eg(e,t){for(var a=e.suspendedLanes,o=e.pingedLanes,s=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-ze(l),m=1<<c,S=s[c];S===-1?((m&a)===0||(m&o)!==0)&&(s[c]=Jp(m,t)):S<=t&&(e.expiredLanes|=m),l&=~m}}function Wn(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ad(){var e=bs;return bs<<=1,(bs&4194240)===0&&(bs=64),e}function Fn(e){for(var t=[],a=0;31>a;a++)t.push(e);return t}function wi(e,t,a){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ze(t),e[t]=a}function tg(e,t){var a=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0<a;){var s=31-ze(a),l=1<<s;t[s]=0,o[s]=-1,e[s]=-1,a&=~l}}function Vn(e,t){var a=e.entangledLanes|=t;for(e=e.entanglements;a;){var o=31-ze(a),s=1<<o;s&t|e[o]&t&&(e[o]|=t),a&=~s}}var _e=0;function od(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var id,Yn,sd,nd,rd,Gn=!1,ws=[],_a=null,qa=null,Ba=null,Ci=new Map,Ai=new Map,Wa=[],ag="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function ld(e,t){switch(e){case"focusin":case"focusout":_a=null;break;case"dragenter":case"dragleave":qa=null;break;case"mouseover":case"mouseout":Ba=null;break;case"pointerover":case"pointerout":Ci.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Ai.delete(t.pointerId)}}function xi(e,t,a,o,s,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:a,eventSystemFlags:o,nativeEvent:l,targetContainers:[s]},t!==null&&(t=_i(t),t!==null&&Yn(t)),e):(e.eventSystemFlags|=o,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function og(e,t,a,o,s){switch(t){case"focusin":return _a=xi(_a,e,t,a,o,s),!0;case"dragenter":return qa=xi(qa,e,t,a,o,s),!0;case"mouseover":return Ba=xi(Ba,e,t,a,o,s),!0;case"pointerover":var l=s.pointerId;return Ci.set(l,xi(Ci.get(l)||null,e,t,a,o,s)),!0;case"gotpointercapture":return l=s.pointerId,Ai.set(l,xi(Ai.get(l)||null,e,t,a,o,s)),!0}return!1}function dd(e){var t=mo(e.target);if(t!==null){var a=J(t);if(a!==null){if(t=a.tag,t===13){if(t=ve(a),t!==null){e.blockedOn=t,rd(e.priority,function(){sd(a)});return}}else if(t===3&&a.stateNode.current.memoizedState.isDehydrated){e.blockedOn=a.tag===3?a.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Cs(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var a=$n(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(a===null){a=e.nativeEvent;var o=new a.constructor(a.type,a);Mo=o,a.target.dispatchEvent(o),Mo=null}else return t=_i(a),t!==null&&Yn(t),e.blockedOn=a,!1;t.shift()}return!0}function ud(e,t,a){Cs(e)&&a.delete(t)}function ig(){Gn=!1,_a!==null&&Cs(_a)&&(_a=null),qa!==null&&Cs(qa)&&(qa=null),Ba!==null&&Cs(Ba)&&(Ba=null),Ci.forEach(ud),Ai.forEach(ud)}function Ri(e,t){e.blockedOn===t&&(e.blockedOn=null,Gn||(Gn=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,ig)))}function Ii(e){function t(s){return Ri(s,e)}if(0<ws.length){Ri(ws[0],e);for(var a=1;a<ws.length;a++){var o=ws[a];o.blockedOn===e&&(o.blockedOn=null)}}for(_a!==null&&Ri(_a,e),qa!==null&&Ri(qa,e),Ba!==null&&Ri(Ba,e),Ci.forEach(t),Ai.forEach(t),a=0;a<Wa.length;a++)o=Wa[a],o.blockedOn===e&&(o.blockedOn=null);for(;0<Wa.length&&(a=Wa[0],a.blockedOn===null);)dd(a),a.blockedOn===null&&Wa.shift()}var _o=Y.ReactCurrentBatchConfig,As=!0;function sg(e,t,a,o){var s=_e,l=_o.transition;_o.transition=null;try{_e=1,Kn(e,t,a,o)}finally{_e=s,_o.transition=l}}function ng(e,t,a,o){var s=_e,l=_o.transition;_o.transition=null;try{_e=4,Kn(e,t,a,o)}finally{_e=s,_o.transition=l}}function Kn(e,t,a,o){if(As){var s=$n(e,t,a,o);if(s===null)pr(e,t,o,xs,a),ld(e,o);else if(og(s,e,t,a,o))o.stopPropagation();else if(ld(e,o),t&4&&-1<ag.indexOf(e)){for(;s!==null;){var l=_i(s);if(l!==null&&id(l),l=$n(e,t,a,o),l===null&&pr(e,t,o,xs,a),l===s)break;s=l}s!==null&&o.stopPropagation()}else pr(e,t,o,null,a)}}var xs=null;function $n(e,t,a,o){if(xs=null,e=Ma(o),e=mo(e),e!==null)if(t=J(e),t===null)e=null;else if(a=t.tag,a===13){if(e=ve(t),e!==null)return e;e=null}else if(a===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return xs=e,null}function cd(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Pi()){case Sa:return 1;case ua:return 4;case va:case No:return 16;case Ie:return 536870912;default:return 16}default:return 16}}var Fa=null,Xn=null,Rs=null;function pd(){if(Rs)return Rs;var e,t=Xn,a=t.length,o,s="value"in Fa?Fa.value:Fa.textContent,l=s.length;for(e=0;e<a&&t[e]===s[e];e++);var c=a-e;for(o=1;o<=c&&t[a-o]===s[l-o];o++);return Rs=s.slice(e,1<o?1-o:void 0)}function Is(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Ds(){return!0}function gd(){return!1}function Ut(e){function t(a,o,s,l,c){this._reactName=a,this._targetInst=s,this.type=o,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(a=e[m],this[m]=a?a(l):l[m]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Ds:gd,this.isPropagationStopped=gd,this}return K(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():typeof a.returnValue!="unknown"&&(a.returnValue=!1),this.isDefaultPrevented=Ds)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():typeof a.cancelBubble!="unknown"&&(a.cancelBubble=!0),this.isPropagationStopped=Ds)},persist:function(){},isPersistent:Ds}),t}var qo={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Qn=Ut(qo),Di=K({},qo,{view:0,detail:0}),rg=Ut(Di),Zn,Jn,Ei,Es=K({},Di,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:tr,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Ei&&(Ei&&e.type==="mousemove"?(Zn=e.screenX-Ei.screenX,Jn=e.screenY-Ei.screenY):Jn=Zn=0,Ei=e),Zn)},movementY:function(e){return"movementY"in e?e.movementY:Jn}}),hd=Ut(Es),lg=K({},Es,{dataTransfer:0}),dg=Ut(lg),ug=K({},Di,{relatedTarget:0}),er=Ut(ug),cg=K({},qo,{animationName:0,elapsedTime:0,pseudoElement:0}),pg=Ut(cg),gg=K({},qo,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),hg=Ut(gg),mg=K({},qo,{data:0}),md=Ut(mg),yg={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},fg={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Sg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function vg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=Sg[e])?!!t[e]:!1}function tr(){return vg}var bg=K({},Di,{key:function(e){if(e.key){var t=yg[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Is(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?fg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:tr,charCode:function(e){return e.type==="keypress"?Is(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Is(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Pg=Ut(bg),kg=K({},Es,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),yd=Ut(kg),wg=K({},Di,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:tr}),Cg=Ut(wg),Ag=K({},qo,{propertyName:0,elapsedTime:0,pseudoElement:0}),xg=Ut(Ag),Rg=K({},Es,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Ig=Ut(Rg),Dg=[9,13,27,32],ar=y&&"CompositionEvent"in window,ji=null;y&&"documentMode"in document&&(ji=document.documentMode);var Eg=y&&"TextEvent"in window&&!ji,fd=y&&(!ar||ji&&8<ji&&11>=ji),Sd=" ",vd=!1;function bd(e,t){switch(e){case"keyup":return Dg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Pd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Bo=!1;function jg(e,t){switch(e){case"compositionend":return Pd(t);case"keypress":return t.which!==32?null:(vd=!0,Sd);case"textInput":return e=t.data,e===Sd&&vd?null:e;default:return null}}function Tg(e,t){if(Bo)return e==="compositionend"||!ar&&bd(e,t)?(e=pd(),Rs=Xn=Fa=null,Bo=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return fd&&t.locale!=="ko"?null:t.data;default:return null}}var Ug={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function kd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Ug[e.type]:t==="textarea"}function wd(e,t,a,o){vi(o),t=zs(t,"onChange"),0<t.length&&(a=new Qn("onChange","change",null,a,o),e.push({event:a,listeners:t}))}var Ti=null,Ui=null;function Lg(e){qd(e,0)}function js(e){var t=Go(e);if(dt(t))return e}function zg(e,t){if(e==="change")return t}var Cd=!1;if(y){var or;if(y){var ir="oninput"in document;if(!ir){var Ad=document.createElement("div");Ad.setAttribute("oninput","return;"),ir=typeof Ad.oninput=="function"}or=ir}else or=!1;Cd=or&&(!document.documentMode||9<document.documentMode)}function xd(){Ti&&(Ti.detachEvent("onpropertychange",Rd),Ui=Ti=null)}function Rd(e){if(e.propertyName==="value"&&js(Ui)){var t=[];wd(t,Ui,e,Ma(e)),Ss(Lg,t)}}function Hg(e,t,a){e==="focusin"?(xd(),Ti=t,Ui=a,Ti.attachEvent("onpropertychange",Rd)):e==="focusout"&&xd()}function Mg(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return js(Ui)}function Og(e,t){if(e==="click")return js(t)}function Ng(e,t){if(e==="input"||e==="change")return js(t)}function _g(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Xt=typeof Object.is=="function"?Object.is:_g;function Li(e,t){if(Xt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var a=Object.keys(e),o=Object.keys(t);if(a.length!==o.length)return!1;for(o=0;o<a.length;o++){var s=a[o];if(!h.call(t,s)||!Xt(e[s],t[s]))return!1}return!0}function Id(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Dd(e,t){var a=Id(e);e=0;for(var o;a;){if(a.nodeType===3){if(o=e+a.textContent.length,e<=t&&o>=t)return{node:a,offset:t-e};e=o}e:{for(;a;){if(a.nextSibling){a=a.nextSibling;break e}a=a.parentNode}a=void 0}a=Id(a)}}function Ed(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Ed(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function jd(){for(var e=window,t=Gt();t instanceof e.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)e=t.contentWindow;else break;t=Gt(e.document)}return t}function sr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function qg(e){var t=jd(),a=e.focusedElem,o=e.selectionRange;if(t!==a&&a&&a.ownerDocument&&Ed(a.ownerDocument.documentElement,a)){if(o!==null&&sr(a)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in a)a.selectionStart=t,a.selectionEnd=Math.min(e,a.value.length);else if(e=(t=a.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=a.textContent.length,l=Math.min(o.start,s);o=o.end===void 0?l:Math.min(o.end,s),!e.extend&&l>o&&(s=o,o=l,l=s),s=Dd(a,l);var c=Dd(a,o);s&&c&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),l>o?(e.addRange(t),e.extend(c.node,c.offset)):(t.setEnd(c.node,c.offset),e.addRange(t)))}}for(t=[],e=a;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof a.focus=="function"&&a.focus(),a=0;a<t.length;a++)e=t[a],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Bg=y&&"documentMode"in document&&11>=document.documentMode,Wo=null,nr=null,zi=null,rr=!1;function Td(e,t,a){var o=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;rr||Wo==null||Wo!==Gt(o)||(o=Wo,"selectionStart"in o&&sr(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),zi&&Li(zi,o)||(zi=o,o=zs(nr,"onSelect"),0<o.length&&(t=new Qn("onSelect","select",null,t,a),e.push({event:t,listeners:o}),t.target=Wo)))}function Ts(e,t){var a={};return a[e.toLowerCase()]=t.toLowerCase(),a["Webkit"+e]="webkit"+t,a["Moz"+e]="moz"+t,a}var Fo={animationend:Ts("Animation","AnimationEnd"),animationiteration:Ts("Animation","AnimationIteration"),animationstart:Ts("Animation","AnimationStart"),transitionend:Ts("Transition","TransitionEnd")},lr={},Ud={};y&&(Ud=document.createElement("div").style,"AnimationEvent"in window||(delete Fo.animationend.animation,delete Fo.animationiteration.animation,delete Fo.animationstart.animation),"TransitionEvent"in window||delete Fo.transitionend.transition);function Us(e){if(lr[e])return lr[e];if(!Fo[e])return e;var t=Fo[e],a;for(a in t)if(t.hasOwnProperty(a)&&a in Ud)return lr[e]=t[a];return e}var Ld=Us("animationend"),zd=Us("animationiteration"),Hd=Us("animationstart"),Md=Us("transitionend"),Od=new Map,Nd="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Va(e,t){Od.set(e,t),p(t,[e])}for(var dr=0;dr<Nd.length;dr++){var ur=Nd[dr],Wg=ur.toLowerCase(),Fg=ur[0].toUpperCase()+ur.slice(1);Va(Wg,"on"+Fg)}Va(Ld,"onAnimationEnd"),Va(zd,"onAnimationIteration"),Va(Hd,"onAnimationStart"),Va("dblclick","onDoubleClick"),Va("focusin","onFocus"),Va("focusout","onBlur"),Va(Md,"onTransitionEnd"),g("onMouseEnter",["mouseout","mouseover"]),g("onMouseLeave",["mouseout","mouseover"]),g("onPointerEnter",["pointerout","pointerover"]),g("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Hi="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Vg=new Set("cancel close invalid load scroll toggle".split(" ").concat(Hi));function _d(e,t,a){var o=e.type||"unknown-event";e.currentTarget=a,Q(o,t,void 0,e),e.currentTarget=null}function qd(e,t){t=(t&4)!==0;for(var a=0;a<e.length;a++){var o=e[a],s=o.event;o=o.listeners;e:{var l=void 0;if(t)for(var c=o.length-1;0<=c;c--){var m=o[c],S=m.instance,j=m.currentTarget;if(m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,j),l=S}else for(c=0;c<o.length;c++){if(m=o[c],S=m.instance,j=m.currentTarget,m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,j),l=S}}}if(re)throw e=me,re=!1,me=null,e}function Ge(e,t){var a=t[Sr];a===void 0&&(a=t[Sr]=new Set);var o=e+"__bubble";a.has(o)||(Bd(t,e,2,!1),a.add(o))}function cr(e,t,a){var o=0;t&&(o|=4),Bd(a,e,o,t)}var Ls="_reactListening"+Math.random().toString(36).slice(2);function Mi(e){if(!e[Ls]){e[Ls]=!0,d.forEach(function(a){a!=="selectionchange"&&(Vg.has(a)||cr(a,!1,e),cr(a,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Ls]||(t[Ls]=!0,cr("selectionchange",!1,t))}}function Bd(e,t,a,o){switch(cd(t)){case 1:var s=sg;break;case 4:s=ng;break;default:s=Kn}a=s.bind(null,t,a,e),s=void 0,!f||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),o?s!==void 0?e.addEventListener(t,a,{capture:!0,passive:s}):e.addEventListener(t,a,!0):s!==void 0?e.addEventListener(t,a,{passive:s}):e.addEventListener(t,a,!1)}function pr(e,t,a,o,s){var l=o;if((t&1)===0&&(t&2)===0&&o!==null)e:for(;;){if(o===null)return;var c=o.tag;if(c===3||c===4){var m=o.stateNode.containerInfo;if(m===s||m.nodeType===8&&m.parentNode===s)break;if(c===4)for(c=o.return;c!==null;){var S=c.tag;if((S===3||S===4)&&(S=c.stateNode.containerInfo,S===s||S.nodeType===8&&S.parentNode===s))return;c=c.return}for(;m!==null;){if(c=mo(m),c===null)return;if(S=c.tag,S===5||S===6){o=l=c;continue e}m=m.parentNode}}o=o.return}Ss(function(){var j=l,O=Ma(a),q=[];e:{var M=Od.get(e);if(M!==void 0){var $=Qn,te=e;switch(e){case"keypress":if(Is(a)===0)break e;case"keydown":case"keyup":$=Pg;break;case"focusin":te="focus",$=er;break;case"focusout":te="blur",$=er;break;case"beforeblur":case"afterblur":$=er;break;case"click":if(a.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":$=hd;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":$=dg;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":$=Cg;break;case Ld:case zd:case Hd:$=pg;break;case Md:$=xg;break;case"scroll":$=rg;break;case"wheel":$=Ig;break;case"copy":case"cut":case"paste":$=hg;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":$=yd}var se=(t&4)!==0,ot=!se&&e==="scroll",R=se?M!==null?M+"Capture":null:M;se=[];for(var P=j,I;P!==null;){I=P;var V=I.stateNode;if(I.tag===5&&V!==null&&(I=V,R!==null&&(V=po(P,R),V!=null&&se.push(Oi(P,V,I)))),ot)break;P=P.return}0<se.length&&(M=new $(M,te,null,a,O),q.push({event:M,listeners:se}))}}if((t&7)===0){e:{if(M=e==="mouseover"||e==="pointerover",$=e==="mouseout"||e==="pointerout",M&&a!==Mo&&(te=a.relatedTarget||a.fromElement)&&(mo(te)||te[ba]))break e;if(($||M)&&(M=O.window===O?O:(M=O.ownerDocument)?M.defaultView||M.parentWindow:window,$?(te=a.relatedTarget||a.toElement,$=j,te=te?mo(te):null,te!==null&&(ot=J(te),te!==ot||te.tag!==5&&te.tag!==6)&&(te=null)):($=null,te=j),$!==te)){if(se=hd,V="onMouseLeave",R="onMouseEnter",P="mouse",(e==="pointerout"||e==="pointerover")&&(se=yd,V="onPointerLeave",R="onPointerEnter",P="pointer"),ot=$==null?M:Go($),I=te==null?M:Go(te),M=new se(V,P+"leave",$,a,O),M.target=ot,M.relatedTarget=I,V=null,mo(O)===j&&(se=new se(R,P+"enter",te,a,O),se.target=I,se.relatedTarget=ot,V=se),ot=V,$&&te)t:{for(se=$,R=te,P=0,I=se;I;I=Vo(I))P++;for(I=0,V=R;V;V=Vo(V))I++;for(;0<P-I;)se=Vo(se),P--;for(;0<I-P;)R=Vo(R),I--;for(;P--;){if(se===R||R!==null&&se===R.alternate)break t;se=Vo(se),R=Vo(R)}se=null}else se=null;$!==null&&Wd(q,M,$,se,!1),te!==null&&ot!==null&&Wd(q,ot,te,se,!0)}}e:{if(M=j?Go(j):window,$=M.nodeName&&M.nodeName.toLowerCase(),$==="select"||$==="input"&&M.type==="file")var ne=zg;else if(kd(M))if(Cd)ne=Ng;else{ne=Mg;var ge=Hg}else($=M.nodeName)&&$.toLowerCase()==="input"&&(M.type==="checkbox"||M.type==="radio")&&(ne=Og);if(ne&&(ne=ne(e,j))){wd(q,ne,a,O);break e}ge&&ge(e,M,j),e==="focusout"&&(ge=M._wrapperState)&&ge.controlled&&M.type==="number"&&zo(M,"number",M.value)}switch(ge=j?Go(j):window,e){case"focusin":(kd(ge)||ge.contentEditable==="true")&&(Wo=ge,nr=j,zi=null);break;case"focusout":zi=nr=Wo=null;break;case"mousedown":rr=!0;break;case"contextmenu":case"mouseup":case"dragend":rr=!1,Td(q,a,O);break;case"selectionchange":if(Bg)break;case"keydown":case"keyup":Td(q,a,O)}var he;if(ar)e:{switch(e){case"compositionstart":var fe="onCompositionStart";break e;case"compositionend":fe="onCompositionEnd";break e;case"compositionupdate":fe="onCompositionUpdate";break e}fe=void 0}else Bo?bd(e,a)&&(fe="onCompositionEnd"):e==="keydown"&&a.keyCode===229&&(fe="onCompositionStart");fe&&(fd&&a.locale!=="ko"&&(Bo||fe!=="onCompositionStart"?fe==="onCompositionEnd"&&Bo&&(he=pd()):(Fa=O,Xn="value"in Fa?Fa.value:Fa.textContent,Bo=!0)),ge=zs(j,fe),0<ge.length&&(fe=new md(fe,e,null,a,O),q.push({event:fe,listeners:ge}),he?fe.data=he:(he=Pd(a),he!==null&&(fe.data=he)))),(he=Eg?jg(e,a):Tg(e,a))&&(j=zs(j,"onBeforeInput"),0<j.length&&(O=new md("onBeforeInput","beforeinput",null,a,O),q.push({event:O,listeners:j}),O.data=he))}qd(q,t)})}function Oi(e,t,a){return{instance:e,listener:t,currentTarget:a}}function zs(e,t){for(var a=t+"Capture",o=[];e!==null;){var s=e,l=s.stateNode;s.tag===5&&l!==null&&(s=l,l=po(e,a),l!=null&&o.unshift(Oi(e,l,s)),l=po(e,t),l!=null&&o.push(Oi(e,l,s))),e=e.return}return o}function Vo(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Wd(e,t,a,o,s){for(var l=t._reactName,c=[];a!==null&&a!==o;){var m=a,S=m.alternate,j=m.stateNode;if(S!==null&&S===o)break;m.tag===5&&j!==null&&(m=j,s?(S=po(a,l),S!=null&&c.unshift(Oi(a,S,m))):s||(S=po(a,l),S!=null&&c.push(Oi(a,S,m)))),a=a.return}c.length!==0&&e.push({event:t,listeners:c})}var Yg=/\r\n?/g,Gg=/\u0000|\uFFFD/g;function Fd(e){return(typeof e=="string"?e:""+e).replace(Yg,`
|
|
39
|
-
`).replace(Gg,"")}function Hs(e,t,a){if(t=Fd(t),Fd(e)!==t&&a)throw Error(r(425))}function Ms(){}var gr=null,hr=null;function mr(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var yr=typeof setTimeout=="function"?setTimeout:void 0,Kg=typeof clearTimeout=="function"?clearTimeout:void 0,Vd=typeof Promise=="function"?Promise:void 0,$g=typeof queueMicrotask=="function"?queueMicrotask:typeof Vd<"u"?function(e){return Vd.resolve(null).then(e).catch(Xg)}:yr;function Xg(e){setTimeout(function(){throw e})}function fr(e,t){var a=t,o=0;do{var s=a.nextSibling;if(e.removeChild(a),s&&s.nodeType===8)if(a=s.data,a==="/$"){if(o===0){e.removeChild(s),Ii(t);return}o--}else a!=="$"&&a!=="$?"&&a!=="$!"||o++;a=s}while(a);Ii(t)}function Ya(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Yd(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="$"||a==="$!"||a==="$?"){if(t===0)return e;t--}else a==="/$"&&t++}e=e.previousSibling}return null}var Yo=Math.random().toString(36).slice(2),ca="__reactFiber$"+Yo,Ni="__reactProps$"+Yo,ba="__reactContainer$"+Yo,Sr="__reactEvents$"+Yo,Qg="__reactListeners$"+Yo,Zg="__reactHandles$"+Yo;function mo(e){var t=e[ca];if(t)return t;for(var a=e.parentNode;a;){if(t=a[ba]||a[ca]){if(a=t.alternate,t.child!==null||a!==null&&a.child!==null)for(e=Yd(e);e!==null;){if(a=e[ca])return a;e=Yd(e)}return t}e=a,a=e.parentNode}return null}function _i(e){return e=e[ca]||e[ba],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Go(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(r(33))}function Os(e){return e[Ni]||null}var vr=[],Ko=-1;function Ga(e){return{current:e}}function Ke(e){0>Ko||(e.current=vr[Ko],vr[Ko]=null,Ko--)}function Fe(e,t){Ko++,vr[Ko]=e.current,e.current=t}var Ka={},ft=Ga(Ka),Ct=Ga(!1),yo=Ka;function $o(e,t){var a=e.type.contextTypes;if(!a)return Ka;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var s={},l;for(l in a)s[l]=t[l];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function At(e){return e=e.childContextTypes,e!=null}function Ns(){Ke(Ct),Ke(ft)}function Gd(e,t,a){if(ft.current!==Ka)throw Error(r(168));Fe(ft,t),Fe(Ct,a)}function Kd(e,t,a){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return a;o=o.getChildContext();for(var s in o)if(!(s in t))throw Error(r(108,Pe(e)||"Unknown",s));return K({},a,o)}function _s(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ka,yo=ft.current,Fe(ft,e),Fe(Ct,Ct.current),!0}function $d(e,t,a){var o=e.stateNode;if(!o)throw Error(r(169));a?(e=Kd(e,t,yo),o.__reactInternalMemoizedMergedChildContext=e,Ke(Ct),Ke(ft),Fe(ft,e)):Ke(Ct),Fe(Ct,a)}var Pa=null,qs=!1,br=!1;function Xd(e){Pa===null?Pa=[e]:Pa.push(e)}function Jg(e){qs=!0,Xd(e)}function $a(){if(!br&&Pa!==null){br=!0;var e=0,t=_e;try{var a=Pa;for(_e=1;e<a.length;e++){var o=a[e];do o=o(!0);while(o!==null)}Pa=null,qs=!1}catch(s){throw Pa!==null&&(Pa=Pa.slice(e+1)),Ye(Sa,$a),s}finally{_e=t,br=!1}}return null}var Xo=[],Qo=0,Bs=null,Ws=0,Nt=[],_t=0,fo=null,ka=1,wa="";function So(e,t){Xo[Qo++]=Ws,Xo[Qo++]=Bs,Bs=e,Ws=t}function Qd(e,t,a){Nt[_t++]=ka,Nt[_t++]=wa,Nt[_t++]=fo,fo=e;var o=ka;e=wa;var s=32-ze(o)-1;o&=~(1<<s),a+=1;var l=32-ze(t)+s;if(30<l){var c=s-s%5;l=(o&(1<<c)-1).toString(32),o>>=c,s-=c,ka=1<<32-ze(t)+s|a<<s|o,wa=l+e}else ka=1<<l|a<<s|o,wa=e}function Pr(e){e.return!==null&&(So(e,1),Qd(e,1,0))}function kr(e){for(;e===Bs;)Bs=Xo[--Qo],Xo[Qo]=null,Ws=Xo[--Qo],Xo[Qo]=null;for(;e===fo;)fo=Nt[--_t],Nt[_t]=null,wa=Nt[--_t],Nt[_t]=null,ka=Nt[--_t],Nt[_t]=null}var Lt=null,zt=null,$e=!1,Qt=null;function Zd(e,t){var a=Ft(5,null,null,0);a.elementType="DELETED",a.stateNode=t,a.return=e,t=e.deletions,t===null?(e.deletions=[a],e.flags|=16):t.push(a)}function Jd(e,t){switch(e.tag){case 5:var a=e.type;return t=t.nodeType!==1||a.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Lt=e,zt=Ya(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Lt=e,zt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(a=fo!==null?{id:ka,overflow:wa}:null,e.memoizedState={dehydrated:t,treeContext:a,retryLane:1073741824},a=Ft(18,null,null,0),a.stateNode=t,a.return=e,e.child=a,Lt=e,zt=null,!0):!1;default:return!1}}function wr(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Cr(e){if($e){var t=zt;if(t){var a=t;if(!Jd(e,t)){if(wr(e))throw Error(r(418));t=Ya(a.nextSibling);var o=Lt;t&&Jd(e,t)?Zd(o,a):(e.flags=e.flags&-4097|2,$e=!1,Lt=e)}}else{if(wr(e))throw Error(r(418));e.flags=e.flags&-4097|2,$e=!1,Lt=e}}}function eu(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Lt=e}function Fs(e){if(e!==Lt)return!1;if(!$e)return eu(e),$e=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!mr(e.type,e.memoizedProps)),t&&(t=zt)){if(wr(e))throw tu(),Error(r(418));for(;t;)Zd(e,t),t=Ya(t.nextSibling)}if(eu(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var a=e.data;if(a==="/$"){if(t===0){zt=Ya(e.nextSibling);break e}t--}else a!=="$"&&a!=="$!"&&a!=="$?"||t++}e=e.nextSibling}zt=null}}else zt=Lt?Ya(e.stateNode.nextSibling):null;return!0}function tu(){for(var e=zt;e;)e=Ya(e.nextSibling)}function Zo(){zt=Lt=null,$e=!1}function Ar(e){Qt===null?Qt=[e]:Qt.push(e)}var eh=Y.ReactCurrentBatchConfig;function qi(e,t,a){if(e=a.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(a._owner){if(a=a._owner,a){if(a.tag!==1)throw Error(r(309));var o=a.stateNode}if(!o)throw Error(r(147,e));var s=o,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var m=s.refs;c===null?delete m[l]:m[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(r(284));if(!a._owner)throw Error(r(290,e))}return e}function Vs(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function au(e){var t=e._init;return t(e._payload)}function ou(e){function t(R,P){if(e){var I=R.deletions;I===null?(R.deletions=[P],R.flags|=16):I.push(P)}}function a(R,P){if(!e)return null;for(;P!==null;)t(R,P),P=P.sibling;return null}function o(R,P){for(R=new Map;P!==null;)P.key!==null?R.set(P.key,P):R.set(P.index,P),P=P.sibling;return R}function s(R,P){return R=oo(R,P),R.index=0,R.sibling=null,R}function l(R,P,I){return R.index=I,e?(I=R.alternate,I!==null?(I=I.index,I<P?(R.flags|=2,P):I):(R.flags|=2,P)):(R.flags|=1048576,P)}function c(R){return e&&R.alternate===null&&(R.flags|=2),R}function m(R,P,I,V){return P===null||P.tag!==6?(P=yl(I,R.mode,V),P.return=R,P):(P=s(P,I),P.return=R,P)}function S(R,P,I,V){var ne=I.type;return ne===E?O(R,P,I.props.children,V,I.key):P!==null&&(P.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===at&&au(ne)===P.type)?(V=s(P,I.props),V.ref=qi(R,P,I),V.return=R,V):(V=yn(I.type,I.key,I.props,null,R.mode,V),V.ref=qi(R,P,I),V.return=R,V)}function j(R,P,I,V){return P===null||P.tag!==4||P.stateNode.containerInfo!==I.containerInfo||P.stateNode.implementation!==I.implementation?(P=fl(I,R.mode,V),P.return=R,P):(P=s(P,I.children||[]),P.return=R,P)}function O(R,P,I,V,ne){return P===null||P.tag!==7?(P=xo(I,R.mode,V,ne),P.return=R,P):(P=s(P,I),P.return=R,P)}function q(R,P,I){if(typeof P=="string"&&P!==""||typeof P=="number")return P=yl(""+P,R.mode,I),P.return=R,P;if(typeof P=="object"&&P!==null){switch(P.$$typeof){case pe:return I=yn(P.type,P.key,P.props,null,R.mode,I),I.ref=qi(R,null,P),I.return=R,I;case De:return P=fl(P,R.mode,I),P.return=R,P;case at:var V=P._init;return q(R,V(P._payload),I)}if(lo(P)||de(P))return P=xo(P,R.mode,I,null),P.return=R,P;Vs(R,P)}return null}function M(R,P,I,V){var ne=P!==null?P.key:null;if(typeof I=="string"&&I!==""||typeof I=="number")return ne!==null?null:m(R,P,""+I,V);if(typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:return I.key===ne?S(R,P,I,V):null;case De:return I.key===ne?j(R,P,I,V):null;case at:return ne=I._init,M(R,P,ne(I._payload),V)}if(lo(I)||de(I))return ne!==null?null:O(R,P,I,V,null);Vs(R,I)}return null}function $(R,P,I,V,ne){if(typeof V=="string"&&V!==""||typeof V=="number")return R=R.get(I)||null,m(P,R,""+V,ne);if(typeof V=="object"&&V!==null){switch(V.$$typeof){case pe:return R=R.get(V.key===null?I:V.key)||null,S(P,R,V,ne);case De:return R=R.get(V.key===null?I:V.key)||null,j(P,R,V,ne);case at:var ge=V._init;return $(R,P,I,ge(V._payload),ne)}if(lo(V)||de(V))return R=R.get(I)||null,O(P,R,V,ne,null);Vs(P,V)}return null}function te(R,P,I,V){for(var ne=null,ge=null,he=P,fe=P=0,pt=null;he!==null&&fe<I.length;fe++){he.index>fe?(pt=he,he=null):pt=he.sibling;var He=M(R,he,I[fe],V);if(He===null){he===null&&(he=pt);break}e&&he&&He.alternate===null&&t(R,he),P=l(He,P,fe),ge===null?ne=He:ge.sibling=He,ge=He,he=pt}if(fe===I.length)return a(R,he),$e&&So(R,fe),ne;if(he===null){for(;fe<I.length;fe++)he=q(R,I[fe],V),he!==null&&(P=l(he,P,fe),ge===null?ne=he:ge.sibling=he,ge=he);return $e&&So(R,fe),ne}for(he=o(R,he);fe<I.length;fe++)pt=$(he,R,fe,I[fe],V),pt!==null&&(e&&pt.alternate!==null&&he.delete(pt.key===null?fe:pt.key),P=l(pt,P,fe),ge===null?ne=pt:ge.sibling=pt,ge=pt);return e&&he.forEach(function(io){return t(R,io)}),$e&&So(R,fe),ne}function se(R,P,I,V){var ne=de(I);if(typeof ne!="function")throw Error(r(150));if(I=ne.call(I),I==null)throw Error(r(151));for(var ge=ne=null,he=P,fe=P=0,pt=null,He=I.next();he!==null&&!He.done;fe++,He=I.next()){he.index>fe?(pt=he,he=null):pt=he.sibling;var io=M(R,he,He.value,V);if(io===null){he===null&&(he=pt);break}e&&he&&io.alternate===null&&t(R,he),P=l(io,P,fe),ge===null?ne=io:ge.sibling=io,ge=io,he=pt}if(He.done)return a(R,he),$e&&So(R,fe),ne;if(he===null){for(;!He.done;fe++,He=I.next())He=q(R,He.value,V),He!==null&&(P=l(He,P,fe),ge===null?ne=He:ge.sibling=He,ge=He);return $e&&So(R,fe),ne}for(he=o(R,he);!He.done;fe++,He=I.next())He=$(he,R,fe,He.value,V),He!==null&&(e&&He.alternate!==null&&he.delete(He.key===null?fe:He.key),P=l(He,P,fe),ge===null?ne=He:ge.sibling=He,ge=He);return e&&he.forEach(function(Uh){return t(R,Uh)}),$e&&So(R,fe),ne}function ot(R,P,I,V){if(typeof I=="object"&&I!==null&&I.type===E&&I.key===null&&(I=I.props.children),typeof I=="object"&&I!==null){switch(I.$$typeof){case pe:e:{for(var ne=I.key,ge=P;ge!==null;){if(ge.key===ne){if(ne=I.type,ne===E){if(ge.tag===7){a(R,ge.sibling),P=s(ge,I.props.children),P.return=R,R=P;break e}}else if(ge.elementType===ne||typeof ne=="object"&&ne!==null&&ne.$$typeof===at&&au(ne)===ge.type){a(R,ge.sibling),P=s(ge,I.props),P.ref=qi(R,ge,I),P.return=R,R=P;break e}a(R,ge);break}else t(R,ge);ge=ge.sibling}I.type===E?(P=xo(I.props.children,R.mode,V,I.key),P.return=R,R=P):(V=yn(I.type,I.key,I.props,null,R.mode,V),V.ref=qi(R,P,I),V.return=R,R=V)}return c(R);case De:e:{for(ge=I.key;P!==null;){if(P.key===ge)if(P.tag===4&&P.stateNode.containerInfo===I.containerInfo&&P.stateNode.implementation===I.implementation){a(R,P.sibling),P=s(P,I.children||[]),P.return=R,R=P;break e}else{a(R,P);break}else t(R,P);P=P.sibling}P=fl(I,R.mode,V),P.return=R,R=P}return c(R);case at:return ge=I._init,ot(R,P,ge(I._payload),V)}if(lo(I))return te(R,P,I,V);if(de(I))return se(R,P,I,V);Vs(R,I)}return typeof I=="string"&&I!==""||typeof I=="number"?(I=""+I,P!==null&&P.tag===6?(a(R,P.sibling),P=s(P,I),P.return=R,R=P):(a(R,P),P=yl(I,R.mode,V),P.return=R,R=P),c(R)):a(R,P)}return ot}var Jo=ou(!0),iu=ou(!1),Ys=Ga(null),Gs=null,ei=null,xr=null;function Rr(){xr=ei=Gs=null}function Ir(e){var t=Ys.current;Ke(Ys),e._currentValue=t}function Dr(e,t,a){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===a)break;e=e.return}}function ti(e,t){Gs=e,xr=ei=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(xt=!0),e.firstContext=null)}function qt(e){var t=e._currentValue;if(xr!==e)if(e={context:e,memoizedValue:t,next:null},ei===null){if(Gs===null)throw Error(r(308));ei=e,Gs.dependencies={lanes:0,firstContext:e}}else ei=ei.next=e;return t}var vo=null;function Er(e){vo===null?vo=[e]:vo.push(e)}function su(e,t,a,o){var s=t.interleaved;return s===null?(a.next=a,Er(t)):(a.next=s.next,s.next=a),t.interleaved=a,Ca(e,o)}function Ca(e,t){e.lanes|=t;var a=e.alternate;for(a!==null&&(a.lanes|=t),a=e,e=e.return;e!==null;)e.childLanes|=t,a=e.alternate,a!==null&&(a.childLanes|=t),a=e,e=e.return;return a.tag===3?a.stateNode:null}var Xa=!1;function jr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function nu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Aa(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qa(e,t,a){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(je&2)!==0){var s=o.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),o.pending=t,Ca(e,a)}return s=o.interleaved,s===null?(t.next=t,Er(o)):(t.next=s.next,s.next=t),o.interleaved=t,Ca(e,a)}function Ks(e,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,a|=o,t.lanes=a,Vn(e,a)}}function ru(e,t){var a=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,a===o)){var s=null,l=null;if(a=a.firstBaseUpdate,a!==null){do{var c={eventTime:a.eventTime,lane:a.lane,tag:a.tag,payload:a.payload,callback:a.callback,next:null};l===null?s=l=c:l=l.next=c,a=a.next}while(a!==null);l===null?s=l=t:l=l.next=t}else s=l=t;a={baseState:o.baseState,firstBaseUpdate:s,lastBaseUpdate:l,shared:o.shared,effects:o.effects},e.updateQueue=a;return}e=a.lastBaseUpdate,e===null?a.firstBaseUpdate=t:e.next=t,a.lastBaseUpdate=t}function $s(e,t,a,o){var s=e.updateQueue;Xa=!1;var l=s.firstBaseUpdate,c=s.lastBaseUpdate,m=s.shared.pending;if(m!==null){s.shared.pending=null;var S=m,j=S.next;S.next=null,c===null?l=j:c.next=j,c=S;var O=e.alternate;O!==null&&(O=O.updateQueue,m=O.lastBaseUpdate,m!==c&&(m===null?O.firstBaseUpdate=j:m.next=j,O.lastBaseUpdate=S))}if(l!==null){var q=s.baseState;c=0,O=j=S=null,m=l;do{var M=m.lane,$=m.eventTime;if((o&M)===M){O!==null&&(O=O.next={eventTime:$,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var te=e,se=m;switch(M=t,$=a,se.tag){case 1:if(te=se.payload,typeof te=="function"){q=te.call($,q,M);break e}q=te;break e;case 3:te.flags=te.flags&-65537|128;case 0:if(te=se.payload,M=typeof te=="function"?te.call($,q,M):te,M==null)break e;q=K({},q,M);break e;case 2:Xa=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,M=s.effects,M===null?s.effects=[m]:M.push(m))}else $={eventTime:$,lane:M,tag:m.tag,payload:m.payload,callback:m.callback,next:null},O===null?(j=O=$,S=q):O=O.next=$,c|=M;if(m=m.next,m===null){if(m=s.shared.pending,m===null)break;M=m,m=M.next,M.next=null,s.lastBaseUpdate=M,s.shared.pending=null}}while(!0);if(O===null&&(S=q),s.baseState=S,s.firstBaseUpdate=j,s.lastBaseUpdate=O,t=s.shared.interleaved,t!==null){s=t;do c|=s.lane,s=s.next;while(s!==t)}else l===null&&(s.shared.lanes=0);ko|=c,e.lanes=c,e.memoizedState=q}}function lu(e,t,a){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var o=e[t],s=o.callback;if(s!==null){if(o.callback=null,o=a,typeof s!="function")throw Error(r(191,s));s.call(o)}}}var Bi={},pa=Ga(Bi),Wi=Ga(Bi),Fi=Ga(Bi);function bo(e){if(e===Bi)throw Error(r(174));return e}function Tr(e,t){switch(Fe(Fi,t),Fe(Wi,e),Fe(pa,Bi),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:uo(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=uo(t,e)}Ke(pa),Fe(pa,t)}function ai(){Ke(pa),Ke(Wi),Ke(Fi)}function du(e){bo(Fi.current);var t=bo(pa.current),a=uo(t,e.type);t!==a&&(Fe(Wi,e),Fe(pa,a))}function Ur(e){Wi.current===e&&(Ke(pa),Ke(Wi))}var Qe=Ga(0);function Xs(e){for(var t=e;t!==null;){if(t.tag===13){var a=t.memoizedState;if(a!==null&&(a=a.dehydrated,a===null||a.data==="$?"||a.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Lr=[];function zr(){for(var e=0;e<Lr.length;e++)Lr[e]._workInProgressVersionPrimary=null;Lr.length=0}var Qs=Y.ReactCurrentDispatcher,Hr=Y.ReactCurrentBatchConfig,Po=0,Ze=null,rt=null,ut=null,Zs=!1,Vi=!1,Yi=0,th=0;function St(){throw Error(r(321))}function Mr(e,t){if(t===null)return!1;for(var a=0;a<t.length&&a<e.length;a++)if(!Xt(e[a],t[a]))return!1;return!0}function Or(e,t,a,o,s,l){if(Po=l,Ze=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Qs.current=e===null||e.memoizedState===null?sh:nh,e=a(o,s),Vi){l=0;do{if(Vi=!1,Yi=0,25<=l)throw Error(r(301));l+=1,ut=rt=null,t.updateQueue=null,Qs.current=rh,e=a(o,s)}while(Vi)}if(Qs.current=tn,t=rt!==null&&rt.next!==null,Po=0,ut=rt=Ze=null,Zs=!1,t)throw Error(r(300));return e}function Nr(){var e=Yi!==0;return Yi=0,e}function ga(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ut===null?Ze.memoizedState=ut=e:ut=ut.next=e,ut}function Bt(){if(rt===null){var e=Ze.alternate;e=e!==null?e.memoizedState:null}else e=rt.next;var t=ut===null?Ze.memoizedState:ut.next;if(t!==null)ut=t,rt=e;else{if(e===null)throw Error(r(310));rt=e,e={memoizedState:rt.memoizedState,baseState:rt.baseState,baseQueue:rt.baseQueue,queue:rt.queue,next:null},ut===null?Ze.memoizedState=ut=e:ut=ut.next=e}return ut}function Gi(e,t){return typeof t=="function"?t(e):t}function _r(e){var t=Bt(),a=t.queue;if(a===null)throw Error(r(311));a.lastRenderedReducer=e;var o=rt,s=o.baseQueue,l=a.pending;if(l!==null){if(s!==null){var c=s.next;s.next=l.next,l.next=c}o.baseQueue=s=l,a.pending=null}if(s!==null){l=s.next,o=o.baseState;var m=c=null,S=null,j=l;do{var O=j.lane;if((Po&O)===O)S!==null&&(S=S.next={lane:0,action:j.action,hasEagerState:j.hasEagerState,eagerState:j.eagerState,next:null}),o=j.hasEagerState?j.eagerState:e(o,j.action);else{var q={lane:O,action:j.action,hasEagerState:j.hasEagerState,eagerState:j.eagerState,next:null};S===null?(m=S=q,c=o):S=S.next=q,Ze.lanes|=O,ko|=O}j=j.next}while(j!==null&&j!==l);S===null?c=o:S.next=m,Xt(o,t.memoizedState)||(xt=!0),t.memoizedState=o,t.baseState=c,t.baseQueue=S,a.lastRenderedState=o}if(e=a.interleaved,e!==null){s=e;do l=s.lane,Ze.lanes|=l,ko|=l,s=s.next;while(s!==e)}else s===null&&(a.lanes=0);return[t.memoizedState,a.dispatch]}function qr(e){var t=Bt(),a=t.queue;if(a===null)throw Error(r(311));a.lastRenderedReducer=e;var o=a.dispatch,s=a.pending,l=t.memoizedState;if(s!==null){a.pending=null;var c=s=s.next;do l=e(l,c.action),c=c.next;while(c!==s);Xt(l,t.memoizedState)||(xt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),a.lastRenderedState=l}return[l,o]}function uu(){}function cu(e,t){var a=Ze,o=Bt(),s=t(),l=!Xt(o.memoizedState,s);if(l&&(o.memoizedState=s,xt=!0),o=o.queue,Br(hu.bind(null,a,o,e),[e]),o.getSnapshot!==t||l||ut!==null&&ut.memoizedState.tag&1){if(a.flags|=2048,Ki(9,gu.bind(null,a,o,s,t),void 0,null),ct===null)throw Error(r(349));(Po&30)!==0||pu(a,t,s)}return s}function pu(e,t,a){e.flags|=16384,e={getSnapshot:t,value:a},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.stores=[e]):(a=t.stores,a===null?t.stores=[e]:a.push(e))}function gu(e,t,a,o){t.value=a,t.getSnapshot=o,mu(t)&&yu(e)}function hu(e,t,a){return a(function(){mu(t)&&yu(e)})}function mu(e){var t=e.getSnapshot;e=e.value;try{var a=t();return!Xt(e,a)}catch{return!0}}function yu(e){var t=Ca(e,1);t!==null&&ta(t,e,1,-1)}function fu(e){var t=ga();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Gi,lastRenderedState:e},t.queue=e,e=e.dispatch=ih.bind(null,Ze,e),[t.memoizedState,e]}function Ki(e,t,a,o){return e={tag:e,create:t,destroy:a,deps:o,next:null},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.lastEffect=e.next=e):(a=t.lastEffect,a===null?t.lastEffect=e.next=e:(o=a.next,a.next=e,e.next=o,t.lastEffect=e)),e}function Su(){return Bt().memoizedState}function Js(e,t,a,o){var s=ga();Ze.flags|=e,s.memoizedState=Ki(1|t,a,void 0,o===void 0?null:o)}function en(e,t,a,o){var s=Bt();o=o===void 0?null:o;var l=void 0;if(rt!==null){var c=rt.memoizedState;if(l=c.destroy,o!==null&&Mr(o,c.deps)){s.memoizedState=Ki(t,a,l,o);return}}Ze.flags|=e,s.memoizedState=Ki(1|t,a,l,o)}function vu(e,t){return Js(8390656,8,e,t)}function Br(e,t){return en(2048,8,e,t)}function bu(e,t){return en(4,2,e,t)}function Pu(e,t){return en(4,4,e,t)}function ku(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function wu(e,t,a){return a=a!=null?a.concat([e]):null,en(4,4,ku.bind(null,t,e),a)}function Wr(){}function Cu(e,t){var a=Bt();t=t===void 0?null:t;var o=a.memoizedState;return o!==null&&t!==null&&Mr(t,o[1])?o[0]:(a.memoizedState=[e,t],e)}function Au(e,t){var a=Bt();t=t===void 0?null:t;var o=a.memoizedState;return o!==null&&t!==null&&Mr(t,o[1])?o[0]:(e=e(),a.memoizedState=[e,t],e)}function xu(e,t,a){return(Po&21)===0?(e.baseState&&(e.baseState=!1,xt=!0),e.memoizedState=a):(Xt(a,t)||(a=ad(),Ze.lanes|=a,ko|=a,e.baseState=!0),t)}function ah(e,t){var a=_e;_e=a!==0&&4>a?a:4,e(!0);var o=Hr.transition;Hr.transition={};try{e(!1),t()}finally{_e=a,Hr.transition=o}}function Ru(){return Bt().memoizedState}function oh(e,t,a){var o=to(e);if(a={lane:o,action:a,hasEagerState:!1,eagerState:null,next:null},Iu(e))Du(t,a);else if(a=su(e,t,a,o),a!==null){var s=wt();ta(a,e,o,s),Eu(a,t,o)}}function ih(e,t,a){var o=to(e),s={lane:o,action:a,hasEagerState:!1,eagerState:null,next:null};if(Iu(e))Du(t,s);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,m=l(c,a);if(s.hasEagerState=!0,s.eagerState=m,Xt(m,c)){var S=t.interleaved;S===null?(s.next=s,Er(t)):(s.next=S.next,S.next=s),t.interleaved=s;return}}catch{}finally{}a=su(e,t,s,o),a!==null&&(s=wt(),ta(a,e,o,s),Eu(a,t,o))}}function Iu(e){var t=e.alternate;return e===Ze||t!==null&&t===Ze}function Du(e,t){Vi=Zs=!0;var a=e.pending;a===null?t.next=t:(t.next=a.next,a.next=t),e.pending=t}function Eu(e,t,a){if((a&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,a|=o,t.lanes=a,Vn(e,a)}}var tn={readContext:qt,useCallback:St,useContext:St,useEffect:St,useImperativeHandle:St,useInsertionEffect:St,useLayoutEffect:St,useMemo:St,useReducer:St,useRef:St,useState:St,useDebugValue:St,useDeferredValue:St,useTransition:St,useMutableSource:St,useSyncExternalStore:St,useId:St,unstable_isNewReconciler:!1},sh={readContext:qt,useCallback:function(e,t){return ga().memoizedState=[e,t===void 0?null:t],e},useContext:qt,useEffect:vu,useImperativeHandle:function(e,t,a){return a=a!=null?a.concat([e]):null,Js(4194308,4,ku.bind(null,t,e),a)},useLayoutEffect:function(e,t){return Js(4194308,4,e,t)},useInsertionEffect:function(e,t){return Js(4,2,e,t)},useMemo:function(e,t){var a=ga();return t=t===void 0?null:t,e=e(),a.memoizedState=[e,t],e},useReducer:function(e,t,a){var o=ga();return t=a!==void 0?a(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=oh.bind(null,Ze,e),[o.memoizedState,e]},useRef:function(e){var t=ga();return e={current:e},t.memoizedState=e},useState:fu,useDebugValue:Wr,useDeferredValue:function(e){return ga().memoizedState=e},useTransition:function(){var e=fu(!1),t=e[0];return e=ah.bind(null,e[1]),ga().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,a){var o=Ze,s=ga();if($e){if(a===void 0)throw Error(r(407));a=a()}else{if(a=t(),ct===null)throw Error(r(349));(Po&30)!==0||pu(o,t,a)}s.memoizedState=a;var l={value:a,getSnapshot:t};return s.queue=l,vu(hu.bind(null,o,l,e),[e]),o.flags|=2048,Ki(9,gu.bind(null,o,l,a,t),void 0,null),a},useId:function(){var e=ga(),t=ct.identifierPrefix;if($e){var a=wa,o=ka;a=(o&~(1<<32-ze(o)-1)).toString(32)+a,t=":"+t+"R"+a,a=Yi++,0<a&&(t+="H"+a.toString(32)),t+=":"}else a=th++,t=":"+t+"r"+a.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},nh={readContext:qt,useCallback:Cu,useContext:qt,useEffect:Br,useImperativeHandle:wu,useInsertionEffect:bu,useLayoutEffect:Pu,useMemo:Au,useReducer:_r,useRef:Su,useState:function(){return _r(Gi)},useDebugValue:Wr,useDeferredValue:function(e){var t=Bt();return xu(t,rt.memoizedState,e)},useTransition:function(){var e=_r(Gi)[0],t=Bt().memoizedState;return[e,t]},useMutableSource:uu,useSyncExternalStore:cu,useId:Ru,unstable_isNewReconciler:!1},rh={readContext:qt,useCallback:Cu,useContext:qt,useEffect:Br,useImperativeHandle:wu,useInsertionEffect:bu,useLayoutEffect:Pu,useMemo:Au,useReducer:qr,useRef:Su,useState:function(){return qr(Gi)},useDebugValue:Wr,useDeferredValue:function(e){var t=Bt();return rt===null?t.memoizedState=e:xu(t,rt.memoizedState,e)},useTransition:function(){var e=qr(Gi)[0],t=Bt().memoizedState;return[e,t]},useMutableSource:uu,useSyncExternalStore:cu,useId:Ru,unstable_isNewReconciler:!1};function Zt(e,t){if(e&&e.defaultProps){t=K({},t),e=e.defaultProps;for(var a in e)t[a]===void 0&&(t[a]=e[a]);return t}return t}function Fr(e,t,a,o){t=e.memoizedState,a=a(o,t),a=a==null?t:K({},t,a),e.memoizedState=a,e.lanes===0&&(e.updateQueue.baseState=a)}var an={isMounted:function(e){return(e=e._reactInternals)?J(e)===e:!1},enqueueSetState:function(e,t,a){e=e._reactInternals;var o=wt(),s=to(e),l=Aa(o,s);l.payload=t,a!=null&&(l.callback=a),t=Qa(e,l,s),t!==null&&(ta(t,e,s,o),Ks(t,e,s))},enqueueReplaceState:function(e,t,a){e=e._reactInternals;var o=wt(),s=to(e),l=Aa(o,s);l.tag=1,l.payload=t,a!=null&&(l.callback=a),t=Qa(e,l,s),t!==null&&(ta(t,e,s,o),Ks(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var a=wt(),o=to(e),s=Aa(a,o);s.tag=2,t!=null&&(s.callback=t),t=Qa(e,s,o),t!==null&&(ta(t,e,o,a),Ks(t,e,o))}};function ju(e,t,a,o,s,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(o,l,c):t.prototype&&t.prototype.isPureReactComponent?!Li(a,o)||!Li(s,l):!0}function Tu(e,t,a){var o=!1,s=Ka,l=t.contextType;return typeof l=="object"&&l!==null?l=qt(l):(s=At(t)?yo:ft.current,o=t.contextTypes,l=(o=o!=null)?$o(e,s):Ka),t=new t(a,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=an,e.stateNode=t,t._reactInternals=e,o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=l),t}function Uu(e,t,a,o){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(a,o),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(a,o),t.state!==e&&an.enqueueReplaceState(t,t.state,null)}function Vr(e,t,a,o){var s=e.stateNode;s.props=a,s.state=e.memoizedState,s.refs={},jr(e);var l=t.contextType;typeof l=="object"&&l!==null?s.context=qt(l):(l=At(t)?yo:ft.current,s.context=$o(e,l)),s.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Fr(e,t,l,a),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&an.enqueueReplaceState(s,s.state,null),$s(e,a,s,o),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function oi(e,t){try{var a="",o=t;do a+=oe(o),o=o.return;while(o);var s=a}catch(l){s=`
|
|
40
|
-
Error generating stack: `+l.message+`
|
|
41
|
-
`+l.stack}return{value:e,source:t,stack:s,digest:null}}function Yr(e,t,a){return{value:e,source:null,stack:a??null,digest:t??null}}function Gr(e,t){try{console.error(t.value)}catch(a){setTimeout(function(){throw a})}}var lh=typeof WeakMap=="function"?WeakMap:Map;function Lu(e,t,a){a=Aa(-1,a),a.tag=3,a.payload={element:null};var o=t.value;return a.callback=function(){un||(un=!0,ll=o),Gr(e,t)},a}function zu(e,t,a){a=Aa(-1,a),a.tag=3;var o=e.type.getDerivedStateFromError;if(typeof o=="function"){var s=t.value;a.payload=function(){return o(s)},a.callback=function(){Gr(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(a.callback=function(){Gr(e,t),typeof o!="function"&&(Ja===null?Ja=new Set([this]):Ja.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),a}function Hu(e,t,a){var o=e.pingCache;if(o===null){o=e.pingCache=new lh;var s=new Set;o.set(t,s)}else s=o.get(t),s===void 0&&(s=new Set,o.set(t,s));s.has(a)||(s.add(a),e=kh.bind(null,e,t,a),t.then(e,e))}function Mu(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Ou(e,t,a,o,s){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,a.flags|=131072,a.flags&=-52805,a.tag===1&&(a.alternate===null?a.tag=17:(t=Aa(-1,1),t.tag=2,Qa(a,t,1))),a.lanes|=1),e):(e.flags|=65536,e.lanes=s,e)}var dh=Y.ReactCurrentOwner,xt=!1;function kt(e,t,a,o){t.child=e===null?iu(t,null,a,o):Jo(t,e.child,a,o)}function Nu(e,t,a,o,s){a=a.render;var l=t.ref;return ti(t,s),o=Or(e,t,a,o,l,s),a=Nr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,xa(e,t,s)):($e&&a&&Pr(t),t.flags|=1,kt(e,t,o,s),t.child)}function _u(e,t,a,o,s){if(e===null){var l=a.type;return typeof l=="function"&&!ml(l)&&l.defaultProps===void 0&&a.compare===null&&a.defaultProps===void 0?(t.tag=15,t.type=l,qu(e,t,l,o,s)):(e=yn(a.type,null,o,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&s)===0){var c=l.memoizedProps;if(a=a.compare,a=a!==null?a:Li,a(c,o)&&e.ref===t.ref)return xa(e,t,s)}return t.flags|=1,e=oo(l,o),e.ref=t.ref,e.return=t,t.child=e}function qu(e,t,a,o,s){if(e!==null){var l=e.memoizedProps;if(Li(l,o)&&e.ref===t.ref)if(xt=!1,t.pendingProps=o=l,(e.lanes&s)!==0)(e.flags&131072)!==0&&(xt=!0);else return t.lanes=e.lanes,xa(e,t,s)}return Kr(e,t,a,o,s)}function Bu(e,t,a){var o=t.pendingProps,s=o.children,l=e!==null?e.memoizedState:null;if(o.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(si,Ht),Ht|=a;else{if((a&1073741824)===0)return e=l!==null?l.baseLanes|a:a,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Fe(si,Ht),Ht|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},o=l!==null?l.baseLanes:a,Fe(si,Ht),Ht|=o}else l!==null?(o=l.baseLanes|a,t.memoizedState=null):o=a,Fe(si,Ht),Ht|=o;return kt(e,t,s,a),t.child}function Wu(e,t){var a=t.ref;(e===null&&a!==null||e!==null&&e.ref!==a)&&(t.flags|=512,t.flags|=2097152)}function Kr(e,t,a,o,s){var l=At(a)?yo:ft.current;return l=$o(t,l),ti(t,s),a=Or(e,t,a,o,l,s),o=Nr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,xa(e,t,s)):($e&&o&&Pr(t),t.flags|=1,kt(e,t,a,s),t.child)}function Fu(e,t,a,o,s){if(At(a)){var l=!0;_s(t)}else l=!1;if(ti(t,s),t.stateNode===null)sn(e,t),Tu(t,a,o),Vr(t,a,o,s),o=!0;else if(e===null){var c=t.stateNode,m=t.memoizedProps;c.props=m;var S=c.context,j=a.contextType;typeof j=="object"&&j!==null?j=qt(j):(j=At(a)?yo:ft.current,j=$o(t,j));var O=a.getDerivedStateFromProps,q=typeof O=="function"||typeof c.getSnapshotBeforeUpdate=="function";q||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==o||S!==j)&&Uu(t,c,o,j),Xa=!1;var M=t.memoizedState;c.state=M,$s(t,o,c,s),S=t.memoizedState,m!==o||M!==S||Ct.current||Xa?(typeof O=="function"&&(Fr(t,a,O,o),S=t.memoizedState),(m=Xa||ju(t,a,m,o,M,S,j))?(q||typeof c.UNSAFE_componentWillMount!="function"&&typeof c.componentWillMount!="function"||(typeof c.componentWillMount=="function"&&c.componentWillMount(),typeof c.UNSAFE_componentWillMount=="function"&&c.UNSAFE_componentWillMount()),typeof c.componentDidMount=="function"&&(t.flags|=4194308)):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=o,t.memoizedState=S),c.props=o,c.state=S,c.context=j,o=m):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),o=!1)}else{c=t.stateNode,nu(e,t),m=t.memoizedProps,j=t.type===t.elementType?m:Zt(t.type,m),c.props=j,q=t.pendingProps,M=c.context,S=a.contextType,typeof S=="object"&&S!==null?S=qt(S):(S=At(a)?yo:ft.current,S=$o(t,S));var $=a.getDerivedStateFromProps;(O=typeof $=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==q||M!==S)&&Uu(t,c,o,S),Xa=!1,M=t.memoizedState,c.state=M,$s(t,o,c,s);var te=t.memoizedState;m!==q||M!==te||Ct.current||Xa?(typeof $=="function"&&(Fr(t,a,$,o),te=t.memoizedState),(j=Xa||ju(t,a,j,o,M,te,S)||!1)?(O||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(o,te,S),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(o,te,S)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),t.memoizedProps=o,t.memoizedState=te),c.props=o,c.state=te,c.context=S,o=j):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),o=!1)}return $r(e,t,a,o,l,s)}function $r(e,t,a,o,s,l){Wu(e,t);var c=(t.flags&128)!==0;if(!o&&!c)return s&&$d(t,a,!1),xa(e,t,l);o=t.stateNode,dh.current=t;var m=c&&typeof a.getDerivedStateFromError!="function"?null:o.render();return t.flags|=1,e!==null&&c?(t.child=Jo(t,e.child,null,l),t.child=Jo(t,null,m,l)):kt(e,t,m,l),t.memoizedState=o.state,s&&$d(t,a,!0),t.child}function Vu(e){var t=e.stateNode;t.pendingContext?Gd(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Gd(e,t.context,!1),Tr(e,t.containerInfo)}function Yu(e,t,a,o,s){return Zo(),Ar(s),t.flags|=256,kt(e,t,a,o),t.child}var Xr={dehydrated:null,treeContext:null,retryLane:0};function Qr(e){return{baseLanes:e,cachePool:null,transitions:null}}function Gu(e,t,a){var o=t.pendingProps,s=Qe.current,l=!1,c=(t.flags&128)!==0,m;if((m=c)||(m=e!==null&&e.memoizedState===null?!1:(s&2)!==0),m?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),Fe(Qe,s&1),e===null)return Cr(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(c=o.children,e=o.fallback,l?(o=t.mode,l=t.child,c={mode:"hidden",children:c},(o&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=fn(c,o,0,null),e=xo(e,o,a,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Qr(a),t.memoizedState=Xr,e):Zr(t,c));if(s=e.memoizedState,s!==null&&(m=s.dehydrated,m!==null))return uh(e,t,c,o,m,s,a);if(l){l=o.fallback,c=t.mode,s=e.child,m=s.sibling;var S={mode:"hidden",children:o.children};return(c&1)===0&&t.child!==s?(o=t.child,o.childLanes=0,o.pendingProps=S,t.deletions=null):(o=oo(s,S),o.subtreeFlags=s.subtreeFlags&14680064),m!==null?l=oo(m,l):(l=xo(l,c,a,null),l.flags|=2),l.return=t,o.return=t,o.sibling=l,t.child=o,o=l,l=t.child,c=e.child.memoizedState,c=c===null?Qr(a):{baseLanes:c.baseLanes|a,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~a,t.memoizedState=Xr,o}return l=e.child,e=l.sibling,o=oo(l,{mode:"visible",children:o.children}),(t.mode&1)===0&&(o.lanes=a),o.return=t,o.sibling=null,e!==null&&(a=t.deletions,a===null?(t.deletions=[e],t.flags|=16):a.push(e)),t.child=o,t.memoizedState=null,o}function Zr(e,t){return t=fn({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function on(e,t,a,o){return o!==null&&Ar(o),Jo(t,e.child,null,a),e=Zr(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function uh(e,t,a,o,s,l,c){if(a)return t.flags&256?(t.flags&=-257,o=Yr(Error(r(422))),on(e,t,c,o)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=o.fallback,s=t.mode,o=fn({mode:"visible",children:o.children},s,0,null),l=xo(l,s,c,null),l.flags|=2,o.return=t,l.return=t,o.sibling=l,t.child=o,(t.mode&1)!==0&&Jo(t,e.child,null,c),t.child.memoizedState=Qr(c),t.memoizedState=Xr,l);if((t.mode&1)===0)return on(e,t,c,null);if(s.data==="$!"){if(o=s.nextSibling&&s.nextSibling.dataset,o)var m=o.dgst;return o=m,l=Error(r(419)),o=Yr(l,o,void 0),on(e,t,c,o)}if(m=(c&e.childLanes)!==0,xt||m){if(o=ct,o!==null){switch(c&-c){case 4:s=2;break;case 16:s=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:s=32;break;case 536870912:s=268435456;break;default:s=0}s=(s&(o.suspendedLanes|c))!==0?0:s,s!==0&&s!==l.retryLane&&(l.retryLane=s,Ca(e,s),ta(o,e,s,-1))}return hl(),o=Yr(Error(r(421))),on(e,t,c,o)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=wh.bind(null,e),s._reactRetry=t,null):(e=l.treeContext,zt=Ya(s.nextSibling),Lt=t,$e=!0,Qt=null,e!==null&&(Nt[_t++]=ka,Nt[_t++]=wa,Nt[_t++]=fo,ka=e.id,wa=e.overflow,fo=t),t=Zr(t,o.children),t.flags|=4096,t)}function Ku(e,t,a){e.lanes|=t;var o=e.alternate;o!==null&&(o.lanes|=t),Dr(e.return,t,a)}function Jr(e,t,a,o,s){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:o,tail:a,tailMode:s}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=o,l.tail=a,l.tailMode=s)}function $u(e,t,a){var o=t.pendingProps,s=o.revealOrder,l=o.tail;if(kt(e,t,o.children,a),o=Qe.current,(o&2)!==0)o=o&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Ku(e,a,t);else if(e.tag===19)Ku(e,a,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}o&=1}if(Fe(Qe,o),(t.mode&1)===0)t.memoizedState=null;else switch(s){case"forwards":for(a=t.child,s=null;a!==null;)e=a.alternate,e!==null&&Xs(e)===null&&(s=a),a=a.sibling;a=s,a===null?(s=t.child,t.child=null):(s=a.sibling,a.sibling=null),Jr(t,!1,s,a,l);break;case"backwards":for(a=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&Xs(e)===null){t.child=s;break}e=s.sibling,s.sibling=a,a=s,s=e}Jr(t,!0,a,null,l);break;case"together":Jr(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function sn(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function xa(e,t,a){if(e!==null&&(t.dependencies=e.dependencies),ko|=t.lanes,(a&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,a=oo(e,e.pendingProps),t.child=a,a.return=t;e.sibling!==null;)e=e.sibling,a=a.sibling=oo(e,e.pendingProps),a.return=t;a.sibling=null}return t.child}function ch(e,t,a){switch(t.tag){case 3:Vu(t),Zo();break;case 5:du(t);break;case 1:At(t.type)&&_s(t);break;case 4:Tr(t,t.stateNode.containerInfo);break;case 10:var o=t.type._context,s=t.memoizedProps.value;Fe(Ys,o._currentValue),o._currentValue=s;break;case 13:if(o=t.memoizedState,o!==null)return o.dehydrated!==null?(Fe(Qe,Qe.current&1),t.flags|=128,null):(a&t.child.childLanes)!==0?Gu(e,t,a):(Fe(Qe,Qe.current&1),e=xa(e,t,a),e!==null?e.sibling:null);Fe(Qe,Qe.current&1);break;case 19:if(o=(a&t.childLanes)!==0,(e.flags&128)!==0){if(o)return $u(e,t,a);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),Fe(Qe,Qe.current),o)break;return null;case 22:case 23:return t.lanes=0,Bu(e,t,a)}return xa(e,t,a)}var Xu,el,Qu,Zu;Xu=function(e,t){for(var a=t.child;a!==null;){if(a.tag===5||a.tag===6)e.appendChild(a.stateNode);else if(a.tag!==4&&a.child!==null){a.child.return=a,a=a.child;continue}if(a===t)break;for(;a.sibling===null;){if(a.return===null||a.return===t)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},el=function(){},Qu=function(e,t,a,o){var s=e.memoizedProps;if(s!==o){e=t.stateNode,bo(pa.current);var l=null;switch(a){case"input":s=Lo(e,s),o=Lo(e,o),l=[];break;case"select":s=K({},s,{value:void 0}),o=K({},o,{value:void 0}),l=[];break;case"textarea":s=mi(e,s),o=mi(e,o),l=[];break;default:typeof s.onClick!="function"&&typeof o.onClick=="function"&&(e.onclick=Ms)}Ho(a,o);var c;a=null;for(j in s)if(!o.hasOwnProperty(j)&&s.hasOwnProperty(j)&&s[j]!=null)if(j==="style"){var m=s[j];for(c in m)m.hasOwnProperty(c)&&(a||(a={}),a[c]="")}else j!=="dangerouslySetInnerHTML"&&j!=="children"&&j!=="suppressContentEditableWarning"&&j!=="suppressHydrationWarning"&&j!=="autoFocus"&&(u.hasOwnProperty(j)?l||(l=[]):(l=l||[]).push(j,null));for(j in o){var S=o[j];if(m=s!=null?s[j]:void 0,o.hasOwnProperty(j)&&S!==m&&(S!=null||m!=null))if(j==="style")if(m){for(c in m)!m.hasOwnProperty(c)||S&&S.hasOwnProperty(c)||(a||(a={}),a[c]="");for(c in S)S.hasOwnProperty(c)&&m[c]!==S[c]&&(a||(a={}),a[c]=S[c])}else a||(l||(l=[]),l.push(j,a)),a=S;else j==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,m=m?m.__html:void 0,S!=null&&m!==S&&(l=l||[]).push(j,S)):j==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(j,""+S):j!=="suppressContentEditableWarning"&&j!=="suppressHydrationWarning"&&(u.hasOwnProperty(j)?(S!=null&&j==="onScroll"&&Ge("scroll",e),l||m===S||(l=[])):(l=l||[]).push(j,S))}a&&(l=l||[]).push("style",a);var j=l;(t.updateQueue=j)&&(t.flags|=4)}},Zu=function(e,t,a,o){a!==o&&(t.flags|=4)};function $i(e,t){if(!$e)switch(e.tailMode){case"hidden":t=e.tail;for(var a=null;t!==null;)t.alternate!==null&&(a=t),t=t.sibling;a===null?e.tail=null:a.sibling=null;break;case"collapsed":a=e.tail;for(var o=null;a!==null;)a.alternate!==null&&(o=a),a=a.sibling;o===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:o.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,a=0,o=0;if(t)for(var s=e.child;s!==null;)a|=s.lanes|s.childLanes,o|=s.subtreeFlags&14680064,o|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)a|=s.lanes|s.childLanes,o|=s.subtreeFlags,o|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=o,e.childLanes=a,t}function ph(e,t,a){var o=t.pendingProps;switch(kr(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return vt(t),null;case 1:return At(t.type)&&Ns(),vt(t),null;case 3:return o=t.stateNode,ai(),Ke(Ct),Ke(ft),zr(),o.pendingContext&&(o.context=o.pendingContext,o.pendingContext=null),(e===null||e.child===null)&&(Fs(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(cl(Qt),Qt=null))),el(e,t),vt(t),null;case 5:Ur(t);var s=bo(Fi.current);if(a=t.type,e!==null&&t.stateNode!=null)Qu(e,t,a,o,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!o){if(t.stateNode===null)throw Error(r(166));return vt(t),null}if(e=bo(pa.current),Fs(t)){o=t.stateNode,a=t.type;var l=t.memoizedProps;switch(o[ca]=t,o[Ni]=l,e=(t.mode&1)!==0,a){case"dialog":Ge("cancel",o),Ge("close",o);break;case"iframe":case"object":case"embed":Ge("load",o);break;case"video":case"audio":for(s=0;s<Hi.length;s++)Ge(Hi[s],o);break;case"source":Ge("error",o);break;case"img":case"image":case"link":Ge("error",o),Ge("load",o);break;case"details":Ge("toggle",o);break;case"input":ps(o,l),Ge("invalid",o);break;case"select":o._wrapperState={wasMultiple:!!l.multiple},Ge("invalid",o);break;case"textarea":hs(o,l),Ge("invalid",o)}Ho(a,l),s=null;for(var c in l)if(l.hasOwnProperty(c)){var m=l[c];c==="children"?typeof m=="string"?o.textContent!==m&&(l.suppressHydrationWarning!==!0&&Hs(o.textContent,m,e),s=["children",m]):typeof m=="number"&&o.textContent!==""+m&&(l.suppressHydrationWarning!==!0&&Hs(o.textContent,m,e),s=["children",""+m]):u.hasOwnProperty(c)&&m!=null&&c==="onScroll"&&Ge("scroll",o)}switch(a){case"input":ya(o),gs(o,l,!0);break;case"textarea":ya(o),za(o);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(o.onclick=Ms)}o=s,t.updateQueue=o,o!==null&&(t.flags|=4)}else{c=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=yi(a)),e==="http://www.w3.org/1999/xhtml"?a==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=c.createElement(a,{is:o.is}):(e=c.createElement(a),a==="select"&&(c=e,o.multiple?c.multiple=!0:o.size&&(c.size=o.size))):e=c.createElementNS(e,a),e[ca]=t,e[Ni]=o,Xu(e,t,!1,!1),t.stateNode=e;e:{switch(c=Si(a,o),a){case"dialog":Ge("cancel",e),Ge("close",e),s=o;break;case"iframe":case"object":case"embed":Ge("load",e),s=o;break;case"video":case"audio":for(s=0;s<Hi.length;s++)Ge(Hi[s],e);s=o;break;case"source":Ge("error",e),s=o;break;case"img":case"image":case"link":Ge("error",e),Ge("load",e),s=o;break;case"details":Ge("toggle",e),s=o;break;case"input":ps(e,o),s=Lo(e,o),Ge("invalid",e);break;case"option":s=o;break;case"select":e._wrapperState={wasMultiple:!!o.multiple},s=K({},o,{value:void 0}),Ge("invalid",e);break;case"textarea":hs(e,o),s=mi(e,o),Ge("invalid",e);break;default:s=o}Ho(a,s),m=s;for(l in m)if(m.hasOwnProperty(l)){var S=m[l];l==="style"?fi(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Ot(e,S)):l==="children"?typeof S=="string"?(a!=="textarea"||S!=="")&&Ha(e,S):typeof S=="number"&&Ha(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(u.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ge("scroll",e):S!=null&&ae(e,l,S,c))}switch(a){case"input":ya(e),gs(e,o,!1);break;case"textarea":ya(e),za(e);break;case"option":o.value!=null&&e.setAttribute("value",""+Ae(o.value));break;case"select":e.multiple=!!o.multiple,l=o.value,l!=null?La(e,!!o.multiple,l,!1):o.defaultValue!=null&&La(e,!!o.multiple,o.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=Ms)}switch(a){case"button":case"input":case"select":case"textarea":o=!!o.autoFocus;break e;case"img":o=!0;break e;default:o=!1}}o&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)Zu(e,t,e.memoizedProps,o);else{if(typeof o!="string"&&t.stateNode===null)throw Error(r(166));if(a=bo(Fi.current),bo(pa.current),Fs(t)){if(o=t.stateNode,a=t.memoizedProps,o[ca]=t,(l=o.nodeValue!==a)&&(e=Lt,e!==null))switch(e.tag){case 3:Hs(o.nodeValue,a,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Hs(o.nodeValue,a,(e.mode&1)!==0)}l&&(t.flags|=4)}else o=(a.nodeType===9?a:a.ownerDocument).createTextNode(o),o[ca]=t,t.stateNode=o}return vt(t),null;case 13:if(Ke(Qe),o=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if($e&&zt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)tu(),Zo(),t.flags|=98560,l=!1;else if(l=Fs(t),o!==null&&o.dehydrated!==null){if(e===null){if(!l)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(317));l[ca]=t}else Zo(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Qt!==null&&(cl(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=a,t):(o=o!==null,o!==(e!==null&&e.memoizedState!==null)&&o&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?lt===0&&(lt=3):hl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return ai(),el(e,t),e===null&&Mi(t.stateNode.containerInfo),vt(t),null;case 10:return Ir(t.type._context),vt(t),null;case 17:return At(t.type)&&Ns(),vt(t),null;case 19:if(Ke(Qe),l=t.memoizedState,l===null)return vt(t),null;if(o=(t.flags&128)!==0,c=l.rendering,c===null)if(o)$i(l,!1);else{if(lt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=Xs(e),c!==null){for(t.flags|=128,$i(l,!1),o=c.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),t.subtreeFlags=0,o=a,a=t.child;a!==null;)l=a,e=o,l.flags&=14680066,c=l.alternate,c===null?(l.childLanes=0,l.lanes=e,l.child=null,l.subtreeFlags=0,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.subtreeFlags=0,l.deletions=null,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),a=a.sibling;return Fe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&Le()>ni&&(t.flags|=128,o=!0,$i(l,!1),t.lanes=4194304)}else{if(!o)if(e=Xs(c),e!==null){if(t.flags|=128,o=!0,a=e.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),$i(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!$e)return vt(t),null}else 2*Le()-l.renderingStartTime>ni&&a!==1073741824&&(t.flags|=128,o=!0,$i(l,!1),t.lanes=4194304);l.isBackwards?(c.sibling=t.child,t.child=c):(a=l.last,a!==null?a.sibling=c:t.child=c,l.last=c)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=Le(),t.sibling=null,a=Qe.current,Fe(Qe,o?a&1|2:a&1),t):(vt(t),null);case 22:case 23:return gl(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(Ht&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function gh(e,t){switch(kr(t),t.tag){case 1:return At(t.type)&&Ns(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ai(),Ke(Ct),Ke(ft),zr(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ur(t),null;case 13:if(Ke(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Zo()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ke(Qe),null;case 4:return ai(),null;case 10:return Ir(t.type._context),null;case 22:case 23:return gl(),null;case 24:return null;default:return null}}var nn=!1,bt=!1,hh=typeof WeakSet=="function"?WeakSet:Set,Z=null;function ii(e,t){var a=e.ref;if(a!==null)if(typeof a=="function")try{a(null)}catch(o){tt(e,t,o)}else a.current=null}function tl(e,t,a){try{a()}catch(o){tt(e,t,o)}}var Ju=!1;function mh(e,t){if(gr=As,e=jd(),sr(e)){if("selectionStart"in e)var a={start:e.selectionStart,end:e.selectionEnd};else e:{a=(a=e.ownerDocument)&&a.defaultView||window;var o=a.getSelection&&a.getSelection();if(o&&o.rangeCount!==0){a=o.anchorNode;var s=o.anchorOffset,l=o.focusNode;o=o.focusOffset;try{a.nodeType,l.nodeType}catch{a=null;break e}var c=0,m=-1,S=-1,j=0,O=0,q=e,M=null;t:for(;;){for(var $;q!==a||s!==0&&q.nodeType!==3||(m=c+s),q!==l||o!==0&&q.nodeType!==3||(S=c+o),q.nodeType===3&&(c+=q.nodeValue.length),($=q.firstChild)!==null;)M=q,q=$;for(;;){if(q===e)break t;if(M===a&&++j===s&&(m=c),M===l&&++O===o&&(S=c),($=q.nextSibling)!==null)break;q=M,M=q.parentNode}q=$}a=m===-1||S===-1?null:{start:m,end:S}}else a=null}a=a||{start:0,end:0}}else a=null;for(hr={focusedElem:e,selectionRange:a},As=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var te=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(te!==null){var se=te.memoizedProps,ot=te.memoizedState,R=t.stateNode,P=R.getSnapshotBeforeUpdate(t.elementType===t.type?se:Zt(t.type,se),ot);R.__reactInternalSnapshotBeforeUpdate=P}break;case 3:var I=t.stateNode.containerInfo;I.nodeType===1?I.textContent="":I.nodeType===9&&I.documentElement&&I.removeChild(I.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(V){tt(t,t.return,V)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return te=Ju,Ju=!1,te}function Xi(e,t,a){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var s=o=o.next;do{if((s.tag&e)===e){var l=s.destroy;s.destroy=void 0,l!==void 0&&tl(t,a,l)}s=s.next}while(s!==o)}}function rn(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var a=t=t.next;do{if((a.tag&e)===e){var o=a.create;a.destroy=o()}a=a.next}while(a!==t)}}function al(e){var t=e.ref;if(t!==null){var a=e.stateNode;switch(e.tag){case 5:e=a;break;default:e=a}typeof t=="function"?t(e):t.current=e}}function ec(e){var t=e.alternate;t!==null&&(e.alternate=null,ec(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[ca],delete t[Ni],delete t[Sr],delete t[Qg],delete t[Zg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function tc(e){return e.tag===5||e.tag===3||e.tag===4}function ac(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||tc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ol(e,t,a){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?a.nodeType===8?a.parentNode.insertBefore(e,t):a.insertBefore(e,t):(a.nodeType===8?(t=a.parentNode,t.insertBefore(e,a)):(t=a,t.appendChild(e)),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Ms));else if(o!==4&&(e=e.child,e!==null))for(ol(e,t,a),e=e.sibling;e!==null;)ol(e,t,a),e=e.sibling}function il(e,t,a){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?a.insertBefore(e,t):a.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(il(e,t,a),e=e.sibling;e!==null;)il(e,t,a),e=e.sibling}var mt=null,Jt=!1;function Za(e,t,a){for(a=a.child;a!==null;)oc(e,t,a),a=a.sibling}function oc(e,t,a){if(ht&&typeof ht.onCommitFiberUnmount=="function")try{ht.onCommitFiberUnmount(Be,a)}catch{}switch(a.tag){case 5:bt||ii(a,t);case 6:var o=mt,s=Jt;mt=null,Za(e,t,a),mt=o,Jt=s,mt!==null&&(Jt?(e=mt,a=a.stateNode,e.nodeType===8?e.parentNode.removeChild(a):e.removeChild(a)):mt.removeChild(a.stateNode));break;case 18:mt!==null&&(Jt?(e=mt,a=a.stateNode,e.nodeType===8?fr(e.parentNode,a):e.nodeType===1&&fr(e,a),Ii(e)):fr(mt,a.stateNode));break;case 4:o=mt,s=Jt,mt=a.stateNode.containerInfo,Jt=!0,Za(e,t,a),mt=o,Jt=s;break;case 0:case 11:case 14:case 15:if(!bt&&(o=a.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){s=o=o.next;do{var l=s,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&tl(a,t,c),s=s.next}while(s!==o)}Za(e,t,a);break;case 1:if(!bt&&(ii(a,t),o=a.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=a.memoizedProps,o.state=a.memoizedState,o.componentWillUnmount()}catch(m){tt(a,t,m)}Za(e,t,a);break;case 21:Za(e,t,a);break;case 22:a.mode&1?(bt=(o=bt)||a.memoizedState!==null,Za(e,t,a),bt=o):Za(e,t,a);break;default:Za(e,t,a)}}function ic(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var a=e.stateNode;a===null&&(a=e.stateNode=new hh),t.forEach(function(o){var s=Ch.bind(null,e,o);a.has(o)||(a.add(o),o.then(s,s))})}}function ea(e,t){var a=t.deletions;if(a!==null)for(var o=0;o<a.length;o++){var s=a[o];try{var l=e,c=t,m=c;e:for(;m!==null;){switch(m.tag){case 5:mt=m.stateNode,Jt=!1;break e;case 3:mt=m.stateNode.containerInfo,Jt=!0;break e;case 4:mt=m.stateNode.containerInfo,Jt=!0;break e}m=m.return}if(mt===null)throw Error(r(160));oc(l,c,s),mt=null,Jt=!1;var S=s.alternate;S!==null&&(S.return=null),s.return=null}catch(j){tt(s,t,j)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)sc(t,e),t=t.sibling}function sc(e,t){var a=e.alternate,o=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(ea(t,e),ha(e),o&4){try{Xi(3,e,e.return),rn(3,e)}catch(se){tt(e,e.return,se)}try{Xi(5,e,e.return)}catch(se){tt(e,e.return,se)}}break;case 1:ea(t,e),ha(e),o&512&&a!==null&&ii(a,a.return);break;case 5:if(ea(t,e),ha(e),o&512&&a!==null&&ii(a,a.return),e.flags&32){var s=e.stateNode;try{Ha(s,"")}catch(se){tt(e,e.return,se)}}if(o&4&&(s=e.stateNode,s!=null)){var l=e.memoizedProps,c=a!==null?a.memoizedProps:l,m=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{m==="input"&&l.type==="radio"&&l.name!=null&&sa(s,l),Si(m,c);var j=Si(m,l);for(c=0;c<S.length;c+=2){var O=S[c],q=S[c+1];O==="style"?fi(s,q):O==="dangerouslySetInnerHTML"?Ot(s,q):O==="children"?Ha(s,q):ae(s,O,q,j)}switch(m){case"input":hi(s,l);break;case"textarea":na(s,l);break;case"select":var M=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!l.multiple;var $=l.value;$!=null?La(s,!!l.multiple,$,!1):M!==!!l.multiple&&(l.defaultValue!=null?La(s,!!l.multiple,l.defaultValue,!0):La(s,!!l.multiple,l.multiple?[]:"",!1))}s[Ni]=l}catch(se){tt(e,e.return,se)}}break;case 6:if(ea(t,e),ha(e),o&4){if(e.stateNode===null)throw Error(r(162));s=e.stateNode,l=e.memoizedProps;try{s.nodeValue=l}catch(se){tt(e,e.return,se)}}break;case 3:if(ea(t,e),ha(e),o&4&&a!==null&&a.memoizedState.isDehydrated)try{Ii(t.containerInfo)}catch(se){tt(e,e.return,se)}break;case 4:ea(t,e),ha(e);break;case 13:ea(t,e),ha(e),s=e.child,s.flags&8192&&(l=s.memoizedState!==null,s.stateNode.isHidden=l,!l||s.alternate!==null&&s.alternate.memoizedState!==null||(rl=Le())),o&4&&ic(e);break;case 22:if(O=a!==null&&a.memoizedState!==null,e.mode&1?(bt=(j=bt)||O,ea(t,e),bt=j):ea(t,e),ha(e),o&8192){if(j=e.memoizedState!==null,(e.stateNode.isHidden=j)&&!O&&(e.mode&1)!==0)for(Z=e,O=e.child;O!==null;){for(q=Z=O;Z!==null;){switch(M=Z,$=M.child,M.tag){case 0:case 11:case 14:case 15:Xi(4,M,M.return);break;case 1:ii(M,M.return);var te=M.stateNode;if(typeof te.componentWillUnmount=="function"){o=M,a=M.return;try{t=o,te.props=t.memoizedProps,te.state=t.memoizedState,te.componentWillUnmount()}catch(se){tt(o,a,se)}}break;case 5:ii(M,M.return);break;case 22:if(M.memoizedState!==null){lc(q);continue}}$!==null?($.return=M,Z=$):lc(q)}O=O.sibling}e:for(O=null,q=e;;){if(q.tag===5){if(O===null){O=q;try{s=q.stateNode,j?(l=s.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(m=q.stateNode,S=q.memoizedProps.style,c=S!=null&&S.hasOwnProperty("display")?S.display:null,m.style.display=Kt("display",c))}catch(se){tt(e,e.return,se)}}}else if(q.tag===6){if(O===null)try{q.stateNode.nodeValue=j?"":q.memoizedProps}catch(se){tt(e,e.return,se)}}else if((q.tag!==22&&q.tag!==23||q.memoizedState===null||q===e)&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===e)break e;for(;q.sibling===null;){if(q.return===null||q.return===e)break e;O===q&&(O=null),q=q.return}O===q&&(O=null),q.sibling.return=q.return,q=q.sibling}}break;case 19:ea(t,e),ha(e),o&4&&ic(e);break;case 21:break;default:ea(t,e),ha(e)}}function ha(e){var t=e.flags;if(t&2){try{e:{for(var a=e.return;a!==null;){if(tc(a)){var o=a;break e}a=a.return}throw Error(r(160))}switch(o.tag){case 5:var s=o.stateNode;o.flags&32&&(Ha(s,""),o.flags&=-33);var l=ac(e);il(e,l,s);break;case 3:case 4:var c=o.stateNode.containerInfo,m=ac(e);ol(e,m,c);break;default:throw Error(r(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function yh(e,t,a){Z=e,nc(e)}function nc(e,t,a){for(var o=(e.mode&1)!==0;Z!==null;){var s=Z,l=s.child;if(s.tag===22&&o){var c=s.memoizedState!==null||nn;if(!c){var m=s.alternate,S=m!==null&&m.memoizedState!==null||bt;m=nn;var j=bt;if(nn=c,(bt=S)&&!j)for(Z=s;Z!==null;)c=Z,S=c.child,c.tag===22&&c.memoizedState!==null?dc(s):S!==null?(S.return=c,Z=S):dc(s);for(;l!==null;)Z=l,nc(l),l=l.sibling;Z=s,nn=m,bt=j}rc(e)}else(s.subtreeFlags&8772)!==0&&l!==null?(l.return=s,Z=l):rc(e)}}function rc(e){for(;Z!==null;){var t=Z;if((t.flags&8772)!==0){var a=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:bt||rn(5,t);break;case 1:var o=t.stateNode;if(t.flags&4&&!bt)if(a===null)o.componentDidMount();else{var s=t.elementType===t.type?a.memoizedProps:Zt(t.type,a.memoizedProps);o.componentDidUpdate(s,a.memoizedState,o.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&lu(t,l,o);break;case 3:var c=t.updateQueue;if(c!==null){if(a=null,t.child!==null)switch(t.child.tag){case 5:a=t.child.stateNode;break;case 1:a=t.child.stateNode}lu(t,c,a)}break;case 5:var m=t.stateNode;if(a===null&&t.flags&4){a=m;var S=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":S.autoFocus&&a.focus();break;case"img":S.src&&(a.src=S.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var j=t.alternate;if(j!==null){var O=j.memoizedState;if(O!==null){var q=O.dehydrated;q!==null&&Ii(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}bt||t.flags&512&&al(t)}catch(M){tt(t,t.return,M)}}if(t===e){Z=null;break}if(a=t.sibling,a!==null){a.return=t.return,Z=a;break}Z=t.return}}function lc(e){for(;Z!==null;){var t=Z;if(t===e){Z=null;break}var a=t.sibling;if(a!==null){a.return=t.return,Z=a;break}Z=t.return}}function dc(e){for(;Z!==null;){var t=Z;try{switch(t.tag){case 0:case 11:case 15:var a=t.return;try{rn(4,t)}catch(S){tt(t,a,S)}break;case 1:var o=t.stateNode;if(typeof o.componentDidMount=="function"){var s=t.return;try{o.componentDidMount()}catch(S){tt(t,s,S)}}var l=t.return;try{al(t)}catch(S){tt(t,l,S)}break;case 5:var c=t.return;try{al(t)}catch(S){tt(t,c,S)}}}catch(S){tt(t,t.return,S)}if(t===e){Z=null;break}var m=t.sibling;if(m!==null){m.return=t.return,Z=m;break}Z=t.return}}var fh=Math.ceil,ln=Y.ReactCurrentDispatcher,sl=Y.ReactCurrentOwner,Wt=Y.ReactCurrentBatchConfig,je=0,ct=null,it=null,yt=0,Ht=0,si=Ga(0),lt=0,Qi=null,ko=0,dn=0,nl=0,Zi=null,Rt=null,rl=0,ni=1/0,Ra=null,un=!1,ll=null,Ja=null,cn=!1,eo=null,pn=0,Ji=0,dl=null,gn=-1,hn=0;function wt(){return(je&6)!==0?Le():gn!==-1?gn:gn=Le()}function to(e){return(e.mode&1)===0?1:(je&2)!==0&&yt!==0?yt&-yt:eh.transition!==null?(hn===0&&(hn=ad()),hn):(e=_e,e!==0||(e=window.event,e=e===void 0?16:cd(e.type)),e)}function ta(e,t,a,o){if(50<Ji)throw Ji=0,dl=null,Error(r(185));wi(e,a,o),((je&2)===0||e!==ct)&&(e===ct&&((je&2)===0&&(dn|=a),lt===4&&ao(e,yt)),It(e,o),a===1&&je===0&&(t.mode&1)===0&&(ni=Le()+500,qs&&$a()))}function It(e,t){var a=e.callbackNode;eg(e,t);var o=ks(e,e===ct?yt:0);if(o===0)a!==null&&fa(a),e.callbackNode=null,e.callbackPriority=0;else if(t=o&-o,e.callbackPriority!==t){if(a!=null&&fa(a),t===1)e.tag===0?Jg(cc.bind(null,e)):Xd(cc.bind(null,e)),$g(function(){(je&6)===0&&$a()}),a=null;else{switch(od(o)){case 1:a=Sa;break;case 4:a=ua;break;case 16:a=va;break;case 536870912:a=Ie;break;default:a=va}a=vc(a,uc.bind(null,e))}e.callbackPriority=t,e.callbackNode=a}}function uc(e,t){if(gn=-1,hn=0,(je&6)!==0)throw Error(r(327));var a=e.callbackNode;if(ri()&&e.callbackNode!==a)return null;var o=ks(e,e===ct?yt:0);if(o===0)return null;if((o&30)!==0||(o&e.expiredLanes)!==0||t)t=mn(e,o);else{t=o;var s=je;je|=2;var l=gc();(ct!==e||yt!==t)&&(Ra=null,ni=Le()+500,Co(e,t));do try{bh();break}catch(m){pc(e,m)}while(!0);Rr(),ln.current=l,je=s,it!==null?t=0:(ct=null,yt=0,t=lt)}if(t!==0){if(t===2&&(s=Wn(e),s!==0&&(o=s,t=ul(e,s))),t===1)throw a=Qi,Co(e,0),ao(e,o),It(e,Le()),a;if(t===6)ao(e,o);else{if(s=e.current.alternate,(o&30)===0&&!Sh(s)&&(t=mn(e,o),t===2&&(l=Wn(e),l!==0&&(o=l,t=ul(e,l))),t===1))throw a=Qi,Co(e,0),ao(e,o),It(e,Le()),a;switch(e.finishedWork=s,e.finishedLanes=o,t){case 0:case 1:throw Error(r(345));case 2:Ao(e,Rt,Ra);break;case 3:if(ao(e,o),(o&130023424)===o&&(t=rl+500-Le(),10<t)){if(ks(e,0)!==0)break;if(s=e.suspendedLanes,(s&o)!==o){wt(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=yr(Ao.bind(null,e,Rt,Ra),t);break}Ao(e,Rt,Ra);break;case 4:if(ao(e,o),(o&4194240)===o)break;for(t=e.eventTimes,s=-1;0<o;){var c=31-ze(o);l=1<<c,c=t[c],c>s&&(s=c),o&=~l}if(o=s,o=Le()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*fh(o/1960))-o,10<o){e.timeoutHandle=yr(Ao.bind(null,e,Rt,Ra),o);break}Ao(e,Rt,Ra);break;case 5:Ao(e,Rt,Ra);break;default:throw Error(r(329))}}}return It(e,Le()),e.callbackNode===a?uc.bind(null,e):null}function ul(e,t){var a=Zi;return e.current.memoizedState.isDehydrated&&(Co(e,t).flags|=256),e=mn(e,t),e!==2&&(t=Rt,Rt=a,t!==null&&cl(t)),e}function cl(e){Rt===null?Rt=e:Rt.push.apply(Rt,e)}function Sh(e){for(var t=e;;){if(t.flags&16384){var a=t.updateQueue;if(a!==null&&(a=a.stores,a!==null))for(var o=0;o<a.length;o++){var s=a[o],l=s.getSnapshot;s=s.value;try{if(!Xt(l(),s))return!1}catch{return!1}}}if(a=t.child,t.subtreeFlags&16384&&a!==null)a.return=t,t=a;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function ao(e,t){for(t&=~nl,t&=~dn,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var a=31-ze(t),o=1<<a;e[a]=-1,t&=~o}}function cc(e){if((je&6)!==0)throw Error(r(327));ri();var t=ks(e,0);if((t&1)===0)return It(e,Le()),null;var a=mn(e,t);if(e.tag!==0&&a===2){var o=Wn(e);o!==0&&(t=o,a=ul(e,o))}if(a===1)throw a=Qi,Co(e,0),ao(e,t),It(e,Le()),a;if(a===6)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ao(e,Rt,Ra),It(e,Le()),null}function pl(e,t){var a=je;je|=1;try{return e(t)}finally{je=a,je===0&&(ni=Le()+500,qs&&$a())}}function wo(e){eo!==null&&eo.tag===0&&(je&6)===0&&ri();var t=je;je|=1;var a=Wt.transition,o=_e;try{if(Wt.transition=null,_e=1,e)return e()}finally{_e=o,Wt.transition=a,je=t,(je&6)===0&&$a()}}function gl(){Ht=si.current,Ke(si)}function Co(e,t){e.finishedWork=null,e.finishedLanes=0;var a=e.timeoutHandle;if(a!==-1&&(e.timeoutHandle=-1,Kg(a)),it!==null)for(a=it.return;a!==null;){var o=a;switch(kr(o),o.tag){case 1:o=o.type.childContextTypes,o!=null&&Ns();break;case 3:ai(),Ke(Ct),Ke(ft),zr();break;case 5:Ur(o);break;case 4:ai();break;case 13:Ke(Qe);break;case 19:Ke(Qe);break;case 10:Ir(o.type._context);break;case 22:case 23:gl()}a=a.return}if(ct=e,it=e=oo(e.current,null),yt=Ht=t,lt=0,Qi=null,nl=dn=ko=0,Rt=Zi=null,vo!==null){for(t=0;t<vo.length;t++)if(a=vo[t],o=a.interleaved,o!==null){a.interleaved=null;var s=o.next,l=a.pending;if(l!==null){var c=l.next;l.next=s,o.next=c}a.pending=o}vo=null}return e}function pc(e,t){do{var a=it;try{if(Rr(),Qs.current=tn,Zs){for(var o=Ze.memoizedState;o!==null;){var s=o.queue;s!==null&&(s.pending=null),o=o.next}Zs=!1}if(Po=0,ut=rt=Ze=null,Vi=!1,Yi=0,sl.current=null,a===null||a.return===null){lt=1,Qi=t,it=null;break}e:{var l=e,c=a.return,m=a,S=t;if(t=yt,m.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var j=S,O=m,q=O.tag;if((O.mode&1)===0&&(q===0||q===11||q===15)){var M=O.alternate;M?(O.updateQueue=M.updateQueue,O.memoizedState=M.memoizedState,O.lanes=M.lanes):(O.updateQueue=null,O.memoizedState=null)}var $=Mu(c);if($!==null){$.flags&=-257,Ou($,c,m,l,t),$.mode&1&&Hu(l,j,t),t=$,S=j;var te=t.updateQueue;if(te===null){var se=new Set;se.add(S),t.updateQueue=se}else te.add(S);break e}else{if((t&1)===0){Hu(l,j,t),hl();break e}S=Error(r(426))}}else if($e&&m.mode&1){var ot=Mu(c);if(ot!==null){(ot.flags&65536)===0&&(ot.flags|=256),Ou(ot,c,m,l,t),Ar(oi(S,m));break e}}l=S=oi(S,m),lt!==4&&(lt=2),Zi===null?Zi=[l]:Zi.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var R=Lu(l,S,t);ru(l,R);break e;case 1:m=S;var P=l.type,I=l.stateNode;if((l.flags&128)===0&&(typeof P.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Ja===null||!Ja.has(I)))){l.flags|=65536,t&=-t,l.lanes|=t;var V=zu(l,m,t);ru(l,V);break e}}l=l.return}while(l!==null)}mc(a)}catch(ne){t=ne,it===a&&a!==null&&(it=a=a.return);continue}break}while(!0)}function gc(){var e=ln.current;return ln.current=tn,e===null?tn:e}function hl(){(lt===0||lt===3||lt===2)&&(lt=4),ct===null||(ko&268435455)===0&&(dn&268435455)===0||ao(ct,yt)}function mn(e,t){var a=je;je|=2;var o=gc();(ct!==e||yt!==t)&&(Ra=null,Co(e,t));do try{vh();break}catch(s){pc(e,s)}while(!0);if(Rr(),je=a,ln.current=o,it!==null)throw Error(r(261));return ct=null,yt=0,lt}function vh(){for(;it!==null;)hc(it)}function bh(){for(;it!==null&&!go();)hc(it)}function hc(e){var t=Sc(e.alternate,e,Ht);e.memoizedProps=e.pendingProps,t===null?mc(e):it=t,sl.current=null}function mc(e){var t=e;do{var a=t.alternate;if(e=t.return,(t.flags&32768)===0){if(a=ph(a,t,Ht),a!==null){it=a;return}}else{if(a=gh(a,t),a!==null){a.flags&=32767,it=a;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{lt=6,it=null;return}}if(t=t.sibling,t!==null){it=t;return}it=t=e}while(t!==null);lt===0&&(lt=5)}function Ao(e,t,a){var o=_e,s=Wt.transition;try{Wt.transition=null,_e=1,Ph(e,t,a,o)}finally{Wt.transition=s,_e=o}return null}function Ph(e,t,a,o){do ri();while(eo!==null);if((je&6)!==0)throw Error(r(327));a=e.finishedWork;var s=e.finishedLanes;if(a===null)return null;if(e.finishedWork=null,e.finishedLanes=0,a===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var l=a.lanes|a.childLanes;if(tg(e,l),e===ct&&(it=ct=null,yt=0),(a.subtreeFlags&2064)===0&&(a.flags&2064)===0||cn||(cn=!0,vc(va,function(){return ri(),null})),l=(a.flags&15990)!==0,(a.subtreeFlags&15990)!==0||l){l=Wt.transition,Wt.transition=null;var c=_e;_e=1;var m=je;je|=4,sl.current=null,mh(e,a),sc(a,e),qg(hr),As=!!gr,hr=gr=null,e.current=a,yh(a),$t(),je=m,_e=c,Wt.transition=l}else e.current=a;if(cn&&(cn=!1,eo=e,pn=s),l=e.pendingLanes,l===0&&(Ja=null),ho(a.stateNode),It(e,Le()),t!==null)for(o=e.onRecoverableError,a=0;a<t.length;a++)s=t[a],o(s.value,{componentStack:s.stack,digest:s.digest});if(un)throw un=!1,e=ll,ll=null,e;return(pn&1)!==0&&e.tag!==0&&ri(),l=e.pendingLanes,(l&1)!==0?e===dl?Ji++:(Ji=0,dl=e):Ji=0,$a(),null}function ri(){if(eo!==null){var e=od(pn),t=Wt.transition,a=_e;try{if(Wt.transition=null,_e=16>e?16:e,eo===null)var o=!1;else{if(e=eo,eo=null,pn=0,(je&6)!==0)throw Error(r(331));var s=je;for(je|=4,Z=e.current;Z!==null;){var l=Z,c=l.child;if((Z.flags&16)!==0){var m=l.deletions;if(m!==null){for(var S=0;S<m.length;S++){var j=m[S];for(Z=j;Z!==null;){var O=Z;switch(O.tag){case 0:case 11:case 15:Xi(8,O,l)}var q=O.child;if(q!==null)q.return=O,Z=q;else for(;Z!==null;){O=Z;var M=O.sibling,$=O.return;if(ec(O),O===j){Z=null;break}if(M!==null){M.return=$,Z=M;break}Z=$}}}var te=l.alternate;if(te!==null){var se=te.child;if(se!==null){te.child=null;do{var ot=se.sibling;se.sibling=null,se=ot}while(se!==null)}}Z=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,Z=c;else e:for(;Z!==null;){if(l=Z,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Xi(9,l,l.return)}var R=l.sibling;if(R!==null){R.return=l.return,Z=R;break e}Z=l.return}}var P=e.current;for(Z=P;Z!==null;){c=Z;var I=c.child;if((c.subtreeFlags&2064)!==0&&I!==null)I.return=c,Z=I;else e:for(c=P;Z!==null;){if(m=Z,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:rn(9,m)}}catch(ne){tt(m,m.return,ne)}if(m===c){Z=null;break e}var V=m.sibling;if(V!==null){V.return=m.return,Z=V;break e}Z=m.return}}if(je=s,$a(),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(Be,e)}catch{}o=!0}return o}finally{_e=a,Wt.transition=t}}return!1}function yc(e,t,a){t=oi(a,t),t=Lu(e,t,1),e=Qa(e,t,1),t=wt(),e!==null&&(wi(e,1,t),It(e,t))}function tt(e,t,a){if(e.tag===3)yc(e,e,a);else for(;t!==null;){if(t.tag===3){yc(t,e,a);break}else if(t.tag===1){var o=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof o.componentDidCatch=="function"&&(Ja===null||!Ja.has(o))){e=oi(a,e),e=zu(t,e,1),t=Qa(t,e,1),e=wt(),t!==null&&(wi(t,1,e),It(t,e));break}}t=t.return}}function kh(e,t,a){var o=e.pingCache;o!==null&&o.delete(t),t=wt(),e.pingedLanes|=e.suspendedLanes&a,ct===e&&(yt&a)===a&&(lt===4||lt===3&&(yt&130023424)===yt&&500>Le()-rl?Co(e,0):nl|=a),It(e,t)}function fc(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ps,Ps<<=1,(Ps&130023424)===0&&(Ps=4194304)));var a=wt();e=Ca(e,t),e!==null&&(wi(e,t,a),It(e,a))}function wh(e){var t=e.memoizedState,a=0;t!==null&&(a=t.retryLane),fc(e,a)}function Ch(e,t){var a=0;switch(e.tag){case 13:var o=e.stateNode,s=e.memoizedState;s!==null&&(a=s.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(r(314))}o!==null&&o.delete(t),fc(e,a)}var Sc;Sc=function(e,t,a){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ct.current)xt=!0;else{if((e.lanes&a)===0&&(t.flags&128)===0)return xt=!1,ch(e,t,a);xt=(e.flags&131072)!==0}else xt=!1,$e&&(t.flags&1048576)!==0&&Qd(t,Ws,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;sn(e,t),e=t.pendingProps;var s=$o(t,ft.current);ti(t,a),s=Or(null,t,o,e,s,a);var l=Nr();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,At(o)?(l=!0,_s(t)):l=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,jr(t),s.updater=an,t.stateNode=s,s._reactInternals=t,Vr(t,o,e,a),t=$r(null,t,o,!0,l,a)):(t.tag=0,$e&&l&&Pr(t),kt(null,t,s,a),t=t.child),t;case 16:o=t.elementType;e:{switch(sn(e,t),e=t.pendingProps,s=o._init,o=s(o._payload),t.type=o,s=t.tag=xh(o),e=Zt(o,e),s){case 0:t=Kr(null,t,o,e,a);break e;case 1:t=Fu(null,t,o,e,a);break e;case 11:t=Nu(null,t,o,e,a);break e;case 14:t=_u(null,t,o,Zt(o.type,e),a);break e}throw Error(r(306,o,""))}return t;case 0:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Zt(o,s),Kr(e,t,o,s,a);case 1:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Zt(o,s),Fu(e,t,o,s,a);case 3:e:{if(Vu(t),e===null)throw Error(r(387));o=t.pendingProps,l=t.memoizedState,s=l.element,nu(e,t),$s(t,o,null,a);var c=t.memoizedState;if(o=c.element,l.isDehydrated)if(l={element:o,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){s=oi(Error(r(423)),t),t=Yu(e,t,o,a,s);break e}else if(o!==s){s=oi(Error(r(424)),t),t=Yu(e,t,o,a,s);break e}else for(zt=Ya(t.stateNode.containerInfo.firstChild),Lt=t,$e=!0,Qt=null,a=iu(t,null,o,a),t.child=a;a;)a.flags=a.flags&-3|4096,a=a.sibling;else{if(Zo(),o===s){t=xa(e,t,a);break e}kt(e,t,o,a)}t=t.child}return t;case 5:return du(t),e===null&&Cr(t),o=t.type,s=t.pendingProps,l=e!==null?e.memoizedProps:null,c=s.children,mr(o,s)?c=null:l!==null&&mr(o,l)&&(t.flags|=32),Wu(e,t),kt(e,t,c,a),t.child;case 6:return e===null&&Cr(t),null;case 13:return Gu(e,t,a);case 4:return Tr(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=Jo(t,null,o,a):kt(e,t,o,a),t.child;case 11:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Zt(o,s),Nu(e,t,o,s,a);case 7:return kt(e,t,t.pendingProps,a),t.child;case 8:return kt(e,t,t.pendingProps.children,a),t.child;case 12:return kt(e,t,t.pendingProps.children,a),t.child;case 10:e:{if(o=t.type._context,s=t.pendingProps,l=t.memoizedProps,c=s.value,Fe(Ys,o._currentValue),o._currentValue=c,l!==null)if(Xt(l.value,c)){if(l.children===s.children&&!Ct.current){t=xa(e,t,a);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var m=l.dependencies;if(m!==null){c=l.child;for(var S=m.firstContext;S!==null;){if(S.context===o){if(l.tag===1){S=Aa(-1,a&-a),S.tag=2;var j=l.updateQueue;if(j!==null){j=j.shared;var O=j.pending;O===null?S.next=S:(S.next=O.next,O.next=S),j.pending=S}}l.lanes|=a,S=l.alternate,S!==null&&(S.lanes|=a),Dr(l.return,a,t),m.lanes|=a;break}S=S.next}}else if(l.tag===10)c=l.type===t.type?null:l.child;else if(l.tag===18){if(c=l.return,c===null)throw Error(r(341));c.lanes|=a,m=c.alternate,m!==null&&(m.lanes|=a),Dr(c,a,t),c=l.sibling}else c=l.child;if(c!==null)c.return=l;else for(c=l;c!==null;){if(c===t){c=null;break}if(l=c.sibling,l!==null){l.return=c.return,c=l;break}c=c.return}l=c}kt(e,t,s.children,a),t=t.child}return t;case 9:return s=t.type,o=t.pendingProps.children,ti(t,a),s=qt(s),o=o(s),t.flags|=1,kt(e,t,o,a),t.child;case 14:return o=t.type,s=Zt(o,t.pendingProps),s=Zt(o.type,s),_u(e,t,o,s,a);case 15:return qu(e,t,t.type,t.pendingProps,a);case 17:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Zt(o,s),sn(e,t),t.tag=1,At(o)?(e=!0,_s(t)):e=!1,ti(t,a),Tu(t,o,s),Vr(t,o,s,a),$r(null,t,o,!0,e,a);case 19:return $u(e,t,a);case 22:return Bu(e,t,a)}throw Error(r(156,t.tag))};function vc(e,t){return Ye(e,t)}function Ah(e,t,a,o){this.tag=e,this.key=a,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Ft(e,t,a,o){return new Ah(e,t,a,o)}function ml(e){return e=e.prototype,!(!e||!e.isReactComponent)}function xh(e){if(typeof e=="function")return ml(e)?1:0;if(e!=null){if(e=e.$$typeof,e===we)return 11;if(e===et)return 14}return 2}function oo(e,t){var a=e.alternate;return a===null?(a=Ft(e.tag,t,e.key,e.mode),a.elementType=e.elementType,a.type=e.type,a.stateNode=e.stateNode,a.alternate=e,e.alternate=a):(a.pendingProps=t,a.type=e.type,a.flags=0,a.subtreeFlags=0,a.deletions=null),a.flags=e.flags&14680064,a.childLanes=e.childLanes,a.lanes=e.lanes,a.child=e.child,a.memoizedProps=e.memoizedProps,a.memoizedState=e.memoizedState,a.updateQueue=e.updateQueue,t=e.dependencies,a.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},a.sibling=e.sibling,a.index=e.index,a.ref=e.ref,a}function yn(e,t,a,o,s,l){var c=2;if(o=e,typeof e=="function")ml(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case E:return xo(a.children,s,l,t);case X:c=8,s|=8;break;case Se:return e=Ft(12,a,t,s|2),e.elementType=Se,e.lanes=l,e;case Ce:return e=Ft(13,a,t,s),e.elementType=Ce,e.lanes=l,e;case Me:return e=Ft(19,a,t,s),e.elementType=Me,e.lanes=l,e;case Oe:return fn(a,s,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ce:c=10;break e;case Te:c=9;break e;case we:c=11;break e;case et:c=14;break e;case at:c=16,o=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=Ft(c,a,t,s),t.elementType=e,t.type=o,t.lanes=l,t}function xo(e,t,a,o){return e=Ft(7,e,o,t),e.lanes=a,e}function fn(e,t,a,o){return e=Ft(22,e,o,t),e.elementType=Oe,e.lanes=a,e.stateNode={isHidden:!1},e}function yl(e,t,a){return e=Ft(6,e,null,t),e.lanes=a,e}function fl(e,t,a){return t=Ft(4,e.children!==null?e.children:[],e.key,t),t.lanes=a,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Rh(e,t,a,o,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Fn(0),this.expirationTimes=Fn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Fn(0),this.identifierPrefix=o,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function Sl(e,t,a,o,s,l,c,m,S){return e=new Rh(e,t,a,m,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Ft(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:o,isDehydrated:a,cache:null,transitions:null,pendingSuspenseBoundaries:null},jr(l),e}function Ih(e,t,a){var o=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:De,key:o==null?null:""+o,children:e,containerInfo:t,implementation:a}}function bc(e){if(!e)return Ka;e=e._reactInternals;e:{if(J(e)!==e||e.tag!==1)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(At(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(r(171))}if(e.tag===1){var a=e.type;if(At(a))return Kd(e,a,t)}return t}function Pc(e,t,a,o,s,l,c,m,S){return e=Sl(a,o,!0,e,s,l,c,m,S),e.context=bc(null),a=e.current,o=wt(),s=to(a),l=Aa(o,s),l.callback=t??null,Qa(a,l,s),e.current.lanes=s,wi(e,s,o),It(e,o),e}function Sn(e,t,a,o){var s=t.current,l=wt(),c=to(s);return a=bc(a),t.context===null?t.context=a:t.pendingContext=a,t=Aa(l,c),t.payload={element:e},o=o===void 0?null:o,o!==null&&(t.callback=o),e=Qa(s,t,c),e!==null&&(ta(e,s,c,l),Ks(e,s,c)),c}function vn(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function kc(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var a=e.retryLane;e.retryLane=a!==0&&a<t?a:t}}function vl(e,t){kc(e,t),(e=e.alternate)&&kc(e,t)}function Dh(){return null}var wc=typeof reportError=="function"?reportError:function(e){console.error(e)};function bl(e){this._internalRoot=e}bn.prototype.render=bl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));Sn(e,t,null,null)},bn.prototype.unmount=bl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;wo(function(){Sn(null,e,null,null)}),t[ba]=null}};function bn(e){this._internalRoot=e}bn.prototype.unstable_scheduleHydration=function(e){if(e){var t=nd();e={blockedOn:null,target:e,priority:t};for(var a=0;a<Wa.length&&t!==0&&t<Wa[a].priority;a++);Wa.splice(a,0,e),a===0&&dd(e)}};function Pl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Pn(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function Cc(){}function Eh(e,t,a,o,s){if(s){if(typeof o=="function"){var l=o;o=function(){var j=vn(c);l.call(j)}}var c=Pc(t,o,e,0,null,!1,!1,"",Cc);return e._reactRootContainer=c,e[ba]=c.current,Mi(e.nodeType===8?e.parentNode:e),wo(),c}for(;s=e.lastChild;)e.removeChild(s);if(typeof o=="function"){var m=o;o=function(){var j=vn(S);m.call(j)}}var S=Sl(e,0,!1,null,null,!1,!1,"",Cc);return e._reactRootContainer=S,e[ba]=S.current,Mi(e.nodeType===8?e.parentNode:e),wo(function(){Sn(t,S,a,o)}),S}function kn(e,t,a,o,s){var l=a._reactRootContainer;if(l){var c=l;if(typeof s=="function"){var m=s;s=function(){var S=vn(c);m.call(S)}}Sn(t,c,e,s)}else c=Eh(a,t,e,s,o);return vn(c)}id=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var a=ki(t.pendingLanes);a!==0&&(Vn(t,a|1),It(t,Le()),(je&6)===0&&(ni=Le()+500,$a()))}break;case 13:wo(function(){var o=Ca(e,1);if(o!==null){var s=wt();ta(o,e,1,s)}}),vl(e,1)}},Yn=function(e){if(e.tag===13){var t=Ca(e,134217728);if(t!==null){var a=wt();ta(t,e,134217728,a)}vl(e,134217728)}},sd=function(e){if(e.tag===13){var t=to(e),a=Ca(e,t);if(a!==null){var o=wt();ta(a,e,t,o)}vl(e,t)}},nd=function(){return _e},rd=function(e,t){var a=_e;try{return _e=e,t()}finally{_e=a}},Oo=function(e,t,a){switch(t){case"input":if(hi(e,a),t=a.name,a.type==="radio"&&t!=null){for(a=e;a.parentNode;)a=a.parentNode;for(a=a.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<a.length;t++){var o=a[t];if(o!==e&&o.form===e.form){var s=Os(o);if(!s)throw Error(r(90));dt(o),hi(o,s)}}}break;case"textarea":na(e,a);break;case"select":t=a.value,t!=null&&La(e,!!a.multiple,t,!1)}},bi=pl,co=wo;var jh={usingClientEntryPoint:!1,Events:[_i,Go,Os,vi,fs,pl]},es={findFiberByHostInstance:mo,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},Th={bundleType:es.bundleType,version:es.version,rendererPackageName:es.rendererPackageName,rendererConfig:es.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Y.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Ne(e),e===null?null:e.stateNode},findFiberByHostInstance:es.findFiberByHostInstance||Dh,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var wn=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wn.isDisabled&&wn.supportsFiber)try{Be=wn.inject(Th),ht=wn}catch{}}return Dt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=jh,Dt.createPortal=function(e,t){var a=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Pl(t))throw Error(r(200));return Ih(e,t,null,a)},Dt.createRoot=function(e,t){if(!Pl(e))throw Error(r(299));var a=!1,o="",s=wc;return t!=null&&(t.unstable_strictMode===!0&&(a=!0),t.identifierPrefix!==void 0&&(o=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=Sl(e,1,!1,null,null,a,!1,o,s),e[ba]=t.current,Mi(e.nodeType===8?e.parentNode:e),new bl(t)},Dt.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=Ne(t),e=e===null?null:e.stateNode,e},Dt.flushSync=function(e){return wo(e)},Dt.hydrate=function(e,t,a){if(!Pn(t))throw Error(r(200));return kn(null,e,t,!0,a)},Dt.hydrateRoot=function(e,t,a){if(!Pl(e))throw Error(r(405));var o=a!=null&&a.hydratedSources||null,s=!1,l="",c=wc;if(a!=null&&(a.unstable_strictMode===!0&&(s=!0),a.identifierPrefix!==void 0&&(l=a.identifierPrefix),a.onRecoverableError!==void 0&&(c=a.onRecoverableError)),t=Pc(t,null,e,1,a??null,s,!1,l,c),e[ba]=t.current,Mi(e),o)for(e=0;e<o.length;e++)a=o[e],s=a._getVersion,s=s(a._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[a,s]:t.mutableSourceEagerHydrationData.push(a,s);return new bn(t)},Dt.render=function(e,t,a){if(!Pn(t))throw Error(r(200));return kn(null,e,t,!1,a)},Dt.unmountComponentAtNode=function(e){if(!Pn(e))throw Error(r(40));return e._reactRootContainer?(wo(function(){kn(null,null,e,!1,function(){e._reactRootContainer=null,e[ba]=null})}),!0):!1},Dt.unstable_batchedUpdates=pl,Dt.unstable_renderSubtreeIntoContainer=function(e,t,a,o){if(!Pn(a))throw Error(r(200));if(e==null||e._reactInternals===void 0)throw Error(r(38));return kn(e,t,a,!1,o)},Dt.version="18.3.1-next-f1338f8080-20240426",Dt}var Tc;function vp(){if(Tc)return Cl.exports;Tc=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(n){console.error(n)}}return i(),Cl.exports=qh(),Cl.exports}var Uc;function Bh(){if(Uc)return Cn;Uc=1;var i=vp();return Cn.createRoot=i.createRoot,Cn.hydrateRoot=i.hydrateRoot,Cn}var Wh=Bh(),x=Gl();const Fh=Sp(x),Vh=fp({__proto__:null,default:Fh},[x]);var Ln=vp();const Yh=Sp(Ln),Gh=fp({__proto__:null,default:Yh},[Ln]);/**
|
|
42
|
-
* @remix-run/router v1.23.2
|
|
43
|
-
*
|
|
44
|
-
* Copyright (c) Remix Software Inc.
|
|
45
|
-
*
|
|
46
|
-
* This source code is licensed under the MIT license found in the
|
|
47
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
48
|
-
*
|
|
49
|
-
* @license MIT
|
|
50
|
-
*/function Xe(){return Xe=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},Xe.apply(this,arguments)}var st;(function(i){i.Pop="POP",i.Push="PUSH",i.Replace="REPLACE"})(st||(st={}));const Lc="popstate";function Kh(i){i===void 0&&(i={});function n(u,p){let{pathname:g="/",search:y="",hash:h=""}=ja(u.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),rs("",{pathname:g,search:y,hash:h},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function r(u,p){let g=u.document.querySelector("base"),y="";if(g&&g.getAttribute("href")){let h=u.location.href,v=h.indexOf("#");y=v===-1?h:h.slice(0,v)}return y+"#"+(typeof p=="string"?p:Uo(p))}function d(u,p){ro(u.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Xh(n,r,d,i)}function ke(i,n){if(i===!1||i===null||typeof i>"u")throw new Error(n)}function ro(i,n){if(!i){typeof console<"u"&&console.warn(n);try{throw new Error(n)}catch{}}}function $h(){return Math.random().toString(36).substr(2,8)}function zc(i,n){return{usr:i.state,key:i.key,idx:n}}function rs(i,n,r,d){return r===void 0&&(r=null),Xe({pathname:typeof i=="string"?i:i.pathname,search:"",hash:""},typeof n=="string"?ja(n):n,{state:r,key:n&&n.key||d||$h()})}function Uo(i){let{pathname:n="/",search:r="",hash:d=""}=i;return r&&r!=="?"&&(n+=r.charAt(0)==="?"?r:"?"+r),d&&d!=="#"&&(n+=d.charAt(0)==="#"?d:"#"+d),n}function ja(i){let n={};if(i){let r=i.indexOf("#");r>=0&&(n.hash=i.substr(r),i=i.substr(0,r));let d=i.indexOf("?");d>=0&&(n.search=i.substr(d),i=i.substr(0,d)),i&&(n.pathname=i)}return n}function Xh(i,n,r,d){d===void 0&&(d={});let{window:u=document.defaultView,v5Compat:p=!1}=d,g=u.history,y=st.Pop,h=null,v=k();v==null&&(v=0,g.replaceState(Xe({},g.state,{idx:v}),""));function k(){return(g.state||{idx:null}).idx}function b(){y=st.Pop;let N=k(),le=N==null?null:N-v;v=N,h&&h({action:y,location:z.location,delta:le})}function D(N,le){y=st.Push;let W=rs(z.location,N,le);r&&r(W,N),v=k()+1;let ae=zc(W,v),Y=z.createHref(W);try{g.pushState(ae,"",Y)}catch(pe){if(pe instanceof DOMException&&pe.name==="DataCloneError")throw pe;u.location.assign(Y)}p&&h&&h({action:y,location:z.location,delta:1})}function U(N,le){y=st.Replace;let W=rs(z.location,N,le);r&&r(W,N),v=k();let ae=zc(W,v),Y=z.createHref(W);g.replaceState(ae,"",Y),p&&h&&h({action:y,location:z.location,delta:0})}function B(N){let le=u.location.origin!=="null"?u.location.origin:u.location.href,W=typeof N=="string"?N:Uo(N);return W=W.replace(/ $/,"%20"),ke(le,"No window.location.(origin|href) available to create URL for href: "+W),new URL(W,le)}let z={get action(){return y},get location(){return i(u,g)},listen(N){if(h)throw new Error("A history only accepts one active listener");return u.addEventListener(Lc,b),h=N,()=>{u.removeEventListener(Lc,b),h=null}},createHref(N){return n(u,N)},createURL:B,encodeLocation(N){let le=B(N);return{pathname:le.pathname,search:le.search,hash:le.hash}},push:D,replace:U,go(N){return g.go(N)}};return z}var qe;(function(i){i.data="data",i.deferred="deferred",i.redirect="redirect",i.error="error"})(qe||(qe={}));const Qh=new Set(["lazy","caseSensitive","path","id","index","children"]);function Zh(i){return i.index===!0}function En(i,n,r,d){return r===void 0&&(r=[]),d===void 0&&(d={}),i.map((u,p)=>{let g=[...r,String(p)],y=typeof u.id=="string"?u.id:g.join("-");if(ke(u.index!==!0||!u.children,"Cannot specify children on an index route"),ke(!d[y],'Found a route id collision on id "'+y+`". Route id's must be globally unique within Data Router usages`),Zh(u)){let h=Xe({},u,n(u),{id:y});return d[y]=h,h}else{let h=Xe({},u,n(u),{id:y,children:void 0});return d[y]=h,u.children&&(h.children=En(u.children,n,g,d)),h}})}function Io(i,n,r){return r===void 0&&(r="/"),Rn(i,n,r,!1)}function Rn(i,n,r,d){let u=typeof n=="string"?ja(n):n,p=Ea(u.pathname||"/",r);if(p==null)return null;let g=bp(i);em(g);let y=null;for(let h=0;y==null&&h<g.length;++h){let v=cm(p);y=dm(g[h],v,d)}return y}function Jh(i,n){let{route:r,pathname:d,params:u}=i;return{id:r.id,pathname:d,params:u,data:n[r.id],handle:r.handle}}function bp(i,n,r,d){n===void 0&&(n=[]),r===void 0&&(r=[]),d===void 0&&(d="");let u=(p,g,y)=>{let h={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};h.relativePath.startsWith("/")&&(ke(h.relativePath.startsWith(d),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+d+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(d.length));let v=Da([d,h.relativePath]),k=r.concat(h);p.children&&p.children.length>0&&(ke(p.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+v+'".')),bp(p.children,n,k,v)),!(p.path==null&&!p.index)&&n.push({path:v,score:rm(v,p.index),routesMeta:k})};return i.forEach((p,g)=>{var y;if(p.path===""||!((y=p.path)!=null&&y.includes("?")))u(p,g);else for(let h of Pp(p.path))u(p,g,h)}),n}function Pp(i){let n=i.split("/");if(n.length===0)return[];let[r,...d]=n,u=r.endsWith("?"),p=r.replace(/\?$/,"");if(d.length===0)return u?[p,""]:[p];let g=Pp(d.join("/")),y=[];return y.push(...g.map(h=>h===""?p:[p,h].join("/"))),u&&y.push(...g),y.map(h=>i.startsWith("/")&&h===""?"/":h)}function em(i){i.sort((n,r)=>n.score!==r.score?r.score-n.score:lm(n.routesMeta.map(d=>d.childrenIndex),r.routesMeta.map(d=>d.childrenIndex)))}const tm=/^:[\w-]+$/,am=3,om=2,im=1,sm=10,nm=-2,Hc=i=>i==="*";function rm(i,n){let r=i.split("/"),d=r.length;return r.some(Hc)&&(d+=nm),n&&(d+=om),r.filter(u=>!Hc(u)).reduce((u,p)=>u+(tm.test(p)?am:p===""?im:sm),d)}function lm(i,n){return i.length===n.length&&i.slice(0,-1).every((d,u)=>d===n[u])?i[i.length-1]-n[n.length-1]:0}function dm(i,n,r){r===void 0&&(r=!1);let{routesMeta:d}=i,u={},p="/",g=[];for(let y=0;y<d.length;++y){let h=d[y],v=y===d.length-1,k=p==="/"?n:n.slice(p.length)||"/",b=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:v},k),D=h.route;if(!b&&v&&r&&!d[d.length-1].route.index&&(b=jn({path:h.relativePath,caseSensitive:h.caseSensitive,end:!1},k)),!b)return null;Object.assign(u,b.params),g.push({params:u,pathname:Da([p,b.pathname]),pathnameBase:mm(Da([p,b.pathnameBase])),route:D}),b.pathnameBase!=="/"&&(p=Da([p,b.pathnameBase]))}return g}function jn(i,n){typeof i=="string"&&(i={path:i,caseSensitive:!1,end:!0});let[r,d]=um(i.path,i.caseSensitive,i.end),u=n.match(r);if(!u)return null;let p=u[0],g=p.replace(/(.)\/+$/,"$1"),y=u.slice(1);return{params:d.reduce((v,k,b)=>{let{paramName:D,isOptional:U}=k;if(D==="*"){let z=y[b]||"";g=p.slice(0,p.length-z.length).replace(/(.)\/+$/,"$1")}const B=y[b];return U&&!B?v[D]=void 0:v[D]=(B||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:i}}function um(i,n,r){n===void 0&&(n=!1),r===void 0&&(r=!0),ro(i==="*"||!i.endsWith("*")||i.endsWith("/*"),'Route path "'+i+'" will be treated as if it were '+('"'+i.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+i.replace(/\*$/,"/*")+'".'));let d=[],u="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,y,h)=>(d.push({paramName:y,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return i.endsWith("*")?(d.push({paramName:"*"}),u+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":i!==""&&i!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,n?void 0:"i"),d]}function cm(i){try{return i.split("/").map(n=>decodeURIComponent(n).replace(/\//g,"%2F")).join("/")}catch(n){return ro(!1,'The URL path "'+i+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+n+").")),i}}function Ea(i,n){if(n==="/")return i;if(!i.toLowerCase().startsWith(n.toLowerCase()))return null;let r=n.endsWith("/")?n.length-1:n.length,d=i.charAt(r);return d&&d!=="/"?null:i.slice(r)||"/"}const pm=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,gm=i=>pm.test(i);function hm(i,n){n===void 0&&(n="/");let{pathname:r,search:d="",hash:u=""}=typeof i=="string"?ja(i):i,p;if(r)if(gm(r))p=r;else{if(r.includes("//")){let g=r;r=r.replace(/\/\/+/g,"/"),ro(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+r))}r.startsWith("/")?p=Mc(r.substring(1),"/"):p=Mc(r,n)}else p=n;return{pathname:p,search:ym(d),hash:fm(u)}}function Mc(i,n){let r=n.replace(/\/+$/,"").split("/");return i.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function Rl(i,n,r,d){return"Cannot include a '"+i+"' character in a manually specified "+("`to."+n+"` field ["+JSON.stringify(d)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function kp(i){return i.filter((n,r)=>r===0||n.route.path&&n.route.path.length>0)}function zn(i,n){let r=kp(i);return n?r.map((d,u)=>u===r.length-1?d.pathname:d.pathnameBase):r.map(d=>d.pathnameBase)}function Hn(i,n,r,d){d===void 0&&(d=!1);let u;typeof i=="string"?u=ja(i):(u=Xe({},i),ke(!u.pathname||!u.pathname.includes("?"),Rl("?","pathname","search",u)),ke(!u.pathname||!u.pathname.includes("#"),Rl("#","pathname","hash",u)),ke(!u.search||!u.search.includes("#"),Rl("#","search","hash",u)));let p=i===""||u.pathname==="",g=p?"/":u.pathname,y;if(g==null)y=r;else{let b=n.length-1;if(!d&&g.startsWith("..")){let D=g.split("/");for(;D[0]==="..";)D.shift(),b-=1;u.pathname=D.join("/")}y=b>=0?n[b]:"/"}let h=hm(u,y),v=g&&g!=="/"&&g.endsWith("/"),k=(p||g===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(v||k)&&(h.pathname+="/"),h}const Da=i=>i.join("/").replace(/\/\/+/g,"/"),mm=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),ym=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,fm=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i;class Tn{constructor(n,r,d,u){u===void 0&&(u=!1),this.status=n,this.statusText=r||"",this.internal=u,d instanceof Error?(this.data=d.toString(),this.error=d):this.data=d}}function ls(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}const wp=["post","put","patch","delete"],Sm=new Set(wp),vm=["get",...wp],bm=new Set(vm),Pm=new Set([301,302,303,307,308]),km=new Set([307,308]),Il={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},wm={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},as={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Kl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Cm=i=>({hasErrorBoundary:!!i.hasErrorBoundary}),Cp="remix-router-transitions";function Am(i){const n=i.window?i.window:typeof window<"u"?window:void 0,r=typeof n<"u"&&typeof n.document<"u"&&typeof n.document.createElement<"u",d=!r;ke(i.routes.length>0,"You must provide a non-empty routes array to createRouter");let u;if(i.mapRouteProperties)u=i.mapRouteProperties;else if(i.detectErrorBoundary){let f=i.detectErrorBoundary;u=A=>({hasErrorBoundary:f(A)})}else u=Cm;let p={},g=En(i.routes,u,void 0,p),y,h=i.basename||"/",v=i.dataStrategy||Dm,k=i.patchRoutesOnNavigation,b=Xe({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},i.future),D=null,U=new Set,B=null,z=null,N=null,le=i.hydrationData!=null,W=Io(g,i.history.location,h),ae=!1,Y=null;if(W==null&&!k){let f=jt(404,{pathname:i.history.location.pathname}),{matches:A,route:T}=Kc(g);W=A,Y={[T.id]:f}}W&&!i.hydrationData&&co(W,g,i.history.location.pathname).active&&(W=null);let pe;if(W)if(W.some(f=>f.route.lazy))pe=!1;else if(!W.some(f=>f.route.loader))pe=!0;else if(b.v7_partialHydration){let f=i.hydrationData?i.hydrationData.loaderData:null,A=i.hydrationData?i.hydrationData.errors:null;if(A){let T=W.findIndex(H=>A[H.route.id]!==void 0);pe=W.slice(0,T+1).every(H=>!Ol(H.route,f,A))}else pe=W.every(T=>!Ol(T.route,f,A))}else pe=i.hydrationData!=null;else if(pe=!1,W=[],b.v7_partialHydration){let f=co(null,g,i.history.location.pathname);f.active&&f.matches&&(ae=!0,W=f.matches)}let De,E={historyAction:i.history.action,location:i.history.location,matches:W,initialized:pe,navigation:Il,restoreScrollPosition:i.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:i.hydrationData&&i.hydrationData.loaderData||{},actionData:i.hydrationData&&i.hydrationData.actionData||null,errors:i.hydrationData&&i.hydrationData.errors||Y,fetchers:new Map,blockers:new Map},X=st.Pop,Se=!1,ce,Te=!1,we=new Map,Ce=null,Me=!1,et=!1,at=[],Oe=new Set,_=new Map,de=0,K=-1,C=new Map,L=new Set,ye=new Map,F=new Map,oe=new Set,ue=new Map,Pe=new Map,Ae;function Ue(){if(D=i.history.listen(f=>{let{action:A,location:T,delta:H}=f;if(Ae){Ae(),Ae=void 0;return}ro(Pe.size===0||H!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let G=Oo({currentLocation:E.location,nextLocation:T,historyAction:A});if(G&&H!=null){let re=new Promise(me=>{Ae=me});i.history.go(H*-1),Ma(G,{state:"blocked",location:T,proceed(){Ma(G,{state:"proceeding",proceed:void 0,reset:void 0,location:T}),re.then(()=>i.history.go(H))},reset(){let me=new Map(E.blockers);me.set(G,as),dt({blockers:me})}});return}return sa(A,T)}),r){Wm(n,we);let f=()=>Fm(n,we);n.addEventListener("pagehide",f),Ce=()=>n.removeEventListener("pagehide",f)}return E.initialized||sa(st.Pop,E.location,{initialHydration:!0}),De}function gt(){D&&D(),Ce&&Ce(),U.clear(),ce&&ce.abort(),E.fetchers.forEach((f,A)=>ra(A)),E.blockers.forEach((f,A)=>Mo(A))}function ya(f){return U.add(f),()=>U.delete(f)}function dt(f,A){A===void 0&&(A={}),E=Xe({},E,f);let T=[],H=[];b.v7_fetcherPersist&&E.fetchers.forEach((G,re)=>{G.state==="idle"&&(oe.has(re)?H.push(re):T.push(re))}),oe.forEach(G=>{!E.fetchers.has(G)&&!_.has(G)&&H.push(G)}),[...U].forEach(G=>G(E,{deletedFetchers:H,viewTransitionOpts:A.viewTransitionOpts,flushSync:A.flushSync===!0})),b.v7_fetcherPersist?(T.forEach(G=>E.fetchers.delete(G)),H.forEach(G=>ra(G))):H.forEach(G=>oe.delete(G))}function Gt(f,A,T){var H,G;let{flushSync:re}=T===void 0?{}:T,me=E.actionData!=null&&E.navigation.formMethod!=null&&ia(E.navigation.formMethod)&&E.navigation.state==="loading"&&((H=f.state)==null?void 0:H._isRedirect)!==!0,ee;A.actionData?Object.keys(A.actionData).length>0?ee=A.actionData:ee=null:me?ee=E.actionData:ee=null;let ie=A.loaderData?Yc(E.loaderData,A.loaderData,A.matches||[],A.errors):E.loaderData,Q=E.blockers;Q.size>0&&(Q=new Map(Q),Q.forEach((Re,nt)=>Q.set(nt,as)));let J=Se===!0||E.navigation.formMethod!=null&&ia(E.navigation.formMethod)&&((G=f.state)==null?void 0:G._isRedirect)!==!0;y&&(g=y,y=void 0),Me||X===st.Pop||(X===st.Push?i.history.push(f,f.state):X===st.Replace&&i.history.replace(f,f.state));let ve;if(X===st.Pop){let Re=we.get(E.location.pathname);Re&&Re.has(f.pathname)?ve={currentLocation:E.location,nextLocation:f}:we.has(f.pathname)&&(ve={currentLocation:f,nextLocation:E.location})}else if(Te){let Re=we.get(E.location.pathname);Re?Re.add(f.pathname):(Re=new Set([f.pathname]),we.set(E.location.pathname,Re)),ve={currentLocation:E.location,nextLocation:f}}dt(Xe({},A,{actionData:ee,loaderData:ie,historyAction:X,location:f,initialized:!0,navigation:Il,revalidation:"idle",restoreScrollPosition:bi(f,A.matches||E.matches),preventScrollReset:J,blockers:Q}),{viewTransitionOpts:ve,flushSync:re===!0}),X=st.Pop,Se=!1,Te=!1,Me=!1,et=!1,at=[]}async function Lo(f,A){if(typeof f=="number"){i.history.go(f);return}let T=Ml(E.location,E.matches,h,b.v7_prependBasename,f,b.v7_relativeSplatPath,A==null?void 0:A.fromRouteId,A==null?void 0:A.relative),{path:H,submission:G,error:re}=Oc(b.v7_normalizeFormMethod,!1,T,A),me=E.location,ee=rs(E.location,H,A&&A.state);ee=Xe({},ee,i.history.encodeLocation(ee));let ie=A&&A.replace!=null?A.replace:void 0,Q=st.Push;ie===!0?Q=st.Replace:ie===!1||G!=null&&ia(G.formMethod)&&G.formAction===E.location.pathname+E.location.search&&(Q=st.Replace);let J=A&&"preventScrollReset"in A?A.preventScrollReset===!0:void 0,ve=(A&&A.flushSync)===!0,Re=Oo({currentLocation:me,nextLocation:ee,historyAction:Q});if(Re){Ma(Re,{state:"blocked",location:ee,proceed(){Ma(Re,{state:"proceeding",proceed:void 0,reset:void 0,location:ee}),Lo(f,A)},reset(){let nt=new Map(E.blockers);nt.set(Re,as),dt({blockers:nt})}});return}return await sa(Q,ee,{submission:G,pendingError:re,preventScrollReset:J,replace:A&&A.replace,enableViewTransition:A&&A.viewTransition,flushSync:ve})}function ps(){if(uo(),dt({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){sa(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}sa(X||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation,enableViewTransition:Te===!0})}}async function sa(f,A,T){ce&&ce.abort(),ce=null,X=f,Me=(T&&T.startUninterruptedRevalidation)===!0,fs(E.location,E.matches),Se=(T&&T.preventScrollReset)===!0,Te=(T&&T.enableViewTransition)===!0;let H=y||g,G=T&&T.overrideNavigation,re=T!=null&&T.initialHydration&&E.matches&&E.matches.length>0&&!ae?E.matches:Io(H,A,h),me=(T&&T.flushSync)===!0;if(re&&E.initialized&&!et&&zm(E.location,A)&&!(T&&T.submission&&ia(T.submission.formMethod))){Gt(A,{matches:re},{flushSync:me});return}let ee=co(re,H,A.pathname);if(ee.active&&ee.matches&&(re=ee.matches),!re){let{error:Ne,notFoundMatches:Ee,route:Ye}=la(A.pathname);Gt(A,{matches:Ee,loaderData:{},errors:{[Ye.id]:Ne}},{flushSync:me});return}ce=new AbortController;let ie=li(i.history,A,ce.signal,T&&T.submission),Q;if(T&&T.pendingError)Q=[Do(re).route.id,{type:qe.error,error:T.pendingError}];else if(T&&T.submission&&ia(T.submission.formMethod)){let Ne=await hi(ie,A,T.submission,re,ee.active,{replace:T.replace,flushSync:me});if(Ne.shortCircuited)return;if(Ne.pendingActionResult){let[Ee,Ye]=Ne.pendingActionResult;if(Mt(Ye)&&ls(Ye.error)&&Ye.error.status===404){ce=null,Gt(A,{matches:Ne.matches,loaderData:{},errors:{[Ee]:Ye.error}});return}}re=Ne.matches||re,Q=Ne.pendingActionResult,G=Dl(A,T.submission),me=!1,ee.active=!1,ie=li(i.history,ie.url,ie.signal)}let{shortCircuited:J,matches:ve,loaderData:Re,errors:nt}=await gs(ie,A,re,ee.active,G,T&&T.submission,T&&T.fetcherSubmission,T&&T.replace,T&&T.initialHydration===!0,me,Q);J||(ce=null,Gt(A,Xe({matches:ve||re},Gc(Q),{loaderData:Re,errors:nt})))}async function hi(f,A,T,H,G,re){re===void 0&&(re={}),uo();let me=qm(A,T);if(dt({navigation:me},{flushSync:re.flushSync===!0}),G){let Q=await Oa(H,A.pathname,f.signal);if(Q.type==="aborted")return{shortCircuited:!0};if(Q.type==="error"){let J=Do(Q.partialMatches).route.id;return{matches:Q.partialMatches,pendingActionResult:[J,{type:qe.error,error:Q.error}]}}else if(Q.matches)H=Q.matches;else{let{notFoundMatches:J,error:ve,route:Re}=la(A.pathname);return{matches:J,pendingActionResult:[Re.id,{type:qe.error,error:ve}]}}}let ee,ie=ns(H,A);if(!ie.route.action&&!ie.route.lazy)ee={type:qe.error,error:jt(405,{method:f.method,pathname:A.pathname,routeId:ie.route.id})};else if(ee=(await za("action",E,f,[ie],H,null))[ie.route.id],f.signal.aborted)return{shortCircuited:!0};if(Eo(ee)){let Q;return re&&re.replace!=null?Q=re.replace:Q=Wc(ee.response.headers.get("Location"),new URL(f.url),h,i.history)===E.location.pathname+E.location.search,await na(f,ee,!0,{submission:T,replace:Q}),{shortCircuited:!0}}if(no(ee))throw jt(400,{type:"defer-action"});if(Mt(ee)){let Q=Do(H,ie.route.id);return(re&&re.replace)!==!0&&(X=st.Push),{matches:H,pendingActionResult:[Q.route.id,ee]}}return{matches:H,pendingActionResult:[ie.route.id,ee]}}async function gs(f,A,T,H,G,re,me,ee,ie,Q,J){let ve=G||Dl(A,re),Re=re||me||Xc(ve),nt=!Me&&(!b.v7_partialHydration||!ie);if(H){if(nt){let Be=zo(J);dt(Xe({navigation:ve},Be!==void 0?{actionData:Be}:{}),{flushSync:Q})}let Ie=await Oa(T,A.pathname,f.signal);if(Ie.type==="aborted")return{shortCircuited:!0};if(Ie.type==="error"){let Be=Do(Ie.partialMatches).route.id;return{matches:Ie.partialMatches,loaderData:{},errors:{[Be]:Ie.error}}}else if(Ie.matches)T=Ie.matches;else{let{error:Be,notFoundMatches:ht,route:ho}=la(A.pathname);return{matches:ht,loaderData:{},errors:{[ho.id]:Be}}}}let Ne=y||g,[Ee,Ye]=_c(i.history,E,T,Re,A,b.v7_partialHydration&&ie===!0,b.v7_skipActionErrorRevalidation,et,at,Oe,oe,ye,L,Ne,h,J);if(da(Ie=>!(T&&T.some(Be=>Be.route.id===Ie))||Ee&&Ee.some(Be=>Be.route.id===Ie)),K=++de,Ee.length===0&&Ye.length===0){let Ie=ms();return Gt(A,Xe({matches:T,loaderData:{},errors:J&&Mt(J[1])?{[J[0]]:J[1].error}:null},Gc(J),Ie?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Q}),{shortCircuited:!0}}if(nt){let Ie={};if(!H){Ie.navigation=ve;let Be=zo(J);Be!==void 0&&(Ie.actionData=Be)}Ye.length>0&&(Ie.fetchers=lo(Ye)),dt(Ie,{flushSync:Q})}Ye.forEach(Ie=>{Kt(Ie.key),Ie.controller&&_.set(Ie.key,Ie.controller)});let fa=()=>Ye.forEach(Ie=>Kt(Ie.key));ce&&ce.signal.addEventListener("abort",fa);let{loaderResults:go,fetcherResults:$t}=await yi(E,T,Ee,Ye,f);if(f.signal.aborted)return{shortCircuited:!0};ce&&ce.signal.removeEventListener("abort",fa),Ye.forEach(Ie=>_.delete(Ie.key));let Le=An(go);if(Le)return await na(f,Le.result,!0,{replace:ee}),{shortCircuited:!0};if(Le=An($t),Le)return L.add(Le.key),await na(f,Le.result,!0,{replace:ee}),{shortCircuited:!0};let{loaderData:Pi,errors:Sa}=Vc(E,T,go,J,Ye,$t,ue);ue.forEach((Ie,Be)=>{Ie.subscribe(ht=>{(ht||Ie.done)&&ue.delete(Be)})}),b.v7_partialHydration&&ie&&E.errors&&(Sa=Xe({},E.errors,Sa));let ua=ms(),va=Ho(K),No=ua||va||Ye.length>0;return Xe({matches:T,loaderData:Pi,errors:Sa},No?{fetchers:new Map(E.fetchers)}:{})}function zo(f){if(f&&!Mt(f[1]))return{[f[0]]:f[1].data};if(E.actionData)return Object.keys(E.actionData).length===0?null:E.actionData}function lo(f){return f.forEach(A=>{let T=E.fetchers.get(A.key),H=os(void 0,T?T.data:void 0);E.fetchers.set(A.key,H)}),new Map(E.fetchers)}function La(f,A,T,H){if(d)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Kt(f);let G=(H&&H.flushSync)===!0,re=y||g,me=Ml(E.location,E.matches,h,b.v7_prependBasename,T,b.v7_relativeSplatPath,A,H==null?void 0:H.relative),ee=Io(re,me,h),ie=co(ee,re,me);if(ie.active&&ie.matches&&(ee=ie.matches),!ee){Ot(f,A,jt(404,{pathname:me}),{flushSync:G});return}let{path:Q,submission:J,error:ve}=Oc(b.v7_normalizeFormMethod,!0,me,H);if(ve){Ot(f,A,ve,{flushSync:G});return}let Re=ns(ee,Q),nt=(H&&H.preventScrollReset)===!0;if(J&&ia(J.formMethod)){mi(f,A,Q,Re,ee,ie.active,G,nt,J);return}ye.set(f,{routeId:A,path:Q}),hs(f,A,Q,Re,ee,ie.active,G,nt,J)}async function mi(f,A,T,H,G,re,me,ee,ie){uo(),ye.delete(f);function Q(ze){if(!ze.route.action&&!ze.route.lazy){let Na=jt(405,{method:ie.formMethod,pathname:T,routeId:A});return Ot(f,A,Na,{flushSync:me}),!0}return!1}if(!re&&Q(H))return;let J=E.fetchers.get(f);Tt(f,Bm(ie,J),{flushSync:me});let ve=new AbortController,Re=li(i.history,T,ve.signal,ie);if(re){let ze=await Oa(G,new URL(Re.url).pathname,Re.signal,f);if(ze.type==="aborted")return;if(ze.type==="error"){Ot(f,A,ze.error,{flushSync:me});return}else if(ze.matches){if(G=ze.matches,H=ns(G,T),Q(H))return}else{Ot(f,A,jt(404,{pathname:T}),{flushSync:me});return}}_.set(f,ve);let nt=de,Ee=(await za("action",E,Re,[H],G,f))[H.route.id];if(Re.signal.aborted){_.get(f)===ve&&_.delete(f);return}if(b.v7_fetcherPersist&&oe.has(f)){if(Eo(Ee)||Mt(Ee)){Tt(f,so(void 0));return}}else{if(Eo(Ee))if(_.delete(f),K>nt){Tt(f,so(void 0));return}else return L.add(f),Tt(f,os(ie)),na(Re,Ee,!1,{fetcherSubmission:ie,preventScrollReset:ee});if(Mt(Ee)){Ot(f,A,Ee.error);return}}if(no(Ee))throw jt(400,{type:"defer-action"});let Ye=E.navigation.location||E.location,fa=li(i.history,Ye,ve.signal),go=y||g,$t=E.navigation.state!=="idle"?Io(go,E.navigation.location,h):E.matches;ke($t,"Didn't find any matches after fetcher action");let Le=++de;C.set(f,Le);let Pi=os(ie,Ee.data);E.fetchers.set(f,Pi);let[Sa,ua]=_c(i.history,E,$t,ie,Ye,!1,b.v7_skipActionErrorRevalidation,et,at,Oe,oe,ye,L,go,h,[H.route.id,Ee]);ua.filter(ze=>ze.key!==f).forEach(ze=>{let Na=ze.key,vs=E.fetchers.get(Na),Bn=os(void 0,vs?vs.data:void 0);E.fetchers.set(Na,Bn),Kt(Na),ze.controller&&_.set(Na,ze.controller)}),dt({fetchers:new Map(E.fetchers)});let va=()=>ua.forEach(ze=>Kt(ze.key));ve.signal.addEventListener("abort",va);let{loaderResults:No,fetcherResults:Ie}=await yi(E,$t,Sa,ua,fa);if(ve.signal.aborted)return;ve.signal.removeEventListener("abort",va),C.delete(f),_.delete(f),ua.forEach(ze=>_.delete(ze.key));let Be=An(No);if(Be)return na(fa,Be.result,!1,{preventScrollReset:ee});if(Be=An(Ie),Be)return L.add(Be.key),na(fa,Be.result,!1,{preventScrollReset:ee});let{loaderData:ht,errors:ho}=Vc(E,$t,No,void 0,ua,Ie,ue);if(E.fetchers.has(f)){let ze=so(Ee.data);E.fetchers.set(f,ze)}Ho(Le),E.navigation.state==="loading"&&Le>K?(ke(X,"Expected pending action"),ce&&ce.abort(),Gt(E.navigation.location,{matches:$t,loaderData:ht,errors:ho,fetchers:new Map(E.fetchers)})):(dt({errors:ho,loaderData:Yc(E.loaderData,ht,$t,ho),fetchers:new Map(E.fetchers)}),et=!1)}async function hs(f,A,T,H,G,re,me,ee,ie){let Q=E.fetchers.get(f);Tt(f,os(ie,Q?Q.data:void 0),{flushSync:me});let J=new AbortController,ve=li(i.history,T,J.signal);if(re){let Ee=await Oa(G,new URL(ve.url).pathname,ve.signal,f);if(Ee.type==="aborted")return;if(Ee.type==="error"){Ot(f,A,Ee.error,{flushSync:me});return}else if(Ee.matches)G=Ee.matches,H=ns(G,T);else{Ot(f,A,jt(404,{pathname:T}),{flushSync:me});return}}_.set(f,J);let Re=de,Ne=(await za("loader",E,ve,[H],G,f))[H.route.id];if(no(Ne)&&(Ne=await $l(Ne,ve.signal,!0)||Ne),_.get(f)===J&&_.delete(f),!ve.signal.aborted){if(oe.has(f)){Tt(f,so(void 0));return}if(Eo(Ne))if(K>Re){Tt(f,so(void 0));return}else{L.add(f),await na(ve,Ne,!1,{preventScrollReset:ee});return}if(Mt(Ne)){Ot(f,A,Ne.error);return}ke(!no(Ne),"Unhandled fetcher deferred data"),Tt(f,so(Ne.data))}}async function na(f,A,T,H){let{submission:G,fetcherSubmission:re,preventScrollReset:me,replace:ee}=H===void 0?{}:H;A.response.headers.has("X-Remix-Revalidate")&&(et=!0);let ie=A.response.headers.get("Location");ke(ie,"Expected a Location header on the redirect Response"),ie=Wc(ie,new URL(f.url),h,i.history);let Q=rs(E.location,ie,{_isRedirect:!0});if(r){let Ee=!1;if(A.response.headers.has("X-Remix-Reload-Document"))Ee=!0;else if(Kl.test(ie)){const Ye=i.history.createURL(ie);Ee=Ye.origin!==n.location.origin||Ea(Ye.pathname,h)==null}if(Ee){ee?n.location.replace(ie):n.location.assign(ie);return}}ce=null;let J=ee===!0||A.response.headers.has("X-Remix-Replace")?st.Replace:st.Push,{formMethod:ve,formAction:Re,formEncType:nt}=E.navigation;!G&&!re&&ve&&Re&&nt&&(G=Xc(E.navigation));let Ne=G||re;if(km.has(A.response.status)&&Ne&&ia(Ne.formMethod))await sa(J,Q,{submission:Xe({},Ne,{formAction:ie}),preventScrollReset:me||Se,enableViewTransition:T?Te:void 0});else{let Ee=Dl(Q,G);await sa(J,Q,{overrideNavigation:Ee,fetcherSubmission:re,preventScrollReset:me||Se,enableViewTransition:T?Te:void 0})}}async function za(f,A,T,H,G,re){let me,ee={};try{me=await Em(v,f,A,T,H,G,re,p,u)}catch(ie){return H.forEach(Q=>{ee[Q.route.id]={type:qe.error,error:ie}}),ee}for(let[ie,Q]of Object.entries(me))if(Hm(Q)){let J=Q.result;ee[ie]={type:qe.redirect,response:Um(J,T,ie,G,h,b.v7_relativeSplatPath)}}else ee[ie]=await Tm(Q);return ee}async function yi(f,A,T,H,G){let re=f.matches,me=za("loader",f,G,T,A,null),ee=Promise.all(H.map(async J=>{if(J.matches&&J.match&&J.controller){let Re=(await za("loader",f,li(i.history,J.path,J.controller.signal),[J.match],J.matches,J.key))[J.match.route.id];return{[J.key]:Re}}else return Promise.resolve({[J.key]:{type:qe.error,error:jt(404,{pathname:J.path})}})})),ie=await me,Q=(await ee).reduce((J,ve)=>Object.assign(J,ve),{});return await Promise.all([Nm(A,ie,G.signal,re,f.loaderData),_m(A,Q,H)]),{loaderResults:ie,fetcherResults:Q}}function uo(){et=!0,at.push(...da()),ye.forEach((f,A)=>{_.has(A)&&Oe.add(A),Kt(A)})}function Tt(f,A,T){T===void 0&&(T={}),E.fetchers.set(f,A),dt({fetchers:new Map(E.fetchers)},{flushSync:(T&&T.flushSync)===!0})}function Ot(f,A,T,H){H===void 0&&(H={});let G=Do(E.matches,A);ra(f),dt({errors:{[G.route.id]:T},fetchers:new Map(E.fetchers)},{flushSync:(H&&H.flushSync)===!0})}function Ha(f){return F.set(f,(F.get(f)||0)+1),oe.has(f)&&oe.delete(f),E.fetchers.get(f)||wm}function ra(f){let A=E.fetchers.get(f);_.has(f)&&!(A&&A.state==="loading"&&C.has(f))&&Kt(f),ye.delete(f),C.delete(f),L.delete(f),b.v7_fetcherPersist&&oe.delete(f),Oe.delete(f),E.fetchers.delete(f)}function qn(f){let A=(F.get(f)||0)-1;A<=0?(F.delete(f),oe.add(f),b.v7_fetcherPersist||ra(f)):F.set(f,A),dt({fetchers:new Map(E.fetchers)})}function Kt(f){let A=_.get(f);A&&(A.abort(),_.delete(f))}function fi(f){for(let A of f){let T=Ha(A),H=so(T.data);E.fetchers.set(A,H)}}function ms(){let f=[],A=!1;for(let T of L){let H=E.fetchers.get(T);ke(H,"Expected fetcher: "+T),H.state==="loading"&&(L.delete(T),f.push(T),A=!0)}return fi(f),A}function Ho(f){let A=[];for(let[T,H]of C)if(H<f){let G=E.fetchers.get(T);ke(G,"Expected fetcher: "+T),G.state==="loading"&&(Kt(T),C.delete(T),A.push(T))}return fi(A),A.length>0}function Si(f,A){let T=E.blockers.get(f)||as;return Pe.get(f)!==A&&Pe.set(f,A),T}function Mo(f){E.blockers.delete(f),Pe.delete(f)}function Ma(f,A){let T=E.blockers.get(f)||as;ke(T.state==="unblocked"&&A.state==="blocked"||T.state==="blocked"&&A.state==="blocked"||T.state==="blocked"&&A.state==="proceeding"||T.state==="blocked"&&A.state==="unblocked"||T.state==="proceeding"&&A.state==="unblocked","Invalid blocker state transition: "+T.state+" -> "+A.state);let H=new Map(E.blockers);H.set(f,A),dt({blockers:H})}function Oo(f){let{currentLocation:A,nextLocation:T,historyAction:H}=f;if(Pe.size===0)return;Pe.size>1&&ro(!1,"A router only supports one blocker at a time");let G=Array.from(Pe.entries()),[re,me]=G[G.length-1],ee=E.blockers.get(re);if(!(ee&&ee.state==="proceeding")&&me({currentLocation:A,nextLocation:T,historyAction:H}))return re}function la(f){let A=jt(404,{pathname:f}),T=y||g,{matches:H,route:G}=Kc(T);return da(),{notFoundMatches:H,route:G,error:A}}function da(f){let A=[];return ue.forEach((T,H)=>{(!f||f(H))&&(T.cancel(),A.push(H),ue.delete(H))}),A}function ys(f,A,T){if(B=f,N=A,z=T||null,!le&&E.navigation===Il){le=!0;let H=bi(E.location,E.matches);H!=null&&dt({restoreScrollPosition:H})}return()=>{B=null,N=null,z=null}}function vi(f,A){return z&&z(f,A.map(H=>Jh(H,E.loaderData)))||f.key}function fs(f,A){if(B&&N){let T=vi(f,A);B[T]=N()}}function bi(f,A){if(B){let T=vi(f,A),H=B[T];if(typeof H=="number")return H}return null}function co(f,A,T){if(k)if(f){if(Object.keys(f[0].params).length>0)return{active:!0,matches:Rn(A,T,h,!0)}}else return{active:!0,matches:Rn(A,T,h,!0)||[]};return{active:!1,matches:null}}async function Oa(f,A,T,H){if(!k)return{type:"success",matches:f};let G=f;for(;;){let re=y==null,me=y||g,ee=p;try{await k({signal:T,path:A,matches:G,fetcherKey:H,patch:(J,ve)=>{T.aborted||Bc(J,ve,me,ee,u)}})}catch(J){return{type:"error",error:J,partialMatches:G}}finally{re&&!T.aborted&&(g=[...g])}if(T.aborted)return{type:"aborted"};let ie=Io(me,A,h);if(ie)return{type:"success",matches:ie};let Q=Rn(me,A,h,!0);if(!Q||G.length===Q.length&&G.every((J,ve)=>J.route.id===Q[ve].route.id))return{type:"success",matches:null};G=Q}}function Ss(f){p={},y=En(f,u,void 0,p)}function po(f,A){let T=y==null;Bc(f,A,y||g,p,u),T&&(g=[...g],dt({}))}return De={get basename(){return h},get future(){return b},get state(){return E},get routes(){return g},get window(){return n},initialize:Ue,subscribe:ya,enableScrollRestoration:ys,navigate:Lo,fetch:La,revalidate:ps,createHref:f=>i.history.createHref(f),encodeLocation:f=>i.history.encodeLocation(f),getFetcher:Ha,deleteFetcher:qn,dispose:gt,getBlocker:Si,deleteBlocker:Mo,patchRoutes:po,_internalFetchControllers:_,_internalActiveDeferreds:ue,_internalSetRoutes:Ss},De}function xm(i){return i!=null&&("formData"in i&&i.formData!=null||"body"in i&&i.body!==void 0)}function Ml(i,n,r,d,u,p,g,y){let h,v;if(g){h=[];for(let b of n)if(h.push(b),b.route.id===g){v=b;break}}else h=n,v=n[n.length-1];let k=Hn(u||".",zn(h,p),Ea(i.pathname,r)||i.pathname,y==="path");if(u==null&&(k.search=i.search,k.hash=i.hash),(u==null||u===""||u===".")&&v){let b=Xl(k.search);if(v.route.index&&!b)k.search=k.search?k.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&b){let D=new URLSearchParams(k.search),U=D.getAll("index");D.delete("index"),U.filter(z=>z).forEach(z=>D.append("index",z));let B=D.toString();k.search=B?"?"+B:""}}return d&&r!=="/"&&(k.pathname=k.pathname==="/"?r:Da([r,k.pathname])),Uo(k)}function Oc(i,n,r,d){if(!d||!xm(d))return{path:r};if(d.formMethod&&!Om(d.formMethod))return{path:r,error:jt(405,{method:d.formMethod})};let u=()=>({path:r,error:jt(400,{type:"invalid-body"})}),p=d.formMethod||"get",g=i?p.toUpperCase():p.toLowerCase(),y=Rp(r);if(d.body!==void 0){if(d.formEncType==="text/plain"){if(!ia(g))return u();let D=typeof d.body=="string"?d.body:d.body instanceof FormData||d.body instanceof URLSearchParams?Array.from(d.body.entries()).reduce((U,B)=>{let[z,N]=B;return""+U+z+"="+N+`
|
|
51
|
-
`},""):String(d.body);return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:void 0,text:D}}}else if(d.formEncType==="application/json"){if(!ia(g))return u();try{let D=typeof d.body=="string"?JSON.parse(d.body):d.body;return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:D,text:void 0}}}catch{return u()}}}ke(typeof FormData=="function","FormData is not available in this environment");let h,v;if(d.formData)h=Nl(d.formData),v=d.formData;else if(d.body instanceof FormData)h=Nl(d.body),v=d.body;else if(d.body instanceof URLSearchParams)h=d.body,v=Fc(h);else if(d.body==null)h=new URLSearchParams,v=new FormData;else try{h=new URLSearchParams(d.body),v=Fc(h)}catch{return u()}let k={formMethod:g,formAction:y,formEncType:d&&d.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(ia(k.formMethod))return{path:r,submission:k};let b=ja(r);return n&&b.search&&Xl(b.search)&&h.append("index",""),b.search="?"+h,{path:Uo(b),submission:k}}function Nc(i,n,r){r===void 0&&(r=!1);let d=i.findIndex(u=>u.route.id===n);return d>=0?i.slice(0,r?d+1:d):i}function _c(i,n,r,d,u,p,g,y,h,v,k,b,D,U,B,z){let N=z?Mt(z[1])?z[1].error:z[1].data:void 0,le=i.createURL(n.location),W=i.createURL(u),ae=r;p&&n.errors?ae=Nc(r,Object.keys(n.errors)[0],!0):z&&Mt(z[1])&&(ae=Nc(r,z[0]));let Y=z?z[1].statusCode:void 0,pe=g&&Y&&Y>=400,De=ae.filter((X,Se)=>{let{route:ce}=X;if(ce.lazy)return!0;if(ce.loader==null)return!1;if(p)return Ol(ce,n.loaderData,n.errors);if(Rm(n.loaderData,n.matches[Se],X)||h.some(Ce=>Ce===X.route.id))return!0;let Te=n.matches[Se],we=X;return qc(X,Xe({currentUrl:le,currentParams:Te.params,nextUrl:W,nextParams:we.params},d,{actionResult:N,actionStatus:Y,defaultShouldRevalidate:pe?!1:y||le.pathname+le.search===W.pathname+W.search||le.search!==W.search||Ap(Te,we)}))}),E=[];return b.forEach((X,Se)=>{if(p||!r.some(Me=>Me.route.id===X.routeId)||k.has(Se))return;let ce=Io(U,X.path,B);if(!ce){E.push({key:Se,routeId:X.routeId,path:X.path,matches:null,match:null,controller:null});return}let Te=n.fetchers.get(Se),we=ns(ce,X.path),Ce=!1;D.has(Se)?Ce=!1:v.has(Se)?(v.delete(Se),Ce=!0):Te&&Te.state!=="idle"&&Te.data===void 0?Ce=y:Ce=qc(we,Xe({currentUrl:le,currentParams:n.matches[n.matches.length-1].params,nextUrl:W,nextParams:r[r.length-1].params},d,{actionResult:N,actionStatus:Y,defaultShouldRevalidate:pe?!1:y})),Ce&&E.push({key:Se,routeId:X.routeId,path:X.path,matches:ce,match:we,controller:new AbortController})}),[De,E]}function Ol(i,n,r){if(i.lazy)return!0;if(!i.loader)return!1;let d=n!=null&&n[i.id]!==void 0,u=r!=null&&r[i.id]!==void 0;return!d&&u?!1:typeof i.loader=="function"&&i.loader.hydrate===!0?!0:!d&&!u}function Rm(i,n,r){let d=!n||r.route.id!==n.route.id,u=i[r.route.id]===void 0;return d||u}function Ap(i,n){let r=i.route.path;return i.pathname!==n.pathname||r!=null&&r.endsWith("*")&&i.params["*"]!==n.params["*"]}function qc(i,n){if(i.route.shouldRevalidate){let r=i.route.shouldRevalidate(n);if(typeof r=="boolean")return r}return n.defaultShouldRevalidate}function Bc(i,n,r,d,u){var p;let g;if(i){let v=d[i];ke(v,"No route found to patch children into: routeId = "+i),v.children||(v.children=[]),g=v.children}else g=r;let y=n.filter(v=>!g.some(k=>xp(v,k))),h=En(y,u,[i||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],d);g.push(...h)}function xp(i,n){return"id"in i&&"id"in n&&i.id===n.id?!0:i.index===n.index&&i.path===n.path&&i.caseSensitive===n.caseSensitive?(!i.children||i.children.length===0)&&(!n.children||n.children.length===0)?!0:i.children.every((r,d)=>{var u;return(u=n.children)==null?void 0:u.some(p=>xp(r,p))}):!1}async function Im(i,n,r){if(!i.lazy)return;let d=await i.lazy();if(!i.lazy)return;let u=r[i.id];ke(u,"No route found in manifest");let p={};for(let g in d){let h=u[g]!==void 0&&g!=="hasErrorBoundary";ro(!h,'Route "'+u.id+'" has a static property "'+g+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+g+'" will be ignored.')),!h&&!Qh.has(g)&&(p[g]=d[g])}Object.assign(u,p),Object.assign(u,Xe({},n(u),{lazy:void 0}))}async function Dm(i){let{matches:n}=i,r=n.filter(u=>u.shouldLoad);return(await Promise.all(r.map(u=>u.resolve()))).reduce((u,p,g)=>Object.assign(u,{[r[g].route.id]:p}),{})}async function Em(i,n,r,d,u,p,g,y,h,v){let k=p.map(U=>U.route.lazy?Im(U.route,h,y):void 0),b=p.map((U,B)=>{let z=k[B],N=u.some(W=>W.route.id===U.route.id);return Xe({},U,{shouldLoad:N,resolve:async W=>(W&&d.method==="GET"&&(U.route.lazy||U.route.loader)&&(N=!0),N?jm(n,d,U,z,W,v):Promise.resolve({type:qe.data,result:void 0}))})}),D=await i({matches:b,request:d,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(k)}catch{}return D}async function jm(i,n,r,d,u,p){let g,y,h=v=>{let k,b=new Promise((B,z)=>k=z);y=()=>k(),n.signal.addEventListener("abort",y);let D=B=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+i+'" [routeId: '+r.route.id+"]"))):v({request:n,params:r.params,context:p},...B!==void 0?[B]:[]),U=(async()=>{try{return{type:"data",result:await(u?u(z=>D(z)):D())}}catch(B){return{type:"error",result:B}}})();return Promise.race([U,b])};try{let v=r.route[i];if(d)if(v){let k,[b]=await Promise.all([h(v).catch(D=>{k=D}),d]);if(k!==void 0)throw k;g=b}else if(await d,v=r.route[i],v)g=await h(v);else if(i==="action"){let k=new URL(n.url),b=k.pathname+k.search;throw jt(405,{method:n.method,pathname:b,routeId:r.route.id})}else return{type:qe.data,result:void 0};else if(v)g=await h(v);else{let k=new URL(n.url),b=k.pathname+k.search;throw jt(404,{pathname:b})}ke(g.result!==void 0,"You defined "+(i==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+i+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:qe.error,result:v}}finally{y&&n.signal.removeEventListener("abort",y)}return g}async function Tm(i){let{result:n,type:r}=i;if(Ip(n)){let b;try{let D=n.headers.get("Content-Type");D&&/\bapplication\/json\b/.test(D)?n.body==null?b=null:b=await n.json():b=await n.text()}catch(D){return{type:qe.error,error:D}}return r===qe.error?{type:qe.error,error:new Tn(n.status,n.statusText,b),statusCode:n.status,headers:n.headers}:{type:qe.data,data:b,statusCode:n.status,headers:n.headers}}if(r===qe.error){if($c(n)){var d,u;if(n.data instanceof Error){var p,g;return{type:qe.error,error:n.data,statusCode:(p=n.init)==null?void 0:p.status,headers:(g=n.init)!=null&&g.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:new Tn(((d=n.init)==null?void 0:d.status)||500,void 0,n.data),statusCode:ls(n)?n.status:void 0,headers:(u=n.init)!=null&&u.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:n,statusCode:ls(n)?n.status:void 0}}if(Mm(n)){var y,h;return{type:qe.deferred,deferredData:n,statusCode:(y=n.init)==null?void 0:y.status,headers:((h=n.init)==null?void 0:h.headers)&&new Headers(n.init.headers)}}if($c(n)){var v,k;return{type:qe.data,data:n.data,statusCode:(v=n.init)==null?void 0:v.status,headers:(k=n.init)!=null&&k.headers?new Headers(n.init.headers):void 0}}return{type:qe.data,data:n}}function Um(i,n,r,d,u,p){let g=i.headers.get("Location");if(ke(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Kl.test(g)){let y=d.slice(0,d.findIndex(h=>h.route.id===r)+1);g=Ml(new URL(n.url),y,u,!0,g,p),i.headers.set("Location",g)}return i}function Wc(i,n,r,d){let u=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Kl.test(i)){let p=i,g=p.startsWith("//")?new URL(n.protocol+p):new URL(p);if(u.includes(g.protocol))throw new Error("Invalid redirect location");let y=Ea(g.pathname,r)!=null;if(g.origin===n.origin&&y)return g.pathname+g.search+g.hash}try{let p=d.createURL(i);if(u.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return i}function li(i,n,r,d){let u=i.createURL(Rp(n)).toString(),p={signal:r};if(d&&ia(d.formMethod)){let{formMethod:g,formEncType:y}=d;p.method=g.toUpperCase(),y==="application/json"?(p.headers=new Headers({"Content-Type":y}),p.body=JSON.stringify(d.json)):y==="text/plain"?p.body=d.text:y==="application/x-www-form-urlencoded"&&d.formData?p.body=Nl(d.formData):p.body=d.formData}return new Request(u,p)}function Nl(i){let n=new URLSearchParams;for(let[r,d]of i.entries())n.append(r,typeof d=="string"?d:d.name);return n}function Fc(i){let n=new FormData;for(let[r,d]of i.entries())n.append(r,d);return n}function Lm(i,n,r,d,u){let p={},g=null,y,h=!1,v={},k=r&&Mt(r[1])?r[1].error:void 0;return i.forEach(b=>{if(!(b.route.id in n))return;let D=b.route.id,U=n[D];if(ke(!Eo(U),"Cannot handle redirect results in processLoaderData"),Mt(U)){let B=U.error;k!==void 0&&(B=k,k=void 0),g=g||{};{let z=Do(i,D);g[z.route.id]==null&&(g[z.route.id]=B)}p[D]=void 0,h||(h=!0,y=ls(U.error)?U.error.status:500),U.headers&&(v[D]=U.headers)}else no(U)?(d.set(D,U.deferredData),p[D]=U.deferredData.data,U.statusCode!=null&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers)):(p[D]=U.data,U.statusCode&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers))}),k!==void 0&&r&&(g={[r[0]]:k},p[r[0]]=void 0),{loaderData:p,errors:g,statusCode:y||200,loaderHeaders:v}}function Vc(i,n,r,d,u,p,g){let{loaderData:y,errors:h}=Lm(n,r,d,g);return u.forEach(v=>{let{key:k,match:b,controller:D}=v,U=p[k];if(ke(U,"Did not find corresponding fetcher result"),!(D&&D.signal.aborted))if(Mt(U)){let B=Do(i.matches,b==null?void 0:b.route.id);h&&h[B.route.id]||(h=Xe({},h,{[B.route.id]:U.error})),i.fetchers.delete(k)}else if(Eo(U))ke(!1,"Unhandled fetcher revalidation redirect");else if(no(U))ke(!1,"Unhandled fetcher deferred data");else{let B=so(U.data);i.fetchers.set(k,B)}}),{loaderData:y,errors:h}}function Yc(i,n,r,d){let u=Xe({},n);for(let p of r){let g=p.route.id;if(n.hasOwnProperty(g)?n[g]!==void 0&&(u[g]=n[g]):i[g]!==void 0&&p.route.loader&&(u[g]=i[g]),d&&d.hasOwnProperty(g))break}return u}function Gc(i){return i?Mt(i[1])?{actionData:{}}:{actionData:{[i[0]]:i[1].data}}:{}}function Do(i,n){return(n?i.slice(0,i.findIndex(d=>d.route.id===n)+1):[...i]).reverse().find(d=>d.route.hasErrorBoundary===!0)||i[0]}function Kc(i){let n=i.length===1?i[0]:i.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:n}],route:n}}function jt(i,n){let{pathname:r,routeId:d,method:u,type:p,message:g}=n===void 0?{}:n,y="Unknown Server Error",h="Unknown @remix-run/router error";return i===400?(y="Bad Request",u&&r&&d?h="You made a "+u+' request to "'+r+'" but '+('did not provide a `loader` for route "'+d+'", ')+"so there is no way to handle the request.":p==="defer-action"?h="defer() is not supported in actions":p==="invalid-body"&&(h="Unable to encode submission body")):i===403?(y="Forbidden",h='Route "'+d+'" does not match URL "'+r+'"'):i===404?(y="Not Found",h='No route matches URL "'+r+'"'):i===405&&(y="Method Not Allowed",u&&r&&d?h="You made a "+u.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+d+'", ')+"so there is no way to handle the request.":u&&(h='Invalid request method "'+u.toUpperCase()+'"')),new Tn(i||500,y,new Error(h),!0)}function An(i){let n=Object.entries(i);for(let r=n.length-1;r>=0;r--){let[d,u]=n[r];if(Eo(u))return{key:d,result:u}}}function Rp(i){let n=typeof i=="string"?ja(i):i;return Uo(Xe({},n,{hash:""}))}function zm(i,n){return i.pathname!==n.pathname||i.search!==n.search?!1:i.hash===""?n.hash!=="":i.hash===n.hash?!0:n.hash!==""}function Hm(i){return Ip(i.result)&&Pm.has(i.result.status)}function no(i){return i.type===qe.deferred}function Mt(i){return i.type===qe.error}function Eo(i){return(i&&i.type)===qe.redirect}function $c(i){return typeof i=="object"&&i!=null&&"type"in i&&"data"in i&&"init"in i&&i.type==="DataWithResponseInit"}function Mm(i){let n=i;return n&&typeof n=="object"&&typeof n.data=="object"&&typeof n.subscribe=="function"&&typeof n.cancel=="function"&&typeof n.resolveData=="function"}function Ip(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.headers=="object"&&typeof i.body<"u"}function Om(i){return bm.has(i.toLowerCase())}function ia(i){return Sm.has(i.toLowerCase())}async function Nm(i,n,r,d,u){let p=Object.entries(n);for(let g=0;g<p.length;g++){let[y,h]=p[g],v=i.find(D=>(D==null?void 0:D.route.id)===y);if(!v)continue;let k=d.find(D=>D.route.id===v.route.id),b=k!=null&&!Ap(k,v)&&(u&&u[v.route.id])!==void 0;no(h)&&b&&await $l(h,r,!1).then(D=>{D&&(n[y]=D)})}}async function _m(i,n,r){for(let d=0;d<r.length;d++){let{key:u,routeId:p,controller:g}=r[d],y=n[u];i.find(v=>(v==null?void 0:v.route.id)===p)&&no(y)&&(ke(g,"Expected an AbortController for revalidating fetcher deferred result"),await $l(y,g.signal,!0).then(v=>{v&&(n[u]=v)}))}}async function $l(i,n,r){if(r===void 0&&(r=!1),!await i.deferredData.resolveData(n)){if(r)try{return{type:qe.data,data:i.deferredData.unwrappedData}}catch(u){return{type:qe.error,error:u}}return{type:qe.data,data:i.deferredData.data}}}function Xl(i){return new URLSearchParams(i).getAll("index").some(n=>n==="")}function ns(i,n){let r=typeof n=="string"?ja(n).search:n.search;if(i[i.length-1].route.index&&Xl(r||""))return i[i.length-1];let d=kp(i);return d[d.length-1]}function Xc(i){let{formMethod:n,formAction:r,formEncType:d,text:u,formData:p,json:g}=i;if(!(!n||!r||!d)){if(u!=null)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:void 0,text:u};if(p!=null)return{formMethod:n,formAction:r,formEncType:d,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:g,text:void 0}}}function Dl(i,n){return n?{state:"loading",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}:{state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function qm(i,n){return{state:"submitting",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}}function os(i,n){return i?{state:"loading",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Bm(i,n){return{state:"submitting",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n?n.data:void 0}}function so(i){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function Wm(i,n){try{let r=i.sessionStorage.getItem(Cp);if(r){let d=JSON.parse(r);for(let[u,p]of Object.entries(d||{}))p&&Array.isArray(p)&&n.set(u,new Set(p||[]))}}catch{}}function Fm(i,n){if(n.size>0){let r={};for(let[d,u]of n)r[d]=[...u];try{i.sessionStorage.setItem(Cp,JSON.stringify(r))}catch(d){ro(!1,"Failed to save applied view transitions in sessionStorage ("+d+").")}}}/**
|
|
52
|
-
* React Router v6.30.3
|
|
53
|
-
*
|
|
54
|
-
* Copyright (c) Remix Software Inc.
|
|
55
|
-
*
|
|
56
|
-
* This source code is licensed under the MIT license found in the
|
|
57
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
58
|
-
*
|
|
59
|
-
* @license MIT
|
|
60
|
-
*/function Un(){return Un=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},Un.apply(this,arguments)}const ds=x.createContext(null),Ql=x.createContext(null),Ta=x.createContext(null),Zl=x.createContext(null),Ua=x.createContext({outlet:null,matches:[],isDataRoute:!1}),Dp=x.createContext(null);function Vm(i,n){let{relative:r}=n===void 0?{}:n;gi()||ke(!1);let{basename:d,navigator:u}=x.useContext(Ta),{hash:p,pathname:g,search:y}=On(i,{relative:r}),h=g;return d!=="/"&&(h=g==="/"?d:Da([d,g])),u.createHref({pathname:h,search:y,hash:p})}function gi(){return x.useContext(Zl)!=null}function Yt(){return gi()||ke(!1),x.useContext(Zl).location}function Ep(i){x.useContext(Ta).static||x.useLayoutEffect(i)}function Mn(){let{isDataRoute:i}=x.useContext(Ua);return i?sy():Ym()}function Ym(){gi()||ke(!1);let i=x.useContext(ds),{basename:n,future:r,navigator:d}=x.useContext(Ta),{matches:u}=x.useContext(Ua),{pathname:p}=Yt(),g=JSON.stringify(zn(u,r.v7_relativeSplatPath)),y=x.useRef(!1);return Ep(()=>{y.current=!0}),x.useCallback(function(v,k){if(k===void 0&&(k={}),!y.current)return;if(typeof v=="number"){d.go(v);return}let b=Hn(v,JSON.parse(g),p,k.relative==="path");i==null&&n!=="/"&&(b.pathname=b.pathname==="/"?n:Da([n,b.pathname])),(k.replace?d.replace:d.push)(b,k.state,k)},[n,d,g,p,i])}const Gm=x.createContext(null);function Km(i){let n=x.useContext(Ua).outlet;return n&&x.createElement(Gm.Provider,{value:i},n)}function On(i,n){let{relative:r}=n===void 0?{}:n,{future:d}=x.useContext(Ta),{matches:u}=x.useContext(Ua),{pathname:p}=Yt(),g=JSON.stringify(zn(u,d.v7_relativeSplatPath));return x.useMemo(()=>Hn(i,JSON.parse(g),p,r==="path"),[i,g,p,r])}function $m(i,n,r,d){gi()||ke(!1);let{navigator:u}=x.useContext(Ta),{matches:p}=x.useContext(Ua),g=p[p.length-1],y=g?g.params:{};g&&g.pathname;let h=g?g.pathnameBase:"/";g&&g.route;let v=Yt(),k;k=v;let b=k.pathname||"/",D=b;if(h!=="/"){let z=h.replace(/^\//,"").split("/");D="/"+b.replace(/^\//,"").split("/").slice(z.length).join("/")}let U=Io(i,{pathname:D});return ey(U&&U.map(z=>Object.assign({},z,{params:Object.assign({},y,z.params),pathname:Da([h,u.encodeLocation?u.encodeLocation(z.pathname).pathname:z.pathname]),pathnameBase:z.pathnameBase==="/"?h:Da([h,u.encodeLocation?u.encodeLocation(z.pathnameBase).pathname:z.pathnameBase])})),p,r,d)}function Xm(){let i=iy(),n=ls(i)?i.status+" "+i.statusText:i instanceof Error?i.message:JSON.stringify(i),r=i instanceof Error?i.stack:null,u={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return x.createElement(x.Fragment,null,x.createElement("h2",null,"Unexpected Application Error!"),x.createElement("h3",{style:{fontStyle:"italic"}},n),r?x.createElement("pre",{style:u},r):null,null)}const Qm=x.createElement(Xm,null);class Zm extends x.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,r){return r.location!==n.location||r.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:r.error,location:r.location,revalidation:n.revalidation||r.revalidation}}componentDidCatch(n,r){console.error("React Router caught the following error during render",n,r)}render(){return this.state.error!==void 0?x.createElement(Ua.Provider,{value:this.props.routeContext},x.createElement(Dp.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Jm(i){let{routeContext:n,match:r,children:d}=i,u=x.useContext(ds);return u&&u.static&&u.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(u.staticContext._deepestRenderedBoundaryId=r.route.id),x.createElement(Ua.Provider,{value:n},d)}function ey(i,n,r,d){var u;if(n===void 0&&(n=[]),r===void 0&&(r=null),d===void 0&&(d=null),i==null){var p;if(!r)return null;if(r.errors)i=r.matches;else if((p=d)!=null&&p.v7_partialHydration&&n.length===0&&!r.initialized&&r.matches.length>0)i=r.matches;else return null}let g=i,y=(u=r)==null?void 0:u.errors;if(y!=null){let k=g.findIndex(b=>b.route.id&&(y==null?void 0:y[b.route.id])!==void 0);k>=0||ke(!1),g=g.slice(0,Math.min(g.length,k+1))}let h=!1,v=-1;if(r&&d&&d.v7_partialHydration)for(let k=0;k<g.length;k++){let b=g[k];if((b.route.HydrateFallback||b.route.hydrateFallbackElement)&&(v=k),b.route.id){let{loaderData:D,errors:U}=r,B=b.route.loader&&D[b.route.id]===void 0&&(!U||U[b.route.id]===void 0);if(b.route.lazy||B){h=!0,v>=0?g=g.slice(0,v+1):g=[g[0]];break}}}return g.reduceRight((k,b,D)=>{let U,B=!1,z=null,N=null;r&&(U=y&&b.route.id?y[b.route.id]:void 0,z=b.route.errorElement||Qm,h&&(v<0&&D===0?(ny("route-fallback"),B=!0,N=null):v===D&&(B=!0,N=b.route.hydrateFallbackElement||null)));let le=n.concat(g.slice(0,D+1)),W=()=>{let ae;return U?ae=z:B?ae=N:b.route.Component?ae=x.createElement(b.route.Component,null):b.route.element?ae=b.route.element:ae=k,x.createElement(Jm,{match:b,routeContext:{outlet:k,matches:le,isDataRoute:r!=null},children:ae})};return r&&(b.route.ErrorBoundary||b.route.errorElement||D===0)?x.createElement(Zm,{location:r.location,revalidation:r.revalidation,component:z,error:U,children:W(),routeContext:{outlet:null,matches:le,isDataRoute:!0}}):W()},null)}var jp=(function(i){return i.UseBlocker="useBlocker",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i})(jp||{}),Tp=(function(i){return i.UseBlocker="useBlocker",i.UseLoaderData="useLoaderData",i.UseActionData="useActionData",i.UseRouteError="useRouteError",i.UseNavigation="useNavigation",i.UseRouteLoaderData="useRouteLoaderData",i.UseMatches="useMatches",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i.UseRouteId="useRouteId",i})(Tp||{});function ty(i){let n=x.useContext(ds);return n||ke(!1),n}function ay(i){let n=x.useContext(Ql);return n||ke(!1),n}function oy(i){let n=x.useContext(Ua);return n||ke(!1),n}function Up(i){let n=oy(),r=n.matches[n.matches.length-1];return r.route.id||ke(!1),r.route.id}function iy(){var i;let n=x.useContext(Dp),r=ay(),d=Up();return n!==void 0?n:(i=r.errors)==null?void 0:i[d]}function sy(){let{router:i}=ty(jp.UseNavigateStable),n=Up(Tp.UseNavigateStable),r=x.useRef(!1);return Ep(()=>{r.current=!0}),x.useCallback(function(u,p){p===void 0&&(p={}),r.current&&(typeof u=="number"?i.navigate(u):i.navigate(u,Un({fromRouteId:n},p)))},[i,n])}const Qc={};function ny(i,n,r){Qc[i]||(Qc[i]=!0)}function ry(i,n){i==null||i.v7_startTransition,(i==null?void 0:i.v7_relativeSplatPath)===void 0&&(!n||n.v7_relativeSplatPath),n&&(n.v7_fetcherPersist,n.v7_normalizeFormMethod,n.v7_partialHydration,n.v7_skipActionErrorRevalidation)}function $b(i){let{to:n,replace:r,state:d,relative:u}=i;gi()||ke(!1);let{future:p,static:g}=x.useContext(Ta),{matches:y}=x.useContext(Ua),{pathname:h}=Yt(),v=Mn(),k=Hn(n,zn(y,p.v7_relativeSplatPath),h,u==="path"),b=JSON.stringify(k);return x.useEffect(()=>v(JSON.parse(b),{replace:r,state:d,relative:u}),[v,b,u,r,d]),null}function ly(i){return Km(i.context)}function dy(i){let{basename:n="/",children:r=null,location:d,navigationType:u=st.Pop,navigator:p,static:g=!1,future:y}=i;gi()&&ke(!1);let h=n.replace(/^\/*/,"/"),v=x.useMemo(()=>({basename:h,navigator:p,static:g,future:Un({v7_relativeSplatPath:!1},y)}),[h,y,p,g]);typeof d=="string"&&(d=ja(d));let{pathname:k="/",search:b="",hash:D="",state:U=null,key:B="default"}=d,z=x.useMemo(()=>{let N=Ea(k,h);return N==null?null:{location:{pathname:N,search:b,hash:D,state:U,key:B},navigationType:u}},[h,k,b,D,U,B,u]);return z==null?null:x.createElement(Ta.Provider,{value:v},x.createElement(Zl.Provider,{children:r,value:z}))}new Promise(()=>{});function uy(i){let n={hasErrorBoundary:i.ErrorBoundary!=null||i.errorElement!=null};return i.Component&&Object.assign(n,{element:x.createElement(i.Component),Component:void 0}),i.HydrateFallback&&Object.assign(n,{hydrateFallbackElement:x.createElement(i.HydrateFallback),HydrateFallback:void 0}),i.ErrorBoundary&&Object.assign(n,{errorElement:x.createElement(i.ErrorBoundary),ErrorBoundary:void 0}),n}/**
|
|
61
|
-
* React Router DOM v6.30.3
|
|
62
|
-
*
|
|
63
|
-
* Copyright (c) Remix Software Inc.
|
|
64
|
-
*
|
|
65
|
-
* This source code is licensed under the MIT license found in the
|
|
66
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
67
|
-
*
|
|
68
|
-
* @license MIT
|
|
69
|
-
*/function ci(){return ci=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},ci.apply(this,arguments)}function Lp(i,n){if(i==null)return{};var r={},d=Object.keys(i),u,p;for(p=0;p<d.length;p++)u=d[p],!(n.indexOf(u)>=0)&&(r[u]=i[u]);return r}function cy(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function py(i,n){return i.button===0&&(!n||n==="_self")&&!cy(i)}function _l(i){return i===void 0&&(i=""),new URLSearchParams(typeof i=="string"||Array.isArray(i)||i instanceof URLSearchParams?i:Object.keys(i).reduce((n,r)=>{let d=i[r];return n.concat(Array.isArray(d)?d.map(u=>[r,u]):[[r,d]])},[]))}function gy(i,n){let r=_l(i);return n&&n.forEach((d,u)=>{r.has(u)||n.getAll(u).forEach(p=>{r.append(u,p)})}),r}const hy=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],my=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],yy="6";try{window.__reactRouterVersion=yy}catch{}function fy(i,n){return Am({basename:void 0,future:ci({},void 0,{v7_prependBasename:!0}),history:Kh({window:void 0}),hydrationData:Sy(),routes:i,mapRouteProperties:uy,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function Sy(){var i;let n=(i=window)==null?void 0:i.__staticRouterHydrationData;return n&&n.errors&&(n=ci({},n,{errors:vy(n.errors)})),n}function vy(i){if(!i)return null;let n=Object.entries(i),r={};for(let[d,u]of n)if(u&&u.__type==="RouteErrorResponse")r[d]=new Tn(u.status,u.statusText,u.data,u.internal===!0);else if(u&&u.__type==="Error"){if(u.__subType){let p=window[u.__subType];if(typeof p=="function")try{let g=new p(u.message);g.stack="",r[d]=g}catch{}}if(r[d]==null){let p=new Error(u.message);p.stack="",r[d]=p}}else r[d]=u;return r}const zp=x.createContext({isTransitioning:!1}),by=x.createContext(new Map),Py="startTransition",Zc=Vh[Py],ky="flushSync",Jc=Gh[ky];function wy(i){Zc?Zc(i):i()}function is(i){Jc?Jc(i):i()}class Cy{constructor(){this.status="pending",this.promise=new Promise((n,r)=>{this.resolve=d=>{this.status==="pending"&&(this.status="resolved",n(d))},this.reject=d=>{this.status==="pending"&&(this.status="rejected",r(d))}})}}function Ay(i){let{fallbackElement:n,router:r,future:d}=i,[u,p]=x.useState(r.state),[g,y]=x.useState(),[h,v]=x.useState({isTransitioning:!1}),[k,b]=x.useState(),[D,U]=x.useState(),[B,z]=x.useState(),N=x.useRef(new Map),{v7_startTransition:le}=d||{},W=x.useCallback(X=>{le?wy(X):X()},[le]),ae=x.useCallback((X,Se)=>{let{deletedFetchers:ce,flushSync:Te,viewTransitionOpts:we}=Se;X.fetchers.forEach((Me,et)=>{Me.data!==void 0&&N.current.set(et,Me.data)}),ce.forEach(Me=>N.current.delete(Me));let Ce=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!we||Ce){Te?is(()=>p(X)):W(()=>p(X));return}if(Te){is(()=>{D&&(k&&k.resolve(),D.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:we.currentLocation,nextLocation:we.nextLocation})});let Me=r.window.document.startViewTransition(()=>{is(()=>p(X))});Me.finished.finally(()=>{is(()=>{b(void 0),U(void 0),y(void 0),v({isTransitioning:!1})})}),is(()=>U(Me));return}D?(k&&k.resolve(),D.skipTransition(),z({state:X,currentLocation:we.currentLocation,nextLocation:we.nextLocation})):(y(X),v({isTransitioning:!0,flushSync:!1,currentLocation:we.currentLocation,nextLocation:we.nextLocation}))},[r.window,D,k,N,W]);x.useLayoutEffect(()=>r.subscribe(ae),[r,ae]),x.useEffect(()=>{h.isTransitioning&&!h.flushSync&&b(new Cy)},[h]),x.useEffect(()=>{if(k&&g&&r.window){let X=g,Se=k.promise,ce=r.window.document.startViewTransition(async()=>{W(()=>p(X)),await Se});ce.finished.finally(()=>{b(void 0),U(void 0),y(void 0),v({isTransitioning:!1})}),U(ce)}},[W,g,k,r.window]),x.useEffect(()=>{k&&g&&u.location.key===g.location.key&&k.resolve()},[k,D,u.location,g]),x.useEffect(()=>{!h.isTransitioning&&B&&(y(B.state),v({isTransitioning:!0,flushSync:!1,currentLocation:B.currentLocation,nextLocation:B.nextLocation}),z(void 0))},[h.isTransitioning,B]),x.useEffect(()=>{},[]);let Y=x.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:X=>r.navigate(X),push:(X,Se,ce)=>r.navigate(X,{state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset}),replace:(X,Se,ce)=>r.navigate(X,{replace:!0,state:Se,preventScrollReset:ce==null?void 0:ce.preventScrollReset})}),[r]),pe=r.basename||"/",De=x.useMemo(()=>({router:r,navigator:Y,static:!1,basename:pe}),[r,Y,pe]),E=x.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return x.useEffect(()=>ry(d,r.future),[d,r.future]),x.createElement(x.Fragment,null,x.createElement(ds.Provider,{value:De},x.createElement(Ql.Provider,{value:u},x.createElement(by.Provider,{value:N.current},x.createElement(zp.Provider,{value:h},x.createElement(dy,{basename:pe,location:u.location,navigationType:u.historyAction,navigator:Y,future:E},u.initialized||r.future.v7_partialHydration?x.createElement(xy,{routes:r.routes,future:r.future,state:u}):n))))),null)}const xy=x.memo(Ry);function Ry(i){let{routes:n,future:r,state:d}=i;return $m(n,void 0,d,r)}const Iy=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Dy=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,jo=x.forwardRef(function(n,r){let{onClick:d,relative:u,reloadDocument:p,replace:g,state:y,target:h,to:v,preventScrollReset:k,viewTransition:b}=n,D=Lp(n,hy),{basename:U}=x.useContext(Ta),B,z=!1;if(typeof v=="string"&&Dy.test(v)&&(B=v,Iy))try{let ae=new URL(window.location.href),Y=v.startsWith("//")?new URL(ae.protocol+v):new URL(v),pe=Ea(Y.pathname,U);Y.origin===ae.origin&&pe!=null?v=pe+Y.search+Y.hash:z=!0}catch{}let N=Vm(v,{relative:u}),le=Ty(v,{replace:g,state:y,target:h,preventScrollReset:k,relative:u,viewTransition:b});function W(ae){d&&d(ae),ae.defaultPrevented||le(ae)}return x.createElement("a",ci({},D,{href:B||N,onClick:z||p?d:W,ref:r,target:h}))}),Ey=x.forwardRef(function(n,r){let{"aria-current":d="page",caseSensitive:u=!1,className:p="",end:g=!1,style:y,to:h,viewTransition:v,children:k}=n,b=Lp(n,my),D=On(h,{relative:b.relative}),U=Yt(),B=x.useContext(Ql),{navigator:z,basename:N}=x.useContext(Ta),le=B!=null&&Uy(D)&&v===!0,W=z.encodeLocation?z.encodeLocation(D).pathname:D.pathname,ae=U.pathname,Y=B&&B.navigation&&B.navigation.location?B.navigation.location.pathname:null;u||(ae=ae.toLowerCase(),Y=Y?Y.toLowerCase():null,W=W.toLowerCase()),Y&&N&&(Y=Ea(Y,N)||Y);const pe=W!=="/"&&W.endsWith("/")?W.length-1:W.length;let De=ae===W||!g&&ae.startsWith(W)&&ae.charAt(pe)==="/",E=Y!=null&&(Y===W||!g&&Y.startsWith(W)&&Y.charAt(W.length)==="/"),X={isActive:De,isPending:E,isTransitioning:le},Se=De?d:void 0,ce;typeof p=="function"?ce=p(X):ce=[p,De?"active":null,E?"pending":null,le?"transitioning":null].filter(Boolean).join(" ");let Te=typeof y=="function"?y(X):y;return x.createElement(jo,ci({},b,{"aria-current":Se,className:ce,ref:r,style:Te,to:h,viewTransition:v}),typeof k=="function"?k(X):k)});var ql;(function(i){i.UseScrollRestoration="useScrollRestoration",i.UseSubmit="useSubmit",i.UseSubmitFetcher="useSubmitFetcher",i.UseFetcher="useFetcher",i.useViewTransitionState="useViewTransitionState"})(ql||(ql={}));var ep;(function(i){i.UseFetcher="useFetcher",i.UseFetchers="useFetchers",i.UseScrollRestoration="useScrollRestoration"})(ep||(ep={}));function jy(i){let n=x.useContext(ds);return n||ke(!1),n}function Ty(i,n){let{target:r,replace:d,state:u,preventScrollReset:p,relative:g,viewTransition:y}=n===void 0?{}:n,h=Mn(),v=Yt(),k=On(i,{relative:g});return x.useCallback(b=>{if(py(b,r)){b.preventDefault();let D=d!==void 0?d:Uo(v)===Uo(k);h(i,{replace:D,state:u,preventScrollReset:p,relative:g,viewTransition:y})}},[v,h,k,d,u,r,i,p,g,y])}function Xb(i){let n=x.useRef(_l(i)),r=x.useRef(!1),d=Yt(),u=x.useMemo(()=>gy(d.search,r.current?null:n.current),[d.search]),p=Mn(),g=x.useCallback((y,h)=>{const v=_l(typeof y=="function"?y(u):y);r.current=!0,p("?"+v,h)},[p,u]);return[u,g]}function Uy(i,n){n===void 0&&(n={});let r=x.useContext(zp);r==null&&ke(!1);let{basename:d}=jy(ql.useViewTransitionState),u=On(i,{relative:n.relative});if(!r.isTransitioning)return!1;let p=Ea(r.currentLocation.pathname,d)||r.currentLocation.pathname,g=Ea(r.nextLocation.pathname,d)||r.nextLocation.pathname;return jn(u.pathname,g)!=null||jn(u.pathname,p)!=null}const Ly="modulepreload",zy=function(i){return"/dashboard/"+i},tp={},oa=function(n,r,d){let u=Promise.resolve();if(r&&r.length>0){let g=function(v){return Promise.all(v.map(k=>Promise.resolve(k).then(b=>({status:"fulfilled",value:b}),b=>({status:"rejected",reason:b}))))};document.getElementsByTagName("link");const y=document.querySelector("meta[property=csp-nonce]"),h=(y==null?void 0:y.nonce)||(y==null?void 0:y.getAttribute("nonce"));u=g(r.map(v=>{if(v=zy(v),v in tp)return;tp[v]=!0;const k=v.endsWith(".css"),b=k?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${b}`))return;const D=document.createElement("link");if(D.rel=k?"stylesheet":Ly,k||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),k)return new Promise((U,B)=>{D.addEventListener("load",U),D.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const y=new Event("vite:preloadError",{cancelable:!0});if(y.payload=g,window.dispatchEvent(y),!y.defaultPrevented)throw g}return u.then(g=>{for(const y of g||[])y.status==="rejected"&&p(y.reason);return n().catch(p)})},Nn=window.location.origin,Hy=3e3,My=5e3;class Oy extends Error{constructor(r,d,u=null,p=null){super(d);Ia(this,"status");Ia(this,"error");Ia(this,"payload");this.name="ApiClientError",this.status=r,this.error=u,this.payload=p}}function Ny(i){var r,d;const n=(d=(r=i.headers)==null?void 0:r.get)==null?void 0:d.call(r,"content-type");return typeof n=="string"&&n.toLowerCase().includes("application/json")}async function _y(i){if(!Ny(i))return null;try{const n=await i.json();if(n&&typeof n=="object")return n}catch{return null}return null}async function ss(i){if(i.ok)return;const n=await _y(i),r=typeof(n==null?void 0:n.message)=="string"&&n.message.trim().length>0?n.message:`API ${i.status}: ${i.statusText}`,d=typeof(n==null?void 0:n.error)=="string"?n.error:null;throw new Oy(i.status,r,d,n)}class qy{constructor(n){Ia(this,"base");this.base=n}async get(n,r){const d=new URL(n,this.base);r&&Object.entries(r).forEach(([p,g])=>d.searchParams.set(p,g));const u=await fetch(d.toString(),{method:"GET"});return await ss(u),u.json()}async patch(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await ss(u),u.json()}async put(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await ss(u),u.json()}async post(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"POST",headers:r?{"Content-Type":"application/json"}:{},body:r?JSON.stringify(r):void 0});return await ss(u),u.json()}async delete(n){const r=new URL(n,this.base),d=await fetch(r.toString(),{method:"DELETE"});return await ss(d),d.json()}}const Pt=new qy(Nn);class Jl{constructor(n){Ia(this,"source",null);Ia(this,"handlers",new Map);Ia(this,"reconnectTimer",null);Ia(this,"url");this.url=n??`${Nn}/api/dashboard/events`}connect(){this.disconnect(),this.source=new EventSource(this.url),this.source.onopen=()=>{this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)},this.source.onerror=()=>{var r;(r=this.source)==null||r.close(),this.source=null,this.scheduleReconnect()};const n=["connection","sync","command","game_change","mcp_status","license"];for(const r of n)this.source.addEventListener(r,d=>{var p;const u=JSON.parse(d.data);(p=this.handlers.get(r))==null||p.forEach(g=>g(u))})}on(n,r){return this.handlers.has(n)||this.handlers.set(n,new Set),this.handlers.get(n).add(r),()=>{var d;return(d=this.handlers.get(n))==null?void 0:d.delete(r)}}disconnect(){var n;(n=this.source)==null||n.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var n;return((n=this.source)==null?void 0:n.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},Hy))}}function By(i){return i.pluginClients&&i.pluginClients.length>0?"studioConnected":(i.connectedClients===0||!i.pluginClients,"serverOnly")}const Hp=x.createContext(null);function Wy({children:i}){const[n,r]=x.useState("disconnected"),[d,u]=x.useState(null),[p,g]=x.useState(null),y=x.useRef(null);return x.useEffect(()=>{let h=!1;async function v(){try{const D=await Pt.get("/status");if(h)return;u(D),r(By(D)),g(null)}catch(D){if(h)return;r("disconnected"),g(D instanceof Error?D.message:String(D))}}v(),y.current=setInterval(v,My);const k=new Jl;k.connect();const b=k.on("connection",()=>{v()});return()=>{h=!0,y.current&&clearInterval(y.current),b(),k.disconnect()}},[]),w.jsx(Hp.Provider,{value:{level:n,status:d,error:p},children:i})}function _n(){const i=x.useContext(Hp);if(!i)throw new Error("useConnection must be used within a ConnectionProvider");return i}const Fy={"sidebar.overview":"Overview","sidebar.changelog":"Changelog","sidebar.connection":"Connection","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Settings","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP server connection required","sidebar.gate.l2":"Roblox Studio plugin connection required","header.currentProject":"Current Project","header.unknownProject":"Unknown project","header.projectRoot.label":"Project Root","header.currentProject.loading":"Loading project root...","header.currentProject.unavailable":"Project root unavailable","header.placeNotConnected":"Place not connected","header.currentProject.tooltip":"Currently selected project folder","header.currentProject.loading.tooltip":"Project root information is still loading","header.currentProject.unavailable.tooltip":"Current project root information is unavailable","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Loading sync root...","header.currentProjectSyncRoot.unavailable":"Sync root unavailable","header.currentProjectSyncRoot.tooltip":"Current sync root folder for the selected project","header.currentProjectSyncRoot.loading.tooltip":"Sync root information is still loading","header.currentProjectSyncRoot.unavailable.tooltip":"Current sync root information is unavailable","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Test files unavailable","header.testFiles.tooltip":"Current playtest files directory for the selected place","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Plugin connection required","header.places.liveRequired":"Plugin connection required for live active place","header.place.tooltip":"Connected Roblox place","header.placeNotConnected.tooltip":"Place not connected","placeScope.current.label":"Current Place","placeScope.lastActive.label":"Last Active Place","placeScope.selected.label":"Selected Place","placeScope.unknownPlace":"Unknown place","placeScope.live":"Live","placeScope.stored":"Stored","placeScope.pluginRequired":"Plugin required","placeScope.pluginRequired.note":"Connect WEPPY Plugin to confirm the live active place.","placeScope.noPlace.label":"Place scope","placeScope.noPlace.value":"No place data available yet","placeScope.noPlace.badge":"No place","placeScope.noPlace.note":"Connect WEPPY Plugin and sync a place to create place-scoped data.","placeScope.selected.note":"Showing stored data only. Studio routing is unchanged.","placeScope.surface.sync":"Sync status and logs use this place.","placeScope.surface.changelog":"Changelog sessions use this place.","placeScope.surface.playtest":"Playtest reports use this place.","placeScope.surface.uiStudio":"UI captures and change history use this place.","placeScope.surface.tools":"Tool history and statistics use this place.","placeScope.loading":"Loading place scope...","placeScope.unavailable":"Place scope unavailable","placeScope.selector.label":"Place data","header.changeProjectRoot":"Change Project Root","header.changeProjectRoot.ariaLabel":"Change project root","header.changeProjectRoot.tooltip":"Change the current project root","header.changeProjectRoot.disabledTooltip.l0":"MCP server connection required before project root can be changed","header.changeProjectRoot.disabledTooltip.loading":"Project root information is still loading","header.changeProjectRoot.disabledTooltip.unavailable":"Current project root information is unavailable","header.projectRootModal.initial.title":"Change project root","header.projectRootModal.initial.body.connected":"After you choose a project folder, MCP will switch to the new project root and the current Studio contents will be fully resynced into the new <selected project folder>/weppy-project-sync target.","header.projectRootModal.initial.body.disconnected":"After you choose a project folder, MCP will switch to the new project root and use <selected project folder>/weppy-project-sync as the next sync target.","header.projectRootModal.initial.nextSyncRoot":"New sync target after selection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Current sync stops immediately.","header.projectRootModal.initial.warningFreshSync":"The current Studio contents will be used to build a fresh full sync in the new target.","header.projectRootModal.initial.warningNoMove":"Old sync folders are not moved automatically.","header.projectRootModal.initial.warningDeferredSync":"If Studio is not connected, full resync starts the next time the plugin connects.","header.projectRootModal.confirm.title":"Confirm new project root","header.projectRootModal.confirm.body":"Review the selected project folder before applying.","header.projectRootModal.confirm.projectRoot":"Selected project folder","header.projectRootModal.confirm.syncRoot":"New sync target","header.projectRootModal.confirm.warningNoMove":"Existing sync folders are not moved automatically.","header.projectRootModal.pick":"Choose folder","header.projectRootModal.apply":"Apply change","header.projectRootModal.cancel":"Cancel","header.projectRootModal.error":"Failed to change project root","status.online":"Online","status.offline":"Offline","status.idle":"Idle","status.syncing":"Syncing","status.error":"Error","status.initializing":"Initializing","level.l0.title":"Server disconnected","level.l0.message":"WEPPY Dashboard opened but MCP server has stopped or is not responding.","level.l1.title":"Server connected","level.l1.hint":"Check: Is Roblox Studio running? Is the plugin installed?","level.l2.ok":"Studio connected","tier.basic":"Basic","tier.basic.tooltip":"Basic tier with the standard WEPPY Dashboard feature set.","tier.pro":"Pro","tier.pro.tooltip":"Pro tier with the full WEPPY Dashboard feature set.","tier.mixed":"Mixed","tier.upgrade":"View Pro","tier.banner.save":"Save AI tokens with Pro!","tier.tool.query_instances.desc":"Inspect instances, search children and descendants, and inspect class data. Pro adds file tree, project structure, and property or tag search.","tier.tool.mutate_instances.desc":"Create, delete, clone, and move instances. Pro adds tree creation and bulk create, delete, or clone operations.","tier.tool.manage_properties.desc":"Read and set properties, attributes, and tags. Pro adds calculated updates, relative changes, and bulk property operations.","tier.tool.manage_scripts.desc":"Read, write, create, delete, edit, and search script source. Pro adds bulk replacement across scripts.","tier.tool.manage_ui.desc":"Pro only. Create or refine game-style menus, HUDs, buttons, labels, and image panels, then capture screens and review improvement suggestions.","tier.tool.manage_ui.action.design_brief":"Plan UI direction","tier.tool.manage_ui.action.create_tree":"Create new UI","tier.tool.manage_ui.action.update":"Update existing UI","tier.tool.manage_ui.action.delete":"Remove UI","tier.tool.manage_ui.action.preview":"Capture UI screen","tier.tool.manage_ui.action.check":"Review improvement suggestions","tier.tool.manage_lighting.desc":"Pro only. Configure lighting, atmosphere, sky, terrain properties, and time-of-day settings.","tier.tool.manage_selection.desc":"Read, set, and clear the current Studio selection. Pro adds context, details, add or remove, and selection watch support.","tier.tool.manage_camera.desc":"Inspect camera state, focus by path or position, and request suggested views.","tier.tool.manage_tween.desc":"Pro only. Create, play, pause, and cancel tweens for smooth animation.","tier.tool.manage_audio.desc":"Pro only. Play, stop, pause, and resume sounds, and configure the audio listener.","tier.tool.manage_animation.desc":"Pro only. Load, play, and stop animations, and inspect active animation tracks.","tier.tool.manage_physics.desc":"Pro only. Register collision groups, configure group collisions, and inspect available groups.","tier.tool.manage_effects.desc":"Pro only. Emit particles, clear effects, and toggle effect state.","tier.tool.manage_terrain.desc":"Pro only. Fill terrain shapes, clear regions, replace materials, manage terrain colors, read or write voxels, generate terrain, and smooth terrain.","tier.tool.spatial_query.desc":"Pro only. Run raycasts, find ground, validate placement, scan areas, search for flat or spawn positions, analyze walkability, map space, and inspect collisions.","tier.tool.manage_assets.desc":"Pro only. Insert models, inspect asset info, search the creator store, insert free assets or packages, and export assets.","tier.tool.manage_sync.desc":"Pro only. Inspect sync status, configuration, history, directions, and read or write synced files.","tier.tool.workspace_state.desc":"Pro only. Run full sync, capture snapshots, inspect recent changes and viewport state, and manage related metadata.","tier.tool.manage_logs.desc":"Inspect output logs with filtering, incremental polling, buffer clearing, and recent error lookup.","tier.tool.system_info.desc":"Inspect connection status and current tier. Pro adds place info, services, Studio settings, playtest control, and automated tests.","tier.tool.manage_studio.desc":"Pro only. Toggle Studio editor view settings such as UI preview for screenshot and QA workflows; it changes Studio session settings, not game UI objects.","tier.tool.batch_execute.desc":"Pro only. Run multiple commands in a batch, with sequential execution and optional continue-on-error behavior.","tier.tool.execute_luau.desc":"Pro only. Execute arbitrary Luau code inside the Roblox Studio sandbox.","connection.server.title":"Bridge Status","connection.server.version":"Version","connection.server.version.tooltip":"WEPPY Bridge runtime version","connection.server.pid":"PID","connection.server.pid.tooltip":"Operating system process identifier","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Time elapsed since the WEPPY Bridge started","connection.server.session":"Session","connection.server.session.tooltip":"Current WEPPY Bridge session identifier","connection.server.exec":"Exec","connection.server.exec.tooltip":"Executable path used to launch the WEPPY Bridge","connection.reconnect":"Reconnect","connection.checkSettings":"Check Settings","connection.agents.title":"AI Agents","connection.agents.name":"Agent","connection.agents.version":"Version","connection.agents.version.tooltip":"MCP Adapter package version for this agent session.","connection.agents.cwd":"Working Dir","connection.agents.cwd.tooltip":"Current working directory for the connected AI agent","connection.agents.projectRoot":"Project Root","connection.agents.projectRoot.tooltip":"Authoritative project root for sync ownership","connection.agents.projectRoot.unresolved":"Unresolved","connection.agents.connected":"Connected","connection.agents.unknown":"Unknown","connection.agents.none":"No agents connected","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Last Seen","connection.plugins.lastSeen.tooltip":"Most recent heartbeat received from the plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Installed plugin version reported by Studio","connection.plugins.none":"No plugins connected","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test connection","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Each AI agent connects through its own MCP Adapter to one shared WEPPY Bridge, which keeps Roblox Studio connected.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Connection Log","connection.log.empty":"No events yet","connection.time.secondsAgo":"s ago","connection.time.minutesAgo":"m ago","connection.time.hoursAgo":"h ago","common.loading":"Loading...","common.retry":"Retry","common.reconnecting":"Reconnecting...","common.expand":"Expand","common.collapse":"Collapse","tools.tab.history":"History","tools.tab.statistics":"Statistics","tools.tab.failures":"Failures","tools.col.time":"Time","tools.col.time.tooltip":"When the tool run was recorded.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Tool name and action that were executed.","tools.col.duration":"Duration","tools.col.duration.tooltip":"How long the tool took to finish.","tools.col.status":"Status","tools.col.status.tooltip":"Outcome of the recorded tool run.","tools.col.tier":"Tier","tools.col.tier.tooltip":"License tier required for the tool or action.","tools.col.tierStats.tooltip":"Basic, Pro, or Mixed summary for the tool statistics row.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Consolidated tool name in the statistics table.","tools.col.calls":"Calls","tools.col.calls.tooltip":"Total number of recorded calls for this tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Number of direct successful runs.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Number of runs that succeeded through fallback execution.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Number of blocked runs without fallback execution.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Number of expected failures caused by caller input, project state, Roblox policy, or user code.","tools.col.err":"FAILED","tools.col.err.tooltip":"Number of runs that failed.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Percentage of calls that finished successfully.","tools.col.avgTime":"Avg Time","tools.col.avgTime.tooltip":"Average execution time across recorded calls.","tools.col.error":"Error","tools.filter.tool":"Tool","tools.filter.all":"All","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"This entry used a Pro-only tool or action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"The requested Pro action succeeded via a Basic fallback.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"The requested Pro action was blocked and no fallback ran.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"The tool call failed as an expected caller, project, policy, or user-code issue.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"The tool run failed.","tools.status.ok":"OK","tools.status.ok.tooltip":"The tool run completed successfully.","tools.tier.mixed.tooltip":"This tool includes both Basic and Pro actions.","tools.detail.params":"Parameters","tools.detail.params.tooltip":"Input parameters passed to this tool run.","tools.detail.result":"Result","tools.detail.result.tooltip":"Returned result payload for this tool run.","tools.detail.requestedCommand":"Command Sent","tools.detail.executedCommand":"Executed Command","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Blocked Reason","tools.detail.noFallback":"No Fallback","tools.detail.noFallback.value":"No fallback ran.","tools.detail.warningMessage":"Warning Message","tools.detail.errorMessage":"Error Message","tools.detail.open":"Details","tools.detail.openLabel":"View details for {command}","tools.detail.dialogLabel":"Tool execution detail","tools.detail.title":"Tool execution","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Clear history?","tools.clear.history.message":"This permanently removes the current place tools history.","tools.clear.statistics.title":"Clear statistics?","tools.clear.statistics.message":"This permanently resets the current place tool statistics.","tools.detail.error":"Error","tools.page.prev":"Prev","tools.page.prev.tooltip":"Go to the previous page of tool history results.","tools.page.next":"Next","tools.page.next.tooltip":"Go to the next page of tool history results.","tools.empty.history":"No history entries","tools.empty.stats":"No tool statistics","tools.empty.failures":"No failures","tools.summary.total":"Total","tools.summary.calls":"calls","tools.summary.sessions":"Sessions","settings.license.title":"License","settings.license.title.tooltip":"Current license status and subscription tier.","settings.license.status":"Status","settings.license.status.tooltip":"Current license activation state.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Current subscription tier for available WEPPY Dashboard features.","settings.license.key":"Key","settings.license.key.tooltip":"Masked license key currently loaded by the server.","settings.license.keyValue.tooltip":"Masked license key currently loaded by the server.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"License provider used to validate this key.","settings.license.providerValue.tooltip":"License provider used to validate this key.","settings.license.active":"Active","settings.license.active.tooltip":"Current license activation state.","settings.license.status.activeCancelPending.tooltip":"Cancellation is pending, but Pro access remains active until the current billing period ends.","settings.license.inactive":"Inactive","settings.license.inactive.tooltip":"Current license activation state.","settings.license.expired":"Expired","settings.license.expired.tooltip":"Current license activation state.","settings.license.unavailable":"License info unavailable","settings.license.detail.cancelPending":"Cancellation is scheduled. Pro access remains active until the current billing period ends.","settings.license.reset":"Reset License","settings.readOnly":"Read-only","settings.readOnly.tooltip":"This section shows values that cannot be edited from the WEPPY Dashboard.","settings.unavailable":"Settings unavailable","settings.general.title":"General Settings","settings.general.title.tooltip":"Hot settings that apply immediately when changed.","settings.general.liveApply":"Live Apply","settings.general.liveApply.tooltip":"Changes in this section are applied immediately without a separate save button.","settings.general.applied":"Applied","settings.general.logLevel":"Log Level","settings.general.logLevel.tooltip":"Choose how much detail the MCP server writes to logs. Lower to ‘debug’ when tracking down a problem.","settings.general.localHistory":"Tool History Recording","settings.general.localHistory.tooltip":"Save AI tool runs to disk. Required for the Tools and History pages.","settings.general.localStatistics":"Tool Statistics Collection","settings.general.localStatistics.tooltip":"Aggregate tool usage counts. Used by the Overview statistics.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"Save structured execution context so the Changelog and Playtest views can render it.","settings.general.requestTimeout":"Action Timeout","settings.general.requestTimeout.tooltip":"Maximum time (in ms) to wait for a single tool action before failing.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Action timeout is measured in milliseconds.","settings.cold.title":"Server Environment","settings.cold.title.tooltip":"Read-only server environment values loaded at startup.","settings.cold.httpPort.tooltip":"Port number used by the MCP WEPPY Dashboard HTTP server.","settings.cold.httpHost.tooltip":"Host interface that the MCP WEPPY Dashboard HTTP server binds to.","settings.cold.hint":"Set via environment variables to change these values.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Choose how WEPPY Dashboard behaves when the MCP Server starts.","settings.dashboard.nextStartBadge":"Next Start","settings.dashboard.autoOpen.label":"Open Dashboard when WEPPY starts","settings.dashboard.autoOpen.description":"Automatically opens this Dashboard after the MCP Server starts.","settings.dashboard.autoOpen.nextStart":"Applies the next time the MCP Server starts.","settings.dashboard.settingsFile.label":"Settings file","settings.dashboard.agentExample.label":"Ask your Agent","settings.dashboard.agentExample.prompt":"“Turn off Dashboard auto-open.”","settings.dashboard.autoOpen.saving":"Saving…","settings.dashboard.autoOpen.saved":"Saved for the next server start.","settings.dashboard.autoOpen.error":"Could not save. The previous setting was restored.","dashboardAutoOpenGuide.eyebrow":"Dashboard preference","dashboardAutoOpenGuide.title":"Choose how WEPPY Dashboard opens","dashboardAutoOpenGuide.currentOn":"Auto-open is currently On. This Dashboard opens after the MCP Server starts.","dashboardAutoOpenGuide.currentOff":"Auto-open is currently Off. WEPPY will not open a new Dashboard tab when the MCP Server starts.","dashboardAutoOpenGuide.changeAnytime":"You can change this anytime in Settings.","dashboardAutoOpenGuide.agentHint":"You can also ask your Agent, “Turn off Dashboard auto-open.”","dashboardAutoOpenGuide.statusOn":"Auto-open On","dashboardAutoOpenGuide.statusOff":"Auto-open Off","dashboardAutoOpenGuide.keep":"Keep current setting","dashboardAutoOpenGuide.turnOff":"Turn off auto-open","dashboardAutoOpenGuide.openSettings":"Open Settings","dashboardAutoOpenGuide.close":"Close auto-open guide","dashboardAutoOpenGuide.saving":"Saving…","dashboardAutoOpenGuide.error":"Could not save your choice. Please try again.","settings.language.title":"Language","settings.language.title.tooltip":"Choose how the WEPPY Dashboard interface text is localized.","settings.language.dashboard":"WEPPY Dashboard Language","settings.language.dashboard.tooltip":"Overrides the WEPPY Dashboard language or follows the system language when set to Auto.","settings.language.auto":"Auto","overview.l0.title":"MCP Server Disconnected","overview.l0.message":"The MCP server is not responding. The WEPPY Dashboard will automatically attempt to reconnect.","overview.l0.step1":"Check that the MCP server process is running","overview.l0.step2":"Restart the MCP server command if needed","overview.l0.reconnecting":"Auto-reconnecting every 3s...","overview.l0.reconnectBtn":"Reconnect","overview.l0.settingsBtn":"Check Settings","overview.l1.pluginGuide":"Roblox Studio plugin is not connected","overview.l1.check1":"Is Roblox Studio running?","overview.l1.check2":"Is the WEPPY Plugin installed?","overview.l1.feedHint":"Changes will appear here once the plugin connects","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP server runtime and process status","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio plugin connection and version status","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Connected AI coding agents and their runtime state","overview.metric.agent.instancesUnit":"instances","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Current Studio to local sync activity","overview.metric.noAgent":"No Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installed MCP server version","overview.meta.session":"Session","overview.meta.session.tooltip":"Current MCP session identifier","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Operating system process identifier","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Time elapsed since the MCP server started","overview.feed.title":"Recent Game Changes","overview.feed.empty":"No recent changes","overview.changelog.title":"Session Change Summary","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instances","overview.changelog.properties":"properties","overview.changelog.assets":"assets","overview.tier.title":"Tier Usage","changelog.subtitle":"Game Change History","changelog.filter.all":"All","changelog.filter.active":"Active","changelog.filter.completed":"Completed","changelog.empty":"No changelog entries yet","changelog.basic.limit.title":"Basic preview shows the latest 3 sessions","changelog.basic.limit.body":"Full changelog timeline browsing is available with Pro.","changelog.basic.metricLabel":"Visible Changelog / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Active","changelog.card.active.tooltip":"This session is still receiving new game changes.","changelog.card.completed":"Completed","changelog.card.completed.tooltip":"This session has ended and no more changes are expected.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"This session only contains the initial sync bootstrap snapshot.","changelog.card.inProgress":"in progress","changelog.card.noChanges":"No changes yet","changelog.card.noChanges.tooltip":"No game changes have been extracted for this session yet.","changelog.card.bootstrapSummary":"Initial sync snapshot","changelog.card.bootstrapSummary.tooltip":"Initial file sync writes are collapsed into a single bootstrap snapshot row.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Script changes made in this session.","changelog.card.instances":"instances","changelog.card.instances.tooltip":"Instance create, delete, move, or clone changes in this session.","changelog.card.modified":"modified","changelog.card.created":"created","changelog.card.deleted":"deleted","changelog.card.moved":"moved","changelog.card.propertiesChanged":"properties changed","changelog.card.propertiesChanged.tooltip":"Property value changes recorded for this session.","changelog.card.lightingConfigured":"Lighting configured","changelog.card.lightingConfigured.tooltip":"Lighting or atmosphere settings changed in this session.","changelog.card.terrainConfigured":"Terrain configured","changelog.card.terrainConfigured.tooltip":"Terrain data or terrain settings changed in this session.","changelog.card.assetsInserted":"assets inserted","changelog.card.assetsInserted.tooltip":"Assets inserted into the place during this session.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Lighting","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.dialogLabel":"Changelog details","changelog.detail.changeSummary":"Change Summary","changelog.detail.changeSummary.tooltip":"Counts of extracted game changes grouped by category for this session.","changelog.detail.changeTimeline":"Change Timeline","changelog.detail.changeTimeline.tooltip":"Chronological list of extracted game changes for this session.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Before & After","changelog.detail.filterCategory":"Category","changelog.detail.filterCategory.tooltip":"Filter the timeline to a single change category.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Both the before and after state were confirmed for this change.","changelog.detail.confidence.partial":"Partial","changelog.detail.confidence.partial.tooltip":"Only part of the before and after state could be confirmed for this change.","changelog.detail.confidence.afterOnly":"After only","changelog.detail.confidence.afterOnly.tooltip":"Only the resulting state after the change could be confirmed.","changelog.detail.confidence.intentOnly":"Intent only","changelog.detail.confidence.intentOnly.tooltip":"Only the requested action was recorded, not the resulting state.","changelog.detail.confidence.unknown":"Unknown","changelog.detail.confidence.unknown.tooltip":"This change could not be confidently classified from the available data.","changelog.detail.noChanges":"No changes in this category","changelog.detail.backToList":"Back to list","changelog.diff.empty":"No diff available","changelog.diff.unified":"Unified","changelog.diff.sideBySide":"Side by Side","changelog.diff.before":"Before","changelog.diff.after":"After","sync.overlay.title":"Roblox Studio plugin required","sync.overlay.message":"Sync status will be available once the Roblox Studio plugin connects.","sync.overlay.check1":"Is Roblox Studio running?","sync.overlay.check2":"Is the WEPPY Plugin installed?","sync.status.title":"Sync Status","sync.status.title.tooltip":"Current Studio and local file sync status for this place.","sync.status.forwardOnly":"Forward Only","sync.status.forwardOnly.tooltip":"Basic tier allows Studio to local forward sync only.","sync.status.place":"Place","sync.status.place.tooltip":"Connected Roblox place name and place ID.","sync.status.path":"Path","sync.status.path.tooltip":"Local filesystem root currently used for sync output.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Total synced Roblox instances tracked in the local mirror.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total synced script files currently indexed for this place.","sync.status.state":"State","sync.status.state.tooltip":"Current runtime sync state reported by the server.","sync.policy.title":"Sync Policy","sync.policy.title.tooltip":"Effective Sync policy reported by the connected Studio plugin.","sync.policy.activation":"Activation","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Workflow","sync.policy.preset.studio_first":"Studio First","sync.policy.preset.bidirectional_review":"Bidirectional","sync.policy.preset.local_code_studio_world":"Local Code, Studio World","sync.policy.preset.custom":"Custom","sync.policy.apply.title":"How local changes apply to Studio","sync.policy.apply.description":"Shows whether changes made locally are reviewed first or applied to Studio automatically.","sync.policy.apply.content":"Content changes","sync.policy.apply.content.tooltip":"Script Source, property, and Service property changes made locally. Instance creation, deletion, renaming, and moves are Structure changes.","sync.policy.apply.structure":"Structure changes","sync.policy.apply.structure.tooltip":"Instance creation, deletion, renaming, and moves made locally. Automatic local deletion additionally requires the separate delete option below.","sync.policy.apply.manual":"Review first","sync.policy.apply.auto":"Auto apply","sync.policy.scope.disclosure":"Scope directions","sync.policy.scope.scriptSource":"Script source","sync.policy.scope.properties":"Properties","sync.policy.scope.structure":"Structure","sync.policy.scope.serviceProperties":"Service properties","sync.policy.endpoint.local":"Local","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Local","sync.policy.direction.forward.tooltip":"Studio changes are written to local files.","sync.policy.direction.reverse":"Local → Studio","sync.policy.direction.reverse.tooltip":"Local file changes are applied to Studio.","sync.policy.direction.bidirectional":"Both ways","sync.policy.direction.bidirectional.tooltip":"Changes can move from Studio to local files and from local files to Studio.","sync.policy.safety.localDeletes":"Local delete → Studio instance removal","sync.policy.safety.review":"Review before delete","sync.policy.safety.review.tooltip":"Local file deletions wait for review before matching Studio instances are removed. This is separate from UI Studio automatic cleanup.","sync.policy.safety.auto":"Auto delete to Studio","sync.policy.safety.auto.tooltip":"Deleting local files may automatically remove matching Studio instances. This is separate from UI Studio automatic cleanup.","sync.policy.reviewRequired":"Review this policy in the Studio plugin before starting Sync.","sync.log.title":"Sync Log","sync.log.empty":"No sync events yet","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"A new sync output was written to disk.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"An existing synced file or instance was updated.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"A synced file or instance was removed.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"A sync event was recorded without a file mutation.","sync.upgrade.title":"Explore Full Sync with Pro","sync.upgrade.benefit1":"Bidirectional sync — edit files, auto-apply to Studio","sync.upgrade.benefit2":"Reverse sync — push file changes back to Studio","sync.upgrade.benefit3":"Full sync history and detailed change log","sync.upgrade.buy":"View Pro","playtest.status.title":"Playtest Status","playtest.status.title.tooltip":"Current Roblox playtest session state reported by Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Studio playtest launch mode for the current session.","playtest.status.mode.value.tooltip":"Specific Roblox Studio playtest mode currently in use.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox place currently associated with this playtest session.","playtest.status.state.running":"Running","playtest.status.state.running.tooltip":"A Roblox playtest session is currently running.","playtest.status.state.paused":"Paused","playtest.status.state.paused.tooltip":"The current Roblox playtest session is paused.","playtest.status.state.notRunning":"Not Running","playtest.status.state.notRunning.tooltip":"No Roblox playtest session is currently running.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Test History","playtest.history.title.tooltip":"Recorded automated playtest runs for this project.","playtest.history.empty":"No test results yet","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Playtest mode used for this recorded test run.","playtest.history.status.passed":"Passed","playtest.history.status.failed":"Failed","playtest.history.status.running":"Running","playtest.history.status.unknown":"Unknown","playtest.history.status.tooltip":"Recorded result state for this automated playtest run.","playtest.empty.title":"No playtest results yet","playtest.empty.message":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.before":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Selected Report","playtest.report.title.tooltip":"Detailed output for the currently selected automated playtest run.","playtest.detail.dialogLabel":"Playtest report detail","playtest.detail.loading":"Loading report...","playtest.detail.errorTitle":"Report unavailable","playtest.report.content":"Report","playtest.report.content.tooltip":"Markdown summary for the selected automated playtest run.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Execution logs captured for the selected automated playtest run.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"No report content available","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest is a Pro-only feature","playtest.basic.desc":"Control playtesting from the WEPPY Dashboard, run automated tests, and view detailed test reports.","playtest.basic.benefit1":"One-click play/pause/stop controls","playtest.basic.benefit2":"Automated test execution via AI agent","playtest.basic.benefit3":"Test history with pass/fail tracking","playtest.basic.benefit4":"Detailed markdown test reports","playtest.sample.badge":"Preview of the Pro playtest view","playtest.sample.title":"You are previewing the playtest screen that becomes available after upgrading to Pro.","playtest.sample.message":"This preview uses sample data. Live playtest control, history management, and real reports unlock with Pro.","playtest.sample.clearDisabled":"Available with Pro for live playtest history.","playtest.sample.place":"Arena Preview","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Spawn into the arena, survive the opener, and verify the HUD responds immediately.","playtest.sample.context.expected":"The player spawns safely, the countdown UI appears within one second, and the first wave starts without errors.","playtest.sample.context.observed":"Spawn protection held, the HUD updated on time, and wave one completed with no gameplay regressions.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
|
|
70
|
-
|
|
71
|
-
- Spawn flow: PASS
|
|
72
|
-
- HUD countdown: PASS
|
|
73
|
-
- Wave bootstrap: PASS
|
|
74
|
-
|
|
75
|
-
This is a sample preview. Live playtests and real reports are available with Pro.`,"playtest.sample.report.logs":`[sample] boot playtest preview
|
|
76
|
-
[sample] spawn protection active
|
|
77
|
-
[sample] hud countdown rendered
|
|
78
|
-
[sample] wave one completed
|
|
79
|
-
[sample] preview report finished`,"sidebar.whatsNew":"What's New","sidebar.help.group":"Help & Feedback","sidebar.help.bug":"Report a bug","sidebar.help.bug.tooltip":"Create a local diagnostic bundle, then open a prefilled bug report on GitHub","bugReportDialog.title":"diagnostics.zip can help us investigate","bugReportDialog.subtitle":"WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"You can submit the bug report without this file, but attaching it usually helps us find the cause faster.","bugReportDialog.attachHow":"To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.","bugReportDialog.download":"1. Download diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Open GitHub issue","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"The zip can contain local logs and project context. Review it before attaching if you want to share it.","sidebar.help.feature":"Suggest a feature","sidebar.help.feature.tooltip":"Suggest a new feature or improvement on GitHub","sidebar.help.discussions":"Installation / usage help","sidebar.help.discussions.tooltip":"Ask for installation or usage help through GitHub Issues","sidebar.help.troubleshooting":"Troubleshooting guide","sidebar.help.troubleshooting.tooltip":"Open the official troubleshooting guide on weppyai.com","header.whatsNew":"What's New","header.whatsNew.tooltip":"What's New","upgrade.title":"View Pro","upgrade.tagline":"Check Pro features","upgrade.cta":"View Pro","upgrade.licenseShortcut":"Enter License","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"What's New","whatsNew.pageSubtitle":"Stay up to date with MCP changes","whatsNew.unreadSection":"Unread","whatsNew.allSection":"All Announcements","whatsNew.empty":"No announcements yet","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Release","whatsNew.category.notice":"Notice","whatsNew.category.deprecation":"Deprecated","whatsNew.category.tip":"Tip","uiStudio.title":"UI Studio","uiStudio.empty":"No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio plugin is not connected","uiStudio.pluginGuide.message":"UI Studio shows screenshots and change history from the connected Studio place. It will update automatically after Studio and the WEPPY Plugin connect.","uiStudio.pluginGuide.check1":"Is Roblox Studio running?","uiStudio.pluginGuide.check2":"Is the WEPPY Plugin installed and running?","uiStudio.pluginGuide.waiting":"Waiting for plugin connection...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Review first","uiStudio.priorityLow":"Optional improvement","uiStudio.highPrioritySection":"Review first","uiStudio.lowPrioritySection":"Optional improvements","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analysis","uiStudio.tabs.history":"History","uiStudio.analysis.reportsTitle":"Latest Analysis by UI Target","uiStudio.analysis.recentCapturesTitle":"Recent Captures","uiStudio.analysis.detailDialog":"Analysis detail","uiStudio.analysis.targetCountLabel":"Targets analyzed","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Improvement Suggestions","uiStudio.analysis.verdict.needsFix":"Improvement Suggestions","uiStudio.analysis.verdict.review":"Improvement Suggestions","uiStudio.analysis.verdict.passed":"No Current Suggestions","uiStudio.analysis.verdictLabel":"Improvement Summary","uiStudio.analysis.coverage.structuralOnly":"Structural checks complete","uiStudio.analysis.coverage.visualSkipped":"Structural checks complete · Visual review skipped","uiStudio.analysis.coverage.visualFailed":"Structural checks complete · Visual review failed","uiStudio.analysis.coverage.full":"Structural and visual checks complete","uiStudio.analysis.coverage.deterministicFailed":"Structural checks failed","uiStudio.analysis.thresholds":"Review basis","uiStudio.analysis.issueSummary.passed":"No additional improvement suggestions under the current review basis.","uiStudio.history.title":"Change History","uiStudio.history.empty":"No history yet. When an AI agent modifies UI using manage_ui, it will be recorded automatically.","uiStudio.history.loading":"Loading...","uiStudio.history.loadingPlace":"Loading current place...","uiStudio.history.noPlace":"No current place data is available yet. Connect WEPPY Plugin and sync a place to view UI change history.","uiStudio.history.noPlaceAction":"Current place is not available yet.","uiStudio.history.error":"Error","uiStudio.history.clear":"Clear","uiStudio.history.filter.actions":"Action type","uiStudio.history.filter.actionAll":"All","uiStudio.history.filter.actionCreate":"Create","uiStudio.history.filter.actionUpdate":"Update","uiStudio.history.filter.actionDelete":"Delete","uiStudio.history.filter.period":"Period","uiStudio.history.filter.dateAll":"All","uiStudio.history.filter.today":"Today","uiStudio.history.filter.yesterday":"Yesterday","uiStudio.history.filter.last7Days":"Last 7 days","uiStudio.history.filter.last30Days":"Last 30 days","uiStudio.history.filter.customRange":"Custom range","uiStudio.history.filter.reset":"Reset","uiStudio.history.filter.from":"From","uiStudio.history.filter.to":"To","uiStudio.history.row.affectedPaths":"Paths","uiStudio.history.row.mutations":"Change details","uiStudio.history.row.expand":"▾ Expand","uiStudio.history.row.collapse":"▲ Collapse","uiStudio.history.row.expandDetails":"Show {n} change details","uiStudio.history.row.collapseDetails":"Hide change details","uiStudio.history.row.toggleDetails":"Toggle change details","uiStudio.history.row.mutationsEmpty":"No change details","uiStudio.history.row.toolLabel":"UI changes ({n})","uiStudio.history.row.compare":"Before / After","uiStudio.history.row.noBeforeState":"No before state","uiStudio.history.row.noAfterState":"No after state","uiStudio.history.row.qualityPlan":"Design direction","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: unavailable","uiStudio.history.row.designCheckNone":"Suggestions: none","uiStudio.history.selection.deleteSelected":"Delete Selected","uiStudio.history.selection.selectAll":"Select All","uiStudio.history.selection.clearSelection":"Clear Selection","uiStudio.history.confirm.deleteRequestsTitle":"Delete Change Records","uiStudio.history.confirm.deleteRequestsMessage":"The selected change records will be deleted. This action cannot be undone.","uiStudio.history.confirm.clearRequestsTitle":"Clear Change History","uiStudio.history.confirm.clearRequestsMessage":"This clears the current place change history. Studio instances are not affected.","uiStudio.history.confirm.cascadeOption":"Also delete linked screenshots","uiStudio.history.drawer.close":"Close","uiStudio.actions.previewAgain":"Preview Again","uiStudio.actions.deleteSnapshot":"Delete This Screenshot","uiStudio.actions.proRequired":"Available after upgrading to Pro","uiStudio.actions.captureCurrentState":"Capture Current State","uiStudio.actions.checkSuggestionsAgain":"Re-check Suggestions","uiStudio.actions.previewRunning":"Capturing…","uiStudio.actions.previewRunningDetail":"The new screenshot file ID will appear when capture finishes.","uiStudio.actions.previewNeedsSaveCheck":"Capture complete, save needs review","uiStudio.actions.previewSaved":"New screenshot saved","uiStudio.actions.previewComplete":"Capture complete","uiStudio.actions.previewSavedDetail":"Existing screenshots are kept; this was saved as a new file.","uiStudio.actions.previewSavedPathMissing":"A new screenshot ID was returned, but the saved file path could not be confirmed.","uiStudio.actions.previewSnapshotIdMissing":"The new screenshot ID could not be confirmed. Refresh the list to verify whether it was saved.","uiStudio.actions.more":"More","uiStudio.gallery.selection.selectedCount":" selected","uiStudio.confirm.deleteSnapshotTitle":"Delete Screenshot","uiStudio.confirm.deleteSnapshotMessage":"Only this screenshot file will be deleted (the Studio instance is preserved).","uiStudio.confirm.deleteBatchTitle":"Delete Selected Screenshots","uiStudio.confirm.deleteBatchMessage":"The selected screenshots will be deleted. This action cannot be undone.","uiStudio.gallery.selectMode":"Select","uiStudio.gallery.exitSelectMode":"Cancel","uiStudio.gallery.selectAll":"Select All","uiStudio.gallery.clearSelection":"Clear Selection","uiStudio.gallery.deleteSelected":"Delete Selected","common.save":"Save","common.cancel":"Cancel","common.delete":"Delete","uiStudio.storage.title":"UI Studio Saved Data","uiStudio.storage.usageLabel":"In use","uiStudio.storage.historyBytes":"Change history","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Change records","uiStudio.storage.mutationCount":"Change details","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Last auto-cleanup","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freed","uiStudio.storage.lastRunErrors":"Errors","uiStudio.storage.loading":"Loading...","uiStudio.cleanup.policy.title":"Auto-delete Policy","uiStudio.cleanup.policy.modeOff":"Off","uiStudio.cleanup.policy.modeAge":"Age-based","uiStudio.cleanup.policy.modeSize":"Size-based","uiStudio.cleanup.policy.cascade":"Also delete linked screenshots","uiStudio.cleanup.policy.save":"Save Policy","uiStudio.cleanup.policy.runNow":"Run saved policy","uiStudio.cleanup.policy.proRequired":"Available after upgrading to Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirm Policy","uiStudio.cleanup.policy.confirm.messageStrict":"Applying this policy will immediately delete","uiStudio.cleanup.policy.confirm.requests":" change records","uiStudio.cleanup.policy.confirm.snapshots":" screenshots","uiStudio.cleanup.policy.confirm.freed":"freed — Apply?","uiStudio.cleanup.keepLastNDays":"Keep last {n} days","uiStudio.cleanup.selectedDelete":"Delete Selected…","uiStudio.cleanup.deleteAll":"Delete All…","uiStudio.cleanup.cleanupConfirmTitle":"Confirm Cleanup","uiStudio.cleanup.cleanupConfirmMessage":"All selected items will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manual cleanup","uiStudio.cleanup.studioPreservedNote":"This deletes saved change records and screenshots on disk only; Roblox Studio instances are not affected.","uiStudio.history.sample.bannerBadge":"Preview of the Pro change history","uiStudio.history.sample.bannerTitle":"You are previewing the UI change history that unlocks after upgrading to Pro.","uiStudio.history.sample.bannerMessage":"This preview uses sample data. Real change history, before/after comparison, and batch delete unlock with Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Run saved policy","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Clear all","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","uiStudio.history.sample.tooltip":"Full history is available with Pro","toast.serverConnected":"MCP server connected","toast.serverDisconnected":"MCP server disconnected","toast.pluginConnected":"Plugin connected","toast.pluginDisconnected":"Plugin disconnected","toast.clearSuccess":"Cleared successfully","toast.clearFailed":"Failed to clear data","common.clear":"Clear","settings.license.activate":"Activate License","settings.license.refresh":"Refresh License","settings.license.keyInput":"License Key","settings.license.disconnected":"Disconnected","settings.license.disconnected.tooltip":"Reconnect to the MCP server to manage license actions from WEPPY Dashboard.","settings.license.live.tooltip":"License actions are sent to the MCP server immediately.","settings.license.status.activationRequired":"Activation Required","settings.license.status.activationRequired.tooltip":"Manual license activation is required before WEPPY Dashboard can refresh this status.","settings.license.status.grace":"Grace","settings.license.status.grace.tooltip":"Provider verification is temporarily unavailable, but Pro access remains active during the grace period.","settings.license.status.graceBilling.tooltip":"Pro access is still available during a billing-related grace period.","settings.license.detail.graceBilling":"Pro access remains available during a billing grace period.","settings.license.detail.graceProviderUnavailable":"Provider unavailable. Pro access remains active during grace mode.","settings.license.detail.manualActivation":"Manual activation required to restore Pro access.","settings.license.detail.missingSessionToken":"Refresh is blocked because the current session token is missing.","settings.license.detail.refreshRecommended":"License verification should be refreshed soon.","connection.agents.kill":"Kill","connection.agents.kill.title":"Kill agent?","connection.agents.killed":"Agent killed","connection.agents.killFailed":"Failed to kill agent","connection.agents.lastCommand":"Last Command","connection.agents.lastCommand.tooltip":"Most recent tool call executed by this agent","connection.agents.lastSeen":"Last Seen","connection.agents.lastSeen.tooltip":"Most recent heartbeat or activity from this agent","connection.clear.title":"Clear connection log?","connection.clear.message":"This permanently removes the stored connection log for the current project.","sync.clear.title":"Clear sync log?","sync.clear.message":"This permanently removes the stored sync log for the current place.","playtest.clear.title":"Clear test history?","playtest.clear.message":"This permanently removes the stored playtest reports for the current place.","changelog.clear.title":"Clear changelog?","changelog.clear.message":"This permanently removes the stored changelog for the current place.","sync.status.placePath":"Place Path","sync.status.placePath.tooltip":"Active place directory where explorer files are synced.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Representative area","changelog.card.verification":"Verification","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Brief design direction used for this change.","uiStudio.history.row.designCheck.tooltip":"Post-change Design Check suggestion summary.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the saved cleanup rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"View Pro features and purchase options.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.manageStorage":"Manage storage","settings.dataHistory.manageStorage.tooltip":"Show or hide storage policy and cleanup controls.","settings.dataHistory.manageStorage.projectChanges.aria":"Manage Project change summary storage","settings.dataHistory.manageStorage.uiStudio.aria":"Manage UI Studio history and screenshots storage","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check suggestions","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Check again","uiStudio.actions.designCheckRunning":"Checking suggestions...","uiStudio.actions.designCheckRunningDetail":"Review first, recommended, and optional item counts will appear when the check finishes.","uiStudio.actions.designCheckComplete":"Suggestion check complete","uiStudio.actions.designCheckNoSnapshotSaved":"This action does not save a new screenshot file.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Number of suggestions to review first. Click for details.","uiStudio.gallery.priorityMediumBadge.tooltip":"Number of recommended suggestions.","uiStudio.priorityMedium":"Review recommended","uiStudio.mediumPrioritySection":"Review recommended","uiStudio.gallery.priorityLowBadge.tooltip":"Number of optional improvements.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Error","uiStudio.analysis.expandChildren":"Show child targets","uiStudio.analysis.openDetail":"Open detail","uiStudio.analysis.childTargets":"Child targets","uiStudio.analysis.childDetailHint":"Open child target detail","uiStudio.compare.before":"Before","uiStudio.compare.after":"After","uiStudio.history.drawer.changeDetails":"Change details","uiStudio.gallery.cardCheckbox":"Select screenshot","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"All scopes","assets.explorer.label":"Asset explorer","assets.breadcrumb.label":"Asset path","assets.explorer.summary":"{direct} in this folder · {descendant} in subfolders","assets.folder.count.one":"1 asset","assets.folder.count.many":"{count} assets","assets.folder.type":"Folder","assets.folders.title":"Folders","assets.folder.assetsTitle":"Assets in this folder","assets.organization.label":"Browse","assets.organization.folders":"Folders","assets.organization.all":"All assets","assets.organization.summary":"{count} assets","assets.view.options":"View options","assets.view.mode":"View mode","assets.view.grid":"Grid","assets.view.list":"List","assets.view.thumbnailSize":"Thumbnail size","assets.view.thumbnailSize.listReason":"Thumbnail size is available in Grid view.","assets.view.size.small":"Small","assets.view.size.medium":"Medium","assets.view.size.large":"Large","assets.list.name":"Name","assets.list.type":"Type","assets.list.scope":"Scope","assets.list.status":"Status","assets.list.updated":"Updated","assets.loading.scope":"Loading {scope} assets...","assets.partial.title":"Some locations could not be loaded","assets.empty.folderTitle":"No matching assets in this folder","assets.empty.folderBody":"Try another folder or category filter.","assets.empty.filteredTitle":"No assets match this filter","assets.empty.filteredBody":"Choose another category or rescan the matching inbox folders.","assets.place.selector":"Asset place","assets.place.context":"Asset place context","assets.place.sharedLibrary":"Shared library","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan inbox folders for the current filter.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Roblox Open Cloud uploads","assets.settings.openCloudToggle.help":"Allow WEPPY to upload Asset Library items to Roblox through the selected Open Cloud credential profile.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope, then rescan inbox folders for the current filter.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"How it works","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect the shared WEPPY Bridge, each AI agent's MCP Adapter, Studio targets, and connection log events.","dashboardHelp.connection.needs.1":"The WEPPY Bridge must be reachable. Studio target rows appear after WEPPY Plugin sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review structured Playtest evidence for UI, input, and server results saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows one sample. Play screenshot evidence is unavailable; semantic UI and interaction evidence remain available. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Close","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If a Studio target is missing, open Roblox Studio and run WEPPY Plugin. If an AI agent or MCP Adapter is missing, reconnect WEPPY MCP Server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect WEPPY Bridge, MCP Adapter, Studio Plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","controls.studioRouting.settingLabel":"Requests without a named Studio target","controls.studioRouting.mode.auto":"Automatic","controls.studioRouting.mode.pinned":"Studio fixed","controls.studioRouting.state.auto":"Current: Automatic","controls.studioRouting.state.pinned":"Current: Studio fixed","controls.studioRouting.saving":"Applying…","controls.studioRouting.applied":"Applied","controls.studioRouting.failed":"Failed to apply","controls.studioRouting.pinnedUnavailable":"Connect a Studio target to use Studio fixed mode.","controls.studioRouting.helpLabel":"How Studio routing works","controls.studioRouting.helpButton":"How does it work?","controls.studioRouting.selectTarget":"Select fixed Studio","controls.studioRouting.select":"Select","controls.studioRouting.targetGroupLabel":"Studio fixed target","controls.luauValidation.title":"Luau Syntax Validation","controls.luauValidation.settingLabel":"Check automatically after Script edits","controls.luauValidation.benefit":"After AI edits a Script, check for Luau syntax errors.","controls.luauValidation.state.on":"Current: On","controls.luauValidation.state.off":"Current: Off","controls.luauValidation.priority":"If an AI request differs from this setting, the Dashboard setting is used. Turn it on or off here to change how Script edits are checked.","controls.luauValidation.switchLabel":"Enforce syntax validation after script writes","controls.luauValidation.saving":"Saving…","controls.luauValidation.applied":"Applied","controls.luauValidation.failed":"Failed to apply","controls.luauValidation.helpLabel":"How Luau syntax validation works","controls.luauValidation.helpButton":"How does it work?","controls.luauValidation.help.behavior":"When On, after AI finishes replacing, editing, inserting, or deleting Script lines, WEPPY checks the full code that was actually saved. When Off, the Script is edited without an automatic syntax check.","controls.luauValidation.help.response":"A clean Script keeps the usual short completion response. WEPPY gives details only when it finds an error or cannot complete the check. Large Scripts may take a little longer.","controls.luauValidation.help.nonBlocking":"If WEPPY finds a syntax error or cannot complete the check, the saved Script change is not undone. The result helps the AI fix the same Script right away.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.state.currentTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.help.auto":"Automatic uses the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.help.pinned":"Studio fixed uses the selected Studio unless the request names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Sync format update available","sync.migration.description":"Review the metadata changes before updating this place from sync format v2 to v3.","sync.migration.status.ready":"Ready to review","sync.migration.status.blocked":"Blocked","sync.migration.preview":"Review changes","sync.migration.summary.add":"Add","sync.migration.summary.modify":"Modify","sync.migration.summary.delete":"Delete","sync.migration.summary.blocked":"Blocked","sync.migration.changes":"Metadata changes","sync.migration.blockers":"Items to resolve","sync.migration.operation.add":"add","sync.migration.operation.modify":"modify","sync.migration.operation.delete":"delete","sync.migration.reason.serializer_regeneration":"Rewrites metadata in the canonical v3 format.","sync.migration.reason.volatile_metadata_removal":"Removes volatile sync metadata.","sync.migration.reason.redundant_empty_metadata":"Removes redundant empty metadata.","sync.migration.reason.runtime_ignore_policy":"Updates the managed runtime ignore policy.","sync.migration.reason.reverse_pending":"Apply or discard pending local-to-Studio changes first.","sync.migration.reason.conflict":"Resolve the local and Studio conflict first.","sync.migration.reason.local_canonical_change":"Review the locally modified canonical metadata first.","sync.migration.reason.source_mutation_detected":"A user source file changed during migration validation.","sync.migration.blocked":"Resolve sync conflicts before updating","sync.migration.stale":"Preview changed. Review the latest diff.","sync.migration.error":"Could not update the sync format. Try again.","sync.migration.refresh":"Refresh preview","sync.migration.refreshing":"Refreshing…","sync.migration.applying":"Applying…","sync.migration.apply":"Apply update","sync.migration.confirm.title":"Apply sync format update?","sync.migration.confirm.message":"Back up and update the listed sync metadata. Your Luau source files will not change.","changelog.ownership.showGenerated":"Show generated metadata","changelog.ownership.userSource":"User source","changelog.ownership.canonicalMirror":"Mirror metadata","changelog.ownership.generated":"Generated","uiStudio.analysis.verdict.incomplete":"Review evidence incomplete","uiStudio.analysis.issueSummary.incomplete":"No suggestions, but interaction and responsive review are still pending.","uiStudio.analysis.coverageDimensions":"Review coverage","uiStudio.analysis.coverageStatus.completed":"Complete","uiStudio.analysis.coverageStatus.failed":"Failed","uiStudio.analysis.coverageStatus.skipped":"Skipped","uiStudio.history.row.readinessIncomplete":"Readiness: evidence incomplete","uiStudio.noSuggestionsIncomplete":"No suggestions, but some review coverage is still missing.","uiStudio.readiness.summary":"UI readiness","uiStudio.primaryVisual.label":"Primary visual","uiStudio.primaryVisual.recompose":"Recompose","uiStudio.primaryVisual.refine":"Refine","uiStudio.primaryVisual.approved":"Approved","uiStudio.primaryVisual.unknown":"Unknown","uiStudio.functional.label":"Functional","uiStudio.functional.safe":"Safe","uiStudio.functional.risk":"Risk found","uiStudio.functional.unknown":"Unknown","uiStudio.functional.safeCompact":"Functional safe","uiStudio.functional.riskCompact":"Functional risk","uiStudio.functional.unknownCompact":"Functional unknown","uiStudio.responsive.label":"Responsive","uiStudio.responsive.recommended":"Recommended","uiStudio.responsive.required":"Required","uiStudio.responsive.unknown":"Unknown","uiStudio.responsive.recommendedCompact":"Responsive recommended","uiStudio.responsive.requiredCompact":"Responsive required","uiStudio.responsive.unknownCompact":"Responsive unknown","uiStudio.readiness.ready":"Ready","uiStudio.readiness.reviewRequired":"Review required","uiStudio.readiness.insufficient":"Evidence incomplete","uiStudio.readiness.unknown":"Readiness unknown","uiStudio.criticSummary":"Critic summary","playtest.history.kind.structured":"Structured","playtest.history.kind.legacy":"Legacy","playtest.history.kind.attention":"Needs attention","playtest.summary.title":"Run summary","playtest.summary.status":"Status","playtest.summary.mode":"Mode","playtest.summary.duration":"Duration","playtest.summary.cleanup":"Cleanup","playtest.dimension.title":"Evidence dimensions","playtest.dimension.hint":"Required evidence is marked below.","playtest.dimension.server":"Server","playtest.dimension.clientUi":"Client UI","playtest.dimension.interaction":"Interaction","playtest.dimension.visual":"Visual","playtest.dimension.required":"Required","playtest.dimension.optional":"Optional","playtest.dimension.steps":"Steps","playtest.steps.title":"Step timeline","playtest.steps.expected":"Expected","playtest.steps.observed":"Observed","playtest.steps.evidence":"Evidence","playtest.steps.server":"Server","playtest.steps.details":"details","playtest.capability.title":"Capabilities and limits","playtest.capability.semanticUi":"Semantic UI snapshot","playtest.capability.virtualInput":"Virtual input","playtest.capability.fixedBootstrap":"Fixed agent bootstrap","playtest.capability.projectAdapter":"Project test adapter","playtest.capability.available":"Available","playtest.capability.unavailable":"Unavailable","playtest.limitations.title":"Limitations","playtest.artifacts.title":"Artifacts","playtest.result.status.passed":"Passed","playtest.result.status.failed":"Failed","playtest.result.status.timedOut":"Timed out","playtest.result.status.cancelled":"Cancelled","playtest.result.status.insufficientEvidence":"Insufficient evidence","playtest.result.status.unavailable":"Unavailable","playtest.result.status.skipped":"Skipped","playtest.result.status.notRequested":"Not requested","playtest.result.status.unknown":"Unknown","playtest.record.incomplete":"Structured result is incomplete","playtest.record.corrupt":"Structured result is damaged","playtest.record.unsupported":"Structured result version is unsupported","playtest.record.unavailable":"Result details are unavailable.","playtest.sample.terminal":"All required evidence passed","playtest.sample.limit.visual":"Play screenshot evidence is unavailable in structured session v1","playtest.history.agents":"Agents","playtest.history.agentCounts":"Server {server} · Client {client}","playtest.agents.title":"Test agents","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Visual evidence unavailable — Play screenshots are not supported in structured session v1.","playtest.limitations.virtualInputUnavailable":"Virtual input is unavailable for this session.","playtest.limitations.visualUnsupportedReason":"Play screenshots are not supported in structured session v1.","playtest.dimension.reason.missing":"Required evidence is missing.","playtest.dimension.reason.capability":"The required capability is unavailable.","playtest.artifacts.metadata":"Result metadata"},Vy={"sidebar.overview":"개요","sidebar.changelog":"변경 이력","sidebar.connection":"연결","sidebar.sync":"동기화","sidebar.playtest":"플레이테스트","sidebar.tools":"도구","sidebar.settings":"설정","sidebar.ui_studio":"UI 스튜디오","sidebar.gate.l1":"MCP 서버를 연결해야 이 페이지를 사용할 수 있습니다.","sidebar.gate.l2":"Roblox Studio 플러그인을 연결해야 이 페이지를 사용할 수 있습니다.","header.currentProject":"현재 프로젝트","header.unknownProject":"알 수 없는 프로젝트","header.projectRoot.label":"Project Root","header.currentProject.loading":"프로젝트 루트 불러오는 중...","header.currentProject.unavailable":"프로젝트 루트를 불러올 수 없음","header.placeNotConnected":"플레이스 미연결","header.currentProject.tooltip":"현재 선택된 프로젝트 폴더입니다.","header.currentProject.loading.tooltip":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.currentProject.unavailable.tooltip":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root 불러오는 중...","header.currentProjectSyncRoot.unavailable":"Sync root 정보를 불러올 수 없음","header.currentProjectSyncRoot.tooltip":"선택된 프로젝트의 현재 sync root 폴더입니다.","header.currentProjectSyncRoot.loading.tooltip":"Sync root 정보를 아직 불러오는 중입니다.","header.currentProjectSyncRoot.unavailable.tooltip":"현재 sync root 정보를 불러올 수 없습니다.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"테스트 파일 경로를 확인할 수 없습니다.","header.testFiles.tooltip":"선택된 플레이스의 현재 플레이테스트 파일 경로입니다.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"플러그인 연결 필요","header.places.liveRequired":"실시간 활성 플레이스를 확인하려면 플러그인 연결이 필요합니다.","header.place.tooltip":"연결된 Roblox 플레이스입니다.","header.placeNotConnected.tooltip":"플레이스 미연결","placeScope.current.label":"현재 플레이스","placeScope.lastActive.label":"마지막 활성 플레이스","placeScope.selected.label":"선택한 플레이스","placeScope.unknownPlace":"알 수 없는 플레이스","placeScope.live":"실시간","placeScope.stored":"저장됨","placeScope.pluginRequired":"플러그인 필요","placeScope.pluginRequired.note":"실시간 활성 플레이스를 확인하려면 WEPPY Plugin을 연결하세요.","placeScope.noPlace.label":"플레이스 범위","placeScope.noPlace.value":"아직 플레이스 데이터가 없습니다.","placeScope.noPlace.badge":"플레이스 없음","placeScope.noPlace.note":"WEPPY Plugin을 연결하고 플레이스를 동기화하면 place-scoped 데이터가 생성됩니다.","placeScope.selected.note":"저장된 데이터만 표시합니다. Studio 라우팅은 변경되지 않습니다.","placeScope.surface.sync":"이 플레이스의 동기화 상태와 로그를 표시합니다.","placeScope.surface.changelog":"이 플레이스의 변경 이력 세션을 표시합니다.","placeScope.surface.playtest":"이 플레이스의 플레이테스트 보고서를 표시합니다.","placeScope.surface.uiStudio":"이 플레이스의 UI 캡처와 변경 이력을 표시합니다.","placeScope.surface.tools":"이 플레이스의 도구 실행 기록과 통계를 표시합니다.","placeScope.loading":"플레이스 범위 불러오는 중...","placeScope.unavailable":"플레이스 범위를 사용할 수 없습니다.","placeScope.selector.label":"플레이스 데이터","header.changeProjectRoot":"프로젝트 루트 변경","header.changeProjectRoot.ariaLabel":"프로젝트 루트 변경","header.changeProjectRoot.tooltip":"현재 프로젝트 루트를 변경합니다.","header.changeProjectRoot.disabledTooltip.l0":"프로젝트 루트를 변경하려면 먼저 MCP 서버 연결이 필요합니다.","header.changeProjectRoot.disabledTooltip.loading":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.changeProjectRoot.disabledTooltip.unavailable":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.projectRootModal.initial.title":"프로젝트 루트 변경","header.projectRootModal.initial.body.connected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 현재 Studio 내용이 새 <selected project folder>/weppy-project-sync 대상으로 전체 재동기화됩니다.","header.projectRootModal.initial.body.disconnected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 새 <selected project folder>/weppy-project-sync 경로가 다음 sync 대상으로 사용됩니다.","header.projectRootModal.initial.nextSyncRoot":"선택 후 새 sync 대상","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"현재 sync는 즉시 중단됩니다.","header.projectRootModal.initial.warningFreshSync":"현재 Studio 내용을 기준으로 새 대상에 fresh full sync가 다시 생성됩니다.","header.projectRootModal.initial.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.initial.warningDeferredSync":"Studio가 아직 연결되지 않았다면 전체 재동기화는 다음 플러그인 연결 시 시작됩니다.","header.projectRootModal.confirm.title":"새 프로젝트 루트 확인","header.projectRootModal.confirm.body":"적용 전에 선택한 프로젝트 폴더를 다시 확인하세요.","header.projectRootModal.confirm.projectRoot":"선택한 프로젝트 폴더","header.projectRootModal.confirm.syncRoot":"새 sync 대상","header.projectRootModal.confirm.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.pick":"폴더 선택","header.projectRootModal.apply":"변경 적용","header.projectRootModal.cancel":"취소","header.projectRootModal.error":"프로젝트 루트를 변경하지 못했습니다.","status.online":"온라인","status.offline":"오프라인","status.idle":"대기","status.syncing":"동기화 중","status.error":"오류","status.initializing":"초기화 중","level.l0.title":"서버 연결 끊김","level.l0.message":"WEPPY Dashboard가 열린 뒤 서버가 종료되었거나 응답하지 않습니다.","level.l1.title":"서버 연결됨","level.l1.hint":"확인: Studio 실행 중? 플러그인 설치?","level.l2.ok":"Studio 연결됨","tier.basic":"Basic","tier.basic.tooltip":"기본 WEPPY Dashboard 기능을 제공하는 Basic 티어입니다.","tier.pro":"Pro","tier.pro.tooltip":"전체 WEPPY Dashboard 기능을 제공하는 Pro 티어입니다.","tier.mixed":"혼합","tier.upgrade":"Pro 확인하기","tier.banner.save":"Pro로 AI 토큰 절약!","tier.tool.query_instances.desc":"인스턴스 조회, 자식/자손 탐색, 클래스 정보, 이름·클래스 검색. Pro: 파일 트리, 프로젝트 구조, 속성·태그 검색.","tier.tool.mutate_instances.desc":"인스턴스 생성, 삭제, 복제, 이동, 이름변경, 피벗. Pro: 트리 생성, 대량 생성·삭제·복제.","tier.tool.manage_properties.desc":"속성, 어트리뷰트, 태그 조회 및 설정. Pro: 계산·상대값 설정, 대량 조회·설정, 자식 일괄 수정.","tier.tool.manage_scripts.desc":"스크립트 소스 코드 읽기, 쓰기, 생성, 삭제, 줄 편집, 검색. Pro: 스크립트 간 일괄 치환.","tier.tool.manage_ui.desc":"Pro 전용. 게임 스타일의 메뉴, HUD, 버튼, 라벨, 이미지 패널을 생성·개선하고 화면 캡처와 개선 제안을 확인합니다.","tier.tool.manage_ui.action.design_brief":"UI 방향 정리","tier.tool.manage_ui.action.create_tree":"새 UI 만들기","tier.tool.manage_ui.action.update":"기존 UI 수정","tier.tool.manage_ui.action.delete":"UI 삭제","tier.tool.manage_ui.action.preview":"UI 화면 캡처","tier.tool.manage_ui.action.check":"개선 제안 확인","tier.tool.manage_lighting.desc":"Pro 전용. 조명, 대기, 하늘, 터레인 속성, 시간대 환경 설정.","tier.tool.manage_selection.desc":"선택 조회, 설정, 해제. Pro: 컨텍스트, 상세 정보, 항목 추가·제거, 변경 감시.","tier.tool.manage_camera.desc":"카메라 정보 조회, 경로 또는 좌표로 포커스, 추천 뷰 제안.","tier.tool.manage_tween.desc":"Pro 전용. 부드러운 애니메이션을 위한 트윈 생성, 재생, 일시정지, 취소.","tier.tool.manage_audio.desc":"Pro 전용. 사운드 재생, 정지, 일시정지, 재개. 오디오 리스너 설정.","tier.tool.manage_animation.desc":"Pro 전용. 애니메이션 로드, 재생, 정지. 휴머노이드·컨트롤러의 트랙 조회.","tier.tool.manage_physics.desc":"Pro 전용. 물리 충돌 그룹 등록, 그룹 간 충돌 설정, 목록 조회.","tier.tool.manage_effects.desc":"Pro 전용. 파티클 방출, 전체 삭제, 이펙트 활성화 토글.","tier.tool.manage_terrain.desc":"Pro 전용. 도형 채우기, 영역 삭제, 재질 치환, 색상 관리, 복셀 읽기·쓰기, 절차적 생성, 스무딩.","tier.tool.spatial_query.desc":"Pro 전용. 레이캐스트, 지면 찾기, 배치 확인, 영역 스캔, 평지·스폰 위치 탐색, 보행 분석, 공간 맵, 충돌 확인.","tier.tool.manage_assets.desc":"Pro 전용. 모델 삽입, 에셋 정보 조회, 크리에이터 스토어 검색, 무료 모델·패키지 삽입, 내보내기.","tier.tool.manage_sync.desc":"Pro 전용. 동기화 상태, 설정, 히스토리, 방향 설정, 동기화 파일 읽기·쓰기.","tier.tool.workspace_state.desc":"Pro 전용. 전체 동기화, 상태 캡처, 최근 변경, 뷰포트 정보, 메타데이터, 캐시 관리.","tier.tool.manage_logs.desc":"출력 로그 필터링 조회, 증분 폴링, 버퍼 삭제, 최근 오류 조회.","tier.tool.system_info.desc":"연결 상태, 사용 티어 확인. Pro: 플레이스 정보, 서비스 목록, Studio 설정, 플레이테스트 제어, 자동 테스트.","tier.tool.manage_studio.desc":"Pro 전용. 스크린샷과 QA 흐름을 위해 UI 프리뷰 같은 Studio 편집기 보기 설정을 전환합니다. 게임 UI 오브젝트는 변경하지 않습니다.","tier.tool.batch_execute.desc":"Pro 전용. 여러 명령을 한 번에 일괄 실행. 순차 처리하며 오류 시 계속 진행 옵션.","tier.tool.execute_luau.desc":"Pro 전용. Roblox Studio 샌드박스에서 임의 Luau 코드 실행.","connection.server.title":"Bridge 상태","connection.server.version":"버전","connection.server.version.tooltip":"WEPPY Bridge 런타임 버전입니다.","connection.server.pid":"PID","connection.server.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","connection.server.uptime":"가동 시간","connection.server.uptime.tooltip":"WEPPY Bridge가 시작된 뒤 경과한 시간입니다.","connection.server.session":"세션","connection.server.session.tooltip":"현재 WEPPY Bridge 세션 식별자입니다.","connection.server.exec":"실행 파일","connection.server.exec.tooltip":"WEPPY Bridge를 실행한 실행 파일 경로입니다.","connection.reconnect":"수동 재연결","connection.checkSettings":"설정 확인","connection.agents.title":"AI 에이전트","connection.agents.name":"에이전트","connection.agents.version":"버전","connection.agents.version.tooltip":"이 에이전트 세션의 MCP Adapter 패키지 버전입니다.","connection.agents.cwd":"작업 디렉토리","connection.agents.cwd.tooltip":"연결된 AI 에이전트의 현재 작업 디렉토리입니다.","connection.agents.projectRoot":"프로젝트 루트","connection.agents.projectRoot.tooltip":"Sync ownership을 결정하는 프로젝트 경로","connection.agents.projectRoot.unresolved":"미확인","connection.agents.connected":"연결 시각","connection.agents.unknown":"알 수 없음","connection.agents.none":"연결된 에이전트 없음","connection.plugins.title":"플러그인","connection.plugins.place":"플레이스","connection.plugins.clientId":"연결 ID","connection.plugins.clientId.tooltip":"진단용 전체 연결 ID입니다.","connection.plugins.lastSeen":"마지막 확인","connection.plugins.lastSeen.tooltip":"플러그인에서 가장 최근에 수신한 heartbeat 시각입니다.","connection.plugins.version":"버전","connection.plugins.version.tooltip":"Studio가 보고한 설치된 플러그인 버전입니다.","connection.plugins.none":"연결된 플러그인 없음","connection.targets.title":"Studio 타깃","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"이 Roblox Studio 창을 가리키는 짧은 이름입니다.","connection.targets.place":"플레이스","connection.targets.placeId":"플레이스 ID","connection.targets.placeId.tooltip":"이 Studio 창의 Roblox 플레이스 ID입니다.","connection.targets.clientId":"연결 ID","connection.targets.clientId.tooltip":"진단용 전체 연결 ID입니다. 보통은 Studio ID를 사용하세요.","connection.targets.session":"세션","connection.targets.session.tooltip":"이 Studio 타깃의 명령 채널 상태입니다.","connection.targets.lastUsed":"마지막 사용","connection.targets.lastUsed.tooltip":"이 Studio 타깃으로 가장 최근에 라우팅된 plugin-route 요청 시각입니다.","connection.targets.lastSeen":"마지막 확인","connection.targets.lastSeen.tooltip":"이 Studio 타깃에서 가장 최근에 수신한 heartbeat 시각입니다.","connection.targets.version":"버전","connection.targets.version.tooltip":"Studio가 보고한 설치된 플러그인 버전입니다.","connection.targets.routing":"라우팅","connection.targets.routing.tooltip":"에이전트가 Studio 창을 지정하지 않았을 때 사용할 기본 창입니다.","connection.targets.inFlight":"진행 중","connection.targets.inFlight.tooltip":"이 Studio 타깃으로 현재 라우팅된 진행 중 명령 요청입니다.","connection.targets.studioState":"Studio 상태","connection.targets.studioState.tooltip":"이 Studio 창이 보고한 현재 편집/실행 상태입니다.","connection.targets.studioState.edit":"편집","connection.targets.studioState.running":"실행 중","connection.targets.studioState.paused":"일시정지","connection.targets.studioState.unknown":"알 수 없음","connection.targets.studioState.source.thread":"WEPPY 실행 명령","connection.targets.studioState.source.pluginConnection":"Studio Play/Test 연결","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"알 수 없는 출처","connection.targets.studioState.updatedUnknown":"보고 없음","connection.targets.copyPlaceId":"플레이스 ID 복사","connection.targets.copyTargetAlias":"Studio ID 복사","connection.targets.copyClientId":"연결 ID 복사","connection.targets.copied":"값을 복사했습니다","connection.targets.copyFailed":"값을 복사하지 못했습니다","connection.targets.none":"연결된 Studio target이 없습니다. Roblox Studio를 열고 WEPPY Plugin을 연결하세요.","connection.targets.help":'Studio 창이 여러 개 연결된 경우 에이전트에게 "Studio ID studio-1에 적용해줘"처럼 말해 특정 창을 지정할 수 있습니다.',"connection.topology.ariaLabel":"연결 구조","connection.topology.title":"연결 구조","connection.topology.description":"각 AI 에이전트는 자체 MCP Adapter를 통해 하나의 공유 WEPPY Bridge에 연결되고, Bridge가 Roblox Studio 연결을 유지합니다.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"활성","connection.topology.stale":"지연","connection.topology.unknown":"미확인","connection.topology.lastActivity":"마지막 활동","connection.topology.noActivity":"최근 활동 없음","connection.topology.versionUnknown":"버전 미확인","connection.topology.placeUnknown":"플레이스 미확인","connection.topology.moreAgents":"+{count}개 에이전트 더 있음","connection.topology.moreStudios":"+{count}개 Studio 더 있음","connection.topology.allAgentsVisible":"모든 에이전트 표시 중","connection.topology.allStudiosVisible":"모든 Studio 표시 중","connection.topology.showAll":"모두 보기","connection.topology.showLess":"접기","connection.topology.showAllAgents":"모든 AI 에이전트 보기","connection.topology.showAllStudios":"모든 Studio 타깃 보기","connection.topology.showLessAgents":"AI 에이전트 접기","connection.topology.showLessStudios":"Studio 타깃 접기","connection.routing.updateFailed":"라우팅 target을 변경하지 못했습니다","connection.log.title":"연결 로그","connection.log.empty":"이벤트 없음","connection.time.secondsAgo":"초 전","connection.time.minutesAgo":"분 전","connection.time.hoursAgo":"시간 전","common.loading":"로딩 중...","common.retry":"재시도","common.reconnecting":"재연결 중...","common.expand":"펼치기","common.collapse":"접기","tools.tab.history":"히스토리","tools.tab.statistics":"통계","tools.tab.failures":"실패","tools.col.time":"시간","tools.col.time.tooltip":"도구 실행이 기록된 시각입니다.","tools.col.toolAction":"도구.액션","tools.col.toolAction.tooltip":"실행된 도구 이름과 액션입니다.","tools.col.duration":"소요 시간","tools.col.duration.tooltip":"도구 실행이 완료될 때까지 걸린 시간입니다.","tools.col.status":"상태","tools.col.status.tooltip":"기록된 도구 실행의 결과 상태입니다.","tools.col.tier":"티어","tools.col.tier.tooltip":"도구 또는 액션에 필요한 라이센스 티어입니다.","tools.col.tierStats.tooltip":"도구 통계 행이 Basic, Pro, Mixed 중 어느 집계인지 설명합니다.","tools.col.tool":"도구","tools.col.tool.tooltip":"통계 테이블에 표시되는 통합 도구 이름입니다.","tools.col.calls":"호출 수","tools.col.calls.tooltip":"이 도구에 대해 기록된 총 호출 횟수입니다.","tools.col.ok":"OK","tools.col.ok.tooltip":"직접 성공한 실행 횟수입니다.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 실행으로 성공한 횟수입니다.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback 없이 차단된 실행 횟수입니다.","tools.col.warn":"주의","tools.col.warn.tooltip":"입력, 프로젝트 상태, Roblox 정책 또는 사용자 코드 때문에 예상된 실패로 기록된 횟수입니다.","tools.col.err":"실패","tools.col.err.tooltip":"실패로 끝난 실행 횟수입니다.","tools.col.okRate":"성공률","tools.col.okRate.tooltip":"성공적으로 끝난 호출 비율입니다.","tools.col.avgTime":"평균 시간","tools.col.avgTime.tooltip":"기록된 호출들의 평균 실행 시간입니다.","tools.col.error":"오류","tools.filter.tool":"도구","tools.filter.all":"전체","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"이 항목은 Pro 전용 도구 또는 액션을 사용했습니다.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"요청한 Pro 액션이 Basic fallback으로 성공했습니다.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"요청한 Pro 액션이 차단되었고 fallback도 실행되지 않았습니다.","tools.badge.warn":"주의","tools.badge.warn.tooltip":"요청, 프로젝트 상태, 정책 또는 사용자 코드 조정이 필요한 예상 실패입니다.","tools.badge.err":"실패","tools.badge.err.tooltip":"도구 실행이 실패로 끝났습니다.","tools.status.ok":"OK","tools.status.ok.tooltip":"도구 실행이 성공적으로 완료되었습니다.","tools.tier.mixed.tooltip":"이 도구에는 Basic 액션과 Pro 액션이 함께 포함됩니다.","tools.detail.params":"파라미터","tools.detail.params.tooltip":"이 도구 실행에 전달된 입력 파라미터입니다.","tools.detail.result":"결과","tools.detail.result.tooltip":"이 도구 실행에서 반환된 결과 페이로드입니다.","tools.detail.requestedCommand":"전송한 명령","tools.detail.executedCommand":"실행된 명령","tools.detail.alternatives":"대안","tools.detail.blockedMessage":"차단 사유","tools.detail.noFallback":"Fallback 없음","tools.detail.noFallback.value":"실행된 fallback이 없습니다.","tools.detail.warningMessage":"주의 메시지","tools.detail.errorMessage":"오류 메시지","tools.detail.open":"상세","tools.detail.openLabel":"{command} 상세 보기","tools.detail.dialogLabel":"도구 실행 상세","tools.detail.title":"도구 실행","tools.history.routing":"라우팅","tools.history.routing.mode":"모드","tools.history.routing.requested":"요청","tools.history.routing.actual":"실제","tools.history.routing.none":"지정한 Studio 대상 없음","tools.clear.history.title":"히스토리를 삭제할까요?","tools.clear.history.message":"현재 place의 도구 히스토리가 영구적으로 삭제됩니다.","tools.clear.statistics.title":"통계를 삭제할까요?","tools.clear.statistics.message":"현재 place의 도구 통계가 영구적으로 초기화됩니다.","tools.detail.error":"오류","tools.page.prev":"이전","tools.page.prev.tooltip":"도구 히스토리의 이전 페이지로 이동합니다.","tools.page.next":"다음","tools.page.next.tooltip":"도구 히스토리의 다음 페이지로 이동합니다.","tools.empty.history":"히스토리 없음","tools.empty.stats":"도구 통계 없음","tools.empty.failures":"실패 없음","tools.summary.total":"합계","tools.summary.calls":"호출","tools.summary.sessions":"세션","settings.license.title":"라이센스","settings.license.title.tooltip":"현재 라이센스 상태와 구독 티어입니다.","settings.license.status":"상태","settings.license.status.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.tier":"티어","settings.license.tier.tooltip":"WEPPY Dashboard 기능 범위를 결정하는 현재 구독 티어입니다.","settings.license.key":"키","settings.license.key.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.keyValue.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.provider":"제공자","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.providerValue.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.active":"활성","settings.license.active.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.status.activeCancelPending.tooltip":"해지가 예약되어 있지만 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.inactive":"비활성","settings.license.inactive.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.expired":"만료","settings.license.expired.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.unavailable":"라이센스 정보를 불러올 수 없음","settings.license.detail.cancelPending":"해지가 예약되었습니다. 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.reset":"라이센스 리셋","settings.readOnly":"읽기 전용","settings.readOnly.tooltip":"이 섹션의 값은 WEPPY Dashboard에서 수정할 수 없습니다.","settings.unavailable":"설정을 불러올 수 없음","settings.general.title":"일반 설정","settings.general.title.tooltip":"변경 즉시 적용되는 Hot 설정입니다.","settings.general.liveApply":"즉시 반영","settings.general.liveApply.tooltip":"이 섹션의 변경은 별도 저장 버튼 없이 바로 적용됩니다.","settings.general.applied":"적용됨","settings.general.logLevel":"로그 레벨","settings.general.logLevel.tooltip":"MCP 서버가 남기는 로그의 자세한 정도를 정합니다. 문제 추적이 필요하면 debug 로 낮추세요.","settings.general.localHistory":"도구 히스토리 기록","settings.general.localHistory.tooltip":"AI 도구 호출 기록을 컴퓨터에 저장합니다. Tools / History 화면에서 보기 위해 필요합니다.","settings.general.localStatistics":"도구 통계 집계","settings.general.localStatistics.tooltip":"도구 사용 횟수를 집계합니다. Overview 화면의 통계에 사용됩니다.","settings.general.contextCapture":"컨텍스트 캡처","settings.general.contextCapture.tooltip":"Changelog와 Playtest 화면에서 보기 좋도록 변경 이력을 구조화해 저장합니다.","settings.general.requestTimeout":"작업 제한 시간","settings.general.requestTimeout.tooltip":"AI 도구 한 번 실행에 대해 기다리는 최대 시간(밀리초)입니다. 시간이 지나면 실패로 처리됩니다.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"작업 제한 시간 단위는 밀리초입니다.","settings.cold.title":"서버 환경변수","settings.cold.title.tooltip":"서버 시작 시 로드되는 읽기 전용 환경변수 값입니다.","settings.cold.httpPort.tooltip":"MCP WEPPY Dashboard HTTP 서버가 사용하는 포트 번호입니다.","settings.cold.httpHost.tooltip":"MCP WEPPY Dashboard HTTP 서버가 바인딩하는 호스트 인터페이스입니다.","settings.cold.hint":"환경변수로 설정하세요.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"MCP 서버가 시작될 때 WEPPY Dashboard가 어떻게 동작할지 선택합니다.","settings.dashboard.nextStartBadge":"다음 시작부터","settings.dashboard.autoOpen.label":"WEPPY 시작 시 Dashboard 열기","settings.dashboard.autoOpen.description":"MCP 서버가 시작된 뒤 이 Dashboard를 자동으로 엽니다.","settings.dashboard.autoOpen.nextStart":"다음 MCP 서버 시작부터 적용됩니다.","settings.dashboard.settingsFile.label":"설정 파일","settings.dashboard.agentExample.label":"Agent에게 이렇게 요청해 보세요","settings.dashboard.agentExample.prompt":"“Dashboard 자동 열기 꺼줘”","settings.dashboard.autoOpen.saving":"저장 중…","settings.dashboard.autoOpen.saved":"다음 서버 시작에 적용되도록 저장했습니다.","settings.dashboard.autoOpen.error":"저장하지 못해 이전 설정으로 되돌렸습니다.","dashboardAutoOpenGuide.eyebrow":"Dashboard 설정","dashboardAutoOpenGuide.title":"WEPPY Dashboard를 여는 방식을 선택하세요","dashboardAutoOpenGuide.currentOn":"현재 자동 열기가 켜져 있습니다. MCP 서버가 시작되면 이 Dashboard가 열립니다.","dashboardAutoOpenGuide.currentOff":"현재 자동 열기가 꺼져 있습니다. MCP 서버가 시작되어도 새 Dashboard 탭을 열지 않습니다.","dashboardAutoOpenGuide.changeAnytime":"Settings에서 언제든지 변경할 수 있습니다.","dashboardAutoOpenGuide.agentHint":"Agent에게 “Dashboard 자동 열기 꺼줘”라고 요청할 수도 있습니다.","dashboardAutoOpenGuide.statusOn":"자동 열기 켜짐","dashboardAutoOpenGuide.statusOff":"자동 열기 꺼짐","dashboardAutoOpenGuide.keep":"현재 설정 유지","dashboardAutoOpenGuide.turnOff":"자동 열기 끄기","dashboardAutoOpenGuide.openSettings":"Settings에서 보기","dashboardAutoOpenGuide.close":"자동 열기 안내 닫기","dashboardAutoOpenGuide.saving":"저장 중…","dashboardAutoOpenGuide.error":"선택을 저장하지 못했습니다. 다시 시도해 주세요.","settings.language.title":"언어","settings.language.title.tooltip":"WEPPY Dashboard UI 텍스트에 사용할 언어를 선택합니다.","settings.language.dashboard":"WEPPY Dashboard 언어","settings.language.dashboard.tooltip":"Auto일 때는 시스템 언어를 따르고, 아니면 선택한 언어를 강제합니다.","settings.language.auto":"자동","overview.l0.title":"MCP 서버 연결 끊김","overview.l0.message":"MCP 서버가 응답하지 않습니다. WEPPY Dashboard가 자동으로 재연결을 시도합니다.","overview.l0.step1":"MCP 서버 프로세스가 실행 중인지 확인하세요","overview.l0.step2":"필요 시 MCP 서버 명령을 다시 시작하세요","overview.l0.reconnecting":"3초마다 자동 재연결 중...","overview.l0.reconnectBtn":"수동 재연결","overview.l0.settingsBtn":"설정 확인","overview.l1.pluginGuide":"Roblox Studio 플러그인이 연결되지 않았습니다","overview.l1.check1":"Roblox Studio가 실행 중인가요?","overview.l1.check2":"WEPPY Plugin이 설치되어 있나요?","overview.l1.feedHint":"플러그인이 연결되면 변경사항이 표시됩니다","overview.metric.server":"서버","overview.metric.server.tooltip":"MCP 서버의 실행 상태와 프로세스 상태입니다.","overview.metric.plugin":"플러그인","overview.metric.plugin.tooltip":"Roblox Studio 플러그인의 연결 상태와 버전 정보입니다.","overview.metric.agent":"에이전트","overview.metric.agent.tooltip":"연결된 AI 코딩 에이전트와 현재 실행 상태입니다.","overview.metric.agent.instancesUnit":"인스턴스","overview.metric.sync":"동기화","overview.metric.sync.tooltip":"현재 Studio와 로컬 파일 간 동기화 상태입니다.","overview.metric.noAgent":"에이전트 없음","overview.meta.version":"버전","overview.meta.version.tooltip":"설치된 MCP 서버 버전입니다.","overview.meta.session":"세션","overview.meta.session.tooltip":"현재 MCP 세션 식별자입니다.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","overview.meta.uptime":"가동 시간","overview.meta.uptime.tooltip":"MCP 서버가 시작된 뒤 경과한 시간입니다.","overview.feed.title":"최근 게임 변경","overview.feed.empty":"최근 변경사항 없음","overview.changelog.title":"세션 변경 요약","overview.changelog.entries":"합계","overview.changelog.scripts":"스크립트","overview.changelog.instances":"인스턴스","overview.changelog.properties":"속성","overview.changelog.assets":"에셋","overview.tier.title":"티어 사용 현황","changelog.subtitle":"게임 변경 이력","changelog.filter.all":"전체","changelog.filter.active":"활성","changelog.filter.completed":"완료","changelog.empty":"변경 이력이 없습니다","changelog.basic.limit.title":"Basic 미리보기에서는 최신 3개 세션만 표시됩니다","changelog.basic.limit.body":"Pro에서 이 플레이스의 전체 변경 이력 타임라인을 확인할 수 있습니다.","changelog.basic.metricLabel":"표시 중인 변경 이력 / 전체","changelog.basic.visible":"표시 중","changelog.basic.total":"전체","changelog.card.active":"활성","changelog.card.active.tooltip":"이 세션은 아직 새 게임 변경을 계속 수집 중입니다.","changelog.card.completed":"완료","changelog.card.completed.tooltip":"이 세션은 종료되어 더 이상 새 변경이 추가되지 않습니다.","changelog.card.bootstrapStatus":"초기화","changelog.card.bootstrapStatus.tooltip":"이 세션에는 초기 동기화 기준 기록만 포함됩니다.","changelog.card.inProgress":"진행 중","changelog.card.noChanges":"아직 변경사항 없음","changelog.card.noChanges.tooltip":"이 세션에서는 아직 추출된 게임 변경이 없습니다.","changelog.card.bootstrapSummary":"초기 동기화 기준 기록","changelog.card.bootstrapSummary.tooltip":"초기 파일 동기화 쓰기 작업은 하나의 기준 기록 행으로 축약됩니다.","changelog.card.sessionIntent":"세션 의도","changelog.card.scripts":"스크립트","changelog.card.scripts.tooltip":"이 세션에서 발생한 스크립트 변경입니다.","changelog.card.instances":"인스턴스","changelog.card.instances.tooltip":"이 세션에서 발생한 인스턴스 생성, 삭제, 이동, 복제 변경입니다.","changelog.card.modified":"수정","changelog.card.created":"생성","changelog.card.deleted":"삭제","changelog.card.moved":"이동","changelog.card.propertiesChanged":"속성 변경","changelog.card.propertiesChanged.tooltip":"이 세션에서 기록된 속성 값 변경입니다.","changelog.card.lightingConfigured":"라이팅 설정됨","changelog.card.lightingConfigured.tooltip":"이 세션에서 라이팅 또는 대기 설정이 변경되었습니다.","changelog.card.terrainConfigured":"터레인 설정됨","changelog.card.terrainConfigured.tooltip":"이 세션에서 터레인 데이터 또는 터레인 설정이 변경되었습니다.","changelog.card.assetsInserted":"에셋 삽입","changelog.card.assetsInserted.tooltip":"이 세션 동안 플레이스에 삽입된 에셋입니다.","changelog.category.script":"스크립트","changelog.category.instance":"인스턴스","changelog.category.property":"속성","changelog.category.lighting":"라이팅","changelog.category.terrain":"터레인","changelog.category.asset":"에셋","changelog.detail.dialogLabel":"변경 이력 상세","changelog.detail.changeSummary":"변경 요약","changelog.detail.changeSummary.tooltip":"이 세션에서 추출된 게임 변경 수를 카테고리별로 묶어서 보여줍니다.","changelog.detail.changeTimeline":"변경 타임라인","changelog.detail.changeTimeline.tooltip":"이 세션에서 추출된 게임 변경을 시간순으로 보여줍니다.","changelog.detail.context.title":"컨텍스트 요약","changelog.detail.context.tooltip":"이 체인지로그 세션에 연결된 구조화된 실행 컨텍스트입니다.","changelog.detail.verification.title":"검증","changelog.detail.verification.tooltip":"이 체인지로그 세션에 연결된 검증 신호입니다.","changelog.detail.verification.label":"결과","changelog.detail.verification.status":"상태","changelog.detail.verification.timestamp":"기록 시각","changelog.detail.beforeAfter":"변경 전후 비교","changelog.detail.filterCategory":"카테고리","changelog.detail.filterCategory.tooltip":"타임라인을 하나의 변경 카테고리만 보이도록 필터링합니다.","changelog.detail.confidence.exact":"정확","changelog.detail.confidence.exact.tooltip":"이 변경은 변경 전과 변경 후 상태가 모두 확인되었습니다.","changelog.detail.confidence.partial":"부분 확인","changelog.detail.confidence.partial.tooltip":"이 변경은 변경 전후 상태 중 일부만 확인되었습니다.","changelog.detail.confidence.afterOnly":"결과만 확인","changelog.detail.confidence.afterOnly.tooltip":"이 변경은 적용 후 결과 상태만 확인되었습니다.","changelog.detail.confidence.intentOnly":"의도만 기록","changelog.detail.confidence.intentOnly.tooltip":"요청된 작업 의도만 기록되었고 결과 상태는 확인되지 않았습니다.","changelog.detail.confidence.unknown":"알 수 없음","changelog.detail.confidence.unknown.tooltip":"사용 가능한 데이터만으로는 이 변경을 신뢰도 있게 분류할 수 없습니다.","changelog.detail.noChanges":"이 카테고리에 변경사항 없음","changelog.detail.backToList":"목록으로 돌아가기","changelog.diff.empty":"비교할 내용 없음","changelog.diff.unified":"통합","changelog.diff.sideBySide":"나란히 비교","changelog.diff.before":"변경 전","changelog.diff.after":"변경 후","sync.overlay.title":"Roblox Studio 플러그인이 필요합니다","sync.overlay.message":"Roblox Studio 플러그인이 연결되면 동기화 상태를 확인할 수 있습니다.","sync.overlay.check1":"Roblox Studio가 실행 중인가요?","sync.overlay.check2":"WEPPY Plugin이 설치되어 있나요?","sync.status.title":"동기화 상태","sync.status.title.tooltip":"이 플레이스의 Studio와 로컬 파일 동기화 상태입니다.","sync.status.forwardOnly":"단방향만","sync.status.forwardOnly.tooltip":"Basic 티어에서는 Studio에서 로컬로 가는 단방향 동기화만 사용할 수 있습니다.","sync.status.place":"플레이스","sync.status.place.tooltip":"연결된 Roblox 플레이스 이름과 플레이스 ID입니다.","sync.status.path":"경로","sync.status.path.tooltip":"현재 동기화 출력에 사용하는 로컬 파일 시스템 루트입니다.","sync.status.instances":"인스턴스","sync.status.instances.tooltip":"로컬 미러에 추적 중인 동기화된 Roblox 인스턴스 수입니다.","sync.status.scripts":"스크립트","sync.status.scripts.tooltip":"이 플레이스에 대해 현재 인덱싱된 동기화 스크립트 파일 수입니다.","sync.status.state":"상태","sync.status.state.tooltip":"서버가 보고한 현재 동기화 런타임 상태입니다.","sync.policy.title":"Sync 정책","sync.policy.title.tooltip":"연결된 Studio 플러그인이 보고한 실제 Sync 적용 정책입니다.","sync.policy.activation":"활성 상태","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"워크플로","sync.policy.preset.studio_first":"Studio 우선","sync.policy.preset.bidirectional_review":"양방향","sync.policy.preset.local_code_studio_world":"로컬 코드, Studio 월드","sync.policy.preset.custom":"Custom","sync.policy.apply.title":"로컬 변경을 Studio에 적용하는 방식","sync.policy.apply.description":"로컬에서 바꾼 내용을 Studio에 검토 후 적용하는지 자동 적용하는지 보여줍니다.","sync.policy.apply.content":"콘텐츠 변경","sync.policy.apply.content.tooltip":"로컬에서 변경한 Script Source, 속성, Service 속성의 Studio 적용 방식입니다. 인스턴스 생성·삭제·이름 변경·이동은 구조 변경입니다.","sync.policy.apply.structure":"구조 변경","sync.policy.apply.structure.tooltip":"로컬에서 수행한 인스턴스 생성·삭제·이름 변경·이동의 Studio 적용 방식입니다. 로컬 삭제 자동 적용에는 아래의 별도 삭제 설정도 필요합니다.","sync.policy.apply.manual":"검토 후 적용","sync.policy.apply.auto":"자동 적용","sync.policy.scope.disclosure":"Scope별 방향","sync.policy.scope.scriptSource":"스크립트 source","sync.policy.scope.properties":"Properties","sync.policy.scope.structure":"구조","sync.policy.scope.serviceProperties":"Service properties","sync.policy.endpoint.local":"로컬","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → 로컬","sync.policy.direction.forward.tooltip":"Studio 변경을 로컬 파일에 기록합니다.","sync.policy.direction.reverse":"로컬 → Studio","sync.policy.direction.reverse.tooltip":"로컬 파일 변경을 Studio에 적용합니다.","sync.policy.direction.bidirectional":"양방향","sync.policy.direction.bidirectional.tooltip":"Studio와 로컬 파일 양쪽의 변경을 서로 적용합니다.","sync.policy.safety.localDeletes":"로컬 삭제 → Studio 인스턴스 삭제","sync.policy.safety.review":"삭제 전 검토","sync.policy.safety.review.tooltip":"로컬 파일 삭제는 대응하는 Studio 인스턴스를 제거하기 전에 검토를 기다립니다. UI Studio 자동 정리와는 별개 기능입니다.","sync.policy.safety.auto":"Studio에 자동 삭제","sync.policy.safety.auto.tooltip":"로컬 파일을 삭제하면 대응하는 Studio 인스턴스가 자동으로 제거될 수 있습니다. UI Studio 자동 정리와는 별개 기능입니다.","sync.policy.reviewRequired":"Sync를 시작하기 전에 Studio 플러그인에서 이 정책을 검토하세요.","sync.log.title":"동기화 로그","sync.log.empty":"동기화 이벤트 없음","sync.log.type.write":"쓰기","sync.log.type.write.tooltip":"새 동기화 출력이 디스크에 기록되었습니다.","sync.log.type.update":"업데이트","sync.log.type.update.tooltip":"기존 동기화 파일 또는 인스턴스가 갱신되었습니다.","sync.log.type.delete":"삭제","sync.log.type.delete.tooltip":"동기화된 파일 또는 인스턴스가 제거되었습니다.","sync.log.type.idle":"대기","sync.log.type.idle.tooltip":"파일 변경 없이 동기화 이벤트만 기록되었습니다.","sync.upgrade.title":"Pro 동기화 기능 확인하기","sync.upgrade.benefit1":"양방향 동기화 — 파일 편집 시 Studio에 자동 반영","sync.upgrade.benefit2":"역방향 동기화 — 파일 변경을 Studio로 전송","sync.upgrade.benefit3":"전체 동기화 히스토리 및 상세 변경 로그","sync.upgrade.buy":"Pro 확인하기","playtest.status.title":"플레이테스트 상태","playtest.status.title.tooltip":"Studio가 보고한 현재 Roblox 플레이테스트 세션 상태입니다.","playtest.status.mode":"모드","playtest.status.mode.tooltip":"현재 세션에 사용 중인 Studio 플레이테스트 실행 모드입니다.","playtest.status.mode.value.tooltip":"현재 적용 중인 Roblox Studio 플레이테스트 모드의 구체적인 값입니다.","playtest.status.mode.play":"플레이","playtest.status.mode.run":"실행","playtest.status.mode.server":"서버","playtest.status.mode.edit":"편집","playtest.status.place.tooltip":"이 플레이테스트 세션과 연결된 Roblox 플레이스입니다.","playtest.status.state.running":"실행 중","playtest.status.state.running.tooltip":"현재 Roblox 플레이테스트 세션이 실행 중입니다.","playtest.status.state.paused":"일시정지","playtest.status.state.paused.tooltip":"현재 Roblox 플레이테스트 세션이 일시정지 상태입니다.","playtest.status.state.notRunning":"실행 안 함","playtest.status.state.notRunning.tooltip":"현재 실행 중인 Roblox 플레이테스트 세션이 없습니다.","playtest.control.play":"플레이","playtest.control.pause":"일시정지","playtest.control.resume":"재개","playtest.control.stop":"정지","playtest.history.title":"테스트 히스토리","playtest.history.title.tooltip":"이 프로젝트에서 기록된 자동 플레이테스트 실행 이력입니다.","playtest.history.empty":"테스트 결과 없음","playtest.history.mode":"모드","playtest.history.mode.tooltip":"이 기록된 테스트 실행에 사용된 플레이테스트 모드입니다.","playtest.history.status.passed":"성공","playtest.history.status.failed":"실패","playtest.history.status.running":"실행 중","playtest.history.status.unknown":"알 수 없음","playtest.history.status.tooltip":"이 자동 플레이테스트 실행의 기록된 결과 상태입니다.","playtest.empty.title":"아직 플레이테스트 결과가 없습니다","playtest.empty.message":"AI Agent가 Playtest를 실행하면 결과가 여기에 표시됩니다.","playtest.empty.message.before":"AI Agent가 Playtest를 실행하면 결과가 여기에 표시됩니다.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"새 리포트가 필요하면 AI Agent에게 Playtest 실행을 요청하세요.","playtest.report.title":"선택된 리포트","playtest.report.title.tooltip":"현재 선택된 자동 플레이테스트 실행의 상세 출력입니다.","playtest.detail.dialogLabel":"플레이테스트 리포트 상세","playtest.detail.loading":"리포트를 불러오는 중...","playtest.detail.errorTitle":"리포트를 불러올 수 없음","playtest.report.content":"리포트","playtest.report.content.tooltip":"선택된 자동 플레이테스트 실행의 마크다운 요약입니다.","playtest.report.logs":"로그","playtest.report.logs.tooltip":"선택된 자동 플레이테스트 실행에서 수집된 실행 로그입니다.","playtest.context.contextId":"컨텍스트 ID","playtest.context.why":"이 테스트를 실행한 이유","playtest.context.expected":"예상 결과","playtest.context.observed":"관찰 결과","playtest.report.empty":"리포트 내용 없음","playtest.basic.icon":"🎮","playtest.basic.title":"플레이테스트는 Pro 전용 기능입니다","playtest.basic.desc":"WEPPY Dashboard에서 플레이테스트를 제어하고, 자동 테스트를 실행하며, 상세한 테스트 리포트를 확인하세요.","playtest.basic.benefit1":"원클릭 플레이/일시정지/정지 제어","playtest.basic.benefit2":"AI 에이전트를 통한 자동 테스트 실행","playtest.basic.benefit3":"성공/실패 추적이 가능한 테스트 히스토리","playtest.basic.benefit4":"상세한 마크다운 테스트 리포트","playtest.sample.badge":"Pro 플레이테스트 화면 미리보기","playtest.sample.title":"현재 보고 있는 화면은 Pro에서 사용할 수 있는 플레이테스트 화면 예시입니다.","playtest.sample.message":"이 미리보기는 샘플 데이터로 구성되어 있습니다. 실시간 플레이테스트 제어, 히스토리 관리, 실제 리포트 저장은 Pro 구매 후 사용할 수 있습니다.","playtest.sample.clearDisabled":"실제 플레이테스트 기록 삭제는 Pro에서 사용할 수 있습니다.","playtest.sample.place":"아레나 미리보기","playtest.sample.history.name":"샘플 아레나 스모크 테스트","playtest.sample.context.why":"아레나에 스폰한 뒤 첫 구간을 버티고 HUD가 즉시 반응하는지 확인합니다.","playtest.sample.context.expected":"플레이어가 안전하게 스폰되고, 1초 안에 카운트다운 UI가 표시되며, 첫 웨이브가 오류 없이 시작되어야 합니다.","playtest.sample.context.observed":"스폰 보호가 정상 동작했고, HUD가 제때 갱신되었으며, 첫 웨이브가 회귀 없이 완료되었습니다.","playtest.sample.report.markdown":`# 샘플 아레나 스모크 테스트
|
|
80
|
-
|
|
81
|
-
- 스폰 흐름: 통과
|
|
82
|
-
- HUD 카운트다운: 통과
|
|
83
|
-
- 웨이브 시작: 통과
|
|
84
|
-
|
|
85
|
-
이 화면은 샘플 미리보기입니다. 라이브 플레이테스트 실행과 실제 리포트 저장은 Pro에서 사용할 수 있습니다.`,"playtest.sample.report.logs":`[sample] 플레이테스트 미리보기 부팅
|
|
86
|
-
[sample] 스폰 보호 활성화
|
|
87
|
-
[sample] HUD 카운트다운 렌더링
|
|
88
|
-
[sample] 1웨이브 완료
|
|
89
|
-
[sample] 미리보기 리포트 종료`,"sidebar.whatsNew":"새 소식","sidebar.help.group":"도움말 및 피드백","sidebar.help.bug":"버그 신고","sidebar.help.bug.tooltip":"로컬 진단 번들을 만들고 GitHub에 환경 정보가 채워진 버그 리포트 열기","bugReportDialog.title":"diagnostics.zip 첨부는 원인 분석에 도움이 됩니다","bugReportDialog.subtitle":"WEPPY가 이 컴퓨터에 진단 zip 파일을 만들었습니다. 이 파일에는 Studio, 플러그인, Sync, 도구 실행 로그가 들어 있어 문제를 확인하는 데 도움이 됩니다.","bugReportDialog.close":"닫기","bugReportDialog.loading":"diagnostics.zip 준비 중...","bugReportDialog.error":"진단 번들을 만들지 못했습니다. 진단 자료 없이 GitHub를 열 수 있습니다.","bugReportDialog.bundle":"번들","bugReportDialog.included":"포함 항목","bugReportDialog.included.none":"찾은 로그 파일 없음","bugReportDialog.optional":"이 파일 없이도 버그 신고를 제출할 수 있지만, zip을 함께 첨부하면 원인 분석이 더 빨라질 수 있습니다.","bugReportDialog.attachHow":"첨부하려면 zip 파일을 다운로드하거나 Finder/Explorer에서 연 뒤, GitHub 이슈의 Diagnostics ZIP (optional) 업로드 영역에 추가하고 제출하세요.","bugReportDialog.download":"1. diagnostics.zip 다운로드","bugReportDialog.reveal":"Finder에서 보기","bugReportDialog.reveal.opening":"여는 중...","bugReportDialog.reveal.opened":"파일 위치를 열었습니다","bugReportDialog.reveal.failed":"파일 위치를 열지 못했습니다.","bugReportDialog.openGithub":"2. GitHub 이슈 열기","bugReportDialog.openGithubFallback":"진단 자료 없이 GitHub 열기","bugReportDialog.retry":"다시 시도","bugReportDialog.hint":"zip에는 로컬 로그와 프로젝트 맥락이 포함될 수 있습니다. 공유하려는 경우 첨부하기 전에 내용을 확인하세요.","sidebar.help.feature":"기능 제안","sidebar.help.feature.tooltip":"GitHub에서 새 기능 또는 개선 제안하기","sidebar.help.discussions":"설치/사용 도움","sidebar.help.discussions.tooltip":"GitHub Issues에서 설치, 연결, 사용 관련 도움 요청하기","sidebar.help.troubleshooting":"문제 해결 가이드","sidebar.help.troubleshooting.tooltip":"weppyai.com 공식 문제 해결 가이드 열기","header.whatsNew":"새 소식","header.whatsNew.tooltip":"새 소식","upgrade.title":"Pro 확인하기","upgrade.tagline":"Pro 기능 확인하기","upgrade.cta":"Pro 확인하기","upgrade.licenseShortcut":"라이선스 입력","upgrade.validUntil":"{{date}}까지","whatsNew.pageTitle":"새 소식","whatsNew.pageSubtitle":"MCP의 주요 변경사항을 확인하세요","whatsNew.unreadSection":"안 읽음","whatsNew.allSection":"전체 공지","whatsNew.empty":"공지가 없습니다","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"중요","whatsNew.category.release":"릴리스","whatsNew.category.notice":"공지","whatsNew.category.deprecation":"지원 중단","whatsNew.category.tip":"팁","uiStudio.title":"UI 스튜디오","uiStudio.empty":"저장된 화면 캡처가 없습니다. AI 에이전트가 현재 UI 상태를 캡처하면 자동 생성됩니다.","uiStudio.loading":"불러오는 중…","uiStudio.pluginGuide.title":"Roblox Studio 플러그인이 연결되지 않았습니다","uiStudio.pluginGuide.message":"UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.","uiStudio.pluginGuide.check1":"Roblox Studio가 실행 중인가요?","uiStudio.pluginGuide.check2":"WEPPY Plugin이 설치되어 실행 중인가요?","uiStudio.pluginGuide.waiting":"플러그인 연결을 기다리는 중...","uiStudio.capturedAt":"캡처 시각","uiStudio.scope":"범위","uiStudio.target":"대상","uiStudio.briefId":"브리프 ID","uiStudio.detailClose":"닫기","uiStudio.colCheck":"항목","uiStudio.colPriority":"우선순위","uiStudio.colCurrent":"현재","uiStudio.colRecommended":"권장","uiStudio.colSuggestion":"제안","uiStudio.priorityHigh":"우선 검토","uiStudio.priorityLow":"선택 개선","uiStudio.highPrioritySection":"우선 검토","uiStudio.lowPrioritySection":"선택 개선","uiStudio.groupSummary":"개 항목","uiStudio.fixLabel":"조치","uiStudio.copyFixCommand":"AI 지시문으로 복사","uiStudio.copiedToClipboard":"복사됨","uiStudio.fullPath":"전체 경로","uiStudio.falsePositiveWarning":"이 그룹은 오탐 가능성이 있습니다","uiStudio.noSuggestions":"현재 개선 제안 없음","uiStudio.sample.badge":"Pro UI 스튜디오 미리보기","uiStudio.sample.title":"Pro에서 이용 가능한 UI 스튜디오를 미리 보고 있습니다.","uiStudio.sample.message":"이 미리보기는 샘플 데이터입니다. 실제 화면 캡처, 검토 이력, AI 자동 수정 요청은 Pro에서 제공됩니다.","uiStudio.tabs.analysis":"분석","uiStudio.tabs.history":"변경 이력","uiStudio.analysis.reportsTitle":"UI 대상별 최신 분석","uiStudio.analysis.recentCapturesTitle":"최근 캡처","uiStudio.analysis.detailDialog":"분석 상세","uiStudio.analysis.targetCountLabel":"분석 대상","uiStudio.analysis.captureLabel":"캡처","uiStudio.analysis.verdict.hasSuggestions":"개선 제안 있음","uiStudio.analysis.verdict.needsFix":"개선 제안 있음","uiStudio.analysis.verdict.review":"개선 제안 있음","uiStudio.analysis.verdict.passed":"현재 개선 제안 없음","uiStudio.analysis.verdictLabel":"개선 요약","uiStudio.analysis.coverage.structuralOnly":"구조 검사만 완료","uiStudio.analysis.coverage.visualSkipped":"구조 검사만 완료 · 시각 검사 생략","uiStudio.analysis.coverage.visualFailed":"구조 검사 완료 · 시각 검사 실패","uiStudio.analysis.coverage.full":"구조·시각 검사 완료","uiStudio.analysis.coverage.deterministicFailed":"구조 검사 실패","uiStudio.analysis.thresholds":"검토 기준","uiStudio.analysis.issueSummary.passed":"현재 검토 기준에서 추가 개선 제안은 없습니다.","uiStudio.history.title":"변경 이력","uiStudio.history.empty":"아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.","uiStudio.history.loading":"로딩 중...","uiStudio.history.loadingPlace":"현재 플레이스 불러오는 중...","uiStudio.history.noPlace":"아직 현재 플레이스 데이터가 없습니다. UI 변경 이력을 보려면 WEPPY Plugin을 연결하고 플레이스를 동기화하세요.","uiStudio.history.noPlaceAction":"현재 플레이스를 아직 사용할 수 없습니다.","uiStudio.history.error":"오류","uiStudio.history.clear":"전체 삭제","uiStudio.history.filter.actions":"작업 유형","uiStudio.history.filter.actionAll":"전체","uiStudio.history.filter.actionCreate":"생성","uiStudio.history.filter.actionUpdate":"수정","uiStudio.history.filter.actionDelete":"삭제","uiStudio.history.filter.period":"기간","uiStudio.history.filter.dateAll":"전체","uiStudio.history.filter.today":"오늘","uiStudio.history.filter.yesterday":"어제","uiStudio.history.filter.last7Days":"최근 7일","uiStudio.history.filter.last30Days":"최근 30일","uiStudio.history.filter.customRange":"직접 지정","uiStudio.history.filter.reset":"초기화","uiStudio.history.filter.from":"시작일","uiStudio.history.filter.to":"종료일","uiStudio.history.row.affectedPaths":"경로","uiStudio.history.row.mutations":"변경 상세","uiStudio.history.row.expand":"▾ 펼치기","uiStudio.history.row.collapse":"▲ 닫기","uiStudio.history.row.expandDetails":"변경 상세 {n}건","uiStudio.history.row.collapseDetails":"변경 상세 닫기","uiStudio.history.row.toggleDetails":"변경 상세 토글","uiStudio.history.row.mutationsEmpty":"변경 내역 없음","uiStudio.history.row.toolLabel":"UI 변경 {n}건","uiStudio.history.row.compare":"전후 비교","uiStudio.history.row.noBeforeState":"이전 상태 없음","uiStudio.history.row.noAfterState":"이후 상태 없음","uiStudio.history.row.qualityPlan":"디자인 방향","uiStudio.history.row.designCheck":"개선 제안","uiStudio.history.row.designCheckUnavailable":"개선 제안: 요약 없음","uiStudio.history.row.designCheckNone":"개선 제안: 현재 없음","uiStudio.history.selection.deleteSelected":"선택 삭제","uiStudio.history.selection.selectAll":"모두 선택","uiStudio.history.selection.clearSelection":"선택 해제","uiStudio.history.confirm.deleteRequestsTitle":"변경 기록 삭제","uiStudio.history.confirm.deleteRequestsMessage":"선택한 변경 기록을 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.history.confirm.clearRequestsTitle":"변경 이력 삭제","uiStudio.history.confirm.clearRequestsMessage":"현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다.","uiStudio.history.confirm.cascadeOption":"연결된 화면 캡처도 함께 삭제","uiStudio.history.drawer.close":"닫기","uiStudio.actions.previewAgain":"다시 미리보기","uiStudio.actions.deleteSnapshot":"이 화면 캡처 삭제","uiStudio.actions.proRequired":"Pro에서 사용 가능","uiStudio.actions.captureCurrentState":"현재 상태 캡처","uiStudio.actions.checkSuggestionsAgain":"개선 제안 다시 확인","uiStudio.actions.previewRunning":"캡처 중…","uiStudio.actions.previewRunningDetail":"완료되면 새 화면 캡처 파일 ID를 표시합니다.","uiStudio.actions.previewNeedsSaveCheck":"캡처 완료, 저장 확인 필요","uiStudio.actions.previewSaved":"새 화면 캡처 저장 완료","uiStudio.actions.previewComplete":"캡처 완료","uiStudio.actions.previewSavedDetail":"기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.","uiStudio.actions.previewSavedPathMissing":"새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.","uiStudio.actions.previewSnapshotIdMissing":"새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.","uiStudio.actions.more":"더 보기","uiStudio.gallery.selection.selectedCount":"개 선택됨","uiStudio.confirm.deleteSnapshotTitle":"화면 캡처 삭제","uiStudio.confirm.deleteSnapshotMessage":"이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존).","uiStudio.confirm.deleteBatchTitle":"화면 캡처 일괄 삭제","uiStudio.confirm.deleteBatchMessage":"선택한 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.gallery.selectMode":"선택 모드","uiStudio.gallery.exitSelectMode":"취소","uiStudio.gallery.selectAll":"모두 선택","uiStudio.gallery.clearSelection":"선택 해제","uiStudio.gallery.deleteSelected":"선택 삭제","common.save":"저장","common.cancel":"취소","common.delete":"삭제","uiStudio.storage.title":"UI Studio 저장 데이터","uiStudio.storage.usageLabel":"사용 중","uiStudio.storage.historyBytes":"변경 이력","uiStudio.storage.snapshotBytes":"화면 캡처","uiStudio.storage.requestCount":"변경 기록","uiStudio.storage.mutationCount":"변경 상세","uiStudio.storage.snapshotCount":"화면 캡처","uiStudio.storage.countSuffix":"개","uiStudio.storage.lastRun":"마지막 자동 정리","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"회수","uiStudio.storage.lastRunErrors":"오류","uiStudio.storage.loading":"로딩 중...","uiStudio.cleanup.policy.title":"자동 삭제 정책","uiStudio.cleanup.policy.modeOff":"사용 안 함 (off)","uiStudio.cleanup.policy.modeAge":"기간 기반 (age)","uiStudio.cleanup.policy.modeSize":"용량 기반 (size)","uiStudio.cleanup.policy.cascade":"연결된 화면 캡처도 함께 삭제","uiStudio.cleanup.policy.save":"정책 저장","uiStudio.cleanup.policy.runNow":"저장된 정책으로 정리","uiStudio.cleanup.policy.proRequired":"Pro에서 사용 가능","uiStudio.cleanup.policy.daysUnit":"일","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"정책 적용 확인","uiStudio.cleanup.policy.confirm.messageStrict":"이 정책으로 즉시","uiStudio.cleanup.policy.confirm.requests":"건","uiStudio.cleanup.policy.confirm.snapshots":"개 화면 캡처","uiStudio.cleanup.policy.confirm.freed":"가 삭제됩니다 — 적용?","uiStudio.cleanup.keepLastNDays":"최근 {n}일만 남기기","uiStudio.cleanup.selectedDelete":"선택 삭제…","uiStudio.cleanup.deleteAll":"전체 삭제…","uiStudio.cleanup.cleanupConfirmTitle":"정리 확인","uiStudio.cleanup.cleanupConfirmMessage":"선택한 항목이 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"7일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"30일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.all":"개의 저장된 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.label":"수동 정리","uiStudio.cleanup.studioPreservedNote":"이 작업은 디스크의 저장된 변경 기록과 화면 캡처만 삭제하며, Roblox Studio 인스턴스는 변경되지 않습니다.","uiStudio.history.sample.bannerBadge":"Pro 변경 이력 미리보기","uiStudio.history.sample.bannerTitle":"Pro에서 이용 가능한 UI 변경 이력 화면을 미리 보고 있습니다.","uiStudio.history.sample.bannerMessage":"이 미리보기는 샘플 데이터입니다. 실제 변경 이력, 전후 비교, 일괄 삭제는 Pro에서 제공됩니다.","uiStudio.fix.touchTarget.label":"터치 타겟 크기","uiStudio.fix.touchTarget.description":"모바일에서 손가락으로 누르기 편한 최소 크기를 만족하는지 확인합니다.","uiStudio.fix.touchTarget.howToFix":"버튼 Size를 44x44 px 이상으로 키우거나 UIPadding으로 터치 영역을 확장하세요.","uiStudio.fix.contrast.label":"텍스트 대비","uiStudio.fix.contrast.description":"텍스트와 배경의 명암 비율이 WCAG 접근성 기준을 만족하는지 확인합니다.","uiStudio.fix.contrast.howToFix":"TextColor3를 더 밝은 색(예: #FFFFFF)으로 바꾸거나 BackgroundColor3를 어둡게 조정하세요.","uiStudio.fix.contrast.falsePositive":"이모지 아이콘은 색상이 고정되어 대비 규칙이 오탐하는 경우가 있습니다.","uiStudio.fix.textScaled.label":"TextScaled 사용","uiStudio.fix.textScaled.description":"TextScaled가 켜져 있으나 UITextSizeConstraint가 없으면 언어 확장 시 레이아웃이 깨질 수 있습니다.","uiStudio.fix.textScaled.howToFix":"해당 TextLabel에 UITextSizeConstraint 자식을 추가하고 MaxTextSize를 지정하세요.","uiStudio.fix.safezone.label":"세이프존 배치","uiStudio.fix.safezone.description":"버튼이 플랫폼별 세이프존 안에 있는지 확인합니다.","uiStudio.fix.safezone.howToFix":"Position을 세이프존 안쪽으로 이동하거나 부모 Frame을 축소하세요.","uiStudio.fix.minTextSize.label":"최소 폰트 크기","uiStudio.fix.minTextSize.description":"텍스트가 너무 작아 가독성이 떨어지는지 확인합니다.","uiStudio.fix.minTextSize.howToFix":"본문 기준 TextSize를 14 이상으로 올리세요.","uiStudio.sample.history.request1.label":"HUD 레이아웃 초기 생성","uiStudio.sample.history.request2.label":"Inventory 모달 디자인 업데이트","uiStudio.sample.history.request3.label":"HUD HealthBar 색상 수정","uiStudio.sample.history.request4.label":"Inventory 탭 버튼 터치 타겟 확대","uiStudio.sample.history.request5.label":"Settings 팝업 삭제","uiStudio.sample.history.request6.label":"HUD 미니맵 컴포넌트 추가","uiStudio.sample.history.request1.mutation1.diff":"Frame + HealthBar + StaminaBar 생성","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"AnchorPoint, Position, Size 설정","uiStudio.sample.history.request1.mutation5.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request2.mutation1.diff":"BackgroundColor3 어둡게 조정 (대비 개선)","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, BorderColor3 설정","uiStudio.sample.history.request2.mutation4.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (빨간 계열)","uiStudio.sample.history.request3.mutation2.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui 제거 (Settings 전용 UI)","uiStudio.sample.history.request6.mutation1.diff":"Frame + MapImage + PlayerDot 생성 시도","uiStudio.sample.history.request6.mutation2.diff":"Size, Position, BackgroundTransparency 설정","uiStudio.sample.history.request6.mutation3.diff":"ImageLabel 설정 중 서버 재시작으로 중단","uiStudio.sample.history.request6.mutation4.diff":"불완전 화면 캡처 저장","uiStudio.sample.history.request6.mutation3.error":"server_restart: 연결 끊김","uiStudio.sample.history.request6.mutation4.error":"partial snapshot: 누락된 레이어 있음","uiStudio.sample.history.detail.backgroundColor":"배경색","uiStudio.sample.history.detail.anchorPoint":"앵커","uiStudio.sample.history.detail.position":"위치","uiStudio.sample.history.detail.size":"사이즈","uiStudio.sample.history.detail.textColor":"글자색","uiStudio.sample.history.detail.textSize":"글자 크기","uiStudio.sample.history.detail.borderSize":"테두리 크기","uiStudio.sample.history.detail.borderColor":"테두리색","settings.dataHistory.title":"데이터 및 이력","settings.dataHistory.title.tooltip":"대시보드에 저장된 데이터를 한 곳에서 관리합니다.","settings.dataHistory.collapse":"{title} 접기","settings.dataHistory.expand":"{title} 펼치기","settings.dataHistory.scope":"현재 프로젝트","settings.dataHistory.scope.tooltip":"삭제 작업은 항목에 따라 현재 프로젝트와 활성 place에 적용됩니다.","settings.dataHistory.intro":"저장된 대시보드 데이터를 확인하고, 관련 페이지로 이동하거나, 저장 기록을 한 곳에서 삭제합니다.","settings.dataHistory.toolsActivity.title":"도구 실행 기록","settings.dataHistory.toolsActivity.description":"Tools 페이지에 표시되는 저장된 도구 실행 기록입니다.","settings.dataHistory.toolStats.title":"도구 사용 통계","settings.dataHistory.toolStats.description":"도구 호출 수와 상태별 집계입니다.","settings.dataHistory.syncLog.title":"동기화 로그","settings.dataHistory.syncLog.description":"활성 place의 파일 동기화 이벤트 기록입니다.","settings.dataHistory.playtest.title":"플레이테스트 리포트","settings.dataHistory.playtest.description":"저장된 자동 플레이테스트 리포트와 로그입니다.","settings.dataHistory.projectChanges.title":"프로젝트 변경 요약","settings.dataHistory.projectChanges.description":"저장된 프로젝트 변경 요약입니다.","settings.dataHistory.projectChanges.clear.title":"프로젝트 변경 요약을 비울까요?","settings.dataHistory.projectChanges.clear.message":"선택한 Place의 완료된 세션과 종료된 컨텍스트 기록이 삭제됩니다. 진행 중인 작업과 Roblox Studio 프로젝트 데이터는 유지됩니다.","settings.dataHistory.projectChanges.clear.success":"프로젝트 변경 요약을 비웠습니다.","settings.projectChanges.cleanup.noPlace":"저장된 프로젝트 변경 기록을 관리할 Place를 선택하세요.","settings.projectChanges.cleanup.loading":"저장 용량 설정을 불러오는 중…","settings.projectChanges.cleanup.loadFailed":"저장 용량 설정을 불러오지 못했습니다.","settings.projectChanges.cleanup.title":"저장 용량 관리","settings.projectChanges.cleanup.title.tooltip":"Place마다 보관할 프로젝트 변경 요약의 최대 용량을 설정합니다.","settings.projectChanges.cleanup.scope":"하나의 설정이 모든 Place에 각각 독립적으로 적용됩니다.","settings.projectChanges.cleanup.usageAria":"Place 저장 용량 사용량","settings.projectChanges.cleanup.usageUnlimited":"{used} 사용 · 제한 없음","settings.projectChanges.cleanup.usageLimited":"{limit} 중 {used} 사용","settings.projectChanges.cleanup.sessions":"세션","settings.projectChanges.cleanup.contexts":"컨텍스트","settings.projectChanges.cleanup.limit":"Place당 한도","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"제한 없음","settings.projectChanges.cleanup.runNow":"저장된 정책으로 정리","settings.projectChanges.cleanup.saved":"저장됨","settings.projectChanges.cleanup.protectedWarning":"활성 변경 기록은 보호되므로 이 Place가 한도를 초과한 상태로 유지될 수 있습니다.","settings.projectChanges.cleanup.lastRun":"마지막 정리","settings.projectChanges.cleanup.lastRunSummary":"{sessions}개 세션 · {bytes} 확보","settings.projectChanges.cleanup.neverRun":"아직 실행하지 않음","settings.projectChanges.cleanup.actionFailed":"저장 용량 설정을 변경하지 못했습니다.","settings.projectChanges.cleanup.confirm.title":"이 한도를 적용하고 저장된 변경 기록을 정리할까요?","settings.projectChanges.cleanup.confirm.message":"{places}개 Place · {sessions}개 세션 · 약 {bytes} 확보 예정.","settings.projectChanges.cleanup.confirm.protected":"{places}개 Place는 활성 데이터 보호로 한도를 초과한 상태가 유지될 수 있습니다.","settings.projectChanges.cleanup.confirm.apply":"한도 적용 및 정리","settings.dataHistory.connectionLog.title":"연결 로그","settings.dataHistory.connectionLog.description":"MCP와 Studio 연결 이벤트 기록입니다.","settings.dataHistory.uiStudio.title":"UI Studio 이력 및 화면 캡처","settings.dataHistory.uiStudio.tooltip":"저장된 UI Studio 변경 기록, 화면 캡처, 자동 삭제 정책을 관리합니다.","settings.dataHistory.uiStudio.description":"저장된 UI Studio 변경 기록, 화면 캡처, 정리 정책입니다.","settings.dataHistory.uiStudio.clear.title":"UI Studio 저장 데이터를 삭제할까요?","settings.dataHistory.uiStudio.clear.message":"저장된 UI Studio 변경 기록과 화면 캡처만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.uiStudio.clear.success":"UI Studio 저장 데이터를 삭제했습니다.","settings.dataHistory.uiStudio.clear.failed":"UI Studio 저장 데이터를 삭제하지 못했습니다.","settings.dataHistory.metric.unavailable":"확인 불가","settings.dataHistory.metric.sizeUnavailable":"용량 확인 불가","settings.dataHistory.metric.records":"건","settings.dataHistory.metric.runs":"회","settings.dataHistory.metric.sessions":"세션","settings.dataHistory.metric.reports":"개 리포트","settings.dataHistory.open":"열기","settings.dataHistory.clearAll":"전체 비우기","settings.dataHistory.clear.title":"저장 데이터를 삭제할까요?","settings.dataHistory.clear.message":"대시보드에 저장된 기록만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.clear.success":"저장 데이터를 삭제했습니다.","settings.dataHistory.clear.failed":"저장 데이터를 삭제하지 못했습니다.","uiStudio.history.sample.tooltip":"전체 이력은 Pro에서 이용 가능합니다","toast.serverConnected":"MCP 서버 연결됨","toast.serverDisconnected":"MCP 서버 연결 끊김","toast.pluginConnected":"플러그인 연결됨","toast.pluginDisconnected":"플러그인 연결 끊김","toast.clearSuccess":"삭제되었습니다","toast.clearFailed":"삭제하지 못했습니다","common.clear":"비우기","settings.license.activate":"라이센스 활성화","settings.license.refresh":"라이센스 새로고침","settings.license.keyInput":"라이센스 키","settings.license.disconnected":"연결 끊김","settings.license.disconnected.tooltip":"WEPPY Dashboard에서 라이센스를 관리하려면 먼저 MCP 서버에 다시 연결하세요.","settings.license.live.tooltip":"라이센스 작업은 MCP 서버에 즉시 반영됩니다.","settings.license.status.activationRequired":"활성화 필요","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard가 이 상태를 갱신하려면 먼저 수동으로 라이센스를 활성화해야 합니다.","settings.license.status.grace":"유예","settings.license.status.grace.tooltip":"공급자 검증이 일시적으로 불가하지만, 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.status.graceBilling.tooltip":"결제 관련 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.detail.graceBilling":"결제 유예 기간 동안 Pro 접근이 유지됩니다.","settings.license.detail.graceProviderUnavailable":"공급자 사용 불가. 유예 모드 동안 Pro 접근은 유지됩니다.","settings.license.detail.manualActivation":"Pro 접근을 복구하려면 수동 활성화가 필요합니다.","settings.license.detail.missingSessionToken":"현재 세션 토큰이 없어 새로고침이 차단되었습니다.","settings.license.detail.refreshRecommended":"라이센스 검증을 곧 새로고침해야 합니다.","connection.agents.kill":"종료","connection.agents.kill.title":"에이전트를 종료할까요?","connection.agents.killed":"에이전트가 종료되었습니다","connection.agents.killFailed":"에이전트를 종료하지 못했습니다","connection.agents.lastCommand":"최근 명령","connection.agents.lastCommand.tooltip":"이 에이전트가 가장 최근에 실행한 도구 호출입니다.","connection.agents.lastSeen":"마지막 활동","connection.agents.lastSeen.tooltip":"이 에이전트의 가장 최근 heartbeat 또는 활동 시각입니다.","connection.clear.title":"연결 로그를 비울까요?","connection.clear.message":"현재 프로젝트에 저장된 연결 로그가 영구적으로 삭제됩니다.","sync.clear.title":"동기화 로그를 비울까요?","sync.clear.message":"현재 플레이스에 저장된 동기화 로그가 영구적으로 삭제됩니다.","playtest.clear.title":"테스트 히스토리를 비울까요?","playtest.clear.message":"현재 플레이스에 저장된 플레이테스트 리포트가 영구적으로 삭제됩니다.","changelog.clear.title":"변경 이력을 비울까요?","changelog.clear.message":"현재 플레이스에 저장된 변경 이력이 영구적으로 삭제됩니다.","sync.status.placePath":"플레이스 경로","sync.status.placePath.tooltip":"Explorer 파일이 동기화되는 현재 플레이스 디렉토리입니다.","tier.progress.label":"Pro / 전체","changelog.card.representativeArea":"대표 영역","changelog.card.verification":"검증","uiStudio.tabs.analysis.tooltip":"AI가 캡처한 화면을 한눈에 보고, 개선이 필요한 UI를 빠르게 찾는 화면입니다.","uiStudio.tabs.history.tooltip":"AI가 UI를 수정한 모든 기록을 시간순으로 보여줍니다. 변경 전·후 화면을 비교할 수 있습니다.","uiStudio.title.tooltip":"AI가 만든 UI 화면을 모아두고 개선 제안을 확인하는 공간입니다.","uiStudio.analysis.reportsTitle.tooltip":"각 UI(예: 인벤토리 창, 메인 메뉴)별로 가장 최근 캡처와 개선 제안 요약을 보여줍니다.","uiStudio.analysis.verdict.hasSuggestions.tooltip":"이 UI에서 더 좋아질 수 있는 부분이 발견됐습니다. 카드를 눌러 상세 내용을 확인하세요.","uiStudio.analysis.verdict.passed.tooltip":"현재 검사 기준에서는 개선할 부분이 발견되지 않았습니다.","uiStudio.analysis.counts.tooltip":"주요는 먼저 검토하면 좋은 핵심 항목, 참고는 다듬으면 좋은 부가 항목입니다.","uiStudio.analysis.thresholds.tooltip":"이 분석에 사용된 기준 세트입니다 (기본값 또는 사용자 정의).","uiStudio.analysis.recentCapturesTitle.tooltip":"최근에 저장된 모든 캡처를 시간순으로 보여줍니다.","uiStudio.gallery.selectAll.tooltip":"현재 보이는 모든 캡처를 한 번에 선택합니다.","uiStudio.gallery.clearSelection.tooltip":"현재 선택된 캡처를 모두 해제합니다.","uiStudio.gallery.deleteSelected.tooltip":"선택한 캡처 파일만 삭제합니다. Studio의 실제 UI는 그대로 유지됩니다.","uiStudio.gallery.cardCheckbox.tooltip":"이 캡처를 선택합니다. 여러 개 선택해 한 번에 삭제할 수 있습니다.","uiStudio.detailClose.tooltip":"이 상세 패널을 닫습니다.","uiStudio.actions.captureCurrentState.tooltip":"지금 Studio에 표시되고 있는 UI를 새 캡처로 저장합니다. 기존 캡처는 그대로 남습니다.","uiStudio.actions.checkSuggestionsAgain.tooltip":"현재 캡처를 새로 캡처하지 않고 개선 제안만 다시 계산합니다.","uiStudio.actions.more.tooltip":"추가 작업 메뉴를 엽니다.","uiStudio.actions.deleteSnapshot.tooltip":"이 캡처 파일만 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.capturedAt.tooltip":"이 화면이 저장된 시각입니다.","uiStudio.scope.tooltip":"캡처 대상 범위입니다 (예: 화면 전체 또는 특정 UI).","uiStudio.target.tooltip":"캡처된 UI 인스턴스의 정확한 경로입니다.","uiStudio.briefId.tooltip":"이 UI를 만든 디자인 지시서(Design Brief)의 식별자입니다.","uiStudio.analysis.verdictLabel.tooltip":"이 캡처에 대한 전반적인 개선 판정입니다.","uiStudio.suggestionGroup.tooltip":"같은 종류의 개선 제안을 묶어서 보여줍니다. 헤더를 클릭해 펼치거나 접을 수 있습니다.","uiStudio.groupSummary.tooltip":"이 항목에 해당하는 UI 요소의 개수입니다.","uiStudio.colCurrent.tooltip":"현재 적용된 값입니다.","uiStudio.colRecommended.tooltip":"권장하는 값입니다.","uiStudio.copyFixCommand.tooltip":"이 문제를 AI에게 설명해 한 번에 고치게 할 수 있는 지시문을 복사합니다.","uiStudio.falsePositiveWarning.tooltip":"이 검사 항목은 실제로는 문제가 아닐 수도 있으니 직접 확인 후 적용하세요.","uiStudio.history.filter.actions.tooltip":"AI가 수행한 변경 종류로 기록을 거를 수 있습니다.","uiStudio.history.filter.period.tooltip":"기록을 시간 범위로 거를 수 있습니다.","uiStudio.history.filter.from.tooltip":"조회를 시작할 날짜입니다.","uiStudio.history.filter.to.tooltip":"조회를 종료할 날짜입니다.","uiStudio.history.filter.actionAll.tooltip":"모든 종류의 작업을 보여줍니다.","uiStudio.history.filter.actionCreate.tooltip":"새 UI를 만든 작업만 보여줍니다.","uiStudio.history.filter.actionUpdate.tooltip":"기존 UI를 수정한 작업만 보여줍니다.","uiStudio.history.filter.actionDelete.tooltip":"UI를 삭제한 작업만 보여줍니다.","uiStudio.history.filter.dateAll.tooltip":"전체 기간을 봅니다.","uiStudio.history.filter.today.tooltip":"오늘 발생한 변경만 봅니다.","uiStudio.history.filter.yesterday.tooltip":"어제 발생한 변경만 봅니다.","uiStudio.history.filter.last7Days.tooltip":"최근 7일간의 변경만 봅니다.","uiStudio.history.filter.last30Days.tooltip":"최근 30일간의 변경만 봅니다.","uiStudio.history.filter.customRange.tooltip":"직접 시작일과 종료일을 지정합니다.","uiStudio.history.filter.reset.tooltip":"모든 필터를 초기 상태로 되돌립니다.","uiStudio.history.title.tooltip":"AI가 UI를 수정한 모든 작업을 시간순으로 모아둔 곳입니다.","uiStudio.history.clear.tooltip":"현재 프로젝트의 모든 변경 이력을 삭제합니다. Studio의 실제 UI는 영향받지 않습니다.","uiStudio.history.row.compare.tooltip":"변경 전과 후 화면을 나란히 비교해 봅니다. 클릭하면 큰 화면으로 확인할 수 있습니다.","uiStudio.history.row.extraPaths.tooltip":"이 작업으로 함께 변경된 다른 UI의 개수입니다.","uiStudio.history.row.noBeforeState.tooltip":"변경 전 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.noAfterState.tooltip":"변경 후 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.affectedPaths.tooltip":"이 작업으로 영향을 받은 UI의 개수입니다.","uiStudio.history.row.mutations.tooltip":"속성 변경 등 세부 작업의 개수입니다.","uiStudio.history.row.qualityPlan.tooltip":"이 변경에 사용된 brief 디자인 방향입니다.","uiStudio.history.row.designCheck.tooltip":"변경 이후 Design Check 개선 제안 요약입니다.","uiStudio.history.row.toggleDetails.tooltip":"어떤 속성이 어떻게 바뀌었는지 한 줄씩 자세히 보여줍니다.","uiStudio.compare.before.tooltip":"AI가 변경하기 직전에 저장된 화면입니다.","uiStudio.compare.after.tooltip":"AI가 변경한 직후에 저장된 화면입니다.","uiStudio.compare.path.tooltip":"이 화면의 UI 인스턴스 경로입니다.","uiStudio.storage.title.tooltip":"UI Studio가 디스크에 저장한 변경 이력과 캡처의 사용량을 보여줍니다.","uiStudio.storage.usageLabel.tooltip":"현재 이 프로젝트에서 UI Studio가 사용 중인 디스크 용량입니다.","uiStudio.storage.historyBytes.tooltip":"변경 기록 데이터(JSON)가 차지하는 용량입니다.","uiStudio.storage.snapshotBytes.tooltip":"캡처된 PNG 이미지 파일이 차지하는 용량입니다.","uiStudio.storage.requestCount.tooltip":"AI가 UI를 수정한 작업의 개수입니다.","uiStudio.storage.mutationCount.tooltip":"각 작업 안의 세부 변경 항목 개수입니다 (속성 변경 한 줄 = 1개).","uiStudio.storage.snapshotCount.tooltip":"저장된 캡처 이미지 파일의 개수입니다.","uiStudio.storage.lastRun.tooltip":"자동 삭제 정책이 가장 최근에 실행된 시각과 결과입니다.","uiStudio.cleanup.label.tooltip":"원할 때 직접 변경 이력과 캡처를 정리할 수 있습니다.","uiStudio.cleanup.keep7.tooltip":"지금부터 7일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.keep30.tooltip":"지금부터 30일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.deleteAll.tooltip":"이 프로젝트에 저장된 모든 변경 이력과 캡처를 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.cleanup.policy.title.tooltip":"오래되거나 용량을 차지하는 캡처를 자동으로 정리하는 규칙입니다.","uiStudio.cleanup.policy.modeOff.tooltip":"자동 정리를 끕니다. 직접 정리하기 전까지 모든 데이터가 유지됩니다.","uiStudio.cleanup.policy.modeAge.tooltip":"지정한 일수보다 오래된 데이터를 자동으로 삭제합니다.","uiStudio.cleanup.policy.modeSize.tooltip":"총 사용량이 지정한 크기를 넘으면 오래된 데이터부터 자동으로 삭제합니다.","uiStudio.cleanup.policy.agePreset.tooltip":"이 일수보다 오래된 데이터를 삭제합니다.","uiStudio.cleanup.policy.ageInput.tooltip":"1일에서 365일 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.sizePreset.tooltip":"총 사용량이 이 크기를 넘지 않도록 유지합니다.","uiStudio.cleanup.policy.sizeInput.tooltip":"50MB에서 10000MB(10GB) 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.cascade.tooltip":"변경 이력만이 아니라 그 이력에 연결된 캡처 이미지도 함께 삭제합니다. 끄면 이미지는 남깁니다.","uiStudio.cleanup.policy.save.tooltip":"현재 입력한 자동 삭제 규칙을 저장합니다. 저장 후부터 백그라운드에서 적용됩니다.","uiStudio.cleanup.policy.runNow.tooltip":"저장된 정리 정책을 다음 자동 실행까지 기다리지 않고 지금 한 번 실행합니다.","settings.license.refresh.tooltip":"라이센스 서버에서 최신 상태를 다시 가져옵니다. 결제·취소 후 상태가 바로 반영되지 않을 때 사용하세요.","settings.license.reset.tooltip":"현재 등록된 라이센스 키를 제거합니다. 다른 키로 다시 활성화할 때 사용하세요.","settings.license.activate.tooltip":"입력한 라이센스 키로 Pro 기능을 활성화합니다.","tier.upgrade.tooltip":"Pro 기능과 구매 옵션을 확인합니다.","settings.language.auto.tooltip":"운영체제 언어 설정을 따릅니다. 지원되지 않는 언어이면 영어로 표시됩니다.","settings.dataHistory.open.tooltip":"이 항목을 자세히 보는 페이지로 이동합니다.","settings.dataHistory.clear.tooltip":"이 항목에 저장된 기록만 삭제합니다. Studio의 실제 데이터는 변경되지 않습니다.","settings.dataHistory.toggle.tooltip":"이 섹션을 접거나 펼칩니다.","settings.dataHistory.manageStorage":"용량 관리","settings.dataHistory.manageStorage.tooltip":"용량 정책과 정리 옵션을 표시하거나 숨깁니다.","settings.dataHistory.manageStorage.projectChanges.aria":"Project change summary 용량 관리","settings.dataHistory.manageStorage.uiStudio.aria":"UI Studio 이력과 화면 캡처 용량 관리","settings.dataHistory.toolsActivity.metric.tooltip":"저장된 도구 실행 기록의 개수와 디스크 사용량입니다.","settings.dataHistory.toolStats.metric.tooltip":"집계된 총 실행 횟수와 세션 수입니다.","settings.dataHistory.syncLog.metric.tooltip":"저장된 동기화 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.playtestReports.metric.tooltip":"저장된 플레이테스트 보고서의 개수와 디스크 사용량입니다.","settings.dataHistory.projectChanges.metric.tooltip":"저장된 프로젝트 변경 요약의 개수와 디스크 사용량입니다.","settings.dataHistory.connectionLog.metric.tooltip":"저장된 연결 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.uiStudio.metric.tooltip":"저장된 UI Studio 변경 기록·캡처 수와 총 디스크 사용량입니다.","uiStudio.designCheckResultsTitle":"Design Check 제안","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"다시 확인","uiStudio.actions.designCheckRunning":"개선 제안 확인 중...","uiStudio.actions.designCheckRunningDetail":"완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.","uiStudio.actions.designCheckComplete":"개선 제안 확인 완료","uiStudio.actions.designCheckNoSnapshotSaved":"이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.","uiStudio.sample.designCheck.contrast":"텍스트 대비 {expected} 미만 (현재 {actual}). TextColor3 또는 BackgroundColor3 조정 필요.","uiStudio.sample.designCheck.touchTarget":"터치 타겟 {expected} 권장 (현재 {actual}). Size 또는 padding을 늘리세요.","uiStudio.sample.designCheck.minTextSize":"TextSize가 {expected} 미만입니다 (현재 {actual}). 가독성 확보를 위해 상향 조정하세요.","uiStudio.gallery.priorityHighBadge.tooltip":"우선 검토 제안 개수입니다. 클릭해서 상세 내용을 확인하세요.","uiStudio.gallery.priorityMediumBadge.tooltip":"검토 권장 제안 개수입니다.","uiStudio.priorityMedium":"검토 권장","uiStudio.mediumPrioritySection":"검토 권장","uiStudio.gallery.priorityLowBadge.tooltip":"선택 개선 제안 개수입니다.","tier.banner.progressLabel":"Pro / 전체","uiStudio.error":"오류","uiStudio.analysis.expandChildren":"하위 대상 보기","uiStudio.analysis.openDetail":"상세 보기","uiStudio.analysis.childTargets":"하위 대상","uiStudio.analysis.childDetailHint":"하위 대상 상세 보기","uiStudio.compare.before":"변경 전","uiStudio.compare.after":"변경 후","uiStudio.history.drawer.changeDetails":"변경 상세","uiStudio.gallery.cardCheckbox":"화면 캡처 선택","sidebar.assets":"에셋","assets.title":"에셋","assets.experimental":"실험 기능","assets.subtitle":"로컬 원본을 확인하고 Roblox에 업로드하며 place별 사용 위치를 점검합니다.","assets.scope.label":"에셋 범위","assets.scope.place":"현재 Place","assets.scope.shared":"공용","assets.scope.all":"모든 범위","assets.explorer.label":"에셋 탐색기","assets.breadcrumb.label":"에셋 경로","assets.explorer.summary":"이 폴더 {direct}개 · 하위 폴더 {descendant}개","assets.folder.count.one":"에셋 1개","assets.folder.count.many":"에셋 {count}개","assets.folder.type":"폴더","assets.folders.title":"폴더","assets.folder.assetsTitle":"이 폴더의 에셋","assets.organization.label":"정리","assets.organization.folders":"폴더","assets.organization.all":"모든 에셋","assets.organization.summary":"에셋 {count}개","assets.view.options":"보기 옵션","assets.view.mode":"보기 방식","assets.view.grid":"그리드","assets.view.list":"목록","assets.view.thumbnailSize":"섬네일 크기","assets.view.thumbnailSize.listReason":"섬네일 크기는 그리드 보기에서 조절할 수 있습니다.","assets.view.size.small":"작게","assets.view.size.medium":"보통","assets.view.size.large":"크게","assets.list.name":"이름","assets.list.type":"유형","assets.list.scope":"범위","assets.list.status":"상태","assets.list.updated":"수정일","assets.loading.scope":"{scope} 에셋을 불러오는 중...","assets.partial.title":"일부 위치를 불러오지 못했습니다","assets.empty.folderTitle":"이 폴더에 조건과 일치하는 에셋이 없습니다","assets.empty.folderBody":"다른 폴더나 카테고리 필터를 선택해 보세요.","assets.empty.filteredTitle":"이 필터와 일치하는 에셋이 없습니다","assets.empty.filteredBody":"다른 카테고리를 선택하거나 해당 inbox 폴더를 다시 스캔하세요.","assets.place.selector":"에셋 Place","assets.place.context":"에셋 위치 정보","assets.place.sharedLibrary":"공용 라이브러리","assets.place.id":"Place ID {placeId}","assets.place.connected":"연결됨","assets.count.shown":"표시 중인 에셋: {count}","assets.category.filter":"카테고리","assets.category.all":"전체","assets.category.image":"이미지","assets.category.decal":"데칼","assets.category.audio":"오디오","assets.category.mesh":"메시","assets.category.model":"모델","assets.category.rbxm":"RBXM","assets.category.video":"비디오","assets.category.animation":"애니메이션","assets.category.comingSoon":"추후 지원 예정","assets.status.localOnly":"로컬 전용","assets.status.uploading":"업로드 중","assets.status.processing":"처리 중","assets.status.uploaded":"업로드됨","assets.status.failed":"실패","assets.status.superseded":"대체됨","assets.rescan":"다시 스캔","assets.rescan.tooltip":"현재 필터에 해당하는 inbox 폴더를 스캔합니다.","assets.rescan.chooseCategory":"다시 스캔할 카테고리를 먼저 선택하세요.","assets.rbxmGuide.title":"Studio에서 RBXM 저장","assets.rbxmGuide.body":"Roblox Studio에서 오브젝트를 선택한 뒤 WEPPY Plugin > Assets에서 선택 항목을 로컬 RBXM 에셋으로 저장하세요.","assets.rbxmGuide.thumbnail":"플러그인 저장 흐름에서 썸네일 자동 생성 여부를 선택할 수 있고, 저장된 RBXM 에셋은 여기에서 관리, 업로드, Studio 삽입에 사용할 수 있습니다.","assets.exportSelection":"Studio 선택 내보내기","assets.exportSelection.tooltip":"현재 Studio 선택 항목을 로컬 .rbxm 에셋으로 내보냅니다.","assets.exportSelection.chooseCategory":"Studio 선택 항목을 내보내려면 RBXM 카테고리를 선택하세요.","assets.upload.open":"업로드","assets.upload.open.tooltip":"이 로컬 파일을 Roblox Open Cloud로 업로드합니다.","assets.upload.selectFirst":"에셋을 먼저 선택하세요.","assets.upload.title":"에셋 업로드","assets.upload.checkingSettings":"업로드 설정을 확인하는 중...","assets.upload.settingsLoadFailed":"업로드 설정을 불러오지 못했습니다.","assets.upload.settingsRequired":"업로드 설정 필요","assets.upload.settingsRequired.apiKey":"업로드 전에 Open Cloud API Key를 저장하세요.","assets.upload.settingsRequired.toggle":"업로드 전에 Open Cloud 업로드를 켜세요.","assets.upload.settingsRequired.creator":"업로드 전에 기본 Creator를 저장하세요.","assets.upload.openSettings":"Asset Library 설정 열기","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator 유형","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"환경변수 API Key는 여기에서 기본 Creator를 저장할 수 없습니다. 이번 업로드에 사용할 Creator를 입력하세요.","assets.upload.displayNameHelp":"Roblox에 에셋 표시 이름으로 저장됩니다.","assets.upload.descriptionHelp":"Roblox에 에셋 설명으로 저장됩니다.","assets.upload.creatorHelp":"Open Cloud에서 업로드된 에셋의 소유자로 사용됩니다.","assets.upload.creatorTypeHelp":"Open Cloud에 Creator 유형으로 전달됩니다.","assets.upload.creatorIdHelp":"Open Cloud에 업로드된 에셋을 소유할 User 또는 Group ID로 전달됩니다.","assets.upload.submit":"Roblox Open Cloud로 업로드","assets.upload.uploading":"업로드 중...","assets.upload.noDelete":"WEPPY는 Roblox 에셋 삭제 기능을 제공하지 않습니다.","assets.upload.delay":"Roblox 처리와 moderation 때문에 Studio 또는 Creator Dashboard 표시가 지연될 수 있습니다.","assets.delete.tooltip":"이 로컬 Asset Library 항목을 삭제합니다.","assets.delete.title":"에셋 삭제","assets.delete.message":"로컬 Asset Library 파일만 삭제합니다. 업로드된 Roblox 에셋은 삭제되지 않습니다.","assets.creator.user":"사용자","assets.creator.group":"그룹","assets.settings.open":"설정 열기","assets.settings.open.tooltip":"Roblox 업로드 설정을 엽니다.","assets.settings.title":"Asset Library 설정","assets.settings.proOnly":"Roblox 업로드 설정과 Open Cloud credential 관리는 Pro에서 사용할 수 있습니다.","assets.settings.openCloudToggle":"Roblox Open Cloud 업로드 사용","assets.settings.openCloudToggle.help":"선택한 Open Cloud credential profile로 Asset Library 항목을 Roblox에 업로드할 수 있게 합니다.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Assets Read와 Write 권한이 포함된 Roblox API key를 생성하세요.","assets.settings.creatorHelp":"프로필 URL의 숫자 사용자 ID 또는 그룹 URL의 숫자 그룹 ID를 사용하세요.","assets.settings.credential.none":"저장된 API key 없음","assets.settings.credential.env":"환경변수","assets.settings.credential.local":"로컬 암호화 파일","assets.settings.registeredApiKey":"등록된 API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"사용 중","assets.settings.field.profile":"프로필","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"저장 위치","assets.settings.field.validationStatus":"검증 상태","assets.settings.field.creators":"Creator 수","assets.settings.validation.unknown":"검증 전","assets.settings.validation.valid":"연결됨","assets.settings.validation.invalid":"확인 필요","assets.settings.profileSelected":"Open Cloud credential profile을 선택했습니다.","assets.settings.useProfile":"프로필 사용","assets.settings.replaceApiKey":"API Key 교체","assets.settings.profileLabel":"프로필 이름 (선택 사항)","assets.settings.profileLabel.placeholder":"Studio 자동화 키","assets.settings.profileLabel.help":"선택 사항입니다. 비워두면 WEPPY가 Open Cloud key 이름을 자동으로 저장합니다.","assets.settings.saveApiKey":"API Key 저장","assets.settings.testConnection":"연결 테스트","assets.settings.removeApiKey":"API Key 등록 해제","assets.settings.saveCreator":"기본 Creator 저장","assets.settings.saveCreatorPreset":"Creator 저장","assets.settings.addCreator":"Creator 추가","assets.settings.addCreator.tooltip.ready":"이 프로필에 다른 User 또는 Group Creator preset을 추가합니다.","assets.settings.cancelCreator":"취소","assets.settings.defaultCreatorBadge":"기본값","assets.settings.makeDefaultCreator":"기본값으로 설정","assets.settings.unregisterCreator":"Creator 등록 해제","assets.settings.creatorLabel":"Creator 라벨 (선택 사항)","assets.settings.creatorLabel.placeholder":"메인 스튜디오 그룹","assets.settings.creatorLabel.help":"선택 사항입니다. 비워두면 WEPPY가 User 123 또는 Group 456 같은 라벨을 자동으로 저장합니다.","assets.settings.action.proRequired":"에셋 업로드 설정은 Pro에서 사용할 수 있습니다.","assets.settings.action.busy":"현재 설정 작업이 끝날 때까지 기다리세요.","assets.settings.saveApiKey.tooltip.ready":"이 API Key를 로컬 암호화 저장소에 저장합니다.","assets.settings.saveApiKey.tooltip.enter":"로컬에 저장할 Open Cloud API Key를 입력하세요.","assets.settings.testConnection.tooltip.entered":"입력한 API Key를 저장하기 전에 테스트합니다.","assets.settings.testConnection.tooltip.saved":"저장된 Open Cloud API Key 연결을 테스트합니다.","assets.settings.testConnection.tooltip.enterOrSaved":"연결을 테스트하려면 API Key를 입력하거나 먼저 저장하세요.","assets.settings.removeApiKey.tooltip.ready":"WEPPY에 로컬 저장된 Open Cloud API Key 등록을 해제합니다.","assets.settings.removeApiKey.tooltip.none":"저장된 로컬 Open Cloud API Key가 없습니다.","assets.settings.removeApiKey.tooltip.env":"환경변수 API Key는 Dashboard에서 제거할 수 없습니다. WEPPY 외부에서 ROBLOX_OPEN_CLOUD_API_KEY를 제거하세요.","assets.settings.unregisterCreator.tooltip.ready":"이 Creator를 선택한 프로필에서 등록 해제합니다.","assets.settings.unregisterApiKey.title":"API Key 등록을 해제할까요?","assets.settings.unregisterApiKey.message":"Roblox API Key 자체는 폐기되지 않습니다. WEPPY가 이 기기에 저장한 Credential Profile 등록 정보만 제거합니다.","assets.settings.unregisterCreator.title":"Creator 등록을 해제할까요?","assets.settings.unregisterCreator.message":"Roblox 사용자나 그룹은 삭제되지 않습니다. 선택한 API Key 프로필의 Creator 목록에서만 해제됩니다.","assets.settings.saveCreator.tooltip.ready":"이 Creator를 업로드 기본 소유자로 저장합니다.","assets.settings.saveCreator.tooltip.noLocal":"기본 Creator를 저장하려면 먼저 로컬 Open Cloud API Key를 저장하세요.","assets.settings.saveCreator.tooltip.env":"환경변수 API Key는 여기에서 기본 Creator를 저장할 수 없습니다. 업로드 창에서 Creator 정보를 입력하세요.","assets.settings.saveCreator.tooltip.enterId":"기본 Creator를 저장하려면 사용자 또는 그룹 ID를 입력하세요.","assets.settings.apiKeySaved":"Open Cloud API Key가 로컬에 저장되었습니다.","assets.settings.apiKeyTested":"Open Cloud API Key 연결을 확인했습니다.","assets.settings.apiKeyRemoved":"로컬 Open Cloud API Key 등록을 해제했습니다.","assets.settings.envApiKeyStillActive":"환경변수 credential이 계속 사용 중입니다. WEPPY 외부에서 ROBLOX_OPEN_CLOUD_API_KEY를 제거하세요.","assets.settings.defaultCreatorSaved":"기본 Creator가 로컬에 저장되었습니다.","assets.settings.creatorUnregistered":"이 프로필에서 Creator 등록을 해제했습니다.","assets.settings.creatorUnregisterFailed":"Creator 등록 해제에 실패했습니다.","assets.settings.saved":"업로드 설정이 저장되었습니다.","assets.settings.saveFailed":"업로드 설정 저장에 실패했습니다.","assets.settings.loadFailed":"업로드 설정을 불러오지 못했습니다.","assets.settings.tested":"연결을 확인했습니다.","assets.settings.testFailed":"연결 테스트에 실패했습니다.","assets.settings.removed":"API key 등록을 해제했습니다.","assets.settings.removeFailed":"API key 등록 해제에 실패했습니다.","assets.basic.notice":"Basic에서는 탐색, 미리보기, 메타데이터 편집, 사용 위치 스캔을 사용할 수 있습니다. Roblox 업로드는 Pro에서 사용할 수 있습니다.","assets.proOnly.tooltip":"Roblox 업로드는 Pro에서 사용할 수 있습니다.","assets.proOnly.upload":"Roblox 업로드는 Pro에서 사용할 수 있습니다.","assets.empty.title":"에셋 없음","assets.empty.body":"범위를 선택한 뒤 현재 필터에 해당하는 inbox 폴더를 다시 스캔하세요.","assets.detail.title":"에셋 상세","assets.detail.displayName":"표시 이름","assets.detail.description":"설명","assets.detail.save":"메타데이터 저장","assets.detail.refreshStatus":"새로고침","assets.detail.scanUsage":"사용 위치 스캔","assets.detail.localFile":"로컬 파일","assets.detail.fileName":"파일","assets.detail.category":"카테고리","assets.detail.scope":"범위","assets.detail.mimeType":"타입","assets.detail.size":"크기","assets.detail.dimensions":"크기(px)","assets.detail.duration":"길이","assets.detail.source":"원본 경로","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox 업로드 상태","assets.detail.status":"상태","assets.detail.assetId":"Asset ID","assets.detail.error":"오류","assets.detail.copyAssetId":"Asset ID 복사","assets.detail.copyUri":"URI 복사","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Studio URI 복사","assets.detail.copyWebUrl":"설정 URL 복사","assets.detail.openRobloxPage":"설정 페이지 열기","assets.detail.robloxWebUrlNotice":"이 페이지를 열려면 업로드된 에셋을 소유하거나 관리할 수 있는 Roblox 계정이 필요합니다.","assets.detail.uploadHistory":"업로드 이력","assets.detail.usedInPlace":"현재 Place에서 쓰인 위치","assets.detail.noUsage":"아직 로컬 Sync 파일에서 참조를 찾지 않았습니다.","assets.detail.usageSource":"확인 기준","assets.detail.usageSource.localSync":"로컬 Sync 파일","assets.detail.usageSource.notScanned":"아직 확인하지 않음","assets.detail.lastScanned":"마지막 확인 시각","assets.detail.lastScannedAt":"마지막 확인: {time}","assets.detail.lastScanned.never":"확인 기록 없음","assets.detail.noUsageUnscanned":"사용 위치 스캔을 실행하면 로컬 Sync 파일에서 이 Roblox Asset ID가 쓰인 위치를 찾습니다.","assets.detail.noUsageAfterScan":"마지막 확인에서 로컬 Sync 파일 내 참조를 찾지 못했습니다.","assets.detail.noUsageNoRobloxId":"Roblox Asset ID가 아직 없어 사용 위치를 확인할 수 없습니다. 업로드 후 스캔할 수 있습니다.","assets.detail.technicalDetails":"기술 세부 정보","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"원본 유형","assets.detail.createdAt":"생성됨","assets.detail.updatedAt":"수정됨","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation 경로","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"{line}번째 줄","assets.studio.notConnected":"Studio 에셋 작업을 사용하려면 Roblox Studio를 연결하세요.","assets.detail.importRbxm":"Studio에 삽입","assets.detail.importRbxm.tooltip":"이 로컬 RBXM 에셋을 연결된 Studio Place의 {target}에 삽입합니다.","assets.detail.generateThumbnail":"썸네일 생성","assets.detail.generateThumbnail.tooltip":"Studio에서 Asset Library 썸네일을 생성하거나 교체합니다.","assets.detail.rbxmOnly":"Studio 가져오기는 .rbxm 에셋에서 사용할 수 있습니다.","assets.detail.rbxmCategoryOnly":"Studio .rbxm 작업은 모델과 애니메이션을 지원합니다.","assets.detail.thumbnailRbxmOnly":"썸네일 생성은 .rbxm 모델 에셋에서 사용할 수 있습니다.","assets.detail.thumbnailModelOnly":"썸네일 생성은 모델 .rbxm 에셋에서 사용할 수 있습니다.","assets.detail.rbxm":"RBXM 내용","assets.detail.rbxmExportedCount":"내보낸 root","assets.detail.rbxmClasses":"클래스","assets.detail.rbxmThumbnail":"썸네일","assets.detail.studioInsertTarget":"Studio 삽입 위치","assets.detail.rbxmRoots":"Root 트리","assets.detail.rbxmReferences":"에셋 참조","assets.detail.rbxmStudioUploads":"Studio-local 업로드","assets.detail.rbxmStudioUploadsLabel":"Studio 업로드","assets.detail.rbxmStudioUploadsUploaded":"업로드됨","assets.detail.rbxmStudioUploadsFailed":"실패","assets.detail.rbxmGeneration":"생성 모델","assets.detail.rbxmGenerationProvider":"제공자","assets.detail.rbxmGenerationPrompt":"프롬프트","assets.detail.rbxmGenerationSchema":"스키마","assets.detail.rbxmGenerationPath":"Studio 경로","assets.detail.rbxmReview":"모델 검토","assets.detail.rbxmReviewReadiness":"준비 상태","assets.detail.rbxmReviewSummary":"요약","assets.detail.rbxmThumbnailAttempts":"썸네일 시도","dashboardHelp.button":"도움말","dashboardHelp.pageButton.ariaLabel":"페이지 도움말 열기","dashboardHelp.fieldButton.ariaLabel":"필드 도움말 열기","dashboardHelp.section.canDo":"여기서 할 수 있는 일","dashboardHelp.section.howItWorks":"동작 방식","dashboardHelp.section.needs":"사용하려면 필요한 것","dashboardHelp.section.links":"관련 링크","dashboardHelp.overview.title":"개요 도움말","dashboardHelp.overview.canDo.1":"MCP 서버, WEPPY Plugin, AI Agent, Sync, 최근 게임 변경 상태를 한 화면에서 확인할 수 있습니다.","dashboardHelp.overview.needs.1":"상태 확인에는 MCP 서버가 필요합니다. Studio 실시간 상태는 활성 Place에 WEPPY Plugin이 연결되어 있어야 합니다.","dashboardHelp.connection.title":"연결 도움말","dashboardHelp.connection.canDo.1":"공유 WEPPY Bridge, 각 AI 에이전트의 MCP Adapter, Studio target, 연결 로그 이벤트를 확인할 수 있습니다.","dashboardHelp.connection.needs.1":"WEPPY Bridge가 응답해야 합니다. Studio target 행은 WEPPY Plugin이 하트비트를 보낸 뒤 표시됩니다.","dashboardHelp.sync.title":"동기화 도움말","dashboardHelp.sync.canDo.1":"Studio와 로컬 파일의 동기화 상태, 방향, 적용 모드, 동기화 로그를 확인할 수 있습니다.","dashboardHelp.sync.needs.1":"Sync에는 활성 Place와 연결된 WEPPY Plugin이 필요합니다. 양방향 및 역방향 워크플로는 Pro에 따라 달라집니다.","dashboardHelp.assets.title":"에셋 도움말","dashboardHelp.assets.canDo.1":"로컬 Asset Library 파일을 탐색하고, 현재 Place/공용 범위를 전환하고, 카테고리로 필터링하고, 사용 위치를 스캔하고, RBXM을 Studio에 삽입하고, 로컬 에셋을 Roblox에 업로드할 수 있습니다.","dashboardHelp.assets.needs.1":"업로드에는 Pro, Open Cloud 업로드 토글, 유효한 API Key, Creator 설정이 필요합니다. 탐색과 미리보기는 Basic에서도 사용할 수 있습니다.","dashboardHelp.changelog.title":"변경 이력 도움말","dashboardHelp.changelog.canDo.1":"AI 작업과 동기화 이벤트에서 추출된 실제 게임 변경 세션을 확인할 수 있습니다.","dashboardHelp.changelog.needs.1":"변경 이력은 현재 Place 기준으로 묶입니다. Basic에서는 최신 미리보기 항목만 표시됩니다.","dashboardHelp.playtest.title":"플레이테스트 도움말","dashboardHelp.playtest.canDo.1":"AI Agent가 저장한 UI, 입력, 서버 결과의 구조화된 Playtest 증거를 확인합니다.","dashboardHelp.playtest.needs.1":"Pro에서는 실제 저장 리포트를 표시하고 Basic에서는 샘플 하나를 표시합니다. Play 화면 캡처 증거는 사용할 수 없지만 semantic UI와 interaction 증거는 확인할 수 있습니다. 현재 Place와의 정확한 연결 판단에는 WEPPY Plugin 연결이 필요합니다.","dashboardHelp.uiStudio.title":"UI Studio 도움말","dashboardHelp.uiStudio.canDo.1":"AI가 만든 UI 분석, 개선 제안, 캡처, 전후 비교 이력을 확인할 수 있습니다.","dashboardHelp.uiStudio.needs.1":"Pro에서는 실제 UI Studio 데이터를 표시합니다. Basic에서는 포함된 샘플을 표시합니다. 새 캡처/검사 작업에는 WEPPY Plugin 연결이 필요합니다.","dashboardHelp.tools.title":"도구 도움말","dashboardHelp.tools.canDo.1":"도구 실행 기록, 상태 분류, fallback/unsupported/warn/error 상세, 사용 통계를 확인할 수 있습니다.","dashboardHelp.tools.needs.1":"기록과 통계는 로컬 기록 설정과 활성 Place 버킷에 따라 표시됩니다.","dashboardHelp.settings.title":"설정 도움말","dashboardHelp.settings.canDo.1":"License, 저장 데이터 정리, 서버 환경 표시, 언어 설정을 관리할 수 있습니다.","dashboardHelp.settings.needs.1":"License 작업에는 MCP 서버 연결이 필요합니다. 서버 환경 값은 여기서 읽기 전용입니다. 에셋 업로드 설정은 Assets 설정에 있습니다.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key 도움말","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY는 이 키를 Roblox Open Cloud 요청에만 사용합니다.","dashboardHelp.openCloudApiKey.needs.1":"Creator Hub에서 Roblox API Key를 만들 때 Access Permissions에 Assets를 추가하고 Read와 Write operation을 모두 켜세요.","dashboardHelp.openCloudApiKey.needs.2":"Key target은 업로드 Creator로 사용할 User 또는 Group과 같아야 합니다.","dashboardHelp.openCloudApiKey.needs.3":"원본 키는 이 기기에 암호화 저장됩니다. WEPPY 서버나 다른 외부 저장소로 보내거나 저장하지 않습니다. 브라우저 저장소, 텔레메트리, 로그, 도구 기록, Asset Library 메타데이터에도 저장하지 않습니다.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API Keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API 사용 가이드","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API 레퍼런스","dashboardHelp.openCloudCreatorId.title":"Creator ID 도움말","dashboardHelp.openCloudCreatorId.canDo.1":"기본 Creator는 새로 업로드되는 Roblox 에셋을 어느 User 또는 Group 소유로 만들지 정합니다.","dashboardHelp.openCloudCreatorId.needs.1":"User를 선택했다면 roblox.com에 로그인한 뒤 아바타나 사용자 이름에서 내 프로필을 열고, 브라우저 URL의 /users/와 /profile 사이 숫자만 복사하세요.","dashboardHelp.openCloudCreatorId.needs.2":"Group을 선택했다면 Roblox 그룹 또는 커뮤니티 페이지를 열고, 브라우저 URL의 /groups/ 또는 /communities/ 뒤 숫자만 복사하세요.","dashboardHelp.openCloudCreatorId.needs.3":"Creator ID에는 숫자 ID만 붙여넣으세요. 전체 URL, rbxassetid://, User, Group 같은 텍스트는 넣지 않습니다.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID 레퍼런스","dashboardHelp.openCloudCreatorId.link.userId":"User ID 레퍼런스","dashboardHelp.openCloudCreatorId.link.groups":"Roblox 그룹","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY는 이 키를 Roblox Open Cloud 요청에만 사용합니다. 키는 이 기기에만 암호화 저장되며 WEPPY 서버나 다른 외부 저장소로 보내거나 저장하지 않습니다.","assets.settings.creatorId.inlineHelp":"새 Roblox asset의 기본 소유자입니다: 사용자 ID 또는 그룹 ID를 입력하세요.","common.close":"닫기","dashboardHelp.section.currentState":"현재 상태에서 확인할 것","dashboardHelp.overview.currentState.serverOnly":"실시간 Place 데이터가 표시되도록 Roblox Studio를 열고 WEPPY Plugin을 시작하세요.","dashboardHelp.overview.currentState.default":"서버 연결이 끊기면 MCP를 다시 시작하거나 자동 재연결을 기다리세요.","dashboardHelp.connection.currentState.1":"Studio target이 보이지 않으면 Roblox Studio를 열고 WEPPY Plugin을 실행하세요. AI 에이전트나 MCP Adapter가 보이지 않으면 AI 도구에서 WEPPY MCP Server를 다시 연결하세요.","dashboardHelp.sync.currentState.pluginMissing":"실시간 Sync 정보를 보려면 Studio에서 WEPPY Plugin을 연결하세요.","dashboardHelp.sync.currentState.basic":"양방향 또는 역방향 Sync를 사용하려면 Pro를 활성화하세요.","dashboardHelp.sync.currentState.default":"동기화가 멈추거나 실패하면 Sync 로그에서 원인을 확인하세요.","dashboardHelp.assets.currentState.basic":"Roblox 업로드를 사용하려면 먼저 Pro를 활성화하세요.","dashboardHelp.assets.currentState.uploadDisabled":"Assets 설정에서 Open Cloud 업로드를 켜세요.","dashboardHelp.assets.currentState.noCredential":"Open Cloud API Key를 저장하고 연결 테스트를 실행하세요.","dashboardHelp.assets.currentState.noCreator":"기본 Creator ID를 저장하거나 업로드할 때 Creator 정보를 입력하세요.","dashboardHelp.assets.currentState.default":"업로드나 사용 위치 스캔을 시작하려면 에셋 상세 창을 여세요.","dashboardHelp.changelog.currentState.1":"목록이 비어 있으면 AI Agent에게 게임 변경 작업을 요청하세요. 지우기는 저장된 이력 기록만 삭제하며 Studio 오브젝트는 삭제하지 않습니다.","dashboardHelp.playtest.currentState.basic":"실제 Playtest 이력을 사용하려면 Pro를 활성화하세요.","dashboardHelp.playtest.currentState.default":"리포트가 없으면 AI Agent에게 Playtest 실행을 요청하세요.","dashboardHelp.uiStudio.currentState.basic":"실시간 UI Studio 미리보기를 사용하려면 Pro를 활성화하세요.","dashboardHelp.uiStudio.currentState.default":"AI Agent에게 UI 캡처나 개선 제안 확인을 요청한 뒤, 필요한 수정 요청을 AI 채팅으로 복사하세요.","dashboardHelp.tools.currentState.1":"기록이 보이지 않으면 Controls > General Settings에서 기록/통계가 켜져 있는지 확인하세요. 실패/차단 상태는 행 확장에서 입력, 권한, 연결 문제를 확인하세요.","dashboardHelp.settings.currentState.1":"Pro 기능을 사용하려면 License를 활성화하세요. 환경 값은 WEPPY Dashboard 밖에서 바꾼 뒤 MCP를 다시 시작하세요. 저장 데이터를 삭제하기 전 확인 문구를 꼭 검토하세요.","dashboardHelp.openCloudApiKey.currentState.saved":"저장된 키가 계속 동작하는지 연결 테스트로 확인하세요.","dashboardHelp.openCloudApiKey.currentState.empty":"Roblox Creator Hub에서 API Key를 만든 뒤 여기에 붙여넣고 저장한 다음 연결 테스트를 실행하세요.","dashboardHelp.openCloudCreatorId.currentState.saved":"새 에셋을 같은 소유자로 계속 만들려면 이 값을 유지하세요.","dashboardHelp.openCloudCreatorId.currentState.empty":"User 또는 Group을 선택하고 숫자 ID를 붙여넣은 뒤 기본 Creator를 저장하세요.","page.overview.title":"개요","page.overview.description":"서버, 플러그인, 에이전트, 동기화, 최근 게임 변경 상태를 한곳에서 확인합니다.","page.connection.title":"연결","page.connection.description":"WEPPY Bridge, MCP Adapter, Studio Plugin, 연결 로그 상태를 확인합니다.","page.sync.title":"동기화","page.sync.description":"Studio와 로컬 파일 동기화 상태, 방향, 적용 모드, 최근 로그를 확인합니다.","page.changelog.title":"변경 이력","page.changelog.description":"AI 작업과 동기화 이벤트에서 기록된 게임 변경 세션을 검토합니다.","page.playtest.title":"플레이테스트","page.playtest.description":"자동 플레이테스트 실행 기록, 저장된 리포트, 결과 이력을 확인합니다.","page.uiStudio.title":"UI 스튜디오","page.uiStudio.description":"UI 캡처, 개선 제안, 변경 전후 이력을 검토합니다.","page.tools.title":"도구","page.tools.description":"도구 실행 이력, 결과 상태, fallback 상세, 사용 통계를 확인합니다.","page.settings.title":"설정","page.settings.description":"라이선스, 저장 데이터, 서버 환경, 언어를 관리합니다.","dashboardHelp.whatsNew.title":"새소식 도움말","dashboardHelp.whatsNew.canDo.1":"WEPPY Dashboard, MCP, Plugin 관련 공지, 릴리즈, 변경 안내를 확인합니다.","dashboardHelp.whatsNew.needs.1":"공지 데이터는 로컬에 포함되어 있으며, 미읽음 상태는 이 브라우저에 저장됩니다.","dashboardHelp.whatsNew.currentState.1":"이 페이지를 방문하면 현재 방문 중 미읽음 공지가 페이지를 떠날 때 읽음 처리됩니다. 이 페이지에서는 상단 헤더의 새소식 버튼을 중복 표시하지 않습니다.","sidebar.controls":"컨트롤","header.manageProjectRoot":"Project Root 관리","header.manageProjectRoot.tooltip":"Project Root 컨트롤을 엽니다.","connection.routing.manage":"라우팅 관리","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"MCP가 사용하는 authoritative project root와 sync target입니다.","controls.projectRoot.live.tooltip":"확인 후 MCP 런타임 상태에 즉시 반영됩니다.","controls.projectRoot.unavailable":"Project root를 불러올 수 없음","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"MCP가 다른 프로젝트 폴더 아래에 sync 데이터를 써야 할 때만 사용하세요. 기존 sync 폴더는 자동으로 이동되지 않습니다.","controls.studioRouting.title":"Studio 라우팅","controls.studioRouting.title.tooltip":"Studio 대상을 지정하지 않은 MCP 요청의 라우팅 우선순위입니다.","controls.studioRouting.settingLabel":"대상을 지정하지 않은 요청","controls.studioRouting.mode.auto":"자동","controls.studioRouting.mode.pinned":"Studio 고정","controls.studioRouting.state.auto":"현재: 자동","controls.studioRouting.state.pinned":"현재: Studio 고정","controls.studioRouting.saving":"적용 중…","controls.studioRouting.applied":"적용됨","controls.studioRouting.failed":"적용 실패","controls.studioRouting.pinnedUnavailable":"Studio 고정 모드를 사용하려면 Studio 대상을 연결하세요.","controls.studioRouting.helpLabel":"Studio 라우팅 동작 안내","controls.studioRouting.helpButton":"어떻게 동작하나요?","controls.studioRouting.selectTarget":"고정할 Studio 선택","controls.studioRouting.select":"선택","controls.studioRouting.targetGroupLabel":"Studio 고정 대상","controls.luauValidation.title":"Luau 문법 검사","controls.luauValidation.settingLabel":"Script 수정 후 자동 검사","controls.luauValidation.benefit":"AI가 Script를 수정한 뒤 Luau 문법 오류가 생겼는지 확인합니다.","controls.luauValidation.state.on":"현재: 켜짐","controls.luauValidation.state.off":"현재: 꺼짐","controls.luauValidation.priority":"AI 요청과 이 설정이 다르면 Dashboard 값이 적용됩니다. 검사 방식을 바꾸려면 이 화면에서 켜거나 끄세요.","controls.luauValidation.switchLabel":"Script 수정 후 자동 문법 검사","controls.luauValidation.saving":"적용 중…","controls.luauValidation.applied":"적용됨","controls.luauValidation.failed":"적용 실패","controls.luauValidation.helpLabel":"Luau 자동 문법 검사 동작 안내","controls.luauValidation.helpButton":"어떻게 동작하나요?","controls.luauValidation.help.behavior":"켜면 AI가 Script 전체 교체, 줄 교체, 줄 삽입, 줄 삭제를 마친 뒤 실제 저장된 전체 코드를 확인합니다. 끄면 Script만 수정하고 자동 문법 검사는 실행하지 않습니다.","controls.luauValidation.help.response":"문법이 정상이면 평소와 같은 짧은 완료 응답을 유지합니다. 오류가 있거나 검사를 진행하지 못했을 때만 자세히 알려주며, 큰 Script는 응답이 조금 늦어질 수 있습니다.","controls.luauValidation.help.nonBlocking":"문법 오류를 발견하거나 검사를 진행하지 못해도 이미 저장된 Script 변경은 되돌리지 않습니다. AI가 같은 Script를 바로 고칠 수 있도록 결과를 알려줍니다.","page.controls.title":"컨트롤","page.controls.description":"Project Root, Studio 라우팅, MCP 실시간 설정을 관리합니다.","dashboardHelp.controls.title":"Controls 도움말","dashboardHelp.controls.canDo.1":"Project Root, Studio 라우팅, MCP hot settings를 관리합니다.","dashboardHelp.controls.needs.1":"Project Root와 Studio Routing은 MCP 서버 연결이 필요합니다. Hot settings는 서버 응답이 필요합니다. Asset upload controls는 Assets 설정에 있습니다.","dashboardHelp.controls.currentState.1":"MCP가 다른 프로젝트 폴더 아래에 동기화 데이터를 써야 할 때만 Project Root를 바꾸세요. Studio Routing은 에이전트 요청이 Studio ID, Connection ID, Place ID 같은 대상을 지정하지 않았을 때만 적용됩니다.","header.projectGroup.label":"프로젝트","header.activeStudio.label":"활성 Studio","header.activeStudio.tooltip":"MCP가 요청을 라우팅할 수 있는 연결된 Studio 대상입니다. Studio Routing은 Studio 대상을 지정하지 않은 요청의 우선순위를 바꿉니다.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · 상태: {state} · 실행 상태: {runtimeState} · 라우팅: {routing}","header.storedPlace.tooltip":"프로젝트에 저장된 Place: {placeName} · Place ID: {placeId} · 상태: {state}","header.activeStudio.emptyTooltip":"연결된 Studio 플러그인이 없습니다. Roblox Studio를 열고 WEPPY Plugin을 연결하세요.","header.placeData.label":"Place 데이터","header.placeData.unavailable":"Place 데이터 경로를 확인할 수 없습니다.","header.placeData.tooltip":"현재 Place 데이터 폴더입니다.","controls.studioRouting.duplicatePlaceWarning":"같은 Place ID를 가진 Studio 창이 여러 개 연결되어 있습니다. 해당 Place를 지정할 때는 Studio ID를 사용하도록 AI 에이전트에게 요청하세요.","connection.routing.priorityControl":"Studio 대상을 지정하지 않은 요청의 우선순위 모드","connection.routing.recentPriority":"Automatic: 최근 우선순위","connection.routing.pinned":"Manual: 고정 Studio","connection.routing.priorityBadge":"우선","connection.routing.pinnedBadge":"고정","connection.routing.setPriorityTarget":"우선 대상으로 설정","controls.studioRouting.priorityTitle":"Studio 대상을 지정하지 않은 요청의 우선순위","controls.studioRouting.priorityDescription":"Studio ID, Connection ID, Place ID를 명시한 요청은 이 우선순위 설정을 건너뛰고 지정된 Studio로 라우팅됩니다.","controls.studioRouting.state.currentTarget":"현재 우선 대상","controls.studioRouting.noPriorityTarget":"연결된 Studio target 없음","controls.studioRouting.help.auto":"자동은 최근 라우팅된 명령과 연결 순서를 기준으로 우선순위가 가장 높은 활성 Studio를 사용합니다.","controls.studioRouting.help.pinned":"Studio 고정은 요청에 Studio ID, Connection ID, Place ID가 없을 때 선택한 Studio를 사용합니다.","sync.migration.title":"Sync 형식 업데이트 가능","sync.migration.description":"이 Place의 Sync 형식을 v2에서 v3로 업데이트하기 전에 메타데이터 변경 내용을 검토하세요.","sync.migration.status.ready":"검토 가능","sync.migration.status.blocked":"차단됨","sync.migration.preview":"변경 내용 검토","sync.migration.summary.add":"추가","sync.migration.summary.modify":"수정","sync.migration.summary.delete":"삭제","sync.migration.summary.blocked":"차단","sync.migration.changes":"메타데이터 변경","sync.migration.blockers":"해결할 항목","sync.migration.operation.add":"추가","sync.migration.operation.modify":"수정","sync.migration.operation.delete":"삭제","sync.migration.reason.serializer_regeneration":"메타데이터를 v3 표준 형식으로 다시 기록합니다.","sync.migration.reason.volatile_metadata_removal":"일시적인 Sync 메타데이터를 제거합니다.","sync.migration.reason.redundant_empty_metadata":"불필요한 빈 메타데이터를 제거합니다.","sync.migration.reason.runtime_ignore_policy":"관리되는 런타임 제외 규칙을 업데이트합니다.","sync.migration.reason.reverse_pending":"대기 중인 로컬→Studio 변경을 먼저 적용하거나 취소하세요.","sync.migration.reason.conflict":"로컬과 Studio 간 충돌을 먼저 해결하세요.","sync.migration.reason.local_canonical_change":"로컬에서 수정된 정본 메타데이터를 먼저 검토하세요.","sync.migration.reason.source_mutation_detected":"Migration 검증 중 사용자 소스 파일이 변경되었습니다.","sync.migration.blocked":"Sync 충돌을 해결한 뒤 업데이트하세요","sync.migration.stale":"미리보기가 변경되었습니다. 최신 차이를 다시 검토하세요.","sync.migration.error":"Sync 형식을 업데이트하지 못했습니다. 다시 시도하세요.","sync.migration.refresh":"미리보기 새로고침","sync.migration.refreshing":"새로고침 중…","sync.migration.applying":"적용 중…","sync.migration.apply":"업데이트 적용","sync.migration.confirm.title":"Sync 형식 업데이트를 적용할까요?","sync.migration.confirm.message":"표시된 Sync 메타데이터를 백업한 뒤 업데이트합니다. Luau 소스 파일은 변경하지 않습니다.","changelog.ownership.showGenerated":"생성된 메타데이터 표시","changelog.ownership.userSource":"사용자 소스","changelog.ownership.canonicalMirror":"미러 메타데이터","changelog.ownership.generated":"자동 생성","uiStudio.analysis.verdict.incomplete":"검토 증거 부족","uiStudio.analysis.issueSummary.incomplete":"제안은 없지만 interaction·responsive 검토가 남아 있습니다.","uiStudio.analysis.coverageDimensions":"검토 범위","uiStudio.analysis.coverageStatus.completed":"완료","uiStudio.analysis.coverageStatus.failed":"실패","uiStudio.analysis.coverageStatus.skipped":"생략","uiStudio.history.row.readinessIncomplete":"준비 상태: 검토 증거 부족","uiStudio.noSuggestionsIncomplete":"제안은 없지만 검토되지 않은 범위가 남아 있습니다.","uiStudio.readiness.summary":"UI 준비 상태","uiStudio.primaryVisual.label":"대표 화면","uiStudio.primaryVisual.recompose":"재구성 필요","uiStudio.primaryVisual.refine":"다듬기 필요","uiStudio.primaryVisual.approved":"승인됨","uiStudio.primaryVisual.unknown":"확인 안 됨","uiStudio.functional.label":"기능","uiStudio.functional.safe":"안전","uiStudio.functional.risk":"위험 있음","uiStudio.functional.unknown":"확인 안 됨","uiStudio.functional.safeCompact":"기능 안전","uiStudio.functional.riskCompact":"기능 위험","uiStudio.functional.unknownCompact":"기능 확인 안 됨","uiStudio.responsive.label":"반응형","uiStudio.responsive.recommended":"권장","uiStudio.responsive.required":"필수","uiStudio.responsive.unknown":"확인 안 됨","uiStudio.responsive.recommendedCompact":"반응형 권장","uiStudio.responsive.requiredCompact":"반응형 필수","uiStudio.responsive.unknownCompact":"반응형 확인 안 됨","uiStudio.readiness.ready":"준비 완료","uiStudio.readiness.reviewRequired":"검토 필요","uiStudio.readiness.insufficient":"증거 부족","uiStudio.readiness.unknown":"준비 상태 확인 안 됨","uiStudio.criticSummary":"비평 요약","playtest.history.kind.structured":"구조화","playtest.history.kind.legacy":"레거시","playtest.history.kind.attention":"확인 필요","playtest.summary.title":"실행 요약","playtest.summary.status":"상태","playtest.summary.mode":"모드","playtest.summary.duration":"소요 시간","playtest.summary.cleanup":"정리","playtest.dimension.title":"증거 항목","playtest.dimension.hint":"필수 증거를 표시합니다.","playtest.dimension.server":"서버","playtest.dimension.clientUi":"클라이언트 UI","playtest.dimension.interaction":"상호작용","playtest.dimension.visual":"화면","playtest.dimension.required":"필수","playtest.dimension.optional":"선택","playtest.dimension.steps":"단계","playtest.steps.title":"단계 타임라인","playtest.steps.expected":"예상","playtest.steps.observed":"관찰","playtest.steps.evidence":"증거","playtest.steps.server":"서버","playtest.steps.details":"상세","playtest.capability.title":"기능과 제한 사항","playtest.capability.semanticUi":"Semantic UI snapshot","playtest.capability.virtualInput":"Virtual input","playtest.capability.fixedBootstrap":"고정 Agent bootstrap","playtest.capability.projectAdapter":"프로젝트 테스트 어댑터","playtest.capability.available":"사용 가능","playtest.capability.unavailable":"사용 불가","playtest.limitations.title":"제한 사항","playtest.artifacts.title":"결과 파일","playtest.result.status.passed":"통과","playtest.result.status.failed":"실패","playtest.result.status.timedOut":"시간 초과","playtest.result.status.cancelled":"취소됨","playtest.result.status.insufficientEvidence":"증거 부족","playtest.result.status.unavailable":"사용 불가","playtest.result.status.skipped":"건너뜀","playtest.result.status.notRequested":"요청 안 함","playtest.result.status.unknown":"알 수 없음","playtest.record.incomplete":"구조화 결과가 완성되지 않았습니다","playtest.record.corrupt":"구조화 결과가 손상되었습니다","playtest.record.unsupported":"지원하지 않는 구조화 결과 버전입니다","playtest.record.unavailable":"결과 상세 정보를 표시할 수 없습니다.","playtest.sample.terminal":"필수 증거가 모두 통과했습니다","playtest.sample.limit.visual":"구조화 세션 v1에서는 Play 화면 캡처 증거를 지원하지 않습니다","playtest.history.agents":"Agent","playtest.history.agentCounts":"서버 {server} · 클라이언트 {client}","playtest.agents.title":"테스트 Agent","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"화면 증거 사용 불가 — 구조화 세션 v1에서는 Play 화면 캡처를 지원하지 않습니다.","playtest.limitations.virtualInputUnavailable":"이 세션에서는 Virtual input을 사용할 수 없습니다.","playtest.limitations.visualUnsupportedReason":"구조화 세션 v1에서는 Play 화면 캡처를 지원하지 않습니다.","playtest.dimension.reason.missing":"필수 증거가 누락되었습니다.","playtest.dimension.reason.capability":"필수 기능을 사용할 수 없습니다.","playtest.artifacts.metadata":"결과 메타데이터"},Yy={"sidebar.overview":"Resumen","sidebar.changelog":"Historial","sidebar.connection":"Conexión","sidebar.sync":"Sincronización","sidebar.playtest":"Prueba","sidebar.tools":"Herramientas","sidebar.settings":"Configuración","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Se requiere conexión con el servidor MCP.","sidebar.gate.l2":"Se requiere conexión con el plugin de Roblox Studio.","header.currentProject":"Proyecto actual","header.unknownProject":"Proyecto desconocido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Cargando raíz del proyecto...","header.currentProject.unavailable":"Raíz del proyecto no disponible","header.placeNotConnected":"Place no conectado","header.currentProject.tooltip":"Carpeta de proyecto seleccionada actualmente.","header.currentProject.loading.tooltip":"La información de la raíz del proyecto todavía se está cargando.","header.currentProject.unavailable.tooltip":"La información actual de la raíz del proyecto no está disponible.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Cargando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root no disponible","header.currentProjectSyncRoot.tooltip":"Carpeta sync root actual del proyecto seleccionado.","header.currentProjectSyncRoot.loading.tooltip":"La información de sync root todavía se está cargando.","header.currentProjectSyncRoot.unavailable.tooltip":"La información actual de sync root no está disponible.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"La ruta de archivos de prueba no está disponible.","header.testFiles.tooltip":"Directorio actual de archivos de playtest para el place seleccionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Se requiere conexión del plugin","header.places.liveRequired":"Se requiere conexión del plugin para ver el place activo en tiempo real.","header.place.tooltip":"Place de Roblox conectado.","header.placeNotConnected.tooltip":"Place no conectado","placeScope.current.label":"Place actual","placeScope.lastActive.label":"Último place activo","placeScope.selected.label":"Place seleccionado","placeScope.unknownPlace":"Place desconocido","placeScope.live":"En vivo","placeScope.stored":"Guardado","placeScope.pluginRequired":"Plugin requerido","placeScope.pluginRequired.note":"Conecta WEPPY Plugin para confirmar el place activo en vivo.","placeScope.noPlace.label":"Alcance del place","placeScope.noPlace.value":"Aún no hay datos de place disponibles","placeScope.noPlace.badge":"Sin place","placeScope.noPlace.note":"Conecta WEPPY Plugin y sincroniza un place para crear datos por place.","placeScope.selected.note":"Solo se muestran datos guardados. El enrutamiento de Studio no cambia.","placeScope.surface.sync":"El estado de sincronización y los registros usan este place.","placeScope.surface.changelog":"Las sesiones del historial de cambios usan este place.","placeScope.surface.playtest":"Los informes de playtest usan este place.","placeScope.surface.uiStudio":"Las capturas de UI y el historial de cambios usan este place.","placeScope.surface.tools":"El historial y las estadísticas de herramientas usan este place.","placeScope.loading":"Cargando alcance del place...","placeScope.unavailable":"Alcance del place no disponible","placeScope.selector.label":"Datos del place","header.changeProjectRoot":"Cambiar raíz del proyecto","header.changeProjectRoot.ariaLabel":"Cambiar raíz del proyecto","header.changeProjectRoot.tooltip":"Cambiar la raíz actual del proyecto.","header.changeProjectRoot.disabledTooltip.l0":"Primero se requiere conexión con el servidor MCP para cambiar la raíz del proyecto.","header.changeProjectRoot.disabledTooltip.loading":"La información de la raíz del proyecto todavía se está cargando.","header.changeProjectRoot.disabledTooltip.unavailable":"La información actual de la raíz del proyecto no está disponible.","header.projectRootModal.initial.title":"Cambiar raíz del proyecto","header.projectRootModal.initial.body.connected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y el contenido actual de Studio se resincronizará por completo en el nuevo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y usará <selected project folder>/weppy-project-sync como el próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Nuevo destino de sync después de la selección","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"El sync actual se detiene de inmediato.","header.projectRootModal.initial.warningFreshSync":"El contenido actual de Studio se usará para crear un fresh full sync en el nuevo destino.","header.projectRootModal.initial.warningNoMove":"Las carpetas de sync anteriores no se mueven automáticamente.","header.projectRootModal.initial.warningDeferredSync":"Si Studio no está conectado, el full resync comenzará la próxima vez que se conecte el plugin.","header.projectRootModal.confirm.title":"Confirmar nueva raíz del proyecto","header.projectRootModal.confirm.body":"Revisa la carpeta seleccionada antes de aplicar el cambio.","header.projectRootModal.confirm.projectRoot":"Carpeta de proyecto seleccionada","header.projectRootModal.confirm.syncRoot":"Nuevo destino de sync","header.projectRootModal.confirm.warningNoMove":"Las carpetas de sync existentes no se mueven automáticamente.","header.projectRootModal.pick":"Elegir carpeta","header.projectRootModal.apply":"Aplicar cambio","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"No se pudo cambiar la raíz del proyecto.","status.online":"En línea","status.offline":"Desconectado","status.idle":"Inactivo","status.syncing":"Sincronizando","status.error":"Error","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"WEPPY Dashboard está abierto pero el servidor MCP se detuvo o no responde.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifica: ¿Roblox Studio está abierto? ¿El plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Nivel Basic con el conjunto estándar de funciones del WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Nivel Pro con el conjunto completo de funciones del WEPPY Dashboard.","tier.mixed":"Mixto","tier.upgrade":"Ver Pro","tier.banner.save":"¡Ahorra tokens de IA con Pro!","tier.tool.query_instances.desc":"Consulta de instancias, exploración de hijos/descendientes, info de clase, búsqueda por nombre y clase. Pro: árbol de archivos, estructura del proyecto, búsqueda por propiedad y etiqueta.","tier.tool.mutate_instances.desc":"Crear, eliminar, clonar, mover, renombrar y pivotar instancias. Pro: creación de árboles, creación/eliminación/duplicación masiva.","tier.tool.manage_properties.desc":"Consultar y establecer propiedades, atributos y etiquetas. Pro: valores calculados y relativos, consulta/establecimiento masivo, modificación masiva de hijos.","tier.tool.manage_scripts.desc":"Leer, escribir, crear, eliminar, editar líneas y buscar en scripts. Pro: reemplazo masivo entre scripts.","tier.tool.manage_ui.desc":"Solo Pro. Crea o mejora menús, HUDs, botones, etiquetas y paneles de imagen con estilo de juego; luego captura pantallas y revisa sugerencias.","tier.tool.manage_ui.action.design_brief":"Planificar la dirección de UI","tier.tool.manage_ui.action.create_tree":"Crear nueva UI","tier.tool.manage_ui.action.update":"Actualizar UI existente","tier.tool.manage_ui.action.delete":"Eliminar UI","tier.tool.manage_ui.action.preview":"Capturar pantalla de UI","tier.tool.manage_ui.action.check":"Revisar sugerencias de mejora","tier.tool.manage_lighting.desc":"Solo Pro. Configuración de iluminación, atmósfera, cielo, propiedades del terreno y hora del día.","tier.tool.manage_selection.desc":"Consultar, establecer y borrar selección. Pro: contexto, detalles, agregar/quitar elementos, monitorear cambios.","tier.tool.manage_camera.desc":"Info de cámara, enfocar por ruta o coordenadas, vista sugerida.","tier.tool.manage_tween.desc":"Solo Pro. Crear, reproducir, pausar y cancelar tweens para animaciones suaves.","tier.tool.manage_audio.desc":"Solo Pro. Reproducir, detener, pausar y reanudar sonidos. Configurar listener de audio.","tier.tool.manage_animation.desc":"Solo Pro. Cargar, reproducir y detener animaciones. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Solo Pro. Registrar grupos de colisión, configurar colisión entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Solo Pro. Emitir partículas, borrar todas, alternar activación de efectos.","tier.tool.manage_terrain.desc":"Solo Pro. Rellenar formas, borrar regiones, reemplazar materiales, gestionar colores, leer/escribir voxels, generación procedural, suavizado.","tier.tool.spatial_query.desc":"Solo Pro. Raycast, buscar suelo, verificar colocación, escaneo de área, buscar zonas planas y puntos de aparición, análisis de caminabilidad, mapa espacial, detección de colisión.","tier.tool.manage_assets.desc":"Solo Pro. Insertar modelos, consultar info de assets, buscar en tienda de creadores, insertar modelos/paquetes gratuitos, exportar.","tier.tool.manage_sync.desc":"Solo Pro. Estado de sincronización, configuración, historial, dirección, lectura/escritura de archivos sincronizados.","tier.tool.workspace_state.desc":"Solo Pro. Sincronización completa, instantánea, cambios recientes, info de viewport, metadatos, gestión de caché.","tier.tool.manage_logs.desc":"Consulta filtrada de registros, sondeo incremental, borrar buffer, consulta de errores recientes.","tier.tool.system_info.desc":"Estado de conexión, verificación de tier. Pro: info de lugar, lista de servicios, configuración de Studio, control de playtest, pruebas automáticas.","tier.tool.manage_studio.desc":"Solo Pro. Alterna ajustes de vista del editor de Studio, como la vista previa de UI, para capturas y QA; cambia ajustes de la sesión, no objetos de UI del juego.","tier.tool.batch_execute.desc":"Solo Pro. Ejecutar múltiples comandos en lote. Procesamiento secuencial con opción de continuar en caso de error.","tier.tool.execute_luau.desc":"Solo Pro. Ejecutar código Luau arbitrario en el sandbox de Roblox Studio.","connection.server.title":"Estado del Bridge","connection.server.version":"Versión","connection.server.version.tooltip":"Versión del entorno de ejecución de WEPPY Bridge.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de proceso del sistema operativo.","connection.server.uptime":"Tiempo activo","connection.server.uptime.tooltip":"Tiempo transcurrido desde que se inició WEPPY Bridge.","connection.server.session":"Sesión","connection.server.session.tooltip":"Identificador de la sesión actual de WEPPY Bridge.","connection.server.exec":"Ejecutable","connection.server.exec.tooltip":"Ruta del ejecutable usado para iniciar WEPPY Bridge.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configuración","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.version":"Versión","connection.agents.version.tooltip":"Versión del paquete MCP Adapter para esta sesión del agente.","connection.agents.cwd":"Directorio","connection.agents.cwd.tooltip":"Directorio de trabajo actual del agente de IA conectado.","connection.agents.projectRoot":"Raíz del proyecto","connection.agents.projectRoot.tooltip":"Ruta del proyecto autoritativa para la propiedad de sincronización","connection.agents.projectRoot.unresolved":"Sin resolver","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconocido","connection.agents.none":"Sin agentes conectados","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat más reciente recibido desde el plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versión instalada del plugin informada por Studio.","connection.plugins.none":"Sin plugins conectados","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Conexión Play/Test de Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Cada agente de IA se conecta mediante su propio MCP Adapter a un WEPPY Bridge compartido, que mantiene la conexión con Roblox Studio.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Registro de conexión","connection.log.empty":"Sin eventos","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Cargando...","common.retry":"Reintentar","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Contraer","tools.tab.history":"Historial","tools.tab.statistics":"Estadísticas","tools.tab.failures":"Fallos","tools.col.time":"Hora","tools.col.time.tooltip":"Momento en que se registró la ejecución de la herramienta.","tools.col.toolAction":"Herramienta.Acción","tools.col.toolAction.tooltip":"Nombre de la herramienta y acción que se ejecutó.","tools.col.duration":"Duración","tools.col.duration.tooltip":"Cuánto tardó la herramienta en finalizar.","tools.col.status":"Estado","tools.col.status.tooltip":"Resultado de la ejecución registrada.","tools.col.tier":"Nivel","tools.col.tier.tooltip":"Nivel de licencia requerido para la herramienta o acción.","tools.col.tierStats.tooltip":"Resumen Basic, Pro o Mixed para esta fila de estadísticas de herramientas.","tools.col.tool":"Herramienta","tools.col.tool.tooltip":"Nombre de la herramienta consolidada en la tabla de estadísticas.","tools.col.calls":"Llamadas","tools.col.calls.tooltip":"Número total de llamadas registradas para esta herramienta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de ejecuciones exitosas directas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de ejecuciones que tuvieron éxito mediante fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de ejecuciones bloqueadas sin fallback.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Número de fallos esperados causados por la entrada, el estado del proyecto, la política de Roblox o el código del usuario.","tools.col.err":"FALLIDO","tools.col.err.tooltip":"Número de ejecuciones que terminaron en fallo.","tools.col.okRate":"% Éxito","tools.col.okRate.tooltip":"Porcentaje de llamadas que terminaron correctamente.","tools.col.avgTime":"Tiempo promedio","tools.col.avgTime.tooltip":"Tiempo promedio de ejecución entre las llamadas registradas.","tools.col.error":"Error","tools.filter.tool":"Herramienta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usó una herramienta o acción exclusiva de Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"La acción Pro solicitada tuvo éxito mediante un fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"La acción Pro solicitada fue bloqueada y no se ejecutó ningún fallback.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"La llamada falló por un problema esperado de entrada, proyecto, política o código de usuario.","tools.badge.err":"FALLIDO","tools.badge.err.tooltip":"La ejecución de la herramienta terminó en fallo.","tools.status.ok":"OK","tools.status.ok.tooltip":"La ejecución de la herramienta finalizó correctamente.","tools.tier.mixed.tooltip":"Esta herramienta incluye acciones Basic y Pro.","tools.detail.params":"Parámetros","tools.detail.params.tooltip":"Parámetros de entrada enviados en esta ejecución.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Carga útil devuelta por esta ejecución.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando ejecutado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo del bloqueo","tools.detail.noFallback":"Sin fallback","tools.detail.noFallback.value":"No se ejecutó ningún fallback.","tools.detail.warningMessage":"Mensaje de advertencia","tools.detail.errorMessage":"Mensaje de error","tools.detail.open":"Detalles","tools.detail.openLabel":"Ver detalles de {command}","tools.detail.dialogLabel":"Detalle de ejecución de herramienta","tools.detail.title":"Ejecución de herramienta","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"¿Borrar historial?","tools.clear.history.message":"Esto elimina permanentemente el historial de herramientas del place actual.","tools.clear.statistics.title":"¿Borrar estadísticas?","tools.clear.statistics.message":"Esto restablece permanentemente las estadísticas de herramientas del place actual.","tools.detail.error":"Error","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir a la página anterior del historial de herramientas.","tools.page.next":"Siguiente","tools.page.next.tooltip":"Ir a la página siguiente del historial de herramientas.","tools.empty.history":"Sin entradas de historial","tools.empty.stats":"Sin estadísticas","tools.empty.failures":"Sin fallos","tools.summary.total":"Total","tools.summary.calls":"llamadas","tools.summary.sessions":"Sesiones","settings.license.title":"Licencia","settings.license.title.tooltip":"Estado actual de la licencia y nivel de suscripción.","settings.license.status":"Estado","settings.license.status.tooltip":"Estado actual de activación de la licencia.","settings.license.tier":"Nivel","settings.license.tier.tooltip":"Nivel de suscripción actual para las funciones disponibles del WEPPY Dashboard.","settings.license.key":"Clave","settings.license.key.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.keyValue.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.provider":"Proveedor","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.providerValue.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.active":"Activa","settings.license.active.tooltip":"Estado actual de activación de la licencia.","settings.license.status.activeCancelPending.tooltip":"La cancelación está pendiente, pero el acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.inactive":"Inactiva","settings.license.inactive.tooltip":"Estado actual de activación de la licencia.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado actual de activación de la licencia.","settings.license.unavailable":"Información de licencia no disponible","settings.license.detail.cancelPending":"La cancelación está programada. El acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.reset":"Restablecer licencia","settings.readOnly":"Solo lectura","settings.readOnly.tooltip":"Esta sección muestra valores que no se pueden editar desde el WEPPY Dashboard.","settings.unavailable":"Configuración no disponible","settings.general.title":"Configuración general","settings.general.title.tooltip":"Ajustes calientes que se aplican inmediatamente al cambiarse.","settings.general.liveApply":"Aplicar en vivo","settings.general.liveApply.tooltip":"Los cambios en esta sección se aplican al instante sin un botón de guardar aparte.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nivel de log","settings.general.logLevel.tooltip":"Define cuánto detalle escribe el WEPPY Dashboard en sus registros.","settings.general.localHistory":"Registro de historial","settings.general.localHistory.tooltip":"Guarda el historial local de ejecución de herramientas para las vistas de historial del WEPPY Dashboard.","settings.general.localStatistics":"Recopilación de estadísticas","settings.general.localStatistics.tooltip":"Agrega estadísticas locales de uso para los informes del WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tiempo de espera","settings.general.requestTimeout.tooltip":"Tiempo máximo que el WEPPY Dashboard espera una acción antes de marcarla como fallida.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"El tiempo de espera de la acción se mide en milisegundos.","settings.cold.title":"Entorno del servidor","settings.cold.title.tooltip":"Valores de entorno del servidor de solo lectura cargados al iniciar.","settings.cold.httpPort.tooltip":"Número de puerto usado por el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interfaz de host a la que se enlaza el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.hint":"Configure mediante variables de entorno.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Elige cómo se comporta WEPPY Dashboard cuando se inicia el servidor MCP.","settings.dashboard.nextStartBadge":"Próximo inicio","settings.dashboard.autoOpen.label":"Abrir Dashboard al iniciar WEPPY","settings.dashboard.autoOpen.description":"Abre automáticamente este Dashboard después de iniciar el servidor MCP.","settings.dashboard.autoOpen.nextStart":"Se aplica la próxima vez que se inicie el servidor MCP.","settings.dashboard.settingsFile.label":"Archivo de configuración","settings.dashboard.agentExample.label":"Pídeselo a tu Agent","settings.dashboard.agentExample.prompt":"“Desactiva la apertura automática del Dashboard”.","settings.dashboard.autoOpen.saving":"Guardando…","settings.dashboard.autoOpen.saved":"Guardado para el próximo inicio del servidor.","settings.dashboard.autoOpen.error":"No se pudo guardar. Se restauró la opción anterior.","dashboardAutoOpenGuide.eyebrow":"Preferencia del Dashboard","dashboardAutoOpenGuide.title":"Elige cómo se abre WEPPY Dashboard","dashboardAutoOpenGuide.currentOn":"La apertura automática está activada. Este Dashboard se abre después de iniciar el servidor MCP.","dashboardAutoOpenGuide.currentOff":"La apertura automática está desactivada. WEPPY no abrirá una pestaña nueva del Dashboard al iniciar el servidor MCP.","dashboardAutoOpenGuide.changeAnytime":"Puedes cambiarlo cuando quieras en Settings.","dashboardAutoOpenGuide.agentHint":"También puedes pedirle a tu Agent: “Desactiva la apertura automática del Dashboard”.","dashboardAutoOpenGuide.statusOn":"Apertura automática activada","dashboardAutoOpenGuide.statusOff":"Apertura automática desactivada","dashboardAutoOpenGuide.keep":"Mantener opción actual","dashboardAutoOpenGuide.turnOff":"Desactivar apertura automática","dashboardAutoOpenGuide.openSettings":"Abrir Settings","dashboardAutoOpenGuide.close":"Cerrar guía de apertura automática","dashboardAutoOpenGuide.saving":"Guardando…","dashboardAutoOpenGuide.error":"No se pudo guardar tu elección. Inténtalo de nuevo.","settings.language.title":"Idioma","settings.language.title.tooltip":"Elige cómo se localiza el texto de la interfaz del WEPPY Dashboard.","settings.language.dashboard":"Idioma del WEPPY Dashboard","settings.language.dashboard.tooltip":"Sobrescribe el idioma del WEPPY Dashboard o usa el idioma del sistema cuando está en Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"El servidor MCP no responde. El WEPPY Dashboard intentará reconectarse automáticamente.","overview.l0.step1":"Verifique que el proceso del servidor MCP esté ejecutándose","overview.l0.step2":"Reinicie el comando del servidor MCP si es necesario","overview.l0.reconnecting":"Reconectando automáticamente cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configuración","overview.l1.pluginGuide":"El plugin de Roblox Studio no está conectado","overview.l1.check1":"¿Roblox Studio está abierto?","overview.l1.check2":"¿El WEPPY Plugin está instalado?","overview.l1.feedHint":"Los cambios aparecerán aquí cuando el plugin se conecte","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Estado de ejecución y proceso del servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Estado de conexión y versión del plugin de Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados y su estado actual.","overview.metric.agent.instancesUnit":"instancias","overview.metric.sync":"Sincronización","overview.metric.sync.tooltip":"Actividad actual de sincronización entre Studio y archivos locales.","overview.metric.noAgent":"Sin agente","overview.meta.version":"Versión","overview.meta.version.tooltip":"Versión instalada del servidor MCP.","overview.meta.session":"Sesión","overview.meta.session.tooltip":"Identificador de la sesión MCP actual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de proceso del sistema operativo.","overview.meta.uptime":"Tiempo activo","overview.meta.uptime.tooltip":"Tiempo transcurrido desde que se inició el servidor MCP.","overview.feed.title":"Cambios recientes del juego","overview.feed.empty":"Sin cambios recientes","overview.changelog.title":"Resumen de cambios de sesión","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instancias","overview.changelog.properties":"propiedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nivel","changelog.subtitle":"Historial de cambios del juego","changelog.filter.all":"Todos","changelog.filter.active":"Activo","changelog.filter.completed":"Completado","changelog.empty":"Sin entradas de historial","changelog.basic.limit.title":"La vista previa Basic muestra solo las 3 sesiones más recientes","changelog.basic.limit.body":"Actualiza a Pro para explorar la línea completa del historial de cambios de este place.","changelog.basic.metricLabel":"Historial visible / Total","changelog.basic.visible":"visibles","changelog.basic.total":"total","changelog.card.active":"Activo","changelog.card.active.tooltip":"Esta sesión todavía sigue recibiendo nuevos cambios del juego.","changelog.card.completed":"Completado","changelog.card.completed.tooltip":"Esta sesión terminó y ya no se esperan más cambios.","changelog.card.bootstrapStatus":"Inicializado","changelog.card.bootstrapStatus.tooltip":"Esta sesión solo contiene la instantánea inicial de bootstrap de sincronización.","changelog.card.inProgress":"en progreso","changelog.card.noChanges":"Sin cambios aún","changelog.card.noChanges.tooltip":"Todavía no se han extraído cambios del juego para esta sesión.","changelog.card.bootstrapSummary":"Instantánea de sincronización inicial","changelog.card.bootstrapSummary.tooltip":"Las escrituras de la sincronización inicial de archivos se agrupan en una sola fila de bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Cambios de scripts realizados en esta sesión.","changelog.card.instances":"instancias","changelog.card.instances.tooltip":"Cambios de creación, eliminación, movimiento o clonado de instancias en esta sesión.","changelog.card.modified":"modificado","changelog.card.created":"creado","changelog.card.deleted":"eliminado","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propiedades cambiadas","changelog.card.propertiesChanged.tooltip":"Cambios de valores de propiedades registrados para esta sesión.","changelog.card.lightingConfigured":"Iluminación configurada","changelog.card.lightingConfigured.tooltip":"La iluminación o la atmósfera cambiaron en esta sesión.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Los datos o la configuración del terreno cambiaron en esta sesión.","changelog.card.assetsInserted":"assets insertados","changelog.card.assetsInserted.tooltip":"Assets insertados en el place durante esta sesión.","changelog.category.script":"Scripts","changelog.category.instance":"Instancias","changelog.category.property":"Propiedades","changelog.category.lighting":"Iluminación","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.dialogLabel":"Detalles del registro de cambios","changelog.detail.changeSummary":"Resumen de cambios","changelog.detail.changeSummary.tooltip":"Cantidad de cambios del juego extraídos agrupados por categoría para esta sesión.","changelog.detail.changeTimeline":"Línea de tiempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica de cambios del juego extraídos para esta sesión.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes y después","changelog.detail.filterCategory":"Categoría","changelog.detail.filterCategory.tooltip":"Filtra la línea de tiempo a una sola categoría de cambio.","changelog.detail.confidence.exact":"Exacto","changelog.detail.confidence.exact.tooltip":"Se confirmaron tanto el estado anterior como el posterior para este cambio.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Solo se pudo confirmar parte del estado anterior y posterior para este cambio.","changelog.detail.confidence.afterOnly":"Solo después","changelog.detail.confidence.afterOnly.tooltip":"Solo se pudo confirmar el estado resultante después del cambio.","changelog.detail.confidence.intentOnly":"Solo intención","changelog.detail.confidence.intentOnly.tooltip":"Solo se registró la acción solicitada, no el estado resultante.","changelog.detail.confidence.unknown":"Desconocido","changelog.detail.confidence.unknown.tooltip":"No fue posible clasificar este cambio con confianza usando los datos disponibles.","changelog.detail.noChanges":"Sin cambios en esta categoría","changelog.detail.backToList":"Volver a la lista","changelog.diff.empty":"Sin diferencias disponibles","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Después","sync.overlay.title":"Se requiere el plugin de Roblox Studio","sync.overlay.message":"El estado de sincronización estará disponible cuando el plugin de Roblox Studio se conecte.","sync.overlay.check1":"¿Roblox Studio está abierto?","sync.overlay.check2":"¿El WEPPY Plugin está instalado?","sync.status.title":"Estado de sincronización","sync.status.title.tooltip":"Estado actual de sincronización entre Studio y archivos locales para este place.","sync.status.forwardOnly":"Solo avance","sync.status.forwardOnly.tooltip":"La suscripción Basic solo permite sincronización directa de Studio a local.","sync.status.place":"Place","sync.status.place.tooltip":"Nombre e ID del place de Roblox conectado.","sync.status.path":"Ruta","sync.status.path.tooltip":"Raíz del sistema de archivos local usada actualmente para la sincronización.","sync.status.instances":"Instancias","sync.status.instances.tooltip":"Cantidad total de instancias de Roblox sincronizadas en el espejo local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Cantidad total de scripts sincronizados e indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado de ejecución de sincronización reportado por el servidor.","sync.policy.title":"Política de Sync","sync.policy.title.tooltip":"Política de Sync efectiva informada por el plugin de Studio conectado.","sync.policy.activation":"Activación","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Flujo de trabajo","sync.policy.preset.studio_first":"Studio primero","sync.policy.preset.bidirectional_review":"Bidireccional","sync.policy.preset.local_code_studio_world":"Código local, mundo en Studio","sync.policy.preset.custom":"Personalizado","sync.policy.apply.title":"Cómo se aplican a Studio los cambios locales","sync.policy.apply.description":"Muestra si los cambios locales se revisan primero o se aplican automáticamente a Studio.","sync.policy.apply.content":"Cambios de contenido","sync.policy.apply.content.tooltip":"Cambios locales en código Script, propiedades y propiedades de servicios. Crear, eliminar, renombrar y mover son cambios de estructura.","sync.policy.apply.structure":"Cambios de estructura","sync.policy.apply.structure.tooltip":"Creación, eliminación, renombrado y movimiento locales de instancias. La eliminación local automática también requiere la opción de borrado separada de abajo.","sync.policy.apply.manual":"Revisar primero","sync.policy.apply.auto":"Aplicación automática","sync.policy.scope.disclosure":"Direcciones por ámbito","sync.policy.scope.scriptSource":"Código de scripts","sync.policy.scope.properties":"Propiedades","sync.policy.scope.structure":"Estructura","sync.policy.scope.serviceProperties":"Propiedades de servicios","sync.policy.endpoint.local":"Local","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Local","sync.policy.direction.forward.tooltip":"Los cambios de Studio se escriben en los archivos locales.","sync.policy.direction.reverse":"Local → Studio","sync.policy.direction.reverse.tooltip":"Los cambios de archivos locales se aplican en Studio.","sync.policy.direction.bidirectional":"Ambas direcciones","sync.policy.direction.bidirectional.tooltip":"Los cambios pueden pasar de Studio a los archivos locales y de los archivos locales a Studio.","sync.policy.safety.localDeletes":"Eliminación local → eliminar instancia de Studio","sync.policy.safety.review":"Revisar antes de borrar","sync.policy.safety.review.tooltip":"Los borrados de archivos locales esperan revisión antes de eliminar las instancias correspondientes de Studio. Es independiente de la limpieza automática de UI Studio.","sync.policy.safety.auto":"Borrado automático en Studio","sync.policy.safety.auto.tooltip":"Borrar archivos locales puede eliminar automáticamente las instancias correspondientes de Studio. Es independiente de la limpieza automática de UI Studio.","sync.policy.reviewRequired":"Revisa esta política en el plugin de Studio antes de iniciar Sync.","sync.log.title":"Registro de sincronización","sync.log.empty":"Sin eventos de sincronización","sync.log.type.write":"ESCRIBIR","sync.log.type.write.tooltip":"Se escribió una nueva salida sincronizada en el disco.","sync.log.type.update":"ACTUALIZAR","sync.log.type.update.tooltip":"Se actualizó un archivo o una instancia ya sincronizada.","sync.log.type.delete":"ELIMINAR","sync.log.type.delete.tooltip":"Se eliminó un archivo o una instancia sincronizada.","sync.log.type.idle":"INACTIVO","sync.log.type.idle.tooltip":"Se registró un evento de sincronización sin modificar archivos.","sync.upgrade.title":"Explora la sincronización completa con Pro","sync.upgrade.benefit1":"Sincronización bidireccional — edita archivos, se aplica automáticamente a Studio","sync.upgrade.benefit2":"Sincronización inversa — envía cambios de archivos a Studio","sync.upgrade.benefit3":"Historial completo de sincronización y registro detallado de cambios","sync.upgrade.buy":"Ver Pro","playtest.status.title":"Estado de prueba","playtest.status.title.tooltip":"Estado actual de la sesión de playtest de Roblox informado por Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicio de playtest de Studio usado por la sesión actual.","playtest.status.mode.value.tooltip":"Modo específico de playtest de Roblox Studio que se está usando ahora.","playtest.status.mode.play":"Jugar","playtest.status.mode.run":"Ejecutar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place de Roblox asociado actualmente con esta sesión de playtest.","playtest.status.state.running":"En ejecución","playtest.status.state.running.tooltip":"Actualmente hay una sesión de playtest de Roblox en ejecución.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"La sesión actual de playtest de Roblox está en pausa.","playtest.status.state.notRunning":"Sin ejecutar","playtest.status.state.notRunning.tooltip":"Actualmente no hay ninguna sesión de playtest de Roblox en ejecución.","playtest.control.play":"Jugar","playtest.control.pause":"Pausar","playtest.control.resume":"Reanudar","playtest.control.stop":"Detener","playtest.history.title":"Historial de pruebas","playtest.history.title.tooltip":"Ejecuciones automatizadas de playtest registradas para este proyecto.","playtest.history.empty":"Sin resultados de prueba","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado en esta ejecución de prueba registrada.","playtest.history.status.passed":"Aprobado","playtest.history.status.failed":"Fallido","playtest.history.status.running":"En ejecución","playtest.history.status.unknown":"Desconocido","playtest.history.status.tooltip":"Estado de resultado registrado para esta ejecución automatizada de playtest.","playtest.empty.title":"Sin resultados de prueba aún","playtest.empty.message":"Los resultados aparecerán aquí después de que el agente de IA ejecute un Playtest.","playtest.empty.message.before":"Los resultados aparecerán aquí después de que el agente de IA ejecute un Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Reporte seleccionado","playtest.report.title.tooltip":"Salida detallada de la ejecución automatizada de playtest seleccionada actualmente.","playtest.detail.dialogLabel":"Detalle del informe de playtest","playtest.detail.loading":"Cargando informe...","playtest.detail.errorTitle":"Informe no disponible","playtest.report.content":"Reporte","playtest.report.content.tooltip":"Resumen en Markdown de la ejecución automatizada de playtest seleccionada.","playtest.report.logs":"Registros","playtest.report.logs.tooltip":"Registros de ejecución capturados para la ejecución automatizada de playtest seleccionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sin contenido de reporte","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest es una función exclusiva de Pro","playtest.basic.desc":"Controla las pruebas desde el WEPPY Dashboard, ejecuta pruebas automatizadas y visualiza reportes detallados.","playtest.basic.benefit1":"Controles de jugar/pausar/detener con un clic","playtest.basic.benefit2":"Ejecución de pruebas automatizadas vía agente IA","playtest.basic.benefit3":"Historial de pruebas con seguimiento de éxito/fallo","playtest.basic.benefit4":"Reportes de prueba detallados en markdown","playtest.sample.badge":"Vista previa de la pantalla Pro de playtest","playtest.sample.title":"Estás viendo una vista previa de la pantalla de playtest disponible después de actualizar a Pro.","playtest.sample.message":"Esta vista previa usa datos de ejemplo. El control de playtest en vivo, la gestión del historial y los reportes reales se desbloquean con Pro.","playtest.sample.clearDisabled":"Actualiza a Pro para borrar el historial real de playtest.","playtest.sample.place":"Vista previa de Arena","playtest.sample.history.name":"Prueba de humo de Arena de ejemplo","playtest.sample.context.why":"Entrar a la arena, sobrevivir a la apertura y verificar que el HUD responda de inmediato.","playtest.sample.context.expected":"El jugador aparece de forma segura, la cuenta regresiva del HUD aparece en un segundo y la primera ola inicia sin errores.","playtest.sample.context.observed":"La protección de aparición funcionó, el HUD se actualizó a tiempo y la primera ola terminó sin regresiones.","playtest.sample.report.markdown":`# Prueba de humo de Arena de ejemplo
|
|
90
|
-
|
|
91
|
-
- Flujo de aparición: PASS
|
|
92
|
-
- Cuenta regresiva del HUD: PASS
|
|
93
|
-
- Inicio de la ola: PASS
|
|
94
|
-
|
|
95
|
-
Esta es una vista de muestra. Actualiza a Pro para ejecutar playtests reales y guardar reportes reales.`,"playtest.sample.report.logs":`[sample] iniciar vista previa de playtest
|
|
96
|
-
[sample] protección de aparición activa
|
|
97
|
-
[sample] cuenta regresiva del hud renderizada
|
|
98
|
-
[sample] primera ola completada
|
|
99
|
-
[sample] reporte de muestra finalizado`,"sidebar.whatsNew":"Novedades","sidebar.help.group":"Ayuda y comentarios","sidebar.help.bug":"Reportar un error","sidebar.help.bug.tooltip":"Crear un paquete de diagnostico local y abrir un reporte de error precargado en GitHub","bugReportDialog.title":"diagnostics.zip puede ayudarnos a investigar","bugReportDialog.subtitle":"WEPPY creó un zip de diagnóstico en este equipo. Incluye registros de Studio, plugin, Sync y herramientas que pueden ayudarnos a entender qué pasó.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Puedes enviar el reporte sin este archivo, pero adjuntarlo suele ayudarnos a encontrar la causa más rápido.","bugReportDialog.attachHow":"Para adjuntarlo, descarga o muestra el zip y luego añádelo al campo Diagnostics ZIP (optional) del issue de GitHub antes de enviarlo.","bugReportDialog.download":"1. Descargar diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Abrir issue de GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"El zip puede contener registros locales y contexto del proyecto. Revísalo antes de adjuntarlo si quieres compartirlo.","sidebar.help.feature":"Proponer una función","sidebar.help.feature.tooltip":"Proponer una nueva función o mejora en GitHub","sidebar.help.discussions":"Ayuda de instalación y uso","sidebar.help.discussions.tooltip":"Pedir ayuda de instalación o uso en GitHub Issues","sidebar.help.troubleshooting":"Guía de solución de problemas","sidebar.help.troubleshooting.tooltip":"Abrir la guía oficial de solución de problemas en weppyai.com","header.whatsNew":"Novedades","header.whatsNew.tooltip":"Novedades","upgrade.title":"Ver Pro","upgrade.tagline":"Consulta las funciones Pro","upgrade.cta":"Ver Pro","upgrade.licenseShortcut":"Ingresar licencia","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novedades","whatsNew.pageSubtitle":"Mantente al día con los cambios de MCP","whatsNew.unreadSection":"Sin leer","whatsNew.allSection":"Todos los anuncios","whatsNew.empty":"Aún no hay anuncios","whatsNew.newBadge":"NUEVO","whatsNew.importantBadge":"IMPORTANTE","whatsNew.category.release":"Versión","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Obsoleto","whatsNew.category.tip":"Consejo","uiStudio.title":"UI Studio","uiStudio.empty":"Aún no hay capturas guardadas. Se crean automáticamente cuando un agente de IA captura el estado actual de la UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"El plugin de Roblox Studio no está conectado","uiStudio.pluginGuide.message":"UI Studio muestra capturas e historial de cambios del place de Studio conectado. Se actualizará automáticamente cuando Studio y WEPPY Plugin se conecten.","uiStudio.pluginGuide.check1":"¿Roblox Studio está abierto?","uiStudio.pluginGuide.check2":"¿WEPPY Plugin está instalado y en ejecución?","uiStudio.pluginGuide.waiting":"Esperando la conexión del plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primero","uiStudio.priorityLow":"Mejora opcional","uiStudio.highPrioritySection":"Revisar primero","uiStudio.lowPrioritySection":"Mejoras opcionales","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análisis","uiStudio.tabs.history":"Historial","uiStudio.analysis.reportsTitle":"Último análisis por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recientes","uiStudio.analysis.detailDialog":"Detalle del análisis","uiStudio.analysis.targetCountLabel":"Destinos analizados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugerencias de mejora","uiStudio.analysis.verdict.needsFix":"Sugerencias de mejora","uiStudio.analysis.verdict.review":"Sugerencias de mejora","uiStudio.analysis.verdict.passed":"Sin sugerencias actuales","uiStudio.analysis.verdictLabel":"Resumen de mejoras","uiStudio.analysis.coverage.structuralOnly":"Solo se completaron las comprobaciones estructurales","uiStudio.analysis.coverage.visualSkipped":"Comprobaciones estructurales completas · Revisión visual omitida","uiStudio.analysis.coverage.visualFailed":"Comprobaciones estructurales completas · Falló la revisión visual","uiStudio.analysis.coverage.full":"Comprobaciones estructurales y visuales completas","uiStudio.analysis.coverage.deterministicFailed":"Fallaron las comprobaciones estructurales","uiStudio.analysis.thresholds":"Base de revisión","uiStudio.analysis.issueSummary.passed":"No hay sugerencias adicionales con la base de revisión actual.","uiStudio.history.title":"Historial de cambios","uiStudio.history.empty":"Aún no hay historial. Cuando un agente de IA modifique la UI con manage_ui, se registrará automáticamente.","uiStudio.history.loading":"Cargando...","uiStudio.history.loadingPlace":"Cargando place actual...","uiStudio.history.noPlace":"Aún no hay datos del place actual. Conecta WEPPY Plugin y sincroniza un place para ver el historial de cambios de UI.","uiStudio.history.noPlaceAction":"El place actual aún no está disponible.","uiStudio.history.error":"Error","uiStudio.history.clear":"Borrar todo","uiStudio.history.filter.actions":"Tipo de acción","uiStudio.history.filter.actionAll":"Todo","uiStudio.history.filter.actionCreate":"Crear","uiStudio.history.filter.actionUpdate":"Actualizar","uiStudio.history.filter.actionDelete":"Eliminar","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Todo","uiStudio.history.filter.today":"Hoy","uiStudio.history.filter.yesterday":"Ayer","uiStudio.history.filter.last7Days":"Últimos 7 días","uiStudio.history.filter.last30Days":"Últimos 30 días","uiStudio.history.filter.customRange":"Rango personalizado","uiStudio.history.filter.reset":"Restablecer","uiStudio.history.filter.from":"Desde","uiStudio.history.filter.to":"Hasta","uiStudio.history.row.affectedPaths":"Rutas","uiStudio.history.row.mutations":"Detalles de cambios","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Contraer","uiStudio.history.row.expandDetails":"Mostrar {n} cambios","uiStudio.history.row.collapseDetails":"Ocultar cambios","uiStudio.history.row.toggleDetails":"Alternar detalles de cambios","uiStudio.history.row.mutationsEmpty":"Sin detalles de cambios","uiStudio.history.row.toolLabel":"Cambios de UI ({n})","uiStudio.history.row.compare":"Antes / Después","uiStudio.history.row.noBeforeState":"Sin estado anterior","uiStudio.history.row.noAfterState":"Sin estado posterior","uiStudio.history.row.qualityPlan":"Dirección de diseño","uiStudio.history.row.designCheck":"Sugerencias","uiStudio.history.row.designCheckUnavailable":"Sugerencias: no disponibles","uiStudio.history.row.designCheckNone":"Sugerencias: ninguna","uiStudio.history.selection.deleteSelected":"Eliminar seleccionados","uiStudio.history.selection.selectAll":"Seleccionar todo","uiStudio.history.selection.clearSelection":"Limpiar selección","uiStudio.history.confirm.deleteRequestsTitle":"Eliminar registros de cambios","uiStudio.history.confirm.deleteRequestsMessage":"Los registros de cambios seleccionados se eliminarán. Esta acción no se puede deshacer.","uiStudio.history.confirm.clearRequestsTitle":"Borrar historial de cambios","uiStudio.history.confirm.clearRequestsMessage":"Esto borra el historial de cambios del place actual. Las instancias de Studio no se ven afectadas.","uiStudio.history.confirm.cascadeOption":"También eliminar capturas vinculadas","uiStudio.history.drawer.close":"Cerrar","uiStudio.actions.previewAgain":"Vista previa de nuevo","uiStudio.actions.deleteSnapshot":"Eliminar esta captura","uiStudio.actions.proRequired":"Disponible tras actualizar a Pro","uiStudio.actions.captureCurrentState":"Capturar estado actual","uiStudio.actions.checkSuggestionsAgain":"Volver a revisar sugerencias","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"El ID del nuevo archivo de captura aparecerá al finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura completada, revisa el guardado","uiStudio.actions.previewSaved":"Nueva captura de pantalla guardada","uiStudio.actions.previewComplete":"Captura completada","uiStudio.actions.previewSavedDetail":"Las capturas existentes se mantienen; esta se guardó como un archivo nuevo.","uiStudio.actions.previewSavedPathMissing":"Se recibió un nuevo ID de captura, pero no se pudo confirmar la ruta del archivo guardado.","uiStudio.actions.previewSnapshotIdMissing":"No se pudo confirmar el nuevo ID de captura. Actualiza la lista para verificar si se guardó.","uiStudio.actions.more":"Más","uiStudio.gallery.selection.selectedCount":" seleccionados","uiStudio.confirm.deleteSnapshotTitle":"Eliminar captura","uiStudio.confirm.deleteSnapshotMessage":"Solo se eliminará este archivo de captura (la instancia de Studio se conserva).","uiStudio.confirm.deleteBatchTitle":"Eliminar capturas seleccionadas","uiStudio.confirm.deleteBatchMessage":"Se eliminarán las capturas seleccionadas. Esta acción no se puede deshacer.","uiStudio.gallery.selectMode":"Seleccionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Seleccionar todo","uiStudio.gallery.clearSelection":"Deseleccionar","uiStudio.gallery.deleteSelected":"Eliminar selección","common.save":"Guardar","common.cancel":"Cancelar","common.delete":"Eliminar","uiStudio.storage.title":"Datos guardados de UI Studio","uiStudio.storage.usageLabel":"En uso","uiStudio.storage.historyBytes":"Historial","uiStudio.storage.snapshotBytes":"Capturas de pantalla","uiStudio.storage.requestCount":"Registros de cambios","uiStudio.storage.mutationCount":"Detalles de cambios","uiStudio.storage.snapshotCount":"Capturas de pantalla","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpieza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Errores","uiStudio.storage.loading":"Cargando...","uiStudio.cleanup.policy.title":"Política de eliminación automática","uiStudio.cleanup.policy.modeOff":"Desactivado","uiStudio.cleanup.policy.modeAge":"Por antigüedad","uiStudio.cleanup.policy.modeSize":"Por tamaño","uiStudio.cleanup.policy.cascade":"También eliminar capturas vinculadas","uiStudio.cleanup.policy.save":"Guardar política","uiStudio.cleanup.policy.runNow":"Ejecutar política guardada","uiStudio.cleanup.policy.proRequired":"Disponible después de actualizar a Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Al aplicar esta política se eliminarán inmediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de cambios","uiStudio.cleanup.policy.confirm.snapshots":" capturas","uiStudio.cleanup.policy.confirm.freed":"liberado — ¿Aplicar?","uiStudio.cleanup.keepLastNDays":"Conservar últimos {n} días","uiStudio.cleanup.selectedDelete":"Eliminar selección…","uiStudio.cleanup.deleteAll":"Eliminar todo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpieza","uiStudio.cleanup.cleanupConfirmMessage":"Los elementos seleccionados serán eliminados. Esta acción no se puede deshacer.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpieza manual","uiStudio.cleanup.studioPreservedNote":"Esta acción elimina únicamente los archivos de historial y capturas en disco; las instancias de Roblox Studio no se ven afectadas.","uiStudio.history.sample.bannerBadge":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerTitle":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerMessage":"Esta vista previa usa datos de ejemplo. El historial real de registros de cambios, la comparación antes/después y la eliminación masiva se desbloquean con Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Actualiza a Pro para desbloquear el historial completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Ejecutar política guardada","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Vaciar todo","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Borrado correctamente","toast.clearFailed":"No se pudo borrar los datos","common.clear":"Borrar","settings.license.activate":"Activar licencia","settings.license.refresh":"Actualizar licencia","settings.license.keyInput":"Clave de licencia","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconéctese al servidor MCP para gestionar la licencia desde WEPPY Dashboard.","settings.license.live.tooltip":"Las acciones de licencia se envían inmediatamente al servidor MCP.","settings.license.status.activationRequired":"Activación requerida","settings.license.status.activationRequired.tooltip":"Se requiere activación manual de la licencia antes de que WEPPY Dashboard pueda actualizar este estado.","settings.license.status.grace":"Período de gracia","settings.license.status.grace.tooltip":"La verificación del proveedor no está disponible temporalmente, pero el acceso Pro permanece activo durante el período de gracia.","settings.license.status.graceBilling.tooltip":"El acceso Pro sigue disponible durante un período de gracia relacionado con la facturación.","settings.license.detail.graceBilling":"El acceso Pro sigue disponible durante el período de gracia de facturación.","settings.license.detail.graceProviderUnavailable":"Proveedor no disponible. El acceso Pro sigue activo en modo de gracia.","settings.license.detail.manualActivation":"Se requiere activación manual para restaurar el acceso Pro.","settings.license.detail.missingSessionToken":"La actualización está bloqueada porque falta el token de sesión actual.","settings.license.detail.refreshRecommended":"Pronto se debe actualizar la verificación de licencia.","connection.agents.kill":"Terminar","connection.agents.kill.title":"¿Terminar el agente?","connection.agents.killed":"Agente terminado","connection.agents.killFailed":"No se pudo terminar el agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Llamada de herramienta más reciente ejecutada por este agente.","connection.agents.lastSeen":"Visto por última vez","connection.agents.lastSeen.tooltip":"Heartbeat o actividad más reciente de este agente.","connection.clear.title":"¿Borrar el registro de conexión?","connection.clear.message":"Esto elimina permanentemente el registro de conexión almacenado del proyecto actual.","sync.clear.title":"¿Borrar el registro de sincronización?","sync.clear.message":"Esto elimina permanentemente el registro de sincronización almacenado del place actual.","playtest.clear.title":"¿Borrar el historial de pruebas?","playtest.clear.message":"Esto elimina permanentemente los informes de playtest almacenados del place actual.","changelog.clear.title":"¿Borrar el changelog?","changelog.clear.message":"Esto elimina permanentemente el changelog almacenado del place actual.","sync.status.placePath":"Ruta del place","sync.status.placePath.tooltip":"Directorio del place activo donde se sincronizan los archivos del explorador.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificación","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Dirección de diseño del brief usada para este cambio.","uiStudio.history.row.designCheck.tooltip":"Resumen de sugerencias de Design Check después del cambio.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Ejecuta ahora una vez la regla de limpieza guardada, sin esperar a la siguiente ejecución programada.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Ver funciones Pro y opciones de compra.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.manageStorage":"Gestionar almacenamiento","settings.dataHistory.manageStorage.tooltip":"Muestra u oculta la política de almacenamiento y los controles de limpieza.","settings.dataHistory.manageStorage.projectChanges.aria":"Gestionar el almacenamiento del resumen de cambios del proyecto","settings.dataHistory.manageStorage.uiStudio.aria":"Gestionar el almacenamiento del historial y las capturas de UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugerencias de Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Revisar de nuevo","uiStudio.actions.designCheckRunning":"Revisando sugerencias...","uiStudio.actions.designCheckRunningDetail":"Al finalizar se mostrarán los elementos para revisar primero, recomendados y opcionales.","uiStudio.actions.designCheckComplete":"Revisión de sugerencias completada","uiStudio.actions.designCheckNoSnapshotSaved":"Esta acción no guarda un nuevo archivo de captura.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugerencias para revisar primero. Haz clic para ver detalles.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugerencias recomendadas.","uiStudio.priorityMedium":"Revisión recomendada","uiStudio.mediumPrioritySection":"Revisión recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de mejoras opcionales.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Error","uiStudio.analysis.expandChildren":"Mostrar objetivos secundarios","uiStudio.analysis.openDetail":"Abrir detalle","uiStudio.analysis.childTargets":"Objetivos secundarios","uiStudio.analysis.childDetailHint":"Abrir detalle del objetivo secundario","uiStudio.compare.before":"Antes","uiStudio.compare.after":"Después","uiStudio.history.drawer.changeDetails":"Detalles del cambio","uiStudio.gallery.cardCheckbox":"Seleccionar captura","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Todos los ámbitos","assets.explorer.label":"Explorador de recursos","assets.breadcrumb.label":"Ruta del recurso","assets.explorer.summary":"{direct} en esta carpeta · {descendant} en subcarpetas","assets.folder.count.one":"1 recurso","assets.folder.count.many":"{count} recursos","assets.folder.type":"Carpeta","assets.folders.title":"Carpetas","assets.folder.assetsTitle":"Recursos en esta carpeta","assets.organization.label":"Explorar","assets.organization.folders":"Carpetas","assets.organization.all":"Todos los recursos","assets.organization.summary":"{count} recursos","assets.view.options":"Opciones de vista","assets.view.mode":"Modo de vista","assets.view.grid":"Cuadrícula","assets.view.list":"Lista","assets.view.thumbnailSize":"Tamaño de miniatura","assets.view.thumbnailSize.listReason":"El tamaño de miniatura está disponible en la vista de cuadrícula.","assets.view.size.small":"Pequeño","assets.view.size.medium":"Mediano","assets.view.size.large":"Grande","assets.list.name":"Nombre","assets.list.type":"Tipo","assets.list.scope":"Ámbito","assets.list.status":"Estado","assets.list.updated":"Actualizado","assets.loading.scope":"Cargando recursos de {scope}...","assets.partial.title":"No se pudieron cargar algunas ubicaciones","assets.empty.folderTitle":"No hay recursos coincidentes en esta carpeta","assets.empty.folderBody":"Prueba otra carpeta o filtro de categoría.","assets.empty.filteredTitle":"Ningún recurso coincide con este filtro","assets.empty.filteredBody":"Elige otra categoría o vuelve a analizar las carpetas correspondientes.","assets.place.selector":"Asset place","assets.place.context":"Contexto del lugar del recurso","assets.place.sharedLibrary":"Biblioteca compartida","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Cómo funciona","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Consulta el WEPPY Bridge compartido, el MCP Adapter de cada agente de IA, los destinos de Studio y el registro de conexiones.","dashboardHelp.connection.needs.1":"WEPPY Bridge debe estar accesible. Los destinos de Studio aparecen cuando WEPPY Plugin envía señales de actividad.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Revisa la evidencia estructurada de Playtest para los resultados de interfaz, entrada y servidor guardados por el AI Agent.","dashboardHelp.playtest.needs.1":"Pro muestra informes reales guardados. Basic muestra una muestra. La evidencia de captura de pantalla de Play no está disponible, pero la evidencia semántica de interfaz e interacción sí. Para identificar con precisión el Place activo, WEPPY Plugin debe estar conectado.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Cerrar","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Si falta un destino de Studio, abre Roblox Studio y ejecuta WEPPY Plugin. Si falta un agente de IA o MCP Adapter, vuelve a conectar WEPPY MCP Server desde tu herramienta de IA.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Consulta el estado de WEPPY Bridge, MCP Adapter, Studio Plugin y el registro de conexiones.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Enrutamiento de Studio","controls.studioRouting.title.tooltip":"Prioridad para solicitudes MCP que no indican un Studio.","controls.studioRouting.settingLabel":"Solicitudes sin un Studio indicado","controls.studioRouting.mode.auto":"Automático","controls.studioRouting.mode.pinned":"Studio fijo","controls.studioRouting.state.auto":"Estado: automático","controls.studioRouting.state.pinned":"Estado: Studio fijo","controls.studioRouting.saving":"Aplicando…","controls.studioRouting.applied":"Aplicado","controls.studioRouting.failed":"No se pudo aplicar","controls.studioRouting.pinnedUnavailable":"Conecta un Studio para usar el modo Studio fijo.","controls.studioRouting.helpLabel":"Cómo funciona el enrutamiento de Studio","controls.studioRouting.helpButton":"¿Cómo funciona?","controls.studioRouting.selectTarget":"Seleccionar Studio fijo","controls.studioRouting.select":"Seleccionar","controls.studioRouting.targetGroupLabel":"Destino de Studio fijo","controls.luauValidation.title":"Comprobación de sintaxis Luau","controls.luauValidation.settingLabel":"Comprobar automáticamente tras editar Scripts","controls.luauValidation.benefit":"Después de que la IA edite un Script, comprueba si hay errores de sintaxis Luau.","controls.luauValidation.state.on":"Estado: activada","controls.luauValidation.state.off":"Estado: desactivada","controls.luauValidation.priority":"Si una solicitud de la IA no coincide con esta opción, se usa la configuración del Dashboard. Actívala o desactívala aquí para cambiar cómo se comprueban las ediciones.","controls.luauValidation.switchLabel":"Comprobación automática después de editar Scripts","controls.luauValidation.saving":"Guardando…","controls.luauValidation.applied":"Aplicado","controls.luauValidation.failed":"No se pudo aplicar","controls.luauValidation.helpLabel":"Cómo funciona la comprobación automática de sintaxis Luau","controls.luauValidation.helpButton":"¿Cómo funciona?","controls.luauValidation.help.behavior":"Al activarla, después de que la IA reemplace, edite, inserte o elimine líneas, WEPPY comprueba todo el código que se guardó realmente. Al desactivarla, solo se edita el Script y no se realiza la comprobación automática.","controls.luauValidation.help.response":"Si el Script está correcto, conserva la respuesta breve habitual. WEPPY solo muestra detalles cuando encuentra un error o no puede completar la comprobación. Los Scripts grandes pueden tardar un poco más.","controls.luauValidation.help.nonBlocking":"Si WEPPY encuentra un error de sintaxis o no puede completar la comprobación, no deshace los cambios guardados en el Script. El resultado ayuda a la IA a corregir el mismo Script enseguida.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Hay varias ventanas de Studio conectadas con el mismo Place ID. Usa el Studio ID para indicar ese lugar.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Las solicitudes con Studio ID, Connection ID o Place ID omiten esta prioridad y se envían al Studio indicado.","controls.studioRouting.state.currentTarget":"Destino prioritario actual","controls.studioRouting.noPriorityTarget":"No hay ningún Studio conectado","controls.studioRouting.help.auto":"Automático usa el Studio activo con mayor prioridad según los comandos recientes y el orden de conexión.","controls.studioRouting.help.pinned":"Studio fijo usa el Studio seleccionado cuando la solicitud no indica un identificador de destino.","sync.migration.title":"Hay una actualización del formato de Sync","sync.migration.description":"Revisa los cambios de metadatos antes de actualizar este Place del formato Sync v2 a v3.","sync.migration.status.ready":"Listo para revisar","sync.migration.status.blocked":"Bloqueado","sync.migration.preview":"Revisar cambios","sync.migration.summary.add":"Añadir","sync.migration.summary.modify":"Modificar","sync.migration.summary.delete":"Eliminar","sync.migration.summary.blocked":"Bloqueado","sync.migration.changes":"Cambios de metadatos","sync.migration.blockers":"Elementos por resolver","sync.migration.operation.add":"añadir","sync.migration.operation.modify":"modificar","sync.migration.operation.delete":"eliminar","sync.migration.reason.serializer_regeneration":"Vuelve a escribir los metadatos en el formato estándar v3.","sync.migration.reason.volatile_metadata_removal":"Elimina metadatos temporales de Sync.","sync.migration.reason.redundant_empty_metadata":"Elimina metadatos vacíos redundantes.","sync.migration.reason.runtime_ignore_policy":"Actualiza la política administrada de exclusión del entorno.","sync.migration.reason.reverse_pending":"Aplica o descarta primero los cambios locales pendientes hacia Studio.","sync.migration.reason.conflict":"Resuelve primero el conflicto entre los archivos locales y Studio.","sync.migration.reason.local_canonical_change":"Revisa primero los metadatos estándar modificados localmente.","sync.migration.reason.source_mutation_detected":"Un archivo fuente del usuario cambió durante la validación.","sync.migration.blocked":"Resuelve los conflictos de Sync antes de actualizar","sync.migration.stale":"La vista previa cambió. Revisa la diferencia más reciente.","sync.migration.error":"No se pudo actualizar el formato de Sync. Inténtalo de nuevo.","sync.migration.refresh":"Actualizar vista previa","sync.migration.refreshing":"Actualizando…","sync.migration.applying":"Aplicando…","sync.migration.apply":"Aplicar actualización","sync.migration.confirm.title":"¿Aplicar la actualización del formato de Sync?","sync.migration.confirm.message":"Se hará una copia de seguridad y se actualizarán los metadatos de Sync indicados. Los archivos fuente Luau no cambiarán.","changelog.ownership.showGenerated":"Mostrar metadatos generados","changelog.ownership.userSource":"Fuente del usuario","changelog.ownership.canonicalMirror":"Metadatos del espejo","changelog.ownership.generated":"Generado","uiStudio.analysis.verdict.incomplete":"Faltan evidencias de revisión","uiStudio.analysis.issueSummary.incomplete":"No hay sugerencias, pero aún faltan las revisiones de interacción y adaptación.","uiStudio.analysis.coverageDimensions":"Cobertura de revisión","uiStudio.analysis.coverageStatus.completed":"Completada","uiStudio.analysis.coverageStatus.failed":"Fallida","uiStudio.analysis.coverageStatus.skipped":"Omitida","uiStudio.history.row.readinessIncomplete":"Preparación: faltan evidencias","uiStudio.noSuggestionsIncomplete":"No hay sugerencias, pero aún falta parte de la revisión.","uiStudio.readiness.summary":"Preparación de la UI","uiStudio.primaryVisual.label":"Vista principal","uiStudio.primaryVisual.recompose":"Recomponer","uiStudio.primaryVisual.refine":"Refinar","uiStudio.primaryVisual.approved":"Aprobada","uiStudio.primaryVisual.unknown":"Desconocida","uiStudio.functional.label":"Funcional","uiStudio.functional.safe":"Segura","uiStudio.functional.risk":"Riesgo detectado","uiStudio.functional.unknown":"Desconocido","uiStudio.functional.safeCompact":"Funcionalmente segura","uiStudio.functional.riskCompact":"Riesgo funcional","uiStudio.functional.unknownCompact":"Función desconocida","uiStudio.responsive.label":"Adaptación","uiStudio.responsive.recommended":"Recomendada","uiStudio.responsive.required":"Obligatoria","uiStudio.responsive.unknown":"Desconocida","uiStudio.responsive.recommendedCompact":"Adaptación recomendada","uiStudio.responsive.requiredCompact":"Adaptación obligatoria","uiStudio.responsive.unknownCompact":"Adaptación desconocida","uiStudio.readiness.ready":"Lista","uiStudio.readiness.reviewRequired":"Requiere revisión","uiStudio.readiness.insufficient":"Faltan evidencias","uiStudio.readiness.unknown":"Preparación desconocida","uiStudio.criticSummary":"Resumen de la revisión","playtest.history.kind.structured":"Estructurado","playtest.history.kind.legacy":"Heredado","playtest.history.kind.attention":"Requiere atención","playtest.summary.title":"Resumen de ejecución","playtest.summary.status":"Estado","playtest.summary.mode":"Modo","playtest.summary.duration":"Duración","playtest.summary.cleanup":"Limpieza","playtest.dimension.title":"Dimensiones de evidencia","playtest.dimension.hint":"La evidencia obligatoria aparece marcada.","playtest.dimension.server":"Servidor","playtest.dimension.clientUi":"UI del cliente","playtest.dimension.interaction":"Interacción","playtest.dimension.visual":"Visual","playtest.dimension.required":"Obligatoria","playtest.dimension.optional":"Opcional","playtest.dimension.steps":"Pasos","playtest.steps.title":"Cronología de pasos","playtest.steps.expected":"Esperado","playtest.steps.observed":"Observado","playtest.steps.evidence":"Evidencia","playtest.steps.server":"Servidor","playtest.steps.details":"detalles","playtest.capability.title":"Capacidades y límites","playtest.capability.semanticUi":"Captura semántica de UI","playtest.capability.virtualInput":"Entrada virtual","playtest.capability.fixedBootstrap":"Inicio fijo del Agent","playtest.capability.projectAdapter":"Adaptador de prueba del proyecto","playtest.capability.available":"Disponible","playtest.capability.unavailable":"No disponible","playtest.limitations.title":"Limitaciones","playtest.artifacts.title":"Archivos","playtest.result.status.passed":"Aprobado","playtest.result.status.failed":"Fallido","playtest.result.status.timedOut":"Tiempo agotado","playtest.result.status.cancelled":"Cancelado","playtest.result.status.insufficientEvidence":"Evidencia insuficiente","playtest.result.status.unavailable":"No disponible","playtest.result.status.skipped":"Omitido","playtest.result.status.notRequested":"No solicitado","playtest.result.status.unknown":"Desconocido","playtest.record.incomplete":"El resultado estructurado está incompleto","playtest.record.corrupt":"El resultado estructurado está dañado","playtest.record.unsupported":"La versión del resultado estructurado no es compatible","playtest.record.unavailable":"Los detalles del resultado no están disponibles.","playtest.sample.terminal":"Toda la evidencia obligatoria fue aprobada","playtest.sample.limit.visual":"La captura de pantalla de Play no está disponible en la sesión estructurada v1","playtest.history.agents":"Agents","playtest.history.agentCounts":"Servidor {server} · Cliente {client}","playtest.agents.title":"Agents de prueba","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Evidencia visual no disponible — Las capturas de Play no son compatibles con la sesión estructurada v1.","playtest.limitations.virtualInputUnavailable":"La entrada virtual no está disponible para esta sesión.","playtest.limitations.visualUnsupportedReason":"Las capturas de Play no son compatibles con la sesión estructurada v1.","playtest.dimension.reason.missing":"Falta evidencia obligatoria.","playtest.dimension.reason.capability":"La capacidad obligatoria no está disponible.","playtest.artifacts.metadata":"Metadatos del resultado"},Gy={"sidebar.overview":"Visão Geral","sidebar.changelog":"Histórico","sidebar.connection":"Conexão","sidebar.sync":"Sincronização","sidebar.playtest":"Teste","sidebar.tools":"Ferramentas","sidebar.settings":"Configurações","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"É necessária conexão com o servidor MCP.","sidebar.gate.l2":"É necessária conexão com o plugin do Roblox Studio.","header.currentProject":"Projeto atual","header.unknownProject":"Projeto desconhecido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Carregando raiz do projeto...","header.currentProject.unavailable":"Raiz do projeto indisponível","header.placeNotConnected":"Place não conectado","header.currentProject.tooltip":"Pasta do projeto atualmente selecionada.","header.currentProject.loading.tooltip":"As informações da raiz do projeto ainda estão carregando.","header.currentProject.unavailable.tooltip":"As informações atuais da raiz do projeto estão indisponíveis.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Carregando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root indisponível","header.currentProjectSyncRoot.tooltip":"Pasta sync root atual do projeto selecionado.","header.currentProjectSyncRoot.loading.tooltip":"As informações de sync root ainda estão carregando.","header.currentProjectSyncRoot.unavailable.tooltip":"As informações atuais de sync root estão indisponíveis.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"O caminho dos arquivos de teste está indisponível.","header.testFiles.tooltip":"Diretório atual dos arquivos de playtest para o place selecionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Conexão do plugin necessária","header.places.liveRequired":"A conexão do plugin é necessária para ver o place ativo em tempo real.","header.place.tooltip":"Place do Roblox conectado.","header.placeNotConnected.tooltip":"Place não conectado","placeScope.current.label":"Place atual","placeScope.lastActive.label":"Último place ativo","placeScope.selected.label":"Place selecionado","placeScope.unknownPlace":"Place desconhecido","placeScope.live":"Ao vivo","placeScope.stored":"Salvo","placeScope.pluginRequired":"Plugin necessário","placeScope.pluginRequired.note":"Conecte o WEPPY Plugin para confirmar o place ativo ao vivo.","placeScope.noPlace.label":"Escopo do place","placeScope.noPlace.value":"Ainda não há dados de place disponíveis","placeScope.noPlace.badge":"Sem place","placeScope.noPlace.note":"Conecte o WEPPY Plugin e sincronize um place para criar dados por place.","placeScope.selected.note":"Mostrando apenas dados salvos. O roteamento do Studio não muda.","placeScope.surface.sync":"O status de sincronização e os logs usam este place.","placeScope.surface.changelog":"As sessões do changelog usam este place.","placeScope.surface.playtest":"Os relatórios de playtest usam este place.","placeScope.surface.uiStudio":"As capturas de UI e o histórico de alterações usam este place.","placeScope.surface.tools":"O histórico e as estatísticas de ferramentas usam este place.","placeScope.loading":"Carregando escopo do place...","placeScope.unavailable":"Escopo do place indisponível","placeScope.selector.label":"Dados do place","header.changeProjectRoot":"Alterar raiz do projeto","header.changeProjectRoot.ariaLabel":"Alterar raiz do projeto","header.changeProjectRoot.tooltip":"Altere a raiz atual do projeto.","header.changeProjectRoot.disabledTooltip.l0":"A conexão com o servidor MCP é necessária primeiro para alterar a raiz do projeto.","header.changeProjectRoot.disabledTooltip.loading":"As informações da raiz do projeto ainda estão carregando.","header.changeProjectRoot.disabledTooltip.unavailable":"As informações atuais da raiz do projeto estão indisponíveis.","header.projectRootModal.initial.title":"Alterar raiz do projeto","header.projectRootModal.initial.body.connected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e o conteúdo atual do Studio será totalmente resincronizado para o novo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e usará <selected project folder>/weppy-project-sync como o próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Novo destino de sync após a seleção","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"O sync atual é interrompido imediatamente.","header.projectRootModal.initial.warningFreshSync":"O conteúdo atual do Studio será usado para criar um fresh full sync no novo destino.","header.projectRootModal.initial.warningNoMove":"Pastas de sync antigas não são movidas automaticamente.","header.projectRootModal.initial.warningDeferredSync":"Se o Studio não estiver conectado, o full resync começará na próxima conexão do plugin.","header.projectRootModal.confirm.title":"Confirmar nova raiz do projeto","header.projectRootModal.confirm.body":"Revise a pasta selecionada antes de aplicar a mudança.","header.projectRootModal.confirm.projectRoot":"Pasta de projeto selecionada","header.projectRootModal.confirm.syncRoot":"Novo destino do sync","header.projectRootModal.confirm.warningNoMove":"Pastas de sync existentes não são movidas automaticamente.","header.projectRootModal.pick":"Escolher pasta","header.projectRootModal.apply":"Aplicar alteração","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"Não foi possível alterar a raiz do projeto.","status.online":"Online","status.offline":"Offline","status.idle":"Ocioso","status.syncing":"Sincronizando","status.error":"Erro","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"O WEPPY Dashboard está aberto mas o servidor MCP parou ou não está respondendo.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifique: O Roblox Studio está aberto? O plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic com o conjunto padrão de recursos do WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro com o conjunto completo de recursos do WEPPY Dashboard.","tier.mixed":"Misto","tier.upgrade":"Ver Pro","tier.banner.save":"Economize tokens de IA com Pro!","tier.tool.query_instances.desc":"Consulta de instâncias, exploração de filhos/descendentes, info de classe, busca por nome e classe. Pro: árvore de arquivos, estrutura do projeto, busca por propriedade e tag.","tier.tool.mutate_instances.desc":"Criar, excluir, clonar, mover, renomear e pivotar instâncias. Pro: criação de árvores, criação/exclusão/duplicação em massa.","tier.tool.manage_properties.desc":"Consultar e definir propriedades, atributos e tags. Pro: valores calculados e relativos, consulta/definição em massa, modificação em massa de filhos.","tier.tool.manage_scripts.desc":"Ler, escrever, criar, excluir, editar linhas e buscar em scripts. Pro: substituição em massa entre scripts.","tier.tool.manage_ui.desc":"Somente Pro. Crie ou refine menus, HUDs, botões, labels e painéis de imagem com estilo de jogo; depois capture telas e revise sugestões.","tier.tool.manage_ui.action.design_brief":"Planejar direção da UI","tier.tool.manage_ui.action.create_tree":"Criar nova UI","tier.tool.manage_ui.action.update":"Atualizar UI existente","tier.tool.manage_ui.action.delete":"Remover UI","tier.tool.manage_ui.action.preview":"Capturar tela da UI","tier.tool.manage_ui.action.check":"Revisar sugestões de melhoria","tier.tool.manage_lighting.desc":"Somente Pro. Configuração de iluminação, atmosfera, céu, propriedades do terreno e hora do dia.","tier.tool.manage_selection.desc":"Consultar, definir e limpar seleção. Pro: contexto, detalhes, adicionar/remover itens, monitorar mudanças.","tier.tool.manage_camera.desc":"Info da câmera, focar por caminho ou coordenadas, visualização sugerida.","tier.tool.manage_tween.desc":"Somente Pro. Criar, reproduzir, pausar e cancelar tweens para animações suaves.","tier.tool.manage_audio.desc":"Somente Pro. Reproduzir, parar, pausar e retomar sons. Configurar listener de áudio.","tier.tool.manage_animation.desc":"Somente Pro. Carregar, reproduzir e parar animações. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Somente Pro. Registrar grupos de colisão, configurar colisão entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Somente Pro. Emitir partículas, limpar todas, alternar ativação de efeitos.","tier.tool.manage_terrain.desc":"Somente Pro. Preencher formas, limpar regiões, substituir materiais, gerenciar cores, ler/escrever voxels, geração procedural, suavização.","tier.tool.spatial_query.desc":"Somente Pro. Raycast, encontrar chão, verificar posicionamento, varredura de área, encontrar áreas planas e pontos de spawn, análise de caminhabilidade, mapa espacial, detecção de colisão.","tier.tool.manage_assets.desc":"Somente Pro. Inserir modelos, consultar info de assets, buscar na loja de criadores, inserir modelos/pacotes gratuitos, exportar.","tier.tool.manage_sync.desc":"Somente Pro. Estado de sincronização, configuração, histórico, direção, leitura/escrita de arquivos sincronizados.","tier.tool.workspace_state.desc":"Somente Pro. Sincronização completa, snapshot, mudanças recentes, info de viewport, metadados, gerenciamento de cache.","tier.tool.manage_logs.desc":"Consulta filtrada de logs, sondagem incremental, limpar buffer, consulta de erros recentes.","tier.tool.system_info.desc":"Estado de conexão, verificação de tier. Pro: info do lugar, lista de serviços, configurações do Studio, controle de playtest, testes automáticos.","tier.tool.manage_studio.desc":"Somente Pro. Alterna ajustes de visualização do editor do Studio, como preview de UI, para capturas e QA; altera a sessão do Studio, não objetos de UI do jogo.","tier.tool.batch_execute.desc":"Somente Pro. Executar múltiplos comandos em lote. Processamento sequencial com opção de continuar em caso de erro.","tier.tool.execute_luau.desc":"Somente Pro. Executar código Luau arbitrário no sandbox do Roblox Studio.","connection.server.title":"Status do Bridge","connection.server.version":"Versão","connection.server.version.tooltip":"Versão do runtime do WEPPY Bridge.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de processo do sistema operacional.","connection.server.uptime":"Tempo ativo","connection.server.uptime.tooltip":"Tempo decorrido desde que o WEPPY Bridge foi iniciado.","connection.server.session":"Sessão","connection.server.session.tooltip":"Identificador da sessão atual do WEPPY Bridge.","connection.server.exec":"Executável","connection.server.exec.tooltip":"Caminho do executável usado para iniciar o WEPPY Bridge.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configurações","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.version":"Versão","connection.agents.version.tooltip":"Versão do pacote MCP Adapter desta sessão do agente.","connection.agents.cwd":"Diretório","connection.agents.cwd.tooltip":"Diretório de trabalho atual do agente de IA conectado.","connection.agents.projectRoot":"Raiz do Projeto","connection.agents.projectRoot.tooltip":"Caminho do projeto autoritativo para propriedade de sincronização","connection.agents.projectRoot.unresolved":"Não resolvido","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconhecido","connection.agents.none":"Nenhum agente conectado","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat mais recente recebido do plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versão instalada do plugin reportada pelo Studio.","connection.plugins.none":"Nenhum plugin conectado","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Conexão Play/Test do Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Cada agente de IA se conecta por seu MCP Adapter ao WEPPY Bridge compartilhado, que mantém a conexão com o Roblox Studio.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Log de conexão","connection.log.empty":"Nenhum evento","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Carregando...","common.retry":"Tentar novamente","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Recolher","tools.tab.history":"Histórico","tools.tab.statistics":"Estatísticas","tools.tab.failures":"Falhas","tools.col.time":"Hora","tools.col.time.tooltip":"Momento em que a execução da ferramenta foi registrada.","tools.col.toolAction":"Ferramenta.Ação","tools.col.toolAction.tooltip":"Nome da ferramenta e ação executada.","tools.col.duration":"Duração","tools.col.duration.tooltip":"Quanto tempo a ferramenta levou para terminar.","tools.col.status":"Status","tools.col.status.tooltip":"Resultado da execução registrada da ferramenta.","tools.col.tier":"Nível","tools.col.tier.tooltip":"Nível de licença exigido para a ferramenta ou ação.","tools.col.tierStats.tooltip":"Resumo Basic, Pro ou Mixed para esta linha de estatísticas da ferramenta.","tools.col.tool":"Ferramenta","tools.col.tool.tooltip":"Nome da ferramenta consolidada na tabela de estatísticas.","tools.col.calls":"Chamadas","tools.col.calls.tooltip":"Número total de chamadas registradas para esta ferramenta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de execuções bem-sucedidas diretas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de execuções que tiveram sucesso por fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de execuções bloqueadas sem fallback.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Número de falhas esperadas causadas por entrada, estado do projeto, política do Roblox ou código do usuário.","tools.col.err":"FALHOU","tools.col.err.tooltip":"Número de execuções que terminaram em falha.","tools.col.okRate":"% Sucesso","tools.col.okRate.tooltip":"Percentual de chamadas que terminaram com sucesso.","tools.col.avgTime":"Tempo médio","tools.col.avgTime.tooltip":"Tempo médio de execução entre as chamadas registradas.","tools.col.error":"Erro","tools.filter.tool":"Ferramenta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usou uma ferramenta ou ação exclusiva do Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"A ação Pro solicitada teve sucesso por meio de um fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"A ação Pro solicitada foi bloqueada e nenhum fallback foi executado.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"A chamada falhou por um problema esperado de entrada, projeto, política ou código de usuário.","tools.badge.err":"FALHOU","tools.badge.err.tooltip":"A execução da ferramenta falhou.","tools.status.ok":"OK","tools.status.ok.tooltip":"A execução da ferramenta terminou com sucesso.","tools.tier.mixed.tooltip":"Esta ferramenta inclui ações Basic e Pro.","tools.detail.params":"Parâmetros","tools.detail.params.tooltip":"Parâmetros de entrada enviados nesta execução da ferramenta.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Payload de resultado retornado por esta execução da ferramenta.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando executado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo do bloqueio","tools.detail.noFallback":"Sem fallback","tools.detail.noFallback.value":"Nenhum fallback foi executado.","tools.detail.warningMessage":"Mensagem de aviso","tools.detail.errorMessage":"Mensagem de erro","tools.detail.open":"Detalhes","tools.detail.openLabel":"Ver detalhes de {command}","tools.detail.dialogLabel":"Detalhes da execução da ferramenta","tools.detail.title":"Execução da ferramenta","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Limpar histórico?","tools.clear.history.message":"Isso remove permanentemente o histórico de ferramentas do place atual.","tools.clear.statistics.title":"Limpar estatísticas?","tools.clear.statistics.message":"Isso redefine permanentemente as estatísticas de ferramentas do place atual.","tools.detail.error":"Erro","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir para a página anterior do histórico de ferramentas.","tools.page.next":"Próximo","tools.page.next.tooltip":"Ir para a próxima página do histórico de ferramentas.","tools.empty.history":"Nenhuma entrada no histórico","tools.empty.stats":"Sem estatísticas","tools.empty.failures":"Sem falhas","tools.summary.total":"Total","tools.summary.calls":"chamadas","tools.summary.sessions":"Sessões","settings.license.title":"Licença","settings.license.title.tooltip":"Status atual da licença e nível de assinatura.","settings.license.status":"Status","settings.license.status.tooltip":"Estado atual de ativação da licença.","settings.license.tier":"Nível","settings.license.tier.tooltip":"Nível de assinatura atual para os recursos disponíveis do WEPPY Dashboard.","settings.license.key":"Chave","settings.license.key.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.keyValue.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.provider":"Provedor","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.providerValue.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.active":"Ativa","settings.license.active.tooltip":"Estado atual de ativação da licença.","settings.license.status.activeCancelPending.tooltip":"O cancelamento está pendente, mas o acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.inactive":"Inativa","settings.license.inactive.tooltip":"Estado atual de ativação da licença.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado atual de ativação da licença.","settings.license.unavailable":"Informações de licença indisponíveis","settings.license.detail.cancelPending":"O cancelamento foi agendado. O acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.reset":"Redefinir licença","settings.readOnly":"Somente leitura","settings.readOnly.tooltip":"Esta seção mostra valores que não podem ser editados pelo WEPPY Dashboard.","settings.unavailable":"Configurações indisponíveis","settings.general.title":"Configurações gerais","settings.general.title.tooltip":"Configurações quentes que são aplicadas imediatamente ao mudar.","settings.general.liveApply":"Aplicar ao vivo","settings.general.liveApply.tooltip":"As mudanças nesta seção são aplicadas imediatamente sem um botão separado de salvar.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nível de log","settings.general.logLevel.tooltip":"Define quanto detalhe o WEPPY Dashboard escreve nos logs.","settings.general.localHistory":"Registro de histórico","settings.general.localHistory.tooltip":"Armazena o histórico local de execução de ferramentas para as telas de histórico do WEPPY Dashboard.","settings.general.localStatistics":"Coleta de estatísticas","settings.general.localStatistics.tooltip":"Agrega estatísticas locais de uso para os relatórios do WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tempo limite","settings.general.requestTimeout.tooltip":"Tempo máximo que o WEPPY Dashboard espera uma ação antes de falhar.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"O tempo limite da ação é medido em milissegundos.","settings.cold.title":"Ambiente do servidor","settings.cold.title.tooltip":"Valores de ambiente do servidor somente leitura carregados na inicialização.","settings.cold.httpPort.tooltip":"Número da porta usada pelo servidor HTTP do WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interface de host à qual o servidor HTTP do WEPPY Dashboard MCP se vincula.","settings.cold.hint":"Configure via variáveis de ambiente.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Escolha como o WEPPY Dashboard se comporta quando o servidor MCP inicia.","settings.dashboard.nextStartBadge":"Próxima inicialização","settings.dashboard.autoOpen.label":"Abrir o Dashboard ao iniciar o WEPPY","settings.dashboard.autoOpen.description":"Abre este Dashboard automaticamente após o servidor MCP iniciar.","settings.dashboard.autoOpen.nextStart":"Será aplicado na próxima inicialização do servidor MCP.","settings.dashboard.settingsFile.label":"Arquivo de configuração","settings.dashboard.agentExample.label":"Peça ao seu Agent","settings.dashboard.agentExample.prompt":"“Desative a abertura automática do Dashboard”.","settings.dashboard.autoOpen.saving":"Salvando…","settings.dashboard.autoOpen.saved":"Salvo para a próxima inicialização do servidor.","settings.dashboard.autoOpen.error":"Não foi possível salvar. A opção anterior foi restaurada.","dashboardAutoOpenGuide.eyebrow":"Preferência do Dashboard","dashboardAutoOpenGuide.title":"Escolha como o WEPPY Dashboard será aberto","dashboardAutoOpenGuide.currentOn":"A abertura automática está ativada. Este Dashboard abre após o servidor MCP iniciar.","dashboardAutoOpenGuide.currentOff":"A abertura automática está desativada. O WEPPY não abrirá uma nova aba do Dashboard ao iniciar o servidor MCP.","dashboardAutoOpenGuide.changeAnytime":"Você pode alterar isso a qualquer momento em Settings.","dashboardAutoOpenGuide.agentHint":"Você também pode pedir ao Agent: “Desative a abertura automática do Dashboard”.","dashboardAutoOpenGuide.statusOn":"Abertura automática ativada","dashboardAutoOpenGuide.statusOff":"Abertura automática desativada","dashboardAutoOpenGuide.keep":"Manter opção atual","dashboardAutoOpenGuide.turnOff":"Desativar abertura automática","dashboardAutoOpenGuide.openSettings":"Abrir Settings","dashboardAutoOpenGuide.close":"Fechar guia de abertura automática","dashboardAutoOpenGuide.saving":"Salvando…","dashboardAutoOpenGuide.error":"Não foi possível salvar sua escolha. Tente novamente.","settings.language.title":"Idioma","settings.language.title.tooltip":"Escolha como o texto da interface do WEPPY Dashboard é localizado.","settings.language.dashboard":"Idioma do WEPPY Dashboard","settings.language.dashboard.tooltip":"Substitui o idioma do WEPPY Dashboard ou segue o idioma do sistema quando definido como Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"O servidor MCP não está respondendo. O WEPPY Dashboard tentará reconectar automaticamente.","overview.l0.step1":"Verifique se o processo do servidor MCP está em execução","overview.l0.step2":"Reinicie o comando do servidor MCP se necessário","overview.l0.reconnecting":"Reconectando automaticamente a cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configurações","overview.l1.pluginGuide":"O plugin do Roblox Studio não está conectado","overview.l1.check1":"O Roblox Studio está aberto?","overview.l1.check2":"O WEPPY Plugin está instalado?","overview.l1.feedHint":"As alterações aparecerão aqui quando o plugin se conectar","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Status de execução e processo do servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status de conexão e versão do plugin do Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados e seu estado atual.","overview.metric.agent.instancesUnit":"instâncias","overview.metric.sync":"Sincronização","overview.metric.sync.tooltip":"Atividade atual de sincronização entre Studio e arquivos locais.","overview.metric.noAgent":"Sem agente","overview.meta.version":"Versão","overview.meta.version.tooltip":"Versão instalada do servidor MCP.","overview.meta.session":"Sessão","overview.meta.session.tooltip":"Identificador da sessão MCP atual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de processo do sistema operacional.","overview.meta.uptime":"Tempo ativo","overview.meta.uptime.tooltip":"Tempo decorrido desde que o servidor MCP foi iniciado.","overview.feed.title":"Alterações recentes do jogo","overview.feed.empty":"Sem alterações recentes","overview.changelog.title":"Resumo de alterações da sessão","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instâncias","overview.changelog.properties":"propriedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nível","changelog.subtitle":"Histórico de alterações do jogo","changelog.filter.all":"Todos","changelog.filter.active":"Ativo","changelog.filter.completed":"Concluído","changelog.empty":"Nenhuma entrada no histórico","changelog.basic.limit.title":"A prévia Basic mostra apenas as 3 sessões mais recentes","changelog.basic.limit.body":"Faça upgrade para Pro para navegar pela linha do tempo completa do changelog deste place.","changelog.basic.metricLabel":"Changelog visível / Total","changelog.basic.visible":"visíveis","changelog.basic.total":"total","changelog.card.active":"Ativo","changelog.card.active.tooltip":"Esta sessão ainda está recebendo novas alterações do jogo.","changelog.card.completed":"Concluído","changelog.card.completed.tooltip":"Esta sessão terminou e não deve receber mais alterações.","changelog.card.bootstrapStatus":"Inicialização","changelog.card.bootstrapStatus.tooltip":"Esta sessão contém apenas o snapshot inicial de bootstrap da sincronização.","changelog.card.inProgress":"em andamento","changelog.card.noChanges":"Sem alterações ainda","changelog.card.noChanges.tooltip":"Ainda não foram extraídas alterações do jogo para esta sessão.","changelog.card.bootstrapSummary":"Snapshot de sincronização inicial","changelog.card.bootstrapSummary.tooltip":"As gravações da sincronização inicial de arquivos são condensadas em uma única linha de snapshot bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Alterações de script feitas nesta sessão.","changelog.card.instances":"instâncias","changelog.card.instances.tooltip":"Alterações de criação, exclusão, movimentação ou clonagem de instâncias nesta sessão.","changelog.card.modified":"modificado","changelog.card.created":"criado","changelog.card.deleted":"excluído","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propriedades alteradas","changelog.card.propertiesChanged.tooltip":"Alterações de valores de propriedades registradas para esta sessão.","changelog.card.lightingConfigured":"Iluminação configurada","changelog.card.lightingConfigured.tooltip":"A iluminação ou a atmosfera foram alteradas nesta sessão.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Os dados ou as configurações de terreno foram alterados nesta sessão.","changelog.card.assetsInserted":"assets inseridos","changelog.card.assetsInserted.tooltip":"Assets inseridos no place durante esta sessão.","changelog.category.script":"Scripts","changelog.category.instance":"Instâncias","changelog.category.property":"Propriedades","changelog.category.lighting":"Iluminação","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.dialogLabel":"Detalhes do histórico de alterações","changelog.detail.changeSummary":"Resumo de alterações","changelog.detail.changeSummary.tooltip":"Contagem de alterações do jogo extraídas e agrupadas por categoria nesta sessão.","changelog.detail.changeTimeline":"Linha do tempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica das alterações do jogo extraídas para esta sessão.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes e depois","changelog.detail.filterCategory":"Categoria","changelog.detail.filterCategory.tooltip":"Filtra a linha do tempo para uma única categoria de alteração.","changelog.detail.confidence.exact":"Exato","changelog.detail.confidence.exact.tooltip":"Os estados antes e depois desta alteração foram confirmados.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Apenas parte dos estados antes e depois desta alteração pôde ser confirmada.","changelog.detail.confidence.afterOnly":"Somente depois","changelog.detail.confidence.afterOnly.tooltip":"Apenas o estado resultante após a alteração pôde ser confirmado.","changelog.detail.confidence.intentOnly":"Somente intenção","changelog.detail.confidence.intentOnly.tooltip":"Apenas a ação solicitada foi registrada, não o estado resultante.","changelog.detail.confidence.unknown":"Desconhecido","changelog.detail.confidence.unknown.tooltip":"Não foi possível classificar esta alteração com confiança a partir dos dados disponíveis.","changelog.detail.noChanges":"Sem alterações nesta categoria","changelog.detail.backToList":"Voltar à lista","changelog.diff.empty":"Sem diferenças disponíveis","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Depois","sync.overlay.title":"Plugin do Roblox Studio necessário","sync.overlay.message":"O status de sincronização estará disponível quando o plugin do Roblox Studio se conectar.","sync.overlay.check1":"O Roblox Studio está aberto?","sync.overlay.check2":"O WEPPY Plugin está instalado?","sync.status.title":"Status de sincronização","sync.status.title.tooltip":"Status atual de sincronização entre o Studio e os arquivos locais deste place.","sync.status.forwardOnly":"Somente avanço","sync.status.forwardOnly.tooltip":"O tier Basic permite apenas sincronização direta do Studio para o local.","sync.status.place":"Place","sync.status.place.tooltip":"Nome e ID do place do Roblox atualmente conectado.","sync.status.path":"Caminho","sync.status.path.tooltip":"Raiz do sistema de arquivos local usada atualmente para a saída de sincronização.","sync.status.instances":"Instâncias","sync.status.instances.tooltip":"Total de instâncias do Roblox sincronizadas no espelho local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total de arquivos de script atualmente indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado atual de execução da sincronização informado pelo servidor.","sync.policy.title":"Política de Sync","sync.policy.title.tooltip":"Política efetiva de Sync informada pelo plugin do Studio conectado.","sync.policy.activation":"Ativação","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Fluxo de trabalho","sync.policy.preset.studio_first":"Studio primeiro","sync.policy.preset.bidirectional_review":"Bidirecional","sync.policy.preset.local_code_studio_world":"Código local, mundo no Studio","sync.policy.preset.custom":"Personalizado","sync.policy.apply.title":"Como as alterações locais são aplicadas ao Studio","sync.policy.apply.description":"Mostra se as alterações locais serão revisadas primeiro ou aplicadas automaticamente ao Studio.","sync.policy.apply.content":"Mudanças de conteúdo","sync.policy.apply.content.tooltip":"Alterações locais de Código Script, propriedades e propriedades de serviços. Criar, excluir, renomear e mover são alterações de estrutura.","sync.policy.apply.structure":"Mudanças de estrutura","sync.policy.apply.structure.tooltip":"Criação, exclusão, renomeação e movimentação locais de instâncias. A exclusão local automática também exige a opção de exclusão separada abaixo.","sync.policy.apply.manual":"Revisar primeiro","sync.policy.apply.auto":"Aplicar automaticamente","sync.policy.scope.disclosure":"Direções por escopo","sync.policy.scope.scriptSource":"Código dos scripts","sync.policy.scope.properties":"Propriedades","sync.policy.scope.structure":"Estrutura","sync.policy.scope.serviceProperties":"Propriedades dos serviços","sync.policy.endpoint.local":"Local","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Local","sync.policy.direction.forward.tooltip":"As mudanças do Studio são gravadas nos arquivos locais.","sync.policy.direction.reverse":"Local → Studio","sync.policy.direction.reverse.tooltip":"As mudanças dos arquivos locais são aplicadas ao Studio.","sync.policy.direction.bidirectional":"Nos dois sentidos","sync.policy.direction.bidirectional.tooltip":"As mudanças podem ir do Studio para os arquivos locais e dos arquivos locais para o Studio.","sync.policy.safety.localDeletes":"Exclusão local → excluir instância do Studio","sync.policy.safety.review":"Revisar antes de excluir","sync.policy.safety.review.tooltip":"As exclusões de arquivos locais aguardam revisão antes de remover as instâncias correspondentes do Studio. Isso é separado da limpeza automática do UI Studio.","sync.policy.safety.auto":"Exclusão automática no Studio","sync.policy.safety.auto.tooltip":"Excluir arquivos locais pode remover automaticamente as instâncias correspondentes do Studio. Isso é separado da limpeza automática do UI Studio.","sync.policy.reviewRequired":"Revise esta política no plugin do Studio antes de iniciar o Sync.","sync.log.title":"Log de sincronização","sync.log.empty":"Sem eventos de sincronização","sync.log.type.write":"ESCREVER","sync.log.type.write.tooltip":"Uma nova saída de sincronização foi gravada no disco.","sync.log.type.update":"ATUALIZAR","sync.log.type.update.tooltip":"Um arquivo ou uma instância já sincronizada foi atualizada.","sync.log.type.delete":"EXCLUIR","sync.log.type.delete.tooltip":"Um arquivo ou uma instância sincronizada foi removida.","sync.log.type.idle":"OCIOSO","sync.log.type.idle.tooltip":"Um evento de sincronização foi registrado sem alterar arquivos.","sync.upgrade.title":"Veja a sincronização completa com Pro","sync.upgrade.benefit1":"Sincronização bidirecional — edite arquivos, aplicação automática no Studio","sync.upgrade.benefit2":"Sincronização reversa — envie alterações de arquivos para o Studio","sync.upgrade.benefit3":"Histórico completo de sincronização e registro detalhado de alterações","sync.upgrade.buy":"Ver Pro","playtest.status.title":"Status de teste","playtest.status.title.tooltip":"Estado atual da sessão de playtest do Roblox informado pelo Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicialização do playtest do Studio para a sessão atual.","playtest.status.mode.value.tooltip":"Modo específico de playtest do Roblox Studio atualmente em uso.","playtest.status.mode.play":"Jogar","playtest.status.mode.run":"Executar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place do Roblox atualmente associado a esta sessão de playtest.","playtest.status.state.running":"Executando","playtest.status.state.running.tooltip":"Uma sessão de playtest do Roblox está em execução no momento.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"A sessão atual de playtest do Roblox está pausada.","playtest.status.state.notRunning":"Não está em execução","playtest.status.state.notRunning.tooltip":"Nenhuma sessão de playtest do Roblox está em execução no momento.","playtest.control.play":"Jogar","playtest.control.pause":"Pausar","playtest.control.resume":"Retomar","playtest.control.stop":"Parar","playtest.history.title":"Histórico de testes","playtest.history.title.tooltip":"Execuções automatizadas de playtest registradas para este projeto.","playtest.history.empty":"Sem resultados de teste","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado nesta execução de teste registrada.","playtest.history.status.passed":"Aprovado","playtest.history.status.failed":"Falhou","playtest.history.status.running":"Executando","playtest.history.status.unknown":"Desconhecido","playtest.history.status.tooltip":"Estado de resultado registrado para esta execução automatizada de playtest.","playtest.empty.title":"Sem resultados de teste ainda","playtest.empty.message":"Os resultados aparecerão aqui depois que o agente de IA executar um Playtest.","playtest.empty.message.before":"Os resultados aparecerão aqui depois que o agente de IA executar um Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Relatório selecionado","playtest.report.title.tooltip":"Saída detalhada da execução automatizada de playtest atualmente selecionada.","playtest.detail.dialogLabel":"Detalhes do relatório de playtest","playtest.detail.loading":"Carregando relatório...","playtest.detail.errorTitle":"Relatório indisponível","playtest.report.content":"Relatório","playtest.report.content.tooltip":"Resumo em Markdown da execução automatizada de playtest selecionada.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Logs de execução capturados para a execução automatizada de playtest selecionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sem conteúdo de relatório","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest é uma função exclusiva do Pro","playtest.basic.desc":"Controle os testes pelo WEPPY Dashboard, execute testes automatizados e visualize relatórios detalhados.","playtest.basic.benefit1":"Controles de jogar/pausar/parar com um clique","playtest.basic.benefit2":"Execução de testes automatizados via agente IA","playtest.basic.benefit3":"Histórico de testes com rastreamento de sucesso/falha","playtest.basic.benefit4":"Relatórios de teste detalhados em markdown","playtest.sample.badge":"Prévia da tela de playtest Pro","playtest.sample.title":"Você está vendo uma prévia da tela de playtest disponível após o upgrade para Pro.","playtest.sample.message":"Esta prévia usa dados de exemplo. Controle de playtest ao vivo, gerenciamento de histórico e relatórios reais são liberados com Pro.","playtest.sample.clearDisabled":"Faça upgrade para Pro para limpar o histórico real de playtest.","playtest.sample.place":"Prévia da Arena","playtest.sample.history.name":"Teste de fumaça da Arena de exemplo","playtest.sample.context.why":"Entrar na arena, sobreviver à abertura e verificar se o HUD responde imediatamente.","playtest.sample.context.expected":"O jogador surge com segurança, a contagem regressiva do HUD aparece em um segundo e a primeira onda começa sem erros.","playtest.sample.context.observed":"A proteção de spawn funcionou, o HUD atualizou no tempo certo e a primeira onda terminou sem regressões.","playtest.sample.report.markdown":`# Teste de fumaça da Arena de exemplo
|
|
100
|
-
|
|
101
|
-
- Fluxo de spawn: PASS
|
|
102
|
-
- Contagem do HUD: PASS
|
|
103
|
-
- Início da onda: PASS
|
|
104
|
-
|
|
105
|
-
Isto é uma prévia de amostra. Faça upgrade para Pro para executar playtests ao vivo e salvar relatórios reais.`,"playtest.sample.report.logs":`[sample] iniciar prévia de playtest
|
|
106
|
-
[sample] proteção de spawn ativa
|
|
107
|
-
[sample] contagem do hud renderizada
|
|
108
|
-
[sample] primeira onda concluída
|
|
109
|
-
[sample] relatório de amostra finalizado`,"sidebar.whatsNew":"Novidades","sidebar.help.group":"Ajuda e feedback","sidebar.help.bug":"Reportar um bug","sidebar.help.bug.tooltip":"Criar um pacote de diagnostico local e abrir um relatorio de bug preenchido no GitHub","bugReportDialog.title":"diagnostics.zip pode ajudar na investigação","bugReportDialog.subtitle":"O WEPPY criou um zip de diagnóstico neste computador. Ele inclui logs do Studio, plugin, Sync e ferramentas que podem ajudar a entender o que aconteceu.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Você pode enviar o bug report sem este arquivo, mas anexar o zip geralmente ajuda a encontrar a causa mais rápido.","bugReportDialog.attachHow":"Para anexar, baixe ou revele o zip e adicione-o ao campo Diagnostics ZIP (optional) da issue do GitHub antes de enviar.","bugReportDialog.download":"1. Baixar diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Abrir issue no GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"O zip pode conter logs locais e contexto do projeto. Revise-o antes de anexar se quiser compartilhar.","sidebar.help.feature":"Sugerir um recurso","sidebar.help.feature.tooltip":"Sugerir um novo recurso ou melhoria no GitHub","sidebar.help.discussions":"Ajuda para instalação e uso","sidebar.help.discussions.tooltip":"Pedir ajuda de instalação ou uso no GitHub Issues","sidebar.help.troubleshooting":"Guia de solução de problemas","sidebar.help.troubleshooting.tooltip":"Abrir o guia oficial de solução de problemas no weppyai.com","header.whatsNew":"Novidades","header.whatsNew.tooltip":"Novidades","upgrade.title":"Ver Pro","upgrade.tagline":"Confira os recursos Pro","upgrade.cta":"Ver Pro","upgrade.licenseShortcut":"Inserir licença","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novidades","whatsNew.pageSubtitle":"Fique por dentro das mudanças do MCP","whatsNew.unreadSection":"Não lidos","whatsNew.allSection":"Todos os anúncios","whatsNew.empty":"Nenhum anúncio ainda","whatsNew.newBadge":"NOVO","whatsNew.importantBadge":"IMPORTANTE","whatsNew.category.release":"Versão","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Descontinuado","whatsNew.category.tip":"Dica","uiStudio.title":"UI Studio","uiStudio.empty":"Ainda não há capturas de tela salvas. Elas são criadas automaticamente quando um agente de IA captura o estado atual da UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"O plugin do Roblox Studio não está conectado","uiStudio.pluginGuide.message":"O UI Studio mostra capturas de tela e histórico de alterações do place do Studio conectado. Ele será atualizado automaticamente quando o Studio e o WEPPY Plugin se conectarem.","uiStudio.pluginGuide.check1":"O Roblox Studio está em execução?","uiStudio.pluginGuide.check2":"O WEPPY Plugin está instalado e em execução?","uiStudio.pluginGuide.waiting":"Aguardando conexão do plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primeiro","uiStudio.priorityLow":"Melhoria opcional","uiStudio.highPrioritySection":"Revisar primeiro","uiStudio.lowPrioritySection":"Melhorias opcionais","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análise","uiStudio.tabs.history":"Histórico","uiStudio.analysis.reportsTitle":"Última análise por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recentes","uiStudio.analysis.detailDialog":"Detalhes da análise","uiStudio.analysis.targetCountLabel":"Destinos analisados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugestões de melhoria","uiStudio.analysis.verdict.needsFix":"Sugestões de melhoria","uiStudio.analysis.verdict.review":"Sugestões de melhoria","uiStudio.analysis.verdict.passed":"Sem sugestões atuais","uiStudio.analysis.verdictLabel":"Resumo de melhorias","uiStudio.analysis.coverage.structuralOnly":"Somente verificações estruturais concluídas","uiStudio.analysis.coverage.visualSkipped":"Verificações estruturais concluídas · Revisão visual ignorada","uiStudio.analysis.coverage.visualFailed":"Verificações estruturais concluídas · Falha na revisão visual","uiStudio.analysis.coverage.full":"Verificações estruturais e visuais concluídas","uiStudio.analysis.coverage.deterministicFailed":"Falha nas verificações estruturais","uiStudio.analysis.thresholds":"Base de revisão","uiStudio.analysis.issueSummary.passed":"Não há sugestões adicionais com a base de revisão atual.","uiStudio.history.title":"Histórico de Alterações","uiStudio.history.empty":"Ainda não há histórico de alterações. Quando um agente de IA modificar a UI com manage_ui, será registrado automaticamente.","uiStudio.history.loading":"Carregando...","uiStudio.history.loadingPlace":"Carregando place atual...","uiStudio.history.noPlace":"Ainda não há dados do place atual. Conecte o WEPPY Plugin e sincronize um place para ver o histórico de alterações da UI.","uiStudio.history.noPlaceAction":"O place atual ainda não está disponível.","uiStudio.history.error":"Erro","uiStudio.history.clear":"Limpar tudo","uiStudio.history.filter.actions":"Tipo de ação","uiStudio.history.filter.actionAll":"Tudo","uiStudio.history.filter.actionCreate":"Criar","uiStudio.history.filter.actionUpdate":"Atualizar","uiStudio.history.filter.actionDelete":"Excluir","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Tudo","uiStudio.history.filter.today":"Hoje","uiStudio.history.filter.yesterday":"Ontem","uiStudio.history.filter.last7Days":"Últimos 7 dias","uiStudio.history.filter.last30Days":"Últimos 30 dias","uiStudio.history.filter.customRange":"Intervalo personalizado","uiStudio.history.filter.reset":"Redefinir","uiStudio.history.filter.from":"De","uiStudio.history.filter.to":"Até","uiStudio.history.row.affectedPaths":"Caminhos","uiStudio.history.row.mutations":"Detalhes de alterações","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Recolher","uiStudio.history.row.expandDetails":"Mostrar {n} alterações","uiStudio.history.row.collapseDetails":"Ocultar alterações","uiStudio.history.row.toggleDetails":"Alternar detalhes das alterações","uiStudio.history.row.mutationsEmpty":"Sem detalhes de alterações","uiStudio.history.row.toolLabel":"Alterações de UI ({n})","uiStudio.history.row.compare":"Antes / Depois","uiStudio.history.row.noBeforeState":"Sem estado anterior","uiStudio.history.row.noAfterState":"Sem estado posterior","uiStudio.history.row.qualityPlan":"Direção de design","uiStudio.history.row.designCheck":"Sugestões","uiStudio.history.row.designCheckUnavailable":"Sugestões: indisponível","uiStudio.history.row.designCheckNone":"Sugestões: nenhuma","uiStudio.history.selection.deleteSelected":"Excluir selecionados","uiStudio.history.selection.selectAll":"Selecionar tudo","uiStudio.history.selection.clearSelection":"Limpar seleção","uiStudio.history.confirm.deleteRequestsTitle":"Excluir registros de alterações","uiStudio.history.confirm.deleteRequestsMessage":"Os registros de alterações selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.history.confirm.clearRequestsTitle":"Limpar Histórico de Alterações","uiStudio.history.confirm.clearRequestsMessage":"Isso limpa o histórico de alterações do place atual. As instâncias do Studio não são afetadas.","uiStudio.history.confirm.cascadeOption":"Também excluir capturas vinculadas","uiStudio.history.drawer.close":"Fechar","uiStudio.actions.previewAgain":"Pré-visualizar Novamente","uiStudio.actions.deleteSnapshot":"Excluir Esta Captura de Tela","uiStudio.actions.proRequired":"Disponível após atualizar para o Pro","uiStudio.actions.captureCurrentState":"Capturar estado atual","uiStudio.actions.checkSuggestionsAgain":"Reverificar sugestões","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"O ID do novo arquivo de captura de tela aparecerá ao finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura concluída, verifique o salvamento","uiStudio.actions.previewSaved":"Nova captura de tela salva","uiStudio.actions.previewComplete":"Captura concluída","uiStudio.actions.previewSavedDetail":"As capturas existentes foram mantidas; esta foi salva como um novo arquivo.","uiStudio.actions.previewSavedPathMissing":"Um novo ID de captura foi retornado, mas o caminho do arquivo salvo não pôde ser confirmado.","uiStudio.actions.previewSnapshotIdMissing":"Não foi possível confirmar o novo ID da captura. Atualize a lista para verificar se ela foi salva.","uiStudio.actions.more":"Mais","uiStudio.gallery.selection.selectedCount":" selecionado(s)","uiStudio.confirm.deleteSnapshotTitle":"Excluir Captura de Tela","uiStudio.confirm.deleteSnapshotMessage":"Apenas este arquivo de captura de tela será excluído (a instância do Studio é preservada).","uiStudio.confirm.deleteBatchTitle":"Excluir Captura de Telas Selecionados","uiStudio.confirm.deleteBatchMessage":"As capturas de tela selecionadas serão excluídas. Esta ação não pode ser desfeita.","uiStudio.gallery.selectMode":"Selecionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Selecionar Tudo","uiStudio.gallery.clearSelection":"Limpar Seleção","uiStudio.gallery.deleteSelected":"Excluir Seleção","common.save":"Salvar","common.cancel":"Cancelar","common.delete":"Excluir","uiStudio.storage.title":"Dados salvos do UI Studio","uiStudio.storage.usageLabel":"Em uso","uiStudio.storage.historyBytes":"Histórico","uiStudio.storage.snapshotBytes":"Capturas de tela","uiStudio.storage.requestCount":"Registros de alterações","uiStudio.storage.mutationCount":"Detalhes de alterações","uiStudio.storage.snapshotCount":"Capturas de tela","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpeza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Erros","uiStudio.storage.loading":"Carregando...","uiStudio.cleanup.policy.title":"Política de exclusão automática","uiStudio.cleanup.policy.modeOff":"Desativado","uiStudio.cleanup.policy.modeAge":"Por idade","uiStudio.cleanup.policy.modeSize":"Por tamanho","uiStudio.cleanup.policy.cascade":"Também excluir capturas de tela vinculadas","uiStudio.cleanup.policy.save":"Salvar política","uiStudio.cleanup.policy.runNow":"Executar política salva","uiStudio.cleanup.policy.proRequired":"Disponível após atualizar para Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Ao aplicar esta política serão excluídos imediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de alterações","uiStudio.cleanup.policy.confirm.snapshots":" capturas de tela","uiStudio.cleanup.policy.confirm.freed":"liberado — Aplicar?","uiStudio.cleanup.keepLastNDays":"Manter últimos {n} dias","uiStudio.cleanup.selectedDelete":"Excluir seleção…","uiStudio.cleanup.deleteAll":"Excluir tudo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpeza","uiStudio.cleanup.cleanupConfirmMessage":"Os itens selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpeza manual","uiStudio.cleanup.studioPreservedNote":"Esta ação exclui apenas os arquivos de histórico e capturas de tela no disco; as instâncias do Roblox Studio não são afetadas.","uiStudio.history.sample.bannerBadge":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerTitle":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerMessage":"Esta prévia usa dados de exemplo. O histórico real de alterações, a comparação antes/depois e a exclusão em lote são desbloqueados com o Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Atualize para Pro para desbloquear o histórico completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Executar política salva","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Limpar tudo","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Limpado com sucesso","toast.clearFailed":"Falha ao limpar os dados","common.clear":"Limpar","settings.license.activate":"Ativar licença","settings.license.refresh":"Atualizar licença","settings.license.keyInput":"Chave de licença","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconecte ao servidor MCP para gerenciar a licença pelo WEPPY Dashboard.","settings.license.live.tooltip":"As ações de licença são enviadas imediatamente ao servidor MCP.","settings.license.status.activationRequired":"Ativação necessária","settings.license.status.activationRequired.tooltip":"É necessária ativação manual da licença antes que o WEPPY Dashboard possa atualizar este status.","settings.license.status.grace":"Tolerância","settings.license.status.grace.tooltip":"A verificação do provedor está temporariamente indisponível, mas o acesso Pro permanece ativo durante o período de tolerância.","settings.license.status.graceBilling.tooltip":"O acesso Pro continua disponível durante um período de tolerância relacionado à cobrança.","settings.license.detail.graceBilling":"O acesso Pro continua disponível durante um período de tolerância de cobrança.","settings.license.detail.graceProviderUnavailable":"Provedor indisponível. O acesso Pro continua ativo no modo de tolerância.","settings.license.detail.manualActivation":"Ativação manual necessária para restaurar o acesso Pro.","settings.license.detail.missingSessionToken":"A atualização está bloqueada porque o token de sessão atual está ausente.","settings.license.detail.refreshRecommended":"A verificação de licença deve ser atualizada em breve.","connection.agents.kill":"Encerrar","connection.agents.kill.title":"Encerrar agente?","connection.agents.killed":"Agente encerrado","connection.agents.killFailed":"Falha ao encerrar o agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Chamada de ferramenta mais recente executada por este agente.","connection.agents.lastSeen":"Visto por último","connection.agents.lastSeen.tooltip":"Heartbeat ou atividade mais recente deste agente.","connection.clear.title":"Limpar o log de conexão?","connection.clear.message":"Isso remove permanentemente o log de conexão armazenado do projeto atual.","sync.clear.title":"Limpar o log de sincronização?","sync.clear.message":"Isso remove permanentemente o log de sincronização armazenado do place atual.","playtest.clear.title":"Limpar o histórico de testes?","playtest.clear.message":"Isso remove permanentemente os relatórios de playtest armazenados do place atual.","changelog.clear.title":"Limpar o changelog?","changelog.clear.message":"Isso remove permanentemente o changelog armazenado do place atual.","sync.status.placePath":"Caminho do place","sync.status.placePath.tooltip":"Diretório do place ativo onde os arquivos do explorer são sincronizados.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificação","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Direção de design do briefing usada nesta alteração.","uiStudio.history.row.designCheck.tooltip":"Resumo das sugestões do Design Check após a alteração.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Execute agora uma vez a regra de limpeza salva, sem esperar pela próxima execução programada.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Veja recursos Pro e opções de compra.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.manageStorage":"Gerenciar armazenamento","settings.dataHistory.manageStorage.tooltip":"Mostra ou oculta a política de armazenamento e os controles de limpeza.","settings.dataHistory.manageStorage.projectChanges.aria":"Gerenciar o armazenamento do resumo de alterações do projeto","settings.dataHistory.manageStorage.uiStudio.aria":"Gerenciar o armazenamento do histórico e das capturas do UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugestões do Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Verificar novamente","uiStudio.actions.designCheckRunning":"Verificando sugestões...","uiStudio.actions.designCheckRunningDetail":"Ao finalizar, serão exibidos itens para revisar primeiro, recomendados e opcionais.","uiStudio.actions.designCheckComplete":"Verificação de sugestões concluída","uiStudio.actions.designCheckNoSnapshotSaved":"Esta ação não salva um novo arquivo de captura de tela.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugestões para revisar primeiro. Clique para ver detalhes.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugestões recomendadas.","uiStudio.priorityMedium":"Revisão recomendada","uiStudio.mediumPrioritySection":"Revisão recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de melhorias opcionais.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erro","uiStudio.analysis.expandChildren":"Mostrar alvos filhos","uiStudio.analysis.openDetail":"Abrir detalhe","uiStudio.analysis.childTargets":"Alvos filhos","uiStudio.analysis.childDetailHint":"Abrir detalhe do alvo filho","uiStudio.compare.before":"Antes","uiStudio.compare.after":"Depois","uiStudio.history.drawer.changeDetails":"Detalhes da alteração","uiStudio.gallery.cardCheckbox":"Selecionar captura","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Todos os escopos","assets.explorer.label":"Explorador de recursos","assets.breadcrumb.label":"Caminho do recurso","assets.explorer.summary":"{direct} nesta pasta · {descendant} em subpastas","assets.folder.count.one":"1 recurso","assets.folder.count.many":"{count} recursos","assets.folder.type":"Pasta","assets.folders.title":"Pastas","assets.folder.assetsTitle":"Recursos nesta pasta","assets.organization.label":"Explorar","assets.organization.folders":"Pastas","assets.organization.all":"Todos os recursos","assets.organization.summary":"{count} recursos","assets.view.options":"Opções de visualização","assets.view.mode":"Modo de visualização","assets.view.grid":"Grade","assets.view.list":"Lista","assets.view.thumbnailSize":"Tamanho da miniatura","assets.view.thumbnailSize.listReason":"O tamanho da miniatura está disponível na visualização em grade.","assets.view.size.small":"Pequeno","assets.view.size.medium":"Médio","assets.view.size.large":"Grande","assets.list.name":"Nome","assets.list.type":"Tipo","assets.list.scope":"Escopo","assets.list.status":"Status","assets.list.updated":"Atualizado","assets.loading.scope":"Carregando recursos de {scope}...","assets.partial.title":"Não foi possível carregar alguns locais","assets.empty.folderTitle":"Nenhum recurso correspondente nesta pasta","assets.empty.folderBody":"Tente outra pasta ou filtro de categoria.","assets.empty.filteredTitle":"Nenhum recurso corresponde a este filtro","assets.empty.filteredBody":"Escolha outra categoria ou verifique novamente as pastas correspondentes.","assets.place.selector":"Asset place","assets.place.context":"Contexto do local do recurso","assets.place.sharedLibrary":"Biblioteca compartilhada","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Como funciona","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Confira o WEPPY Bridge compartilhado, o MCP Adapter de cada agente de IA, os destinos do Studio e o registro de conexões.","dashboardHelp.connection.needs.1":"O WEPPY Bridge precisa estar acessível. Os destinos do Studio aparecem depois que o WEPPY Plugin envia sinais de atividade.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Revise as evidências estruturadas de Playtest para resultados de interface, entrada e servidor salvos pelo AI Agent.","dashboardHelp.playtest.needs.1":"O Pro mostra relatórios reais salvos. O Basic mostra uma amostra. Evidências de captura de tela do Play não estão disponíveis, mas as evidências semânticas de interface e interação permanecem disponíveis. Para identificar corretamente o Place ativo, o WEPPY Plugin precisa estar conectado.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fechar","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Se um destino do Studio não aparecer, abra o Roblox Studio e execute o WEPPY Plugin. Se um agente de IA ou MCP Adapter não aparecer, reconecte o WEPPY MCP Server pela sua ferramenta de IA.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Confira o status do WEPPY Bridge compartilhado, do MCP Adapter de cada agente de IA, dos destinos do Studio e dos logs de conexão.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Roteamento do Studio","controls.studioRouting.title.tooltip":"Prioridade para solicitações MCP que não indicam um Studio.","controls.studioRouting.settingLabel":"Solicitações sem um Studio indicado","controls.studioRouting.mode.auto":"Automático","controls.studioRouting.mode.pinned":"Studio fixo","controls.studioRouting.state.auto":"Estado: automático","controls.studioRouting.state.pinned":"Estado: Studio fixo","controls.studioRouting.saving":"Aplicando…","controls.studioRouting.applied":"Aplicado","controls.studioRouting.failed":"Falha ao aplicar","controls.studioRouting.pinnedUnavailable":"Conecte um Studio para usar o modo Studio fixo.","controls.studioRouting.helpLabel":"Como funciona o roteamento do Studio","controls.studioRouting.helpButton":"Como funciona?","controls.studioRouting.selectTarget":"Selecionar Studio fixo","controls.studioRouting.select":"Selecionar","controls.studioRouting.targetGroupLabel":"Destino do Studio fixo","controls.luauValidation.title":"Verificação de sintaxe Luau","controls.luauValidation.settingLabel":"Verificar automaticamente após editar Scripts","controls.luauValidation.benefit":"Depois que a IA editar um Script, verifique se há erros de sintaxe Luau.","controls.luauValidation.state.on":"Estado: ligada","controls.luauValidation.state.off":"Estado: desligada","controls.luauValidation.priority":"Se uma solicitação da IA for diferente desta opção, a configuração do Dashboard será usada. Ligue ou desligue aqui para mudar como as edições são verificadas.","controls.luauValidation.switchLabel":"Verificação automática após editar Scripts","controls.luauValidation.saving":"Salvando…","controls.luauValidation.applied":"Aplicado","controls.luauValidation.failed":"Falha ao aplicar","controls.luauValidation.helpLabel":"Como funciona a verificação automática de sintaxe Luau","controls.luauValidation.helpButton":"Como funciona?","controls.luauValidation.help.behavior":"Quando ligada, depois que a IA substituir, editar, inserir ou excluir linhas, a WEPPY verifica todo o código que foi realmente salvo. Quando desligada, apenas o Script é editado e a verificação automática não é executada.","controls.luauValidation.help.response":"Se o Script estiver correto, a resposta curta habitual é mantida. A WEPPY só mostra detalhes quando encontra um erro ou não consegue concluir a verificação. Scripts grandes podem demorar um pouco mais.","controls.luauValidation.help.nonBlocking":"Se a WEPPY encontrar um erro de sintaxe ou não conseguir concluir a verificação, a alteração salva no Script não será desfeita. O resultado ajuda a IA a corrigir o mesmo Script imediatamente.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Há mais de uma janela do Studio conectada com o mesmo Place ID. Use o Studio ID para indicar esse local.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Solicitações com Studio ID, Connection ID ou Place ID ignoram esta prioridade e seguem para o Studio indicado.","controls.studioRouting.state.currentTarget":"Destino prioritário atual","controls.studioRouting.noPriorityTarget":"Nenhum Studio conectado","controls.studioRouting.help.auto":"Automático usa o Studio ativo de maior prioridade com base nos comandos recentes e na ordem de conexão.","controls.studioRouting.help.pinned":"Studio fixo usa o Studio selecionado quando a solicitação não informa um identificador de destino.","sync.migration.title":"Atualização do formato de Sync disponível","sync.migration.description":"Revise as mudanças de metadados antes de atualizar este Place do formato Sync v2 para v3.","sync.migration.status.ready":"Pronto para revisar","sync.migration.status.blocked":"Bloqueado","sync.migration.preview":"Revisar mudanças","sync.migration.summary.add":"Adicionar","sync.migration.summary.modify":"Modificar","sync.migration.summary.delete":"Excluir","sync.migration.summary.blocked":"Bloqueado","sync.migration.changes":"Mudanças de metadados","sync.migration.blockers":"Itens a resolver","sync.migration.operation.add":"adicionar","sync.migration.operation.modify":"modificar","sync.migration.operation.delete":"excluir","sync.migration.reason.serializer_regeneration":"Regrava os metadados no formato padrão v3.","sync.migration.reason.volatile_metadata_removal":"Remove metadados temporários de Sync.","sync.migration.reason.redundant_empty_metadata":"Remove metadados vazios redundantes.","sync.migration.reason.runtime_ignore_policy":"Atualiza a política gerenciada de exclusão do runtime.","sync.migration.reason.reverse_pending":"Aplique ou descarte primeiro as mudanças locais pendentes para o Studio.","sync.migration.reason.conflict":"Resolva primeiro o conflito entre os arquivos locais e o Studio.","sync.migration.reason.local_canonical_change":"Revise primeiro os metadados padrão modificados localmente.","sync.migration.reason.source_mutation_detected":"Um arquivo de origem do usuário mudou durante a validação.","sync.migration.blocked":"Resolva os conflitos de Sync antes de atualizar","sync.migration.stale":"A prévia mudou. Revise a diferença mais recente.","sync.migration.error":"Não foi possível atualizar o formato de Sync. Tente novamente.","sync.migration.refresh":"Atualizar prévia","sync.migration.refreshing":"Atualizando…","sync.migration.applying":"Aplicando…","sync.migration.apply":"Aplicar atualização","sync.migration.confirm.title":"Aplicar a atualização do formato de Sync?","sync.migration.confirm.message":"Os metadados de Sync listados serão copiados e atualizados. Seus arquivos de origem Luau não serão alterados.","changelog.ownership.showGenerated":"Mostrar metadados gerados","changelog.ownership.userSource":"Código do usuário","changelog.ownership.canonicalMirror":"Metadados do espelho","changelog.ownership.generated":"Gerado","uiStudio.analysis.verdict.incomplete":"Evidências de revisão incompletas","uiStudio.analysis.issueSummary.incomplete":"Não há sugestões, mas as revisões de interação e responsividade ainda estão pendentes.","uiStudio.analysis.coverageDimensions":"Cobertura da revisão","uiStudio.analysis.coverageStatus.completed":"Concluída","uiStudio.analysis.coverageStatus.failed":"Falhou","uiStudio.analysis.coverageStatus.skipped":"Ignorada","uiStudio.history.row.readinessIncomplete":"Prontidão: evidências incompletas","uiStudio.noSuggestionsIncomplete":"Não há sugestões, mas parte da cobertura de revisão ainda está ausente.","uiStudio.readiness.summary":"Prontidão da UI","uiStudio.primaryVisual.label":"Tela principal","uiStudio.primaryVisual.recompose":"Recompor","uiStudio.primaryVisual.refine":"Refinar","uiStudio.primaryVisual.approved":"Aprovada","uiStudio.primaryVisual.unknown":"Desconhecida","uiStudio.functional.label":"Funcional","uiStudio.functional.safe":"Segura","uiStudio.functional.risk":"Risco encontrado","uiStudio.functional.unknown":"Desconhecido","uiStudio.functional.safeCompact":"Função segura","uiStudio.functional.riskCompact":"Risco funcional","uiStudio.functional.unknownCompact":"Função desconhecida","uiStudio.responsive.label":"Responsiva","uiStudio.responsive.recommended":"Recomendada","uiStudio.responsive.required":"Obrigatória","uiStudio.responsive.unknown":"Desconhecida","uiStudio.responsive.recommendedCompact":"Responsiva recomendada","uiStudio.responsive.requiredCompact":"Responsiva obrigatória","uiStudio.responsive.unknownCompact":"Responsiva desconhecida","uiStudio.readiness.ready":"Pronta","uiStudio.readiness.reviewRequired":"Revisão necessária","uiStudio.readiness.insufficient":"Evidências incompletas","uiStudio.readiness.unknown":"Prontidão desconhecida","uiStudio.criticSummary":"Resumo da revisão","playtest.history.kind.structured":"Estruturado","playtest.history.kind.legacy":"Legado","playtest.history.kind.attention":"Requer atenção","playtest.summary.title":"Resumo da execução","playtest.summary.status":"Status","playtest.summary.mode":"Modo","playtest.summary.duration":"Duração","playtest.summary.cleanup":"Limpeza","playtest.dimension.title":"Dimensões de evidência","playtest.dimension.hint":"As evidências obrigatórias estão marcadas.","playtest.dimension.server":"Servidor","playtest.dimension.clientUi":"UI do cliente","playtest.dimension.interaction":"Interação","playtest.dimension.visual":"Visual","playtest.dimension.required":"Obrigatória","playtest.dimension.optional":"Opcional","playtest.dimension.steps":"Etapas","playtest.steps.title":"Linha do tempo das etapas","playtest.steps.expected":"Esperado","playtest.steps.observed":"Observado","playtest.steps.evidence":"Evidência","playtest.steps.server":"Servidor","playtest.steps.details":"detalhes","playtest.capability.title":"Recursos e limites","playtest.capability.semanticUi":"Snapshot semântico da UI","playtest.capability.virtualInput":"Entrada virtual","playtest.capability.fixedBootstrap":"Inicialização fixa do Agent","playtest.capability.projectAdapter":"Adaptador de teste do projeto","playtest.capability.available":"Disponível","playtest.capability.unavailable":"Indisponível","playtest.limitations.title":"Limitações","playtest.artifacts.title":"Artefatos","playtest.result.status.passed":"Aprovado","playtest.result.status.failed":"Falhou","playtest.result.status.timedOut":"Tempo esgotado","playtest.result.status.cancelled":"Cancelado","playtest.result.status.insufficientEvidence":"Evidência insuficiente","playtest.result.status.unavailable":"Indisponível","playtest.result.status.skipped":"Ignorado","playtest.result.status.notRequested":"Não solicitado","playtest.result.status.unknown":"Desconhecido","playtest.record.incomplete":"O resultado estruturado está incompleto","playtest.record.corrupt":"O resultado estruturado está danificado","playtest.record.unsupported":"A versão do resultado estruturado não é compatível","playtest.record.unavailable":"Os detalhes do resultado estão indisponíveis.","playtest.sample.terminal":"Todas as evidências obrigatórias foram aprovadas","playtest.sample.limit.visual":"A captura de tela do Play não está disponível na sessão estruturada v1","playtest.history.agents":"Agents","playtest.history.agentCounts":"Servidor {server} · Cliente {client}","playtest.agents.title":"Agents de teste","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Evidência visual indisponível — Capturas do Play não são compatíveis com a sessão estruturada v1.","playtest.limitations.virtualInputUnavailable":"A entrada virtual está indisponível para esta sessão.","playtest.limitations.visualUnsupportedReason":"Capturas do Play não são compatíveis com a sessão estruturada v1.","playtest.dimension.reason.missing":"Faltam evidências obrigatórias.","playtest.dimension.reason.capability":"O recurso obrigatório está indisponível.","playtest.artifacts.metadata":"Metadados do resultado"},Ky={"sidebar.overview":"概要","sidebar.changelog":"変更履歴","sidebar.connection":"接続","sidebar.sync":"同期","sidebar.playtest":"プレイテスト","sidebar.tools":"ツール","sidebar.settings":"設定","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP サーバーへの接続が必要です。","sidebar.gate.l2":"Roblox Studio プラグインへの接続が必要です。","header.currentProject":"現在のプロジェクト","header.unknownProject":"不明なプロジェクト","header.projectRoot.label":"Project Root","header.currentProject.loading":"プロジェクトルートを読み込み中...","header.currentProject.unavailable":"プロジェクトルートを読み込めません","header.placeNotConnected":"プレイス未接続","header.currentProject.tooltip":"現在選択されているプロジェクトフォルダです。","header.currentProject.loading.tooltip":"プロジェクトルート情報をまだ読み込み中です。","header.currentProject.unavailable.tooltip":"現在のプロジェクトルート情報を読み込めません。","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root を読み込み中...","header.currentProjectSyncRoot.unavailable":"Sync root 情報を読み込めません","header.currentProjectSyncRoot.tooltip":"選択中のプロジェクトに対応する現在の sync root フォルダです。","header.currentProjectSyncRoot.loading.tooltip":"Sync root 情報をまだ読み込み中です。","header.currentProjectSyncRoot.unavailable.tooltip":"現在の sync root 情報を読み込めません。","header.testFiles.label":"Test Files","header.testFiles.unavailable":"テストファイルのパスを確認できません。","header.testFiles.tooltip":"選択した place の現在の playtest ファイルディレクトリです。","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"プラグイン接続が必要です","header.places.liveRequired":"現在の active place を確認するにはプラグイン接続が必要です。","header.place.tooltip":"接続中の Roblox プレイスです。","header.placeNotConnected.tooltip":"プレイス未接続","placeScope.current.label":"現在の Place","placeScope.lastActive.label":"最後にアクティブだった Place","placeScope.selected.label":"選択中の Place","placeScope.unknownPlace":"不明な Place","placeScope.live":"ライブ","placeScope.stored":"保存済み","placeScope.pluginRequired":"プラグインが必要","placeScope.pluginRequired.note":"ライブのアクティブ Place を確認するには WEPPY Plugin を接続してください。","placeScope.noPlace.label":"Place スコープ","placeScope.noPlace.value":"まだ Place データがありません","placeScope.noPlace.badge":"Place なし","placeScope.noPlace.note":"WEPPY Plugin を接続して Place を同期すると、Place ごとのデータが作成されます。","placeScope.selected.note":"保存済みデータのみ表示しています。Studio のルーティングは変更されません。","placeScope.surface.sync":"同期ステータスとログはこの Place を使用します。","placeScope.surface.changelog":"変更履歴セッションはこの Place を使用します。","placeScope.surface.playtest":"プレイテストレポートはこの Place を使用します。","placeScope.surface.uiStudio":"UI キャプチャと変更履歴はこの Place を使用します。","placeScope.surface.tools":"ツール履歴と統計はこの Place を使用します。","placeScope.loading":"Place スコープを読み込み中...","placeScope.unavailable":"Place スコープを使用できません","placeScope.selector.label":"Place データ","header.changeProjectRoot":"プロジェクトルートを変更","header.changeProjectRoot.ariaLabel":"プロジェクトルートを変更","header.changeProjectRoot.tooltip":"現在の project root を変更します。","header.changeProjectRoot.disabledTooltip.l0":"プロジェクトルートを変更するには、まず MCP サーバー接続が必要です。","header.changeProjectRoot.disabledTooltip.loading":"プロジェクトルート情報をまだ読み込み中です。","header.changeProjectRoot.disabledTooltip.unavailable":"現在のプロジェクトルート情報を読み込めません。","header.projectRootModal.initial.title":"プロジェクトルートを変更","header.projectRootModal.initial.body.connected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、現在の Studio 内容が新しい <selected project folder>/weppy-project-sync にフル再同期されます。","header.projectRootModal.initial.body.disconnected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、<selected project folder>/weppy-project-sync を次の sync 対象として使用します。","header.projectRootModal.initial.nextSyncRoot":"選択後の新しい sync 先","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"現在の sync は直ちに停止します。","header.projectRootModal.initial.warningFreshSync":"現在の Studio 内容を基準に、新しい対象へ fresh full sync が作成されます。","header.projectRootModal.initial.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.initial.warningDeferredSync":"Studio が未接続の場合、full resync は次回 plugin 接続時に開始されます。","header.projectRootModal.confirm.title":"新しいプロジェクトルートを確認","header.projectRootModal.confirm.body":"適用前に選択したプロジェクトフォルダを確認してください。","header.projectRootModal.confirm.projectRoot":"選択したプロジェクトフォルダ","header.projectRootModal.confirm.syncRoot":"新しい sync 先","header.projectRootModal.confirm.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.pick":"フォルダを選択","header.projectRootModal.apply":"変更を適用","header.projectRootModal.cancel":"キャンセル","header.projectRootModal.error":"プロジェクトルートを変更できませんでした。","status.online":"オンライン","status.offline":"オフライン","status.idle":"待機中","status.syncing":"同期中","status.error":"エラー","status.initializing":"初期化中","level.l0.title":"サーバー切断","level.l0.message":"WEPPY Dashboard は開いていますが、MCPサーバーが停止したか応答していません。","level.l1.title":"サーバー接続済み","level.l1.hint":"確認: Roblox Studioは実行中?プラグインはインストール済み?","level.l2.ok":"Studio接続済み","tier.basic":"Basic","tier.basic.tooltip":"標準のWEPPY Dashboard機能を提供するBasicティアです。","tier.pro":"Pro","tier.pro.tooltip":"すべてのWEPPY Dashboard機能を提供するProティアです。","tier.mixed":"混合","tier.upgrade":"Proを確認","tier.banner.save":"ProでAIトークンを節約!","tier.tool.query_instances.desc":"インスタンス照会、子孫探索、クラス情報、名前・クラス検索。Pro: ファイルツリー、プロジェクト構造、プロパティ・タグ検索。","tier.tool.mutate_instances.desc":"インスタンスの作成、削除、複製、移動、名前変更、ピボット。Pro: ツリー作成、一括作成・削除・複製。","tier.tool.manage_properties.desc":"プロパティ、属性、タグの取得・設定。Pro: 計算・相対値設定、一括取得・設定、子の一括変更。","tier.tool.manage_scripts.desc":"スクリプトソースの読取・書込・作成・削除・行編集・検索。Pro: スクリプト間一括置換。","tier.tool.manage_ui.desc":"Pro専用。ゲームらしいメニュー、HUD、ボタン、ラベル、画像パネルを作成・改善し、画面キャプチャと改善提案を確認します。","tier.tool.manage_ui.action.design_brief":"UIの方向性を整理","tier.tool.manage_ui.action.create_tree":"新しいUIを作成","tier.tool.manage_ui.action.update":"既存UIを更新","tier.tool.manage_ui.action.delete":"UIを削除","tier.tool.manage_ui.action.preview":"UI画面をキャプチャ","tier.tool.manage_ui.action.check":"改善提案を確認","tier.tool.manage_lighting.desc":"Pro専用。照明、大気、空、テレイン属性、時間帯の環境設定。","tier.tool.manage_selection.desc":"選択の取得、設定、解除。Pro: コンテキスト、詳細、項目の追加・削除、変更監視。","tier.tool.manage_camera.desc":"カメラ情報取得、パスまたは座標でフォーカス、推奨ビュー提案。","tier.tool.manage_tween.desc":"Pro専用。滑らかなアニメーションのためのトゥイーン作成、再生、一時停止、キャンセル。","tier.tool.manage_audio.desc":"Pro専用。サウンドの再生、停止、一時停止、再開。オーディオリスナー設定。","tier.tool.manage_animation.desc":"Pro専用。アニメーションのロード、再生、停止。ヒューマノイド・コントローラーのトラック照会。","tier.tool.manage_physics.desc":"Pro専用。物理衝突グループの登録、グループ間衝突設定、一覧照会。","tier.tool.manage_effects.desc":"Pro専用。パーティクル放出、全消去、エフェクト有効化トグル。","tier.tool.manage_terrain.desc":"Pro専用。図形充填、領域消去、マテリアル置換、色管理、ボクセル読書、手続き生成、スムージング。","tier.tool.spatial_query.desc":"Pro専用。レイキャスト、地面検索、配置確認、領域スキャン、平地・スポーン位置探索、歩行分析、空間マップ、衝突確認。","tier.tool.manage_assets.desc":"Pro専用。モデル挿入、アセット情報照会、クリエイターストア検索、無料モデル・パッケージ挿入、エクスポート。","tier.tool.manage_sync.desc":"Pro専用。同期状態、設定、履歴、方向設定、同期ファイル読書。","tier.tool.workspace_state.desc":"Pro専用。フル同期、スナップショット、最近の変更、ビューポート情報、メタデータ、キャッシュ管理。","tier.tool.manage_logs.desc":"出力ログのフィルタリング照会、増分ポーリング、バッファ消去、最近のエラー照会。","tier.tool.system_info.desc":"接続状態、使用ティア確認。Pro: プレイス情報、サービス一覧、Studio設定、プレイテスト制御、自動テスト。","tier.tool.manage_studio.desc":"Pro専用。スクリーンショットやQAのためにUIプレビューなどStudioエディタの表示設定を切り替えます。ゲーム内UIオブジェクトは変更しません。","tier.tool.batch_execute.desc":"Pro専用。複数コマンドを一括実行。順次処理、エラー時続行オプション。","tier.tool.execute_luau.desc":"Pro専用。Roblox Studioサンドボックスで任意のLuauコードを実行。","connection.server.title":"Bridgeステータス","connection.server.version":"バージョン","connection.server.version.tooltip":"WEPPY Bridgeランタイムのバージョンです。","connection.server.pid":"PID","connection.server.pid.tooltip":"OSが使用するプロセス識別子です。","connection.server.uptime":"稼働時間","connection.server.uptime.tooltip":"WEPPY Bridgeの起動後に経過した時間です。","connection.server.session":"セッション","connection.server.session.tooltip":"現在のWEPPY Bridgeセッション識別子です。","connection.server.exec":"実行ファイル","connection.server.exec.tooltip":"WEPPY Bridgeを起動した実行ファイルのパスです。","connection.reconnect":"再接続","connection.checkSettings":"設定を確認","connection.agents.title":"AIエージェント","connection.agents.name":"エージェント","connection.agents.version":"バージョン","connection.agents.version.tooltip":"このエージェントセッションの MCP Adapter パッケージバージョンです。","connection.agents.cwd":"作業ディレクトリ","connection.agents.cwd.tooltip":"接続中のAIエージェントの現在の作業ディレクトリです。","connection.agents.projectRoot":"プロジェクトルート","connection.agents.projectRoot.tooltip":"同期オーナーシップの権威あるプロジェクトパス","connection.agents.projectRoot.unresolved":"未解決","connection.agents.connected":"接続時刻","connection.agents.unknown":"不明","connection.agents.none":"接続中のエージェントなし","connection.plugins.title":"プラグイン","connection.plugins.place":"プレイス","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"最終確認","connection.plugins.lastSeen.tooltip":"プラグインから最後に受信したハートビート時刻です。","connection.plugins.version":"バージョン","connection.plugins.version.tooltip":"Studioが報告したインストール済みプラグインのバージョンです。","connection.plugins.none":"接続中のプラグインなし","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test 接続","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"各AIエージェントは専用のMCP Adapterを介して1つの共有WEPPY Bridgeに接続し、BridgeがRoblox Studioとの接続を維持します。","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"接続ログ","connection.log.empty":"イベントなし","connection.time.secondsAgo":"秒前","connection.time.minutesAgo":"分前","connection.time.hoursAgo":"時間前","common.loading":"読み込み中...","common.retry":"再試行","common.reconnecting":"再接続中...","common.expand":"展開","common.collapse":"折りたたむ","tools.tab.history":"履歴","tools.tab.statistics":"統計","tools.tab.failures":"失敗","tools.col.time":"時刻","tools.col.time.tooltip":"ツール実行が記録された時刻です。","tools.col.toolAction":"ツール.アクション","tools.col.toolAction.tooltip":"実行されたツール名とアクションです。","tools.col.duration":"所要時間","tools.col.duration.tooltip":"ツール完了までにかかった時間です。","tools.col.status":"ステータス","tools.col.status.tooltip":"記録されたツール実行の結果です。","tools.col.tier":"ティア","tools.col.tier.tooltip":"そのツールまたはアクションに必要なライセンスティアです。","tools.col.tierStats.tooltip":"ツール統計行がBasic、Pro、Mixedのどれに当たるかを示します。","tools.col.tool":"ツール","tools.col.tool.tooltip":"統計テーブルに表示される統合ツール名です。","tools.col.calls":"呼び出し数","tools.col.calls.tooltip":"このツールで記録された総呼び出し回数です。","tools.col.ok":"OK","tools.col.ok.tooltip":"直接成功した実行回数です。","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 実行で成功した回数です。","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback なしでブロックされた実行回数です。","tools.col.warn":"WARN","tools.col.warn.tooltip":"入力、プロジェクト状態、Roblox ポリシー、ユーザーコードに起因する想定内の失敗回数です。","tools.col.err":"失敗","tools.col.err.tooltip":"失敗で終了した実行回数です。","tools.col.okRate":"成功率","tools.col.okRate.tooltip":"正常に完了した呼び出しの割合です。","tools.col.avgTime":"平均時間","tools.col.avgTime.tooltip":"記録された呼び出し全体の平均実行時間です。","tools.col.error":"エラー","tools.filter.tool":"ツール","tools.filter.all":"すべて","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"この項目はPro専用のツールまたはアクションを使用しました。","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"要求したProアクションがBasic fallbackで成功しました。","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"要求したProアクションはブロックされ、fallbackも実行されませんでした。","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"入力、プロジェクト状態、ポリシー、ユーザーコードに起因する想定内の失敗です。","tools.badge.err":"失敗","tools.badge.err.tooltip":"ツール実行が失敗で終了しました。","tools.status.ok":"OK","tools.status.ok.tooltip":"ツール実行が正常に完了しました。","tools.tier.mixed.tooltip":"このツールにはBasicとProのアクションが両方含まれます。","tools.detail.params":"パラメータ","tools.detail.params.tooltip":"このツール実行に渡された入力パラメータです。","tools.detail.result":"結果","tools.detail.result.tooltip":"このツール実行から返された結果ペイロードです。","tools.detail.requestedCommand":"送信したコマンド","tools.detail.executedCommand":"実行コマンド","tools.detail.alternatives":"代替候補","tools.detail.blockedMessage":"ブロック理由","tools.detail.noFallback":"Fallback なし","tools.detail.noFallback.value":"実行された fallback はありません。","tools.detail.warningMessage":"警告メッセージ","tools.detail.errorMessage":"エラーメッセージ","tools.detail.open":"詳細","tools.detail.openLabel":"{command} の詳細を表示","tools.detail.dialogLabel":"ツール実行の詳細","tools.detail.title":"ツール実行","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"履歴を削除しますか?","tools.clear.history.message":"現在の place のツール履歴を完全に削除します。","tools.clear.statistics.title":"統計を削除しますか?","tools.clear.statistics.message":"現在の place のツール統計を完全にリセットします。","tools.detail.error":"エラー","tools.page.prev":"前へ","tools.page.prev.tooltip":"ツール履歴の前のページへ移動します。","tools.page.next":"次へ","tools.page.next.tooltip":"ツール履歴の次のページへ移動します。","tools.empty.history":"履歴なし","tools.empty.stats":"ツール統計なし","tools.empty.failures":"失敗なし","tools.summary.total":"合計","tools.summary.calls":"呼び出し","tools.summary.sessions":"セッション","settings.license.title":"ライセンス","settings.license.title.tooltip":"現在のライセンス状態とサブスクリプションティアです。","settings.license.status":"ステータス","settings.license.status.tooltip":"現在のライセンス有効化状態です。","settings.license.tier":"ティア","settings.license.tier.tooltip":"利用できるWEPPY Dashboard機能を決める現在のサブスクリプションティアです。","settings.license.key":"キー","settings.license.key.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.keyValue.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.provider":"プロバイダー","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.providerValue.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.active":"有効","settings.license.active.tooltip":"現在のライセンス有効化状態です。","settings.license.status.activeCancelPending.tooltip":"解約は予約済みですが、現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.inactive":"無効","settings.license.inactive.tooltip":"現在のライセンス有効化状態です。","settings.license.expired":"期限切れ","settings.license.expired.tooltip":"現在のライセンス有効化状態です。","settings.license.unavailable":"ライセンス情報を取得できません","settings.license.detail.cancelPending":"解約が予約されました。現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.reset":"ライセンスをリセット","settings.readOnly":"読み取り専用","settings.readOnly.tooltip":"このセクションの値はWEPPY Dashboardから編集できません。","settings.unavailable":"設定を取得できません","settings.general.title":"一般設定","settings.general.title.tooltip":"変更すると即時反映されるHot設定です。","settings.general.liveApply":"即時反映","settings.general.liveApply.tooltip":"このセクションの変更は別の保存ボタンなしですぐ適用されます。","settings.general.applied":"適用済み","settings.general.logLevel":"ログレベル","settings.general.logLevel.tooltip":"WEPPY Dashboardログに出力する詳細度を設定します。","settings.general.localHistory":"ツール履歴記録","settings.general.localHistory.tooltip":"WEPPY Dashboard履歴画面用にローカルのツール実行履歴を保存します。","settings.general.localStatistics":"ツール統計収集","settings.general.localStatistics.tooltip":"WEPPY Dashboard表示用にローカル利用統計を集計します。","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"操作タイムアウト","settings.general.requestTimeout.tooltip":"操作を失敗扱いにするまでWEPPY Dashboardが待機する最大時間です。","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"操作タイムアウトの単位はミリ秒です。","settings.cold.title":"サーバー環境変数","settings.cold.title.tooltip":"サーバー起動時に読み込まれる読み取り専用の環境変数です。","settings.cold.httpPort.tooltip":"MCPWEPPY DashboardHTTPサーバーが使用するポート番号です。","settings.cold.httpHost.tooltip":"MCPWEPPY DashboardHTTPサーバーがバインドするホストインターフェースです。","settings.cold.hint":"環境変数で設定してください。","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"MCPサーバー起動時のWEPPY Dashboardの動作を選択します。","settings.dashboard.nextStartBadge":"次回起動から","settings.dashboard.autoOpen.label":"WEPPY起動時にDashboardを開く","settings.dashboard.autoOpen.description":"MCPサーバーの起動後にこのDashboardを自動で開きます。","settings.dashboard.autoOpen.nextStart":"次回のMCPサーバー起動時から適用されます。","settings.dashboard.settingsFile.label":"設定ファイル","settings.dashboard.agentExample.label":"Agentへの依頼例","settings.dashboard.agentExample.prompt":"「Dashboardの自動起動をオフにして」","settings.dashboard.autoOpen.saving":"保存中…","settings.dashboard.autoOpen.saved":"次回のサーバー起動用に保存しました。","settings.dashboard.autoOpen.error":"保存できなかったため、以前の設定に戻しました。","dashboardAutoOpenGuide.eyebrow":"Dashboard設定","dashboardAutoOpenGuide.title":"WEPPY Dashboardの開き方を選択してください","dashboardAutoOpenGuide.currentOn":"自動起動は現在オンです。MCPサーバーの起動後にこのDashboardが開きます。","dashboardAutoOpenGuide.currentOff":"自動起動は現在オフです。MCPサーバーの起動時に新しいDashboardタブは開きません。","dashboardAutoOpenGuide.changeAnytime":"Settingsでいつでも変更できます。","dashboardAutoOpenGuide.agentHint":"Agentに「Dashboardの自動起動をオフにして」と依頼することもできます。","dashboardAutoOpenGuide.statusOn":"自動起動 オン","dashboardAutoOpenGuide.statusOff":"自動起動 オフ","dashboardAutoOpenGuide.keep":"現在の設定を維持","dashboardAutoOpenGuide.turnOff":"自動起動をオフにする","dashboardAutoOpenGuide.openSettings":"Settingsを開く","dashboardAutoOpenGuide.close":"自動起動の案内を閉じる","dashboardAutoOpenGuide.saving":"保存中…","dashboardAutoOpenGuide.error":"選択を保存できませんでした。もう一度お試しください。","settings.language.title":"言語","settings.language.title.tooltip":"WEPPY DashboardUIテキストの表示言語を選択します。","settings.language.dashboard":"WEPPY Dashboard言語","settings.language.dashboard.tooltip":"Autoではシステム言語を使い、それ以外では選択した言語を強制します。","settings.language.auto":"自動","overview.l0.title":"MCPサーバー切断","overview.l0.message":"MCPサーバーが応答していません。WEPPY Dashboardが自動的に再接続を試みます。","overview.l0.step1":"MCPサーバープロセスが実行中か確認してください","overview.l0.step2":"必要に応じてMCPサーバーコマンドを再起動してください","overview.l0.reconnecting":"3秒ごとに自動再接続中...","overview.l0.reconnectBtn":"再接続","overview.l0.settingsBtn":"設定を確認","overview.l1.pluginGuide":"Roblox Studioプラグインが接続されていません","overview.l1.check1":"Roblox Studioは実行中ですか?","overview.l1.check2":"WEPPY Pluginはインストール済みですか?","overview.l1.feedHint":"プラグインが接続されると変更がここに表示されます","overview.metric.server":"サーバー","overview.metric.server.tooltip":"MCPサーバーの実行状態とプロセス状態です。","overview.metric.plugin":"プラグイン","overview.metric.plugin.tooltip":"Roblox Studioプラグインの接続状態とバージョン情報です。","overview.metric.agent":"エージェント","overview.metric.agent.tooltip":"接続中のAIコーディングエージェントと現在の実行状態です。","overview.metric.agent.instancesUnit":"インスタンス","overview.metric.sync":"同期","overview.metric.sync.tooltip":"現在のStudioとローカルファイル間の同期状態です。","overview.metric.noAgent":"エージェントなし","overview.meta.version":"バージョン","overview.meta.version.tooltip":"インストールされているMCPサーバーのバージョンです。","overview.meta.session":"セッション","overview.meta.session.tooltip":"現在のMCPセッション識別子です。","overview.meta.pid":"PID","overview.meta.pid.tooltip":"OSが使用するプロセス識別子です。","overview.meta.uptime":"稼働時間","overview.meta.uptime.tooltip":"MCPサーバーの起動後に経過した時間です。","overview.feed.title":"最近のゲーム変更","overview.feed.empty":"最近の変更なし","overview.changelog.title":"セッション変更サマリー","overview.changelog.entries":"合計","overview.changelog.scripts":"スクリプト","overview.changelog.instances":"インスタンス","overview.changelog.properties":"プロパティ","overview.changelog.assets":"アセット","overview.tier.title":"ティア使用状況","changelog.subtitle":"ゲーム変更履歴","changelog.filter.all":"すべて","changelog.filter.active":"アクティブ","changelog.filter.completed":"完了","changelog.empty":"変更履歴がありません","changelog.basic.limit.title":"Basicプレビューでは最新3セッションのみ表示されます","changelog.basic.limit.body":"Proにアップグレードすると、このプレイスの完全な変更履歴タイムラインを確認できます。","changelog.basic.metricLabel":"表示中の変更履歴 / 全体","changelog.basic.visible":"表示中","changelog.basic.total":"全体","changelog.card.active":"アクティブ","changelog.card.active.tooltip":"このセッションはまだ新しいゲーム変更を受信しています。","changelog.card.completed":"完了","changelog.card.completed.tooltip":"このセッションは終了しており、これ以上変更は追加されません。","changelog.card.bootstrapStatus":"初期化","changelog.card.bootstrapStatus.tooltip":"このセッションには初期同期ブートストラップのスナップショットのみが含まれます。","changelog.card.inProgress":"進行中","changelog.card.noChanges":"変更なし","changelog.card.noChanges.tooltip":"このセッションではまだ抽出されたゲーム変更がありません。","changelog.card.bootstrapSummary":"初期同期スナップショット","changelog.card.bootstrapSummary.tooltip":"初期ファイル同期の書き込みは 1 件のブートストラップスナップショット行にまとめられます。","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"スクリプト","changelog.card.scripts.tooltip":"このセッションで発生したスクリプト変更です。","changelog.card.instances":"インスタンス","changelog.card.instances.tooltip":"このセッションで発生したインスタンスの作成、削除、移動、複製です。","changelog.card.modified":"変更","changelog.card.created":"作成","changelog.card.deleted":"削除","changelog.card.moved":"移動","changelog.card.propertiesChanged":"プロパティ変更","changelog.card.propertiesChanged.tooltip":"このセッションで記録されたプロパティ値の変更です。","changelog.card.lightingConfigured":"ライティング設定済み","changelog.card.lightingConfigured.tooltip":"このセッションでライティングまたは大気設定が変更されました。","changelog.card.terrainConfigured":"テレイン設定済み","changelog.card.terrainConfigured.tooltip":"このセッションでテレインデータまたはテレイン設定が変更されました。","changelog.card.assetsInserted":"アセット挿入","changelog.card.assetsInserted.tooltip":"このセッション中にプレイスへ挿入されたアセットです。","changelog.category.script":"スクリプト","changelog.category.instance":"インスタンス","changelog.category.property":"プロパティ","changelog.category.lighting":"ライティング","changelog.category.terrain":"テレイン","changelog.category.asset":"アセット","changelog.detail.dialogLabel":"変更履歴の詳細","changelog.detail.changeSummary":"変更サマリー","changelog.detail.changeSummary.tooltip":"このセッションで抽出されたゲーム変更数をカテゴリ別に表示します。","changelog.detail.changeTimeline":"変更タイムライン","changelog.detail.changeTimeline.tooltip":"このセッションで抽出されたゲーム変更を時系列で表示します。","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"変更前後の比較","changelog.detail.filterCategory":"カテゴリ","changelog.detail.filterCategory.tooltip":"タイムラインを 1 つの変更カテゴリに絞り込みます。","changelog.detail.confidence.exact":"正確","changelog.detail.confidence.exact.tooltip":"この変更は変更前と変更後の状態が両方確認されています。","changelog.detail.confidence.partial":"部分確認","changelog.detail.confidence.partial.tooltip":"この変更は変更前後の状態の一部のみ確認されています。","changelog.detail.confidence.afterOnly":"結果のみ確認","changelog.detail.confidence.afterOnly.tooltip":"この変更は適用後の結果状態のみ確認されています。","changelog.detail.confidence.intentOnly":"意図のみ記録","changelog.detail.confidence.intentOnly.tooltip":"要求された操作意図のみが記録され、結果状態は確認されていません。","changelog.detail.confidence.unknown":"不明","changelog.detail.confidence.unknown.tooltip":"利用可能なデータだけではこの変更を確実に分類できませんでした。","changelog.detail.noChanges":"このカテゴリに変更なし","changelog.detail.backToList":"一覧に戻る","changelog.diff.empty":"差分なし","changelog.diff.unified":"統合","changelog.diff.sideBySide":"並列比較","changelog.diff.before":"変更前","changelog.diff.after":"変更後","sync.overlay.title":"Roblox Studioプラグインが必要です","sync.overlay.message":"Roblox Studioプラグインが接続されると同期状態を確認できます。","sync.overlay.check1":"Roblox Studioは実行中ですか?","sync.overlay.check2":"WEPPY Pluginはインストール済みですか?","sync.status.title":"同期ステータス","sync.status.title.tooltip":"このプレイスのStudioとローカルファイルの同期状態です。","sync.status.forwardOnly":"順方向のみ","sync.status.forwardOnly.tooltip":"BasicティアではStudioからローカルへの順方向同期のみ利用できます。","sync.status.place":"プレイス","sync.status.place.tooltip":"接続中のRobloxプレイス名とプレイスIDです。","sync.status.path":"パス","sync.status.path.tooltip":"現在同期出力に使っているローカルファイルシステムのルートです。","sync.status.instances":"インスタンス","sync.status.instances.tooltip":"ローカルミラーで追跡中の同期済みRobloxインスタンス総数です。","sync.status.scripts":"スクリプト","sync.status.scripts.tooltip":"このプレイスで現在インデックスされている同期スクリプトファイル数です。","sync.status.state":"状態","sync.status.state.tooltip":"サーバーが報告した現在の同期ランタイム状態です。","sync.policy.title":"Syncポリシー","sync.policy.title.tooltip":"接続中のStudioプラグインが報告した実効Syncポリシーです。","sync.policy.activation":"有効状態","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"ワークフロー","sync.policy.preset.studio_first":"Studio優先","sync.policy.preset.bidirectional_review":"双方向","sync.policy.preset.local_code_studio_world":"ローカルコード、Studioワールド","sync.policy.preset.custom":"カスタム","sync.policy.apply.title":"ローカル変更をStudioに適用する方法","sync.policy.apply.description":"ローカルでの変更を確認してから適用するか、Studioに自動適用するかを表示します。","sync.policy.apply.content":"コンテンツ変更","sync.policy.apply.content.tooltip":"ローカルで変更したScriptソース、プロパティ、サービスプロパティです。インスタンスの作成、削除、名前変更、移動は構造変更です。","sync.policy.apply.structure":"構造変更","sync.policy.apply.structure.tooltip":"ローカルでのインスタンス作成、削除、名前変更、移動です。ローカル削除の自動適用には、下の別の削除オプションも必要です。","sync.policy.apply.manual":"レビュー後に適用","sync.policy.apply.auto":"自動適用","sync.policy.scope.disclosure":"スコープ別の方向","sync.policy.scope.scriptSource":"スクリプトソース","sync.policy.scope.properties":"プロパティ","sync.policy.scope.structure":"構造","sync.policy.scope.serviceProperties":"サービスプロパティ","sync.policy.endpoint.local":"ローカル","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → ローカル","sync.policy.direction.forward.tooltip":"Studioの変更をローカルファイルに書き込みます。","sync.policy.direction.reverse":"ローカル → Studio","sync.policy.direction.reverse.tooltip":"ローカルファイルの変更をStudioに適用します。","sync.policy.direction.bidirectional":"双方向","sync.policy.direction.bidirectional.tooltip":"Studioからローカルへの変更と、ローカルからStudioへの変更の両方を適用できます。","sync.policy.safety.localDeletes":"ローカル削除 → Studioインスタンス削除","sync.policy.safety.review":"削除前にレビュー","sync.policy.safety.review.tooltip":"ローカルファイルの削除は、対応するStudioインスタンスを削除する前にレビューを待ちます。UI Studioの自動クリーンアップとは別の機能です。","sync.policy.safety.auto":"Studioへ自動削除","sync.policy.safety.auto.tooltip":"ローカルファイルを削除すると、対応するStudioインスタンスが自動的に削除される場合があります。UI Studioの自動クリーンアップとは別の機能です。","sync.policy.reviewRequired":"Syncを開始する前にStudioプラグインでこのポリシーを確認してください。","sync.log.title":"同期ログ","sync.log.empty":"同期イベントなし","sync.log.type.write":"書き込み","sync.log.type.write.tooltip":"新しい同期出力がディスクに書き込まれました。","sync.log.type.update":"更新","sync.log.type.update.tooltip":"既存の同期ファイルまたはインスタンスが更新されました。","sync.log.type.delete":"削除","sync.log.type.delete.tooltip":"同期済みファイルまたはインスタンスが削除されました。","sync.log.type.idle":"待機","sync.log.type.idle.tooltip":"ファイル変更なしで同期イベントのみ記録されました。","sync.upgrade.title":"Proの完全同期機能を確認","sync.upgrade.benefit1":"双方向同期 — ファイルを編集するとStudioに自動反映","sync.upgrade.benefit2":"逆方向同期 — ファイルの変更をStudioに送信","sync.upgrade.benefit3":"完全な同期履歴と詳細な変更ログ","sync.upgrade.buy":"Proを確認","playtest.status.title":"プレイテストステータス","playtest.status.title.tooltip":"Studio が報告した現在の Roblox プレイテストセッション状態です。","playtest.status.mode":"モード","playtest.status.mode.tooltip":"現在のセッションで使われている Studio プレイテスト起動モードです。","playtest.status.mode.value.tooltip":"現在使用中の Roblox Studio プレイテストモードの具体的な値です。","playtest.status.mode.play":"プレイ","playtest.status.mode.run":"実行","playtest.status.mode.server":"サーバー","playtest.status.mode.edit":"編集","playtest.status.place.tooltip":"このプレイテストセッションに関連付けられた Roblox プレイスです。","playtest.status.state.running":"実行中","playtest.status.state.running.tooltip":"現在 Roblox プレイテストセッションが実行中です。","playtest.status.state.paused":"一時停止","playtest.status.state.paused.tooltip":"現在の Roblox プレイテストセッションは一時停止中です。","playtest.status.state.notRunning":"未実行","playtest.status.state.notRunning.tooltip":"現在実行中の Roblox プレイテストセッションはありません。","playtest.control.play":"プレイ","playtest.control.pause":"一時停止","playtest.control.resume":"再開","playtest.control.stop":"停止","playtest.history.title":"テスト履歴","playtest.history.title.tooltip":"このプロジェクトで記録された自動プレイテスト実行履歴です。","playtest.history.empty":"テスト結果なし","playtest.history.mode":"モード","playtest.history.mode.tooltip":"この記録済みテスト実行で使われたプレイテストモードです。","playtest.history.status.passed":"成功","playtest.history.status.failed":"失敗","playtest.history.status.running":"実行中","playtest.history.status.unknown":"不明","playtest.history.status.tooltip":"この自動プレイテスト実行で記録された結果状態です。","playtest.empty.title":"プレイテスト結果がありません","playtest.empty.message":"AIエージェントがPlaytestを実行すると、結果がここに表示されます。","playtest.empty.message.before":"AIエージェントがPlaytestを実行すると、結果がここに表示されます。","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"選択されたレポート","playtest.report.title.tooltip":"現在選択されている自動プレイテスト実行の詳細出力です。","playtest.detail.dialogLabel":"プレイテストレポートの詳細","playtest.detail.loading":"レポートを読み込み中...","playtest.detail.errorTitle":"レポートを表示できません","playtest.report.content":"レポート","playtest.report.content.tooltip":"選択された自動プレイテスト実行の Markdown 要約です。","playtest.report.logs":"ログ","playtest.report.logs.tooltip":"選択された自動プレイテスト実行で収集された実行ログです。","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"レポート内容なし","playtest.basic.icon":"🎮","playtest.basic.title":"プレイテストはPro専用機能です","playtest.basic.desc":"WEPPY Dashboardからプレイテストを制御し、自動テストを実行し、詳細なテストレポートを確認できます。","playtest.basic.benefit1":"ワンクリックのプレイ/一時停止/停止コントロール","playtest.basic.benefit2":"AIエージェントによる自動テスト実行","playtest.basic.benefit3":"成功/失敗追跡付きテスト履歴","playtest.basic.benefit4":"詳細なマークダウンテストレポート","playtest.sample.badge":"Proプレイテスト画面のプレビュー","playtest.sample.title":"現在表示しているのは、Proにアップグレード後に利用できるプレイテスト画面のプレビューです。","playtest.sample.message":"このプレビューはサンプルデータを使用しています。ライブのプレイテスト操作、履歴管理、実際のレポート保存はPro購入後に利用できます。","playtest.sample.clearDisabled":"実際のプレイテスト履歴の削除はProで利用できます。","playtest.sample.place":"アリーナプレビュー","playtest.sample.history.name":"サンプルアリーナスモークテスト","playtest.sample.context.why":"アリーナにスポーンし、開始直後を生き残り、HUDがすぐ反応するか確認します。","playtest.sample.context.expected":"プレイヤーが安全にスポーンし、1秒以内にカウントダウンUIが表示され、最初のウェーブがエラーなく始まること。","playtest.sample.context.observed":"スポーン保護が正常に動作し、HUDは時間どおり更新され、最初のウェーブは回帰なく完了しました。","playtest.sample.report.markdown":`# サンプルアリーナスモークテスト
|
|
110
|
-
|
|
111
|
-
- スポーンフロー: PASS
|
|
112
|
-
- HUDカウントダウン: PASS
|
|
113
|
-
- ウェーブ開始: PASS
|
|
114
|
-
|
|
115
|
-
これはサンプルプレビューです。Proにアップグレードすると、ライブのプレイテスト実行と実際のレポート保存ができます。`,"playtest.sample.report.logs":`[sample] プレイテストプレビュー起動
|
|
116
|
-
[sample] スポーン保護有効
|
|
117
|
-
[sample] hudカウントダウン描画
|
|
118
|
-
[sample] 第1ウェーブ完了
|
|
119
|
-
[sample] プレビュー報告終了`,"sidebar.whatsNew":"新着情報","sidebar.help.group":"ヘルプとフィードバック","sidebar.help.bug":"バグを報告","sidebar.help.bug.tooltip":"ローカル診断バンドルを作成してから、環境情報を事前入力した GitHub のバグ報告を開く","bugReportDialog.title":"diagnostics.zip は原因調査に役立ちます","bugReportDialog.subtitle":"WEPPY がこのコンピューターに診断 zip を作成しました。Studio、プラグイン、Sync、ツール実行ログが含まれ、問題の確認に役立ちます。","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"このファイルがなくてもバグ報告は送信できますが、zip を添付すると原因を早く確認しやすくなります。","bugReportDialog.attachHow":"添付するには zip をダウンロードするか Finder/Explorer で開き、送信前に GitHub issue の Diagnostics ZIP (optional) アップロード欄へ追加してください。","bugReportDialog.download":"1. diagnostics.zip をダウンロード","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub issue を開く","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"zip にはローカルログやプロジェクト情報が含まれることがあります。共有する場合は添付前に内容を確認してください。","sidebar.help.feature":"機能を提案","sidebar.help.feature.tooltip":"GitHub で新機能や改善を提案する","sidebar.help.discussions":"インストール/使い方の相談","sidebar.help.discussions.tooltip":"GitHub Issues でインストール、接続、使い方の相談をする","sidebar.help.troubleshooting":"トラブルシューティングガイド","sidebar.help.troubleshooting.tooltip":"weppyai.com の公式トラブルシューティングガイドを開く","header.whatsNew":"新着情報","header.whatsNew.tooltip":"新着情報","upgrade.title":"Proを確認","upgrade.tagline":"Pro機能を確認","upgrade.cta":"Proを確認","upgrade.licenseShortcut":"ライセンスを入力","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"新着情報","whatsNew.pageSubtitle":"MCPの最新変更をチェック","whatsNew.unreadSection":"未読","whatsNew.allSection":"すべてのお知らせ","whatsNew.empty":"お知らせはまだありません","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"重要","whatsNew.category.release":"リリース","whatsNew.category.notice":"お知らせ","whatsNew.category.deprecation":"非推奨","whatsNew.category.tip":"ヒント","uiStudio.title":"UI Studio","uiStudio.empty":"保存されたスクリーンショットはまだありません。AIエージェントが現在のUI状態をキャプチャすると自動作成されます。","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio プラグインが接続されていません","uiStudio.pluginGuide.message":"UI Studio は、接続された Studio place のスクリーンショットと変更履歴を表示します。Studio と WEPPY Plugin が接続されると自動的に更新されます。","uiStudio.pluginGuide.check1":"Roblox Studio は起動していますか?","uiStudio.pluginGuide.check2":"WEPPY Plugin はインストールされ、実行されていますか?","uiStudio.pluginGuide.waiting":"プラグイン接続を待機中...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"優先確認","uiStudio.priorityLow":"任意改善","uiStudio.highPrioritySection":"優先確認","uiStudio.lowPrioritySection":"任意改善","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"分析","uiStudio.tabs.history":"変更履歴","uiStudio.analysis.reportsTitle":"UI 対象別の最新分析","uiStudio.analysis.recentCapturesTitle":"最近のキャプチャ","uiStudio.analysis.detailDialog":"分析詳細","uiStudio.analysis.targetCountLabel":"分析対象","uiStudio.analysis.captureLabel":"キャプチャ","uiStudio.analysis.verdict.hasSuggestions":"改善提案あり","uiStudio.analysis.verdict.needsFix":"改善提案あり","uiStudio.analysis.verdict.review":"改善提案あり","uiStudio.analysis.verdict.passed":"現在の改善提案なし","uiStudio.analysis.verdictLabel":"改善サマリー","uiStudio.analysis.coverage.structuralOnly":"構造チェックのみ完了","uiStudio.analysis.coverage.visualSkipped":"構造チェック完了 · ビジュアルチェックをスキップ","uiStudio.analysis.coverage.visualFailed":"構造チェック完了 · ビジュアルチェック失敗","uiStudio.analysis.coverage.full":"構造・ビジュアルチェック完了","uiStudio.analysis.coverage.deterministicFailed":"構造チェック失敗","uiStudio.analysis.thresholds":"レビュー基準","uiStudio.analysis.issueSummary.passed":"現在のレビュー基準では、追加の改善提案はありません。","uiStudio.history.title":"変更履歴","uiStudio.history.empty":"まだ変更履歴がありません。AIエージェントがmanage_uiでUIを変更すると自動的に記録されます。","uiStudio.history.loading":"読み込み中...","uiStudio.history.loadingPlace":"現在の Place を読み込み中...","uiStudio.history.noPlace":"現在の Place データはまだありません。UI 変更履歴を表示するには WEPPY Plugin を接続して Place を同期してください。","uiStudio.history.noPlaceAction":"現在の Place はまだ利用できません。","uiStudio.history.error":"エラー","uiStudio.history.clear":"すべて削除","uiStudio.history.filter.actions":"アクション種別","uiStudio.history.filter.actionAll":"すべて","uiStudio.history.filter.actionCreate":"作成","uiStudio.history.filter.actionUpdate":"更新","uiStudio.history.filter.actionDelete":"削除","uiStudio.history.filter.period":"期間","uiStudio.history.filter.dateAll":"すべて","uiStudio.history.filter.today":"今日","uiStudio.history.filter.yesterday":"昨日","uiStudio.history.filter.last7Days":"過去 7 日","uiStudio.history.filter.last30Days":"過去 30 日","uiStudio.history.filter.customRange":"範囲指定","uiStudio.history.filter.reset":"リセット","uiStudio.history.filter.from":"開始","uiStudio.history.filter.to":"終了","uiStudio.history.row.affectedPaths":"パス","uiStudio.history.row.mutations":"変更詳細","uiStudio.history.row.expand":"▾ 展開","uiStudio.history.row.collapse":"▲ 閉じる","uiStudio.history.row.expandDetails":"変更詳細 {n} 件","uiStudio.history.row.collapseDetails":"変更詳細を閉じる","uiStudio.history.row.toggleDetails":"変更詳細を切り替え","uiStudio.history.row.mutationsEmpty":"変更詳細なし","uiStudio.history.row.toolLabel":"UI変更({n}件)","uiStudio.history.row.compare":"前後比較","uiStudio.history.row.noBeforeState":"変更前なし","uiStudio.history.row.noAfterState":"変更後なし","uiStudio.history.row.qualityPlan":"デザイン方針","uiStudio.history.row.designCheck":"改善提案","uiStudio.history.row.designCheckUnavailable":"改善提案: 要約なし","uiStudio.history.row.designCheckNone":"改善提案: 現在なし","uiStudio.history.selection.deleteSelected":"選択を削除","uiStudio.history.selection.selectAll":"すべて選択","uiStudio.history.selection.clearSelection":"選択解除","uiStudio.history.confirm.deleteRequestsTitle":"変更記録を削除","uiStudio.history.confirm.deleteRequestsMessage":"選択した変更記録を削除します。この操作は元に戻せません。","uiStudio.history.confirm.clearRequestsTitle":"変更履歴を削除","uiStudio.history.confirm.clearRequestsMessage":"現在の place の変更履歴を削除します。Studio インスタンスには影響しません。","uiStudio.history.confirm.cascadeOption":"リンクされたスクリーンショットも削除","uiStudio.history.drawer.close":"閉じる","uiStudio.actions.previewAgain":"再プレビュー","uiStudio.actions.deleteSnapshot":"このスクリーンショットを削除","uiStudio.actions.proRequired":"Proにアップグレード後に利用可能","uiStudio.actions.captureCurrentState":"現在の状態をキャプチャ","uiStudio.actions.checkSuggestionsAgain":"提案を再確認","uiStudio.actions.previewRunning":"キャプチャ中…","uiStudio.actions.previewRunningDetail":"完了すると新しいスクリーンショットファイル ID が表示されます。","uiStudio.actions.previewNeedsSaveCheck":"キャプチャ完了、保存確認が必要","uiStudio.actions.previewSaved":"新しいスクリーンショットを保存しました","uiStudio.actions.previewComplete":"キャプチャ完了","uiStudio.actions.previewSavedDetail":"既存のスクリーンショットは変更せず、新しいファイルとして保存しました。","uiStudio.actions.previewSavedPathMissing":"新しいスクリーンショット ID は返されましたが、保存先パスを確認できませんでした。","uiStudio.actions.previewSnapshotIdMissing":"新しいスクリーンショット ID を確認できませんでした。リストを更新して保存状況を確認してください。","uiStudio.actions.more":"その他","uiStudio.gallery.selection.selectedCount":" 件選択中","uiStudio.confirm.deleteSnapshotTitle":"スクリーンショットを削除","uiStudio.confirm.deleteSnapshotMessage":"このスクリーンショットファイルのみ削除されます(Studioインスタンスは保持されます)。","uiStudio.confirm.deleteBatchTitle":"スクリーンショットを一括削除","uiStudio.confirm.deleteBatchMessage":"選択したスクリーンショットを削除します。この操作は元に戻せません。","uiStudio.gallery.selectMode":"選択","uiStudio.gallery.exitSelectMode":"キャンセル","uiStudio.gallery.selectAll":"すべて選択","uiStudio.gallery.clearSelection":"選択解除","uiStudio.gallery.deleteSelected":"選択削除","common.save":"保存","common.cancel":"キャンセル","common.delete":"削除","uiStudio.storage.title":"UI Studioの保存データ","uiStudio.storage.usageLabel":"使用中","uiStudio.storage.historyBytes":"履歴","uiStudio.storage.snapshotBytes":"スクリーンショット","uiStudio.storage.requestCount":"変更記録","uiStudio.storage.mutationCount":"変更詳細","uiStudio.storage.snapshotCount":"スクリーンショット","uiStudio.storage.countSuffix":"件","uiStudio.storage.lastRun":"最後の自動クリーンアップ","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"解放","uiStudio.storage.lastRunErrors":"エラー","uiStudio.storage.loading":"読み込み中...","uiStudio.cleanup.policy.title":"自動削除ポリシー","uiStudio.cleanup.policy.modeOff":"無効","uiStudio.cleanup.policy.modeAge":"期間ベース","uiStudio.cleanup.policy.modeSize":"サイズベース","uiStudio.cleanup.policy.cascade":"リンクされたスクリーンショットも削除","uiStudio.cleanup.policy.save":"ポリシーを保存","uiStudio.cleanup.policy.runNow":"保存済みポリシーを実行","uiStudio.cleanup.policy.proRequired":"Proにアップグレード後に利用可能","uiStudio.cleanup.policy.daysUnit":"日","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"ポリシーの確認","uiStudio.cleanup.policy.confirm.messageStrict":"このポリシーを適用すると直ちに削除されます","uiStudio.cleanup.policy.confirm.requests":" 件","uiStudio.cleanup.policy.confirm.snapshots":" スクリーンショット","uiStudio.cleanup.policy.confirm.freed":"解放 — 適用しますか?","uiStudio.cleanup.keepLastNDays":"直近{n}日間のみ保持","uiStudio.cleanup.selectedDelete":"選択削除…","uiStudio.cleanup.deleteAll":"全て削除…","uiStudio.cleanup.cleanupConfirmTitle":"クリーンアップの確認","uiStudio.cleanup.cleanupConfirmMessage":"選択したアイテムが削除されます。この操作は元に戻せません。","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"手動クリーンアップ","uiStudio.cleanup.studioPreservedNote":"この操作はディスク上の履歴・スクリーンショットファイルのみを削除します。Roblox Studio のインスタンスには影響しません。","uiStudio.history.sample.bannerBadge":"Pro 変更履歴プレビュー","uiStudio.history.sample.bannerTitle":"Pro変更履歴のプレビュー","uiStudio.history.sample.bannerMessage":"このプレビューはサンプルデータを使用しています。実際のリクエスト履歴、前後比較、一括削除はProでご利用いただけます。","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"全履歴はProにアップグレード後にご利用いただけます","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"保存済みポリシーを実行","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"すべて消去","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP サーバーに接続しました","toast.serverDisconnected":"MCP サーバーから切断されました","toast.pluginConnected":"プラグインに接続しました","toast.pluginDisconnected":"プラグインから切断されました","toast.clearSuccess":"削除しました","toast.clearFailed":"削除に失敗しました","common.clear":"クリア","settings.license.activate":"ライセンスを有効化","settings.license.refresh":"ライセンスを更新","settings.license.keyInput":"ライセンスキー","settings.license.disconnected":"切断","settings.license.disconnected.tooltip":"WEPPY Dashboard からライセンス操作を行うには、MCP サーバーに再接続してください。","settings.license.live.tooltip":"ライセンス操作は MCP サーバーに即時反映されます。","settings.license.status.activationRequired":"有効化が必要","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard がこの状態を更新するには、ライセンスを手動で有効化する必要があります。","settings.license.status.grace":"猶予","settings.license.status.grace.tooltip":"プロバイダー検証が一時的に利用できませんが、猶予期間中は Pro アクセスが維持されます。","settings.license.status.graceBilling.tooltip":"請求関連の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceBilling":"請求の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceProviderUnavailable":"プロバイダーが利用できません。猶予モードの間も Pro アクセスは維持されます。","settings.license.detail.manualActivation":"Pro アクセスを復元するには手動での有効化が必要です。","settings.license.detail.missingSessionToken":"現在のセッショントークンが存在しないため、更新がブロックされています。","settings.license.detail.refreshRecommended":"ライセンス検証を近いうちに更新してください。","connection.agents.kill":"強制終了","connection.agents.kill.title":"エージェントを強制終了しますか?","connection.agents.killed":"エージェントを強制終了しました","connection.agents.killFailed":"エージェントの強制終了に失敗しました","connection.agents.lastCommand":"最終コマンド","connection.agents.lastCommand.tooltip":"このエージェントが最後に実行したツール呼び出しです。","connection.agents.lastSeen":"最終確認","connection.agents.lastSeen.tooltip":"このエージェントから最後に受信したハートビートまたは活動時刻です。","connection.clear.title":"接続ログをクリアしますか?","connection.clear.message":"現在のプロジェクトに保存された接続ログが完全に削除されます。","sync.clear.title":"同期ログをクリアしますか?","sync.clear.message":"現在のプレイスに保存された同期ログが完全に削除されます。","playtest.clear.title":"テスト履歴をクリアしますか?","playtest.clear.message":"現在のプレイスに保存されたプレイテストレポートが完全に削除されます。","changelog.clear.title":"変更ログをクリアしますか?","changelog.clear.message":"現在のプレイスに保存された変更ログが完全に削除されます。","sync.status.placePath":"プレイスパス","sync.status.placePath.tooltip":"Explorer ファイルが同期される現在のプレイスディレクトリです。","tier.progress.label":"Pro / 全体","changelog.card.representativeArea":"代表領域","changelog.card.verification":"検証","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"この変更で使用したブリーフのデザイン方針です。","uiStudio.history.row.designCheck.tooltip":"変更後のDesign Check改善提案の要約です。","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"保存済みのクリーンアップルールを、次回の自動実行を待たずに今すぐ1回実行します。","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Pro機能と購入オプションを確認します。","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.manageStorage":"ストレージ管理","settings.dataHistory.manageStorage.tooltip":"ストレージポリシーとクリーンアップ操作を表示または非表示にします。","settings.dataHistory.manageStorage.projectChanges.aria":"Project change summary のストレージを管理","settings.dataHistory.manageStorage.uiStudio.aria":"UI Studio の履歴とスクリーンショットのストレージを管理","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check の提案","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"もう一度確認","uiStudio.actions.designCheckRunning":"提案を確認中...","uiStudio.actions.designCheckRunningDetail":"完了すると優先確認、確認推奨、任意改善の件数が表示されます。","uiStudio.actions.designCheckComplete":"提案の確認が完了しました","uiStudio.actions.designCheckNoSnapshotSaved":"この操作では新しいスクリーンショットファイルは保存されません。","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"優先確認する提案の数です。クリックして詳細を確認します。","uiStudio.gallery.priorityMediumBadge.tooltip":"確認推奨の提案数です。","uiStudio.priorityMedium":"確認推奨","uiStudio.mediumPrioritySection":"確認推奨","uiStudio.gallery.priorityLowBadge.tooltip":"任意改善の提案数です。","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"エラー","uiStudio.analysis.expandChildren":"子ターゲットを表示","uiStudio.analysis.openDetail":"詳細を開く","uiStudio.analysis.childTargets":"子ターゲット","uiStudio.analysis.childDetailHint":"子ターゲットの詳細を開く","uiStudio.compare.before":"変更前","uiStudio.compare.after":"変更後","uiStudio.history.drawer.changeDetails":"変更詳細","uiStudio.gallery.cardCheckbox":"スクリーンショットを選択","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"すべての範囲","assets.explorer.label":"アセットエクスプローラー","assets.breadcrumb.label":"アセットのパス","assets.explorer.summary":"このフォルダーに {direct} 件 · サブフォルダーに {descendant} 件","assets.folder.count.one":"1 アセット","assets.folder.count.many":"{count} アセット","assets.folder.type":"フォルダー","assets.folders.title":"フォルダー","assets.folder.assetsTitle":"このフォルダーのアセット","assets.organization.label":"閲覧","assets.organization.folders":"フォルダー","assets.organization.all":"すべてのアセット","assets.organization.summary":"{count}件のアセット","assets.view.options":"表示オプション","assets.view.mode":"表示形式","assets.view.grid":"グリッド","assets.view.list":"リスト","assets.view.thumbnailSize":"サムネイルサイズ","assets.view.thumbnailSize.listReason":"サムネイルサイズはグリッド表示で変更できます。","assets.view.size.small":"小","assets.view.size.medium":"中","assets.view.size.large":"大","assets.list.name":"名前","assets.list.type":"種類","assets.list.scope":"範囲","assets.list.status":"状態","assets.list.updated":"更新日","assets.loading.scope":"{scope} のアセットを読み込み中...","assets.partial.title":"一部の場所を読み込めませんでした","assets.empty.folderTitle":"このフォルダーに一致するアセットはありません","assets.empty.folderBody":"別のフォルダーまたはカテゴリフィルターを試してください。","assets.empty.filteredTitle":"このフィルターに一致するアセットはありません","assets.empty.filteredBody":"別のカテゴリを選ぶか、該当するフォルダーを再スキャンしてください。","assets.place.selector":"Asset place","assets.place.context":"アセットの場所コンテキスト","assets.place.sharedLibrary":"共有ライブラリ","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"仕組み","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"共有WEPPY Bridge、各AIエージェントのMCP Adapter、Studioターゲット、接続ログを確認できます。","dashboardHelp.connection.needs.1":"WEPPY Bridgeに接続できる必要があります。StudioターゲットはWEPPY Pluginがハートビートを送信すると表示されます。","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"AI Agentが保存したUI、入力、サーバー結果の構造化Playtestエビデンスを確認します。","dashboardHelp.playtest.needs.1":"Proでは実際の保存レポートを表示し、Basicでは1件のサンプルを表示します。Play画面のキャプチャエビデンスは利用できませんが、セマンティックUIと操作エビデンスは確認できます。現在のPlaceを正確に判定するにはWEPPY Pluginの接続が必要です。","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"閉じる","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Studioターゲットが表示されない場合はRoblox Studioを開いてWEPPY Pluginを実行してください。AIエージェントまたはMCP Adapterが表示されない場合は、AIツールからWEPPY MCP Serverを再接続してください。","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"WEPPY Bridge、MCP Adapter、Studio Plugin、接続ログの状態を確認します。","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio ルーティング","controls.studioRouting.title.tooltip":"Studio の対象を指定していない MCP リクエストのルーティング優先順位です。","controls.studioRouting.settingLabel":"Studio を指定していないリクエスト","controls.studioRouting.mode.auto":"自動","controls.studioRouting.mode.pinned":"Studio 固定","controls.studioRouting.state.auto":"現在: 自動","controls.studioRouting.state.pinned":"現在: Studio 固定","controls.studioRouting.saving":"適用中…","controls.studioRouting.applied":"適用済み","controls.studioRouting.failed":"適用できませんでした","controls.studioRouting.pinnedUnavailable":"Studio 固定を使用するには、Studio の対象を接続してください。","controls.studioRouting.helpLabel":"Studio ルーティングの仕組み","controls.studioRouting.helpButton":"どのように動作しますか?","controls.studioRouting.selectTarget":"固定する Studio を選択","controls.studioRouting.select":"選択","controls.studioRouting.targetGroupLabel":"Studio の固定先","controls.luauValidation.title":"Luau 構文チェック","controls.luauValidation.settingLabel":"Script 編集後に自動チェック","controls.luauValidation.benefit":"AI が Script を編集したあと、Luau の構文エラーがないか確認します。","controls.luauValidation.state.on":"現在: オン","controls.luauValidation.state.off":"現在: オフ","controls.luauValidation.priority":"AI のリクエストとこの設定が異なる場合は、Dashboard の設定が使われます。確認方法を変えるには、この画面でオンまたはオフにしてください。","controls.luauValidation.switchLabel":"Script 編集後の自動構文チェック","controls.luauValidation.saving":"保存中…","controls.luauValidation.applied":"適用済み","controls.luauValidation.failed":"適用できませんでした","controls.luauValidation.helpLabel":"Luau 自動構文チェックの仕組み","controls.luauValidation.helpButton":"どのように動作しますか?","controls.luauValidation.help.behavior":"オンにすると、AI が Script 全体の置換、行の置換、挿入、削除を終えたあと、実際に保存されたコード全体を確認します。オフでは Script の編集だけを行い、自動構文チェックは実行しません。","controls.luauValidation.help.response":"構文に問題がなければ、通常どおり短い完了結果を返します。エラーが見つかった場合や確認できなかった場合だけ詳しく知らせます。大きな Script では少し時間がかかることがあります。","controls.luauValidation.help.nonBlocking":"構文エラーが見つかった場合や確認できなかった場合でも、保存済みの Script 編集は取り消しません。AI が同じ Script をすぐ修正できるよう結果を知らせます。","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"同じ Place ID の Studio ウィンドウが複数接続されています。その Place を指定するときは Studio ID を使用してください。","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Studio ID、Connection ID、Place ID を明示したリクエストはこの設定を使わず、指定した Studio に送られます。","controls.studioRouting.state.currentTarget":"現在の優先対象","controls.studioRouting.noPriorityTarget":"接続中の Studio がありません","controls.studioRouting.help.auto":"自動では、直近のルーティングと接続順に基づいて最も優先度の高い Studio を使用します。","controls.studioRouting.help.pinned":"Studio 固定では、リクエストに対象 ID がない場合に選択した Studio を使用します。","sync.migration.title":"Sync形式を更新できます","sync.migration.description":"このPlaceのSync形式をv2からv3へ更新する前に、メタデータの変更内容を確認してください。","sync.migration.status.ready":"確認可能","sync.migration.status.blocked":"ブロック中","sync.migration.preview":"変更内容を確認","sync.migration.summary.add":"追加","sync.migration.summary.modify":"変更","sync.migration.summary.delete":"削除","sync.migration.summary.blocked":"ブロック","sync.migration.changes":"メタデータの変更","sync.migration.blockers":"解決が必要な項目","sync.migration.operation.add":"追加","sync.migration.operation.modify":"変更","sync.migration.operation.delete":"削除","sync.migration.reason.serializer_regeneration":"メタデータを標準のv3形式で再生成します。","sync.migration.reason.volatile_metadata_removal":"一時的なSyncメタデータを削除します。","sync.migration.reason.redundant_empty_metadata":"不要な空のメタデータを削除します。","sync.migration.reason.runtime_ignore_policy":"管理対象のランタイム除外ルールを更新します。","sync.migration.reason.reverse_pending":"保留中のローカルからStudioへの変更を先に適用または破棄してください。","sync.migration.reason.conflict":"ローカルとStudioの競合を先に解決してください。","sync.migration.reason.local_canonical_change":"ローカルで変更された標準メタデータを先に確認してください。","sync.migration.reason.source_mutation_detected":"Migrationの検証中にユーザーソースが変更されました。","sync.migration.blocked":"Syncの競合を解決してから更新してください","sync.migration.stale":"プレビューが変わりました。最新の差分を確認してください。","sync.migration.error":"Sync形式を更新できませんでした。もう一度お試しください。","sync.migration.refresh":"プレビューを更新","sync.migration.refreshing":"更新中…","sync.migration.applying":"適用中…","sync.migration.apply":"更新を適用","sync.migration.confirm.title":"Sync形式の更新を適用しますか?","sync.migration.confirm.message":"一覧のSyncメタデータをバックアップして更新します。Luauソースファイルは変更しません。","changelog.ownership.showGenerated":"生成メタデータを表示","changelog.ownership.userSource":"ユーザーソース","changelog.ownership.canonicalMirror":"ミラーメタデータ","changelog.ownership.generated":"生成済み","uiStudio.analysis.verdict.incomplete":"レビュー証拠が不足しています","uiStudio.analysis.issueSummary.incomplete":"提案はありませんが、操作とレスポンシブのレビューが残っています。","uiStudio.analysis.coverageDimensions":"レビュー範囲","uiStudio.analysis.coverageStatus.completed":"完了","uiStudio.analysis.coverageStatus.failed":"失敗","uiStudio.analysis.coverageStatus.skipped":"未実施","uiStudio.history.row.readinessIncomplete":"準備状況:証拠不足","uiStudio.noSuggestionsIncomplete":"提案はありませんが、未レビューの範囲が残っています。","uiStudio.readiness.summary":"UIの準備状況","uiStudio.primaryVisual.label":"メイン画面","uiStudio.primaryVisual.recompose":"再構成が必要","uiStudio.primaryVisual.refine":"調整が必要","uiStudio.primaryVisual.approved":"承認済み","uiStudio.primaryVisual.unknown":"未確認","uiStudio.functional.label":"機能","uiStudio.functional.safe":"安全","uiStudio.functional.risk":"リスクあり","uiStudio.functional.unknown":"未確認","uiStudio.functional.safeCompact":"機能は安全","uiStudio.functional.riskCompact":"機能リスク","uiStudio.functional.unknownCompact":"機能は未確認","uiStudio.responsive.label":"レスポンシブ","uiStudio.responsive.recommended":"推奨","uiStudio.responsive.required":"必須","uiStudio.responsive.unknown":"未確認","uiStudio.responsive.recommendedCompact":"レスポンシブ推奨","uiStudio.responsive.requiredCompact":"レスポンシブ必須","uiStudio.responsive.unknownCompact":"レスポンシブ未確認","uiStudio.readiness.ready":"準備完了","uiStudio.readiness.reviewRequired":"レビューが必要","uiStudio.readiness.insufficient":"証拠不足","uiStudio.readiness.unknown":"準備状況は未確認","uiStudio.criticSummary":"レビュー要約","playtest.history.kind.structured":"構造化","playtest.history.kind.legacy":"レガシー","playtest.history.kind.attention":"確認が必要","playtest.summary.title":"実行サマリー","playtest.summary.status":"状態","playtest.summary.mode":"モード","playtest.summary.duration":"所要時間","playtest.summary.cleanup":"クリーンアップ","playtest.dimension.title":"エビデンス項目","playtest.dimension.hint":"必須エビデンスを表示します。","playtest.dimension.server":"サーバー","playtest.dimension.clientUi":"クライアントUI","playtest.dimension.interaction":"操作","playtest.dimension.visual":"画面","playtest.dimension.required":"必須","playtest.dimension.optional":"任意","playtest.dimension.steps":"ステップ","playtest.steps.title":"ステップタイムライン","playtest.steps.expected":"期待値","playtest.steps.observed":"観測値","playtest.steps.evidence":"エビデンス","playtest.steps.server":"サーバー","playtest.steps.details":"詳細","playtest.capability.title":"機能と制限","playtest.capability.semanticUi":"Semantic UI snapshot","playtest.capability.virtualInput":"Virtual input","playtest.capability.fixedBootstrap":"固定Agent bootstrap","playtest.capability.projectAdapter":"プロジェクトテストアダプター","playtest.capability.available":"利用可能","playtest.capability.unavailable":"利用不可","playtest.limitations.title":"制限事項","playtest.artifacts.title":"成果物","playtest.result.status.passed":"成功","playtest.result.status.failed":"失敗","playtest.result.status.timedOut":"タイムアウト","playtest.result.status.cancelled":"キャンセル","playtest.result.status.insufficientEvidence":"エビデンス不足","playtest.result.status.unavailable":"利用不可","playtest.result.status.skipped":"スキップ","playtest.result.status.notRequested":"未要求","playtest.result.status.unknown":"不明","playtest.record.incomplete":"構造化結果が未完了です","playtest.record.corrupt":"構造化結果が破損しています","playtest.record.unsupported":"構造化結果のバージョンに対応していません","playtest.record.unavailable":"結果の詳細を表示できません。","playtest.sample.terminal":"必須エビデンスがすべて成功しました","playtest.sample.limit.visual":"構造化セッションv1ではPlay画面のキャプチャエビデンスを利用できません","playtest.history.agents":"Agent","playtest.history.agentCounts":"サーバー {server}・クライアント {client}","playtest.agents.title":"テストAgent","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"画面エビデンス利用不可 — 構造化セッションv1ではPlay画面のキャプチャに対応していません。","playtest.limitations.virtualInputUnavailable":"このセッションではVirtual inputを利用できません。","playtest.limitations.visualUnsupportedReason":"構造化セッションv1ではPlay画面のキャプチャに対応していません。","playtest.dimension.reason.missing":"必須エビデンスがありません。","playtest.dimension.reason.capability":"必須機能を利用できません。","playtest.artifacts.metadata":"結果メタデータ"},$y={"sidebar.overview":"Ringkasan","sidebar.changelog":"Riwayat","sidebar.connection":"Koneksi","sidebar.sync":"Sinkronisasi","sidebar.playtest":"Playtest","sidebar.tools":"Alat","sidebar.settings":"Pengaturan","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Koneksi server MCP diperlukan.","sidebar.gate.l2":"Koneksi plugin Roblox Studio diperlukan.","header.currentProject":"Proyek saat ini","header.unknownProject":"Proyek tidak dikenal","header.projectRoot.label":"Project Root","header.currentProject.loading":"Memuat project root...","header.currentProject.unavailable":"Project root tidak tersedia","header.placeNotConnected":"Place belum terhubung","header.currentProject.tooltip":"Folder proyek yang sedang dipilih.","header.currentProject.loading.tooltip":"Informasi project root masih dimuat.","header.currentProject.unavailable.tooltip":"Informasi project root saat ini tidak tersedia.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Memuat sync root...","header.currentProjectSyncRoot.unavailable":"Sync root tidak tersedia","header.currentProjectSyncRoot.tooltip":"Folder sync root saat ini untuk proyek yang dipilih.","header.currentProjectSyncRoot.loading.tooltip":"Informasi sync root masih dimuat.","header.currentProjectSyncRoot.unavailable.tooltip":"Informasi sync root saat ini tidak tersedia.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Path file test tidak tersedia.","header.testFiles.tooltip":"Direktori file playtest saat ini untuk place yang dipilih.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Koneksi plugin diperlukan","header.places.liveRequired":"Koneksi plugin diperlukan untuk melihat place aktif secara live.","header.place.tooltip":"Place Roblox yang terhubung.","header.placeNotConnected.tooltip":"Place belum terhubung","placeScope.current.label":"Place saat ini","placeScope.lastActive.label":"Place aktif terakhir","placeScope.selected.label":"Place yang dipilih","placeScope.unknownPlace":"Place tidak dikenal","placeScope.live":"Live","placeScope.stored":"Tersimpan","placeScope.pluginRequired":"Plugin diperlukan","placeScope.pluginRequired.note":"Hubungkan WEPPY Plugin untuk mengonfirmasi place aktif live.","placeScope.noPlace.label":"Cakupan place","placeScope.noPlace.value":"Belum ada data place","placeScope.noPlace.badge":"Tidak ada place","placeScope.noPlace.note":"Hubungkan WEPPY Plugin dan sinkronkan place untuk membuat data per place.","placeScope.selected.note":"Hanya menampilkan data tersimpan. Routing Studio tidak berubah.","placeScope.surface.sync":"Status sinkronisasi dan log memakai place ini.","placeScope.surface.changelog":"Sesi changelog memakai place ini.","placeScope.surface.playtest":"Laporan playtest memakai place ini.","placeScope.surface.uiStudio":"Capture UI dan riwayat perubahan memakai place ini.","placeScope.surface.tools":"Riwayat dan statistik tool memakai place ini.","placeScope.loading":"Memuat cakupan place...","placeScope.unavailable":"Cakupan place tidak tersedia","placeScope.selector.label":"Data place","header.changeProjectRoot":"Ubah project root","header.changeProjectRoot.ariaLabel":"Ubah project root","header.changeProjectRoot.tooltip":"Ubah project root saat ini.","header.changeProjectRoot.disabledTooltip.l0":"Koneksi server MCP diperlukan terlebih dahulu sebelum project root bisa diubah.","header.changeProjectRoot.disabledTooltip.loading":"Informasi project root masih dimuat.","header.changeProjectRoot.disabledTooltip.unavailable":"Informasi project root saat ini tidak tersedia.","header.projectRootModal.initial.title":"Ubah project root","header.projectRootModal.initial.body.connected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan konten Studio saat ini akan disinkronkan ulang sepenuhnya ke target baru <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan menggunakan <selected project folder>/weppy-project-sync sebagai target sync berikutnya.","header.projectRootModal.initial.nextSyncRoot":"Target sync baru setelah pemilihan","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Sync saat ini berhenti seketika.","header.projectRootModal.initial.warningFreshSync":"Konten Studio saat ini akan digunakan untuk membuat fresh full sync di target baru.","header.projectRootModal.initial.warningNoMove":"Folder sync lama tidak dipindahkan secara otomatis.","header.projectRootModal.initial.warningDeferredSync":"Jika Studio belum terhubung, full resync akan dimulai saat plugin terhubung berikutnya.","header.projectRootModal.confirm.title":"Konfirmasi project root baru","header.projectRootModal.confirm.body":"Tinjau folder proyek yang dipilih sebelum menerapkan perubahan.","header.projectRootModal.confirm.projectRoot":"Folder proyek yang dipilih","header.projectRootModal.confirm.syncRoot":"Target sync baru","header.projectRootModal.confirm.warningNoMove":"Folder sync yang ada tidak dipindahkan secara otomatis.","header.projectRootModal.pick":"Pilih folder","header.projectRootModal.apply":"Terapkan perubahan","header.projectRootModal.cancel":"Batal","header.projectRootModal.error":"Gagal mengubah project root.","status.online":"Online","status.offline":"Offline","status.idle":"Menunggu","status.syncing":"Menyinkronkan","status.error":"Error","status.initializing":"Menginisialisasi","level.l0.title":"Server terputus","level.l0.message":"WEPPY Dashboard terbuka tetapi server MCP telah berhenti atau tidak merespons.","level.l1.title":"Server terhubung","level.l1.hint":"Periksa: Apakah Roblox Studio berjalan? Apakah plugin terinstal?","level.l2.ok":"Studio terhubung","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic dengan kumpulan fitur WEPPY Dashboard standar.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro dengan kumpulan fitur WEPPY Dashboard lengkap.","tier.mixed":"Campuran","tier.upgrade":"Lihat Pro","tier.banner.save":"Hemat token AI dengan Pro!","tier.tool.query_instances.desc":"Kueri instance, jelajahi anak/keturunan, info kelas, cari berdasarkan nama dan kelas. Pro: pohon file, struktur proyek, pencarian berdasarkan properti dan tag.","tier.tool.mutate_instances.desc":"Buat, hapus, klon, pindah, ganti nama, dan pivot instance. Pro: pembuatan pohon, pembuatan/penghapusan/duplikasi massal.","tier.tool.manage_properties.desc":"Lihat dan atur properti, atribut, dan tag. Pro: nilai kalkulasi dan relatif, lihat/atur massal, modifikasi massal anak.","tier.tool.manage_scripts.desc":"Baca, tulis, buat, hapus, edit baris, dan cari di script. Pro: penggantian massal antar script.","tier.tool.manage_ui.desc":"Khusus Pro. Buat atau perbaiki menu, HUD, tombol, label, dan panel gambar bergaya game, lalu tangkap layar dan tinjau saran peningkatan.","tier.tool.manage_ui.action.design_brief":"Rencanakan arah UI","tier.tool.manage_ui.action.create_tree":"Buat UI baru","tier.tool.manage_ui.action.update":"Perbarui UI yang ada","tier.tool.manage_ui.action.delete":"Hapus UI","tier.tool.manage_ui.action.preview":"Tangkap layar UI","tier.tool.manage_ui.action.check":"Tinjau saran peningkatan","tier.tool.manage_lighting.desc":"Khusus Pro. Pengaturan pencahayaan, atmosfer, langit, properti terrain, dan waktu.","tier.tool.manage_selection.desc":"Lihat, atur, dan hapus seleksi. Pro: konteks, detail, tambah/hapus item, pantau perubahan.","tier.tool.manage_camera.desc":"Info kamera, fokus berdasarkan jalur atau koordinat, saran tampilan.","tier.tool.manage_tween.desc":"Khusus Pro. Buat, putar, jeda, dan batalkan tween untuk animasi halus.","tier.tool.manage_audio.desc":"Khusus Pro. Putar, hentikan, jeda, dan lanjutkan suara. Atur listener audio.","tier.tool.manage_animation.desc":"Khusus Pro. Muat, putar, dan hentikan animasi. Lihat track humanoid/pengontrol.","tier.tool.manage_physics.desc":"Khusus Pro. Daftarkan grup tabrakan, atur tabrakan antar grup, daftar grup.","tier.tool.manage_effects.desc":"Khusus Pro. Pancarkan partikel, hapus semua, aktifkan/nonaktifkan efek.","tier.tool.manage_terrain.desc":"Khusus Pro. Isi bentuk, hapus wilayah, ganti material, kelola warna, baca/tulis voxel, pembuatan prosedural, pemulusan.","tier.tool.spatial_query.desc":"Khusus Pro. Raycast, cari tanah, periksa penempatan, pindai area, cari area datar dan titik spawn, analisis kemampuan jalan, peta spasial, deteksi tabrakan.","tier.tool.manage_assets.desc":"Khusus Pro. Sisipkan model, lihat info aset, cari di toko kreator, sisipkan model/paket gratis, ekspor.","tier.tool.manage_sync.desc":"Khusus Pro. Status sinkronisasi, konfigurasi, riwayat, arah, baca/tulis file tersinkronisasi.","tier.tool.workspace_state.desc":"Khusus Pro. Sinkronisasi penuh, tangkapan layar, perubahan terbaru, info viewport, metadata, manajemen cache.","tier.tool.manage_logs.desc":"Kueri log terfilter, polling inkremental, hapus buffer, kueri error terbaru.","tier.tool.system_info.desc":"Status koneksi, verifikasi tier. Pro: info tempat, daftar layanan, pengaturan Studio, kontrol playtest, pengujian otomatis.","tier.tool.manage_studio.desc":"Khusus Pro. Alihkan pengaturan tampilan editor Studio seperti preview UI untuk screenshot dan QA; ini mengubah sesi Studio, bukan objek UI game.","tier.tool.batch_execute.desc":"Khusus Pro. Eksekusi beberapa perintah sekaligus. Pemrosesan berurutan dengan opsi lanjut saat error.","tier.tool.execute_luau.desc":"Khusus Pro. Jalankan kode Luau di sandbox Roblox Studio.","connection.server.title":"Status Bridge","connection.server.version":"Versi","connection.server.version.tooltip":"Versi runtime WEPPY Bridge.","connection.server.pid":"PID","connection.server.pid.tooltip":"Pengenal proses dari sistem operasi.","connection.server.uptime":"Waktu aktif","connection.server.uptime.tooltip":"Waktu yang berlalu sejak WEPPY Bridge dimulai.","connection.server.session":"Sesi","connection.server.session.tooltip":"Pengenal sesi WEPPY Bridge saat ini.","connection.server.exec":"Eksekutabel","connection.server.exec.tooltip":"Path eksekutabel yang digunakan untuk menjalankan WEPPY Bridge.","connection.reconnect":"Hubungkan ulang","connection.checkSettings":"Periksa pengaturan","connection.agents.title":"Agen AI","connection.agents.name":"Agen","connection.agents.version":"Versi","connection.agents.version.tooltip":"Versi paket MCP Adapter untuk sesi agen ini.","connection.agents.cwd":"Direktori kerja","connection.agents.cwd.tooltip":"Direktori kerja saat ini milik agen AI yang terhubung.","connection.agents.projectRoot":"Root Proyek","connection.agents.projectRoot.tooltip":"Jalur proyek otoritatif untuk kepemilikan sinkronisasi","connection.agents.projectRoot.unresolved":"Belum terselesaikan","connection.agents.connected":"Terhubung","connection.agents.unknown":"Tidak diketahui","connection.agents.none":"Tidak ada agen terhubung","connection.plugins.title":"Plugin","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Terakhir terlihat","connection.plugins.lastSeen.tooltip":"Heartbeat terbaru yang diterima dari plugin.","connection.plugins.version":"Versi","connection.plugins.version.tooltip":"Versi plugin terpasang yang dilaporkan oleh Studio.","connection.plugins.none":"Tidak ada plugin terhubung","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Koneksi Play/Test Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Setiap agen AI terhubung melalui MCP Adapter miliknya ke WEPPY Bridge bersama, yang menjaga koneksi Roblox Studio.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Log Koneksi","connection.log.empty":"Belum ada event","connection.time.secondsAgo":"dtk lalu","connection.time.minutesAgo":"mnt lalu","connection.time.hoursAgo":"jam lalu","common.loading":"Memuat...","common.retry":"Coba lagi","common.reconnecting":"Menghubungkan ulang...","common.expand":"Perluas","common.collapse":"Ciutkan","tools.tab.history":"Riwayat","tools.tab.statistics":"Statistik","tools.tab.failures":"Kegagalan","tools.col.time":"Waktu","tools.col.time.tooltip":"Waktu ketika eksekusi alat dicatat.","tools.col.toolAction":"Alat.Aksi","tools.col.toolAction.tooltip":"Nama alat dan aksi yang dijalankan.","tools.col.duration":"Durasi","tools.col.duration.tooltip":"Berapa lama alat menyelesaikan eksekusi.","tools.col.status":"Status","tools.col.status.tooltip":"Hasil dari eksekusi alat yang tercatat.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Tier lisensi yang dibutuhkan untuk alat atau aksi ini.","tools.col.tierStats.tooltip":"Ringkasan Basic, Pro, atau Mixed untuk baris statistik alat ini.","tools.col.tool":"Alat","tools.col.tool.tooltip":"Nama alat konsolidasi pada tabel statistik.","tools.col.calls":"Panggilan","tools.col.calls.tooltip":"Jumlah total panggilan yang tercatat untuk alat ini.","tools.col.ok":"OK","tools.col.ok.tooltip":"Jumlah eksekusi sukses langsung.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Jumlah eksekusi yang berhasil melalui fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Jumlah eksekusi yang diblokir tanpa fallback.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Jumlah kegagalan yang diperkirakan karena input, status proyek, kebijakan Roblox, atau kode pengguna.","tools.col.err":"GAGAL","tools.col.err.tooltip":"Jumlah eksekusi yang berakhir gagal.","tools.col.okRate":"% Sukses","tools.col.okRate.tooltip":"Persentase panggilan yang selesai dengan sukses.","tools.col.avgTime":"Waktu rata-rata","tools.col.avgTime.tooltip":"Rata-rata waktu eksekusi dari panggilan yang tercatat.","tools.col.error":"Error","tools.filter.tool":"Alat","tools.filter.all":"Semua","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Entri ini menggunakan alat atau aksi khusus Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Aksi Pro yang diminta berhasil melalui fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Aksi Pro yang diminta diblokir dan tidak ada fallback yang dijalankan.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"Panggilan alat gagal karena masalah input, proyek, kebijakan, atau kode pengguna yang diperkirakan.","tools.badge.err":"GAGAL","tools.badge.err.tooltip":"Eksekusi alat berakhir gagal.","tools.status.ok":"OK","tools.status.ok.tooltip":"Eksekusi alat selesai dengan sukses.","tools.tier.mixed.tooltip":"Alat ini memiliki campuran aksi Basic dan Pro.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Parameter input yang dikirim pada eksekusi alat ini.","tools.detail.result":"Hasil","tools.detail.result.tooltip":"Payload hasil yang dikembalikan dari eksekusi alat ini.","tools.detail.requestedCommand":"Perintah dikirim","tools.detail.executedCommand":"Perintah dijalankan","tools.detail.alternatives":"Alternatif","tools.detail.blockedMessage":"Alasan diblokir","tools.detail.noFallback":"Tanpa fallback","tools.detail.noFallback.value":"Tidak ada fallback yang dijalankan.","tools.detail.warningMessage":"Pesan peringatan","tools.detail.errorMessage":"Pesan error","tools.detail.open":"Detail","tools.detail.openLabel":"Lihat detail untuk {command}","tools.detail.dialogLabel":"Detail eksekusi alat","tools.detail.title":"Eksekusi alat","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Hapus riwayat?","tools.clear.history.message":"Tindakan ini akan menghapus permanen riwayat alat untuk place saat ini.","tools.clear.statistics.title":"Hapus statistik?","tools.clear.statistics.message":"Tindakan ini akan mereset permanen statistik alat untuk place saat ini.","tools.detail.error":"Error","tools.page.prev":"Sebelumnya","tools.page.prev.tooltip":"Pindah ke halaman sebelumnya pada riwayat alat.","tools.page.next":"Selanjutnya","tools.page.next.tooltip":"Pindah ke halaman berikutnya pada riwayat alat.","tools.empty.history":"Tidak ada entri riwayat","tools.empty.stats":"Tidak ada statistik alat","tools.empty.failures":"Tidak ada kegagalan","tools.summary.total":"Total","tools.summary.calls":"panggilan","tools.summary.sessions":"Sesi","settings.license.title":"Lisensi","settings.license.title.tooltip":"Status lisensi dan tier langganan saat ini.","settings.license.status":"Status","settings.license.status.tooltip":"Status aktivasi lisensi saat ini.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Tier langganan saat ini untuk fitur WEPPY Dashboard yang tersedia.","settings.license.key":"Kunci","settings.license.key.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.keyValue.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.provider":"Penyedia","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.providerValue.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.active":"Aktif","settings.license.active.tooltip":"Status aktivasi lisensi saat ini.","settings.license.status.activeCancelPending.tooltip":"Pembatalan sedang menunggu, tetapi akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.inactive":"Tidak aktif","settings.license.inactive.tooltip":"Status aktivasi lisensi saat ini.","settings.license.expired":"Kedaluwarsa","settings.license.expired.tooltip":"Status aktivasi lisensi saat ini.","settings.license.unavailable":"Info lisensi tidak tersedia","settings.license.detail.cancelPending":"Pembatalan telah dijadwalkan. Akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.reset":"Reset Lisensi","settings.readOnly":"Hanya baca","settings.readOnly.tooltip":"Bagian ini menampilkan nilai yang tidak bisa diedit dari WEPPY Dashboard.","settings.unavailable":"Pengaturan tidak tersedia","settings.general.title":"Pengaturan umum","settings.general.title.tooltip":"Pengaturan panas yang langsung diterapkan saat diubah.","settings.general.liveApply":"Terapkan langsung","settings.general.liveApply.tooltip":"Perubahan di bagian ini langsung diterapkan tanpa tombol simpan terpisah.","settings.general.applied":"Diterapkan","settings.general.logLevel":"Level log","settings.general.logLevel.tooltip":"Menetapkan seberapa detail WEPPY Dashboard menulis lognya.","settings.general.localHistory":"Perekaman riwayat alat","settings.general.localHistory.tooltip":"Menyimpan riwayat eksekusi alat lokal untuk tampilan riwayat WEPPY Dashboard.","settings.general.localStatistics":"Pengumpulan statistik alat","settings.general.localStatistics.tooltip":"Mengumpulkan statistik penggunaan lokal untuk pelaporan WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Batas waktu tindakan","settings.general.requestTimeout.tooltip":"Waktu maksimum WEPPY Dashboard menunggu tindakan sebelum dianggap gagal.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Batas waktu tindakan diukur dalam milidetik.","settings.cold.title":"Lingkungan server","settings.cold.title.tooltip":"Nilai lingkungan server hanya-baca yang dimuat saat startup.","settings.cold.httpPort.tooltip":"Nomor port yang digunakan oleh server HTTP WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Antarmuka host yang diikat oleh server HTTP WEPPY Dashboard MCP.","settings.cold.hint":"Atur melalui variabel lingkungan.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Pilih perilaku WEPPY Dashboard saat server MCP dimulai.","settings.dashboard.nextStartBadge":"Mulai berikutnya","settings.dashboard.autoOpen.label":"Buka Dashboard saat WEPPY dimulai","settings.dashboard.autoOpen.description":"Membuka Dashboard ini secara otomatis setelah server MCP dimulai.","settings.dashboard.autoOpen.nextStart":"Berlaku saat server MCP dimulai berikutnya.","settings.dashboard.settingsFile.label":"File pengaturan","settings.dashboard.agentExample.label":"Minta Agent Anda","settings.dashboard.agentExample.prompt":"“Nonaktifkan buka otomatis Dashboard”.","settings.dashboard.autoOpen.saving":"Menyimpan…","settings.dashboard.autoOpen.saved":"Disimpan untuk startup server berikutnya.","settings.dashboard.autoOpen.error":"Tidak dapat menyimpan. Pengaturan sebelumnya telah dipulihkan.","dashboardAutoOpenGuide.eyebrow":"Preferensi Dashboard","dashboardAutoOpenGuide.title":"Pilih cara WEPPY Dashboard dibuka","dashboardAutoOpenGuide.currentOn":"Buka otomatis sedang aktif. Dashboard ini dibuka setelah server MCP dimulai.","dashboardAutoOpenGuide.currentOff":"Buka otomatis sedang nonaktif. WEPPY tidak akan membuka tab Dashboard baru saat server MCP dimulai.","dashboardAutoOpenGuide.changeAnytime":"Anda dapat mengubahnya kapan saja di Settings.","dashboardAutoOpenGuide.agentHint":"Anda juga dapat meminta Agent, “Nonaktifkan buka otomatis Dashboard”.","dashboardAutoOpenGuide.statusOn":"Buka otomatis aktif","dashboardAutoOpenGuide.statusOff":"Buka otomatis nonaktif","dashboardAutoOpenGuide.keep":"Pertahankan pengaturan saat ini","dashboardAutoOpenGuide.turnOff":"Nonaktifkan buka otomatis","dashboardAutoOpenGuide.openSettings":"Buka Settings","dashboardAutoOpenGuide.close":"Tutup panduan buka otomatis","dashboardAutoOpenGuide.saving":"Menyimpan…","dashboardAutoOpenGuide.error":"Pilihan Anda tidak dapat disimpan. Coba lagi.","settings.language.title":"Bahasa","settings.language.title.tooltip":"Pilih cara teks antarmuka WEPPY Dashboard dilokalkan.","settings.language.dashboard":"Bahasa WEPPY Dashboard","settings.language.dashboard.tooltip":"Mengganti bahasa WEPPY Dashboard atau mengikuti bahasa sistem saat disetel ke Otomatis.","settings.language.auto":"Otomatis","overview.l0.title":"Server MCP terputus","overview.l0.message":"Server MCP tidak merespons. WEPPY Dashboard akan mencoba menghubungkan ulang secara otomatis.","overview.l0.step1":"Periksa apakah proses server MCP sedang berjalan","overview.l0.step2":"Mulai ulang perintah server MCP jika diperlukan","overview.l0.reconnecting":"Menghubungkan ulang otomatis setiap 3 detik...","overview.l0.reconnectBtn":"Hubungkan ulang","overview.l0.settingsBtn":"Periksa pengaturan","overview.l1.pluginGuide":"Plugin Roblox Studio tidak terhubung","overview.l1.check1":"Apakah Roblox Studio sedang berjalan?","overview.l1.check2":"Apakah WEPPY Plugin sudah terinstal?","overview.l1.feedHint":"Perubahan akan muncul di sini setelah plugin terhubung","overview.metric.server":"Server","overview.metric.server.tooltip":"Status runtime dan proses server MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status koneksi dan versi plugin Roblox Studio.","overview.metric.agent":"Agen","overview.metric.agent.tooltip":"Agen coding AI yang terhubung dan status runtime-nya.","overview.metric.agent.instancesUnit":"instansi","overview.metric.sync":"Sinkronisasi","overview.metric.sync.tooltip":"Aktivitas sinkronisasi saat ini antara Studio dan file lokal.","overview.metric.noAgent":"Tidak ada agen","overview.meta.version":"Versi","overview.meta.version.tooltip":"Versi server MCP yang terpasang.","overview.meta.session":"Sesi","overview.meta.session.tooltip":"Pengenal sesi MCP saat ini.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Pengenal proses dari sistem operasi.","overview.meta.uptime":"Waktu aktif","overview.meta.uptime.tooltip":"Waktu yang berlalu sejak server MCP dimulai.","overview.feed.title":"Perubahan game terbaru","overview.feed.empty":"Tidak ada perubahan terbaru","overview.changelog.title":"Ringkasan perubahan sesi","overview.changelog.entries":"Total","overview.changelog.scripts":"skrip","overview.changelog.instances":"instansi","overview.changelog.properties":"properti","overview.changelog.assets":"aset","overview.tier.title":"Penggunaan tier","changelog.subtitle":"Riwayat perubahan game","changelog.filter.all":"Semua","changelog.filter.active":"Aktif","changelog.filter.completed":"Selesai","changelog.empty":"Belum ada entri riwayat","changelog.basic.limit.title":"Pratinjau Basic hanya menampilkan 3 sesi terbaru","changelog.basic.limit.body":"Upgrade ke Pro untuk melihat timeline changelog lengkap untuk place ini.","changelog.basic.metricLabel":"Changelog terlihat / Total","changelog.basic.visible":"terlihat","changelog.basic.total":"total","changelog.card.active":"Aktif","changelog.card.active.tooltip":"Sesi ini masih menerima perubahan game baru.","changelog.card.completed":"Selesai","changelog.card.completed.tooltip":"Sesi ini sudah berakhir dan tidak ada perubahan baru yang diharapkan.","changelog.card.bootstrapStatus":"Inisialisasi","changelog.card.bootstrapStatus.tooltip":"Sesi ini hanya berisi tangkapan layar bootstrap sinkronisasi awal.","changelog.card.inProgress":"sedang berlangsung","changelog.card.noChanges":"Belum ada perubahan","changelog.card.noChanges.tooltip":"Belum ada perubahan game yang diekstrak untuk sesi ini.","changelog.card.bootstrapSummary":"Snapshot sinkronisasi awal","changelog.card.bootstrapSummary.tooltip":"Penulisan sinkronisasi file awal diringkas menjadi satu baris tangkapan layar bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"skrip","changelog.card.scripts.tooltip":"Perubahan skrip yang terjadi di sesi ini.","changelog.card.instances":"instansi","changelog.card.instances.tooltip":"Perubahan pembuatan, penghapusan, pemindahan, atau kloning instansi di sesi ini.","changelog.card.modified":"diubah","changelog.card.created":"dibuat","changelog.card.deleted":"dihapus","changelog.card.moved":"dipindahkan","changelog.card.propertiesChanged":"properti diubah","changelog.card.propertiesChanged.tooltip":"Perubahan nilai properti yang tercatat untuk sesi ini.","changelog.card.lightingConfigured":"Pencahayaan dikonfigurasi","changelog.card.lightingConfigured.tooltip":"Pencahayaan atau pengaturan atmosfer berubah di sesi ini.","changelog.card.terrainConfigured":"Terrain dikonfigurasi","changelog.card.terrainConfigured.tooltip":"Data terrain atau pengaturan terrain berubah di sesi ini.","changelog.card.assetsInserted":"aset disisipkan","changelog.card.assetsInserted.tooltip":"Aset yang dimasukkan ke place selama sesi ini.","changelog.category.script":"Skrip","changelog.category.instance":"Instansi","changelog.category.property":"Properti","changelog.category.lighting":"Pencahayaan","changelog.category.terrain":"Terrain","changelog.category.asset":"Aset","changelog.detail.dialogLabel":"Detail riwayat perubahan","changelog.detail.changeSummary":"Ringkasan perubahan","changelog.detail.changeSummary.tooltip":"Jumlah perubahan game yang diekstrak dan dikelompokkan per kategori untuk sesi ini.","changelog.detail.changeTimeline":"Timeline perubahan","changelog.detail.changeTimeline.tooltip":"Daftar kronologis perubahan game yang diekstrak untuk sesi ini.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Sebelum & Sesudah","changelog.detail.filterCategory":"Kategori","changelog.detail.filterCategory.tooltip":"Filter timeline ke satu kategori perubahan.","changelog.detail.confidence.exact":"Tepat","changelog.detail.confidence.exact.tooltip":"Status sebelum dan sesudah perubahan ini sama-sama terkonfirmasi.","changelog.detail.confidence.partial":"Parsial","changelog.detail.confidence.partial.tooltip":"Hanya sebagian status sebelum dan sesudah perubahan ini yang bisa dikonfirmasi.","changelog.detail.confidence.afterOnly":"Hanya sesudah","changelog.detail.confidence.afterOnly.tooltip":"Hanya status hasil setelah perubahan yang bisa dikonfirmasi.","changelog.detail.confidence.intentOnly":"Hanya niat","changelog.detail.confidence.intentOnly.tooltip":"Hanya aksi yang diminta yang tercatat, bukan status hasilnya.","changelog.detail.confidence.unknown":"Tidak diketahui","changelog.detail.confidence.unknown.tooltip":"Perubahan ini tidak dapat diklasifikasikan dengan yakin dari data yang tersedia.","changelog.detail.noChanges":"Tidak ada perubahan di kategori ini","changelog.detail.backToList":"Kembali ke daftar","changelog.diff.empty":"Tidak ada perbedaan","changelog.diff.unified":"Terpadu","changelog.diff.sideBySide":"Berdampingan","changelog.diff.before":"Sebelum","changelog.diff.after":"Sesudah","sync.overlay.title":"Plugin Roblox Studio diperlukan","sync.overlay.message":"Status sinkronisasi akan tersedia setelah plugin Roblox Studio terhubung.","sync.overlay.check1":"Apakah Roblox Studio sedang berjalan?","sync.overlay.check2":"Apakah WEPPY Plugin sudah terinstal?","sync.status.title":"Status sinkronisasi","sync.status.title.tooltip":"Status sinkronisasi Studio dan file lokal untuk place ini.","sync.status.forwardOnly":"Hanya maju","sync.status.forwardOnly.tooltip":"Tier Basic hanya mengizinkan sinkronisasi maju dari Studio ke lokal.","sync.status.place":"Place","sync.status.place.tooltip":"Nama place Roblox yang terhubung beserta ID place-nya.","sync.status.path":"Path","sync.status.path.tooltip":"Root sistem file lokal yang saat ini dipakai untuk output sinkronisasi.","sync.status.instances":"Instansi","sync.status.instances.tooltip":"Jumlah total instance Roblox yang disinkronkan di mirror lokal.","sync.status.scripts":"Skrip","sync.status.scripts.tooltip":"Jumlah total file skrip yang saat ini diindeks untuk place ini.","sync.status.state":"Status","sync.status.state.tooltip":"Status runtime sinkronisasi saat ini yang dilaporkan server.","sync.policy.title":"Kebijakan Sync","sync.policy.title.tooltip":"Kebijakan Sync efektif yang dilaporkan oleh plugin Studio yang terhubung.","sync.policy.activation":"Aktivasi","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Alur kerja","sync.policy.preset.studio_first":"Studio lebih dahulu","sync.policy.preset.bidirectional_review":"Dua arah","sync.policy.preset.local_code_studio_world":"Kode lokal, dunia Studio","sync.policy.preset.custom":"Kustom","sync.policy.apply.title":"Cara menerapkan perubahan lokal ke Studio","sync.policy.apply.description":"Menampilkan apakah perubahan lokal ditinjau lebih dulu atau diterapkan otomatis ke Studio.","sync.policy.apply.content":"Perubahan konten","sync.policy.apply.content.tooltip":"Perubahan lokal pada Sumber Script, properti, dan properti layanan. Membuat, menghapus, mengganti nama, dan memindahkan adalah perubahan struktur.","sync.policy.apply.structure":"Perubahan struktur","sync.policy.apply.structure.tooltip":"Pembuatan, penghapusan, penggantian nama, dan pemindahan instance secara lokal. Penghapusan lokal otomatis juga memerlukan opsi penghapusan terpisah di bawah.","sync.policy.apply.manual":"Tinjau dahulu","sync.policy.apply.auto":"Terapkan otomatis","sync.policy.scope.disclosure":"Arah per cakupan","sync.policy.scope.scriptSource":"Sumber script","sync.policy.scope.properties":"Properti","sync.policy.scope.structure":"Struktur","sync.policy.scope.serviceProperties":"Properti layanan","sync.policy.endpoint.local":"Lokal","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Lokal","sync.policy.direction.forward.tooltip":"Perubahan Studio ditulis ke file lokal.","sync.policy.direction.reverse":"Lokal → Studio","sync.policy.direction.reverse.tooltip":"Perubahan file lokal diterapkan ke Studio.","sync.policy.direction.bidirectional":"Dua arah","sync.policy.direction.bidirectional.tooltip":"Perubahan dapat bergerak dari Studio ke file lokal dan dari file lokal ke Studio.","sync.policy.safety.localDeletes":"Hapus lokal → hapus instance Studio","sync.policy.safety.review":"Tinjau sebelum menghapus","sync.policy.safety.review.tooltip":"Penghapusan file lokal menunggu tinjauan sebelum instance Studio yang sesuai dihapus. Ini terpisah dari pembersihan otomatis UI Studio.","sync.policy.safety.auto":"Hapus otomatis di Studio","sync.policy.safety.auto.tooltip":"Menghapus file lokal dapat secara otomatis menghapus instance Studio yang sesuai. Ini terpisah dari pembersihan otomatis UI Studio.","sync.policy.reviewRequired":"Tinjau kebijakan ini di plugin Studio sebelum memulai Sync.","sync.log.title":"Log sinkronisasi","sync.log.empty":"Tidak ada event sinkronisasi","sync.log.type.write":"TULIS","sync.log.type.write.tooltip":"Output sinkronisasi baru ditulis ke disk.","sync.log.type.update":"PERBARUI","sync.log.type.update.tooltip":"File atau instance yang sudah tersinkron diperbarui.","sync.log.type.delete":"HAPUS","sync.log.type.delete.tooltip":"File atau instance tersinkron telah dihapus.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Event sinkronisasi dicatat tanpa perubahan file.","sync.upgrade.title":"Lihat sinkronisasi penuh dengan Pro","sync.upgrade.benefit1":"Sinkronisasi dua arah — edit file, otomatis diterapkan ke Studio","sync.upgrade.benefit2":"Sinkronisasi mundur — kirim perubahan file ke Studio","sync.upgrade.benefit3":"Riwayat sinkronisasi lengkap dan log perubahan detail","sync.upgrade.buy":"Lihat Pro","playtest.status.title":"Status playtest","playtest.status.title.tooltip":"Status sesi playtest Roblox saat ini yang dilaporkan oleh Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode peluncuran playtest Studio untuk sesi saat ini.","playtest.status.mode.value.tooltip":"Mode playtest Roblox Studio spesifik yang sedang dipakai saat ini.","playtest.status.mode.play":"Main","playtest.status.mode.run":"Jalankan","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Place Roblox yang saat ini terkait dengan sesi playtest ini.","playtest.status.state.running":"Berjalan","playtest.status.state.running.tooltip":"Sesi playtest Roblox saat ini sedang berjalan.","playtest.status.state.paused":"Dijeda","playtest.status.state.paused.tooltip":"Sesi playtest Roblox saat ini sedang dijeda.","playtest.status.state.notRunning":"Tidak berjalan","playtest.status.state.notRunning.tooltip":"Saat ini tidak ada sesi playtest Roblox yang sedang berjalan.","playtest.control.play":"Main","playtest.control.pause":"Jeda","playtest.control.resume":"Lanjutkan","playtest.control.stop":"Berhenti","playtest.history.title":"Riwayat tes","playtest.history.title.tooltip":"Riwayat eksekusi playtest otomatis yang tercatat untuk proyek ini.","playtest.history.empty":"Belum ada hasil tes","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode playtest yang digunakan pada eksekusi tes yang tercatat ini.","playtest.history.status.passed":"Berhasil","playtest.history.status.failed":"Gagal","playtest.history.status.running":"Berjalan","playtest.history.status.unknown":"Tidak diketahui","playtest.history.status.tooltip":"Status hasil yang tercatat untuk eksekusi playtest otomatis ini.","playtest.empty.title":"Belum ada hasil playtest","playtest.empty.message":"Hasil akan muncul di sini setelah agen AI menjalankan Playtest.","playtest.empty.message.before":"Hasil akan muncul di sini setelah agen AI menjalankan Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Laporan terpilih","playtest.report.title.tooltip":"Output detail untuk eksekusi playtest otomatis yang sedang dipilih.","playtest.detail.dialogLabel":"Detail laporan playtest","playtest.detail.loading":"Memuat laporan...","playtest.detail.errorTitle":"Laporan tidak tersedia","playtest.report.content":"Laporan","playtest.report.content.tooltip":"Ringkasan Markdown untuk eksekusi playtest otomatis yang dipilih.","playtest.report.logs":"Log","playtest.report.logs.tooltip":"Log eksekusi yang ditangkap untuk eksekusi playtest otomatis yang dipilih.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Tidak ada konten laporan","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest adalah fitur khusus Pro","playtest.basic.desc":"Kontrol playtest dari WEPPY Dashboard, jalankan tes otomatis, dan lihat laporan tes detail.","playtest.basic.benefit1":"Kontrol main/jeda/berhenti sekali klik","playtest.basic.benefit2":"Eksekusi tes otomatis via agen AI","playtest.basic.benefit3":"Riwayat tes dengan pelacakan berhasil/gagal","playtest.basic.benefit4":"Laporan tes detail dalam markdown","playtest.sample.badge":"Pratinjau tampilan playtest Pro","playtest.sample.title":"Anda sedang melihat pratinjau layar playtest yang tersedia setelah upgrade ke Pro.","playtest.sample.message":"Pratinjau ini menggunakan data sampel. Kontrol playtest langsung, pengelolaan riwayat, dan laporan nyata tersedia setelah upgrade ke Pro.","playtest.sample.clearDisabled":"Upgrade ke Pro untuk menghapus riwayat playtest nyata.","playtest.sample.place":"Pratinjau Arena","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Masuk ke arena, bertahan pada fase awal, dan pastikan HUD merespons segera.","playtest.sample.context.expected":"Pemain spawn dengan aman, UI hitung mundur muncul dalam satu detik, dan wave pertama dimulai tanpa error.","playtest.sample.context.observed":"Proteksi spawn bekerja, HUD diperbarui tepat waktu, dan wave pertama selesai tanpa regresi.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
|
|
120
|
-
|
|
121
|
-
- Alur spawn: PASS
|
|
122
|
-
- Hitung mundur HUD: PASS
|
|
123
|
-
- Awal wave: PASS
|
|
124
|
-
|
|
125
|
-
Ini adalah pratinjau sampel. Upgrade ke Pro untuk menjalankan playtest langsung dan menyimpan laporan nyata.`,"playtest.sample.report.logs":`[sample] boot pratinjau playtest
|
|
126
|
-
[sample] proteksi spawn aktif
|
|
127
|
-
[sample] hitung mundur hud dirender
|
|
128
|
-
[sample] wave pertama selesai
|
|
129
|
-
[sample] laporan pratinjau selesai`,"sidebar.whatsNew":"Yang Baru","sidebar.help.group":"Bantuan & Umpan Balik","sidebar.help.bug":"Laporkan bug","sidebar.help.bug.tooltip":"Buat paket diagnostik lokal, lalu buka laporan bug GitHub yang sudah terisi","bugReportDialog.title":"diagnostics.zip dapat membantu investigasi","bugReportDialog.subtitle":"WEPPY membuat zip diagnostik di komputer ini. File ini berisi log Studio, plugin, Sync, dan tool yang dapat membantu kami memahami masalahnya.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Kamu tetap bisa mengirim laporan bug tanpa file ini, tetapi melampirkan zip biasanya membantu kami menemukan penyebabnya lebih cepat.","bugReportDialog.attachHow":"Untuk melampirkannya, unduh atau tampilkan zip, lalu tambahkan ke kolom Diagnostics ZIP (optional) di issue GitHub sebelum dikirim.","bugReportDialog.download":"1. Unduh diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Buka issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Zip dapat berisi log lokal dan konteks proyek. Tinjau sebelum melampirkannya jika ingin dibagikan.","sidebar.help.feature":"Sarankan fitur baru","sidebar.help.feature.tooltip":"Sarankan fitur baru atau peningkatan di GitHub","sidebar.help.discussions":"Bantuan instalasi/penggunaan","sidebar.help.discussions.tooltip":"Minta bantuan instalasi atau penggunaan lewat GitHub Issues","sidebar.help.troubleshooting":"Panduan pemecahan masalah","sidebar.help.troubleshooting.tooltip":"Buka panduan pemecahan masalah resmi di weppyai.com","header.whatsNew":"Yang Baru","header.whatsNew.tooltip":"Yang Baru","upgrade.title":"Lihat Pro","upgrade.tagline":"Lihat fitur Pro","upgrade.cta":"Lihat Pro","upgrade.licenseShortcut":"Masukkan lisensi","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Yang Baru","whatsNew.pageSubtitle":"Tetap update dengan perubahan MCP","whatsNew.unreadSection":"Belum Dibaca","whatsNew.allSection":"Semua Pengumuman","whatsNew.empty":"Belum ada pengumuman","whatsNew.newBadge":"BARU","whatsNew.importantBadge":"PENTING","whatsNew.category.release":"Rilis","whatsNew.category.notice":"Pemberitahuan","whatsNew.category.deprecation":"Tidak Digunakan","whatsNew.category.tip":"Tips","uiStudio.title":"UI Studio","uiStudio.empty":"Belum ada tangkapan layar tersimpan. Ini dibuat otomatis saat agen AI menangkap status UI saat ini.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Plugin Roblox Studio belum terhubung","uiStudio.pluginGuide.message":"UI Studio menampilkan tangkapan layar dan riwayat perubahan dari place Studio yang terhubung. Ini akan diperbarui otomatis setelah Studio dan WEPPY Plugin terhubung.","uiStudio.pluginGuide.check1":"Apakah Roblox Studio sedang berjalan?","uiStudio.pluginGuide.check2":"Apakah WEPPY Plugin terpasang dan berjalan?","uiStudio.pluginGuide.waiting":"Menunggu koneksi plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Tinjau dahulu","uiStudio.priorityLow":"Peningkatan opsional","uiStudio.highPrioritySection":"Tinjau dahulu","uiStudio.lowPrioritySection":"Peningkatan opsional","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analisis","uiStudio.tabs.history":"Riwayat","uiStudio.analysis.reportsTitle":"Analisis Terbaru per Target UI","uiStudio.analysis.recentCapturesTitle":"Tangkapan Terbaru","uiStudio.analysis.detailDialog":"Detail analisis","uiStudio.analysis.targetCountLabel":"Target dianalisis","uiStudio.analysis.captureLabel":"Tangkapan","uiStudio.analysis.verdict.hasSuggestions":"Saran Perbaikan","uiStudio.analysis.verdict.needsFix":"Saran Perbaikan","uiStudio.analysis.verdict.review":"Saran Perbaikan","uiStudio.analysis.verdict.passed":"Tidak Ada Saran Saat Ini","uiStudio.analysis.verdictLabel":"Ringkasan Perbaikan","uiStudio.analysis.coverage.structuralOnly":"Hanya pemeriksaan struktural yang selesai","uiStudio.analysis.coverage.visualSkipped":"Pemeriksaan struktural selesai · Pemeriksaan visual dilewati","uiStudio.analysis.coverage.visualFailed":"Pemeriksaan struktural selesai · Pemeriksaan visual gagal","uiStudio.analysis.coverage.full":"Pemeriksaan struktural dan visual selesai","uiStudio.analysis.coverage.deterministicFailed":"Pemeriksaan struktural gagal","uiStudio.analysis.thresholds":"Basis Tinjauan","uiStudio.analysis.issueSummary.passed":"Tidak ada saran perbaikan tambahan pada basis tinjauan saat ini.","uiStudio.history.title":"Riwayat Perubahan","uiStudio.history.empty":"Belum ada riwayat perubahan. Ketika agen AI memodifikasi UI menggunakan manage_ui, akan dicatat secara otomatis.","uiStudio.history.loading":"Memuat...","uiStudio.history.loadingPlace":"Memuat place saat ini...","uiStudio.history.noPlace":"Data place saat ini belum tersedia. Hubungkan WEPPY Plugin dan sinkronkan place untuk melihat riwayat perubahan UI.","uiStudio.history.noPlaceAction":"Place saat ini belum tersedia.","uiStudio.history.error":"Kesalahan","uiStudio.history.clear":"Hapus Semua","uiStudio.history.filter.actions":"Jenis aksi","uiStudio.history.filter.actionAll":"Semua","uiStudio.history.filter.actionCreate":"Buat","uiStudio.history.filter.actionUpdate":"Perbarui","uiStudio.history.filter.actionDelete":"Hapus","uiStudio.history.filter.period":"Periode","uiStudio.history.filter.dateAll":"Semua","uiStudio.history.filter.today":"Hari Ini","uiStudio.history.filter.yesterday":"Kemarin","uiStudio.history.filter.last7Days":"7 Hari Terakhir","uiStudio.history.filter.last30Days":"30 Hari Terakhir","uiStudio.history.filter.customRange":"Rentang Kustom","uiStudio.history.filter.reset":"Setel Ulang","uiStudio.history.filter.from":"Dari","uiStudio.history.filter.to":"Hingga","uiStudio.history.row.affectedPaths":"Jalur","uiStudio.history.row.mutations":"Detail perubahan","uiStudio.history.row.expand":"▾ Perluas","uiStudio.history.row.collapse":"▲ Tutup","uiStudio.history.row.expandDetails":"Tampilkan {n} detail perubahan","uiStudio.history.row.collapseDetails":"Sembunyikan detail perubahan","uiStudio.history.row.toggleDetails":"Alihkan detail perubahan","uiStudio.history.row.mutationsEmpty":"Tidak ada detail perubahan","uiStudio.history.row.toolLabel":"Perubahan UI ({n})","uiStudio.history.row.compare":"Sebelum / Sesudah","uiStudio.history.row.noBeforeState":"Tidak ada status sebelumnya","uiStudio.history.row.noAfterState":"Tidak ada status sesudahnya","uiStudio.history.row.qualityPlan":"Arah desain","uiStudio.history.row.designCheck":"Saran","uiStudio.history.row.designCheckUnavailable":"Saran: tidak tersedia","uiStudio.history.row.designCheckNone":"Saran: tidak ada","uiStudio.history.selection.deleteSelected":"Hapus yang dipilih","uiStudio.history.selection.selectAll":"Pilih semua","uiStudio.history.selection.clearSelection":"Hapus pilihan","uiStudio.history.confirm.deleteRequestsTitle":"Hapus catatan perubahan","uiStudio.history.confirm.deleteRequestsMessage":"Catatan perubahan yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.history.confirm.clearRequestsTitle":"Hapus Riwayat Perubahan","uiStudio.history.confirm.clearRequestsMessage":"Ini menghapus riwayat perubahan place saat ini. Instance Studio tidak terpengaruh.","uiStudio.history.confirm.cascadeOption":"Juga hapus tangkapan layar terkait","uiStudio.history.drawer.close":"Tutup","uiStudio.actions.previewAgain":"Pratinjau Lagi","uiStudio.actions.deleteSnapshot":"Hapus Tangkapan Layar Ini","uiStudio.actions.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.actions.captureCurrentState":"Tangkap Keadaan Saat Ini","uiStudio.actions.checkSuggestionsAgain":"Periksa Ulang Saran","uiStudio.actions.previewRunning":"Menangkap…","uiStudio.actions.previewRunningDetail":"ID file tangkapan layar baru akan muncul setelah penangkapan selesai.","uiStudio.actions.previewNeedsSaveCheck":"Tangkapan selesai, penyimpanan perlu diperiksa","uiStudio.actions.previewSaved":"Tangkapan layar baru disimpan","uiStudio.actions.previewComplete":"Tangkapan selesai","uiStudio.actions.previewSavedDetail":"Tangkapan yang ada tetap dipertahankan; ini disimpan sebagai file baru.","uiStudio.actions.previewSavedPathMissing":"ID tangkapan baru diterima, tetapi jalur file tersimpan tidak dapat dikonfirmasi.","uiStudio.actions.previewSnapshotIdMissing":"ID tangkapan baru tidak dapat dikonfirmasi. Segarkan daftar untuk memastikan apakah sudah tersimpan.","uiStudio.actions.more":"Lainnya","uiStudio.gallery.selection.selectedCount":" dipilih","uiStudio.confirm.deleteSnapshotTitle":"Hapus Tangkapan Layar","uiStudio.confirm.deleteSnapshotMessage":"Hanya file tangkapan layar ini yang dihapus (instans Studio tetap disimpan).","uiStudio.confirm.deleteBatchTitle":"Hapus Tangkapan Layar Terpilih","uiStudio.confirm.deleteBatchMessage":"Tangkapan layar yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.gallery.selectMode":"Pilih","uiStudio.gallery.exitSelectMode":"Batal","uiStudio.gallery.selectAll":"Pilih Semua","uiStudio.gallery.clearSelection":"Batalkan Pilihan","uiStudio.gallery.deleteSelected":"Hapus Pilihan","common.save":"Simpan","common.cancel":"Batal","common.delete":"Hapus","uiStudio.storage.title":"Data tersimpan UI Studio","uiStudio.storage.usageLabel":"Digunakan","uiStudio.storage.historyBytes":"Riwayat","uiStudio.storage.snapshotBytes":"Tangkapan layar","uiStudio.storage.requestCount":"Catatan perubahan","uiStudio.storage.mutationCount":"Detail perubahan","uiStudio.storage.snapshotCount":"Tangkapan layar","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Pembersihan otomatis terakhir","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"dibebaskan","uiStudio.storage.lastRunErrors":"Kesalahan","uiStudio.storage.loading":"Memuat...","uiStudio.cleanup.policy.title":"Kebijakan hapus otomatis","uiStudio.cleanup.policy.modeOff":"Nonaktif","uiStudio.cleanup.policy.modeAge":"Berbasis usia","uiStudio.cleanup.policy.modeSize":"Berbasis ukuran","uiStudio.cleanup.policy.cascade":"Juga hapus tangkapan layar terkait","uiStudio.cleanup.policy.save":"Simpan kebijakan","uiStudio.cleanup.policy.runNow":"Jalankan kebijakan tersimpan","uiStudio.cleanup.policy.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.cleanup.policy.daysUnit":"h","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Konfirmasi kebijakan","uiStudio.cleanup.policy.confirm.messageStrict":"Menerapkan kebijakan ini akan segera menghapus","uiStudio.cleanup.policy.confirm.requests":" catatan perubahan","uiStudio.cleanup.policy.confirm.snapshots":" tangkapan layar","uiStudio.cleanup.policy.confirm.freed":"dibebaskan — Terapkan?","uiStudio.cleanup.keepLastNDays":"Simpan {n} hari terakhir","uiStudio.cleanup.selectedDelete":"Hapus pilihan…","uiStudio.cleanup.deleteAll":"Hapus semua…","uiStudio.cleanup.cleanupConfirmTitle":"Konfirmasi pembersihan","uiStudio.cleanup.cleanupConfirmMessage":"Item yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Pembersihan manual","uiStudio.cleanup.studioPreservedNote":"Tindakan ini hanya menghapus file riwayat dan tangkapan layar di disk; instans Roblox Studio tidak terpengaruh.","uiStudio.history.sample.bannerBadge":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerTitle":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerMessage":"Pratinjau ini menggunakan data sampel. Riwayat perubahan nyata, perbandingan sebelum/sesudah, dan penghapusan massal tersedia di Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Upgrade ke Pro untuk membuka riwayat lengkap","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Jalankan kebijakan tersimpan","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Kosongkan semua","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Server MCP terhubung","toast.serverDisconnected":"Server MCP terputus","toast.pluginConnected":"Plugin terhubung","toast.pluginDisconnected":"Plugin terputus","toast.clearSuccess":"Berhasil dihapus","toast.clearFailed":"Gagal menghapus data","common.clear":"Hapus","settings.license.activate":"Aktifkan lisensi","settings.license.refresh":"Segarkan lisensi","settings.license.keyInput":"Kunci lisensi","settings.license.disconnected":"Terputus","settings.license.disconnected.tooltip":"Sambungkan ulang ke server MCP untuk mengelola lisensi dari WEPPY Dashboard.","settings.license.live.tooltip":"Tindakan lisensi langsung dikirim ke server MCP.","settings.license.status.activationRequired":"Aktivasi Diperlukan","settings.license.status.activationRequired.tooltip":"Aktivasi lisensi manual diperlukan sebelum WEPPY Dashboard dapat menyegarkan status ini.","settings.license.status.grace":"Masa Tenggang","settings.license.status.grace.tooltip":"Verifikasi penyedia sementara tidak tersedia, tetapi akses Pro tetap aktif selama masa tenggang.","settings.license.status.graceBilling.tooltip":"Akses Pro tetap tersedia selama masa tenggang terkait penagihan.","settings.license.detail.graceBilling":"Akses Pro tetap tersedia selama masa tenggang penagihan.","settings.license.detail.graceProviderUnavailable":"Penyedia tidak tersedia. Akses Pro tetap aktif selama mode tenggang.","settings.license.detail.manualActivation":"Aktivasi manual diperlukan untuk memulihkan akses Pro.","settings.license.detail.missingSessionToken":"Penyegaran diblokir karena token sesi saat ini tidak ada.","settings.license.detail.refreshRecommended":"Verifikasi lisensi harus segera disegarkan.","connection.agents.kill":"Hentikan","connection.agents.kill.title":"Hentikan agen?","connection.agents.killed":"Agen dihentikan","connection.agents.killFailed":"Gagal menghentikan agen","connection.agents.lastCommand":"Perintah Terakhir","connection.agents.lastCommand.tooltip":"Panggilan alat terbaru yang dijalankan oleh agen ini.","connection.agents.lastSeen":"Terakhir Terlihat","connection.agents.lastSeen.tooltip":"Heartbeat atau aktivitas terbaru dari agen ini.","connection.clear.title":"Hapus log koneksi?","connection.clear.message":"Tindakan ini menghapus secara permanen log koneksi yang tersimpan untuk proyek saat ini.","sync.clear.title":"Hapus log sinkronisasi?","sync.clear.message":"Tindakan ini menghapus secara permanen log sinkronisasi yang tersimpan untuk place saat ini.","playtest.clear.title":"Hapus riwayat tes?","playtest.clear.message":"Tindakan ini menghapus secara permanen laporan playtest yang tersimpan untuk place saat ini.","changelog.clear.title":"Hapus changelog?","changelog.clear.message":"Tindakan ini menghapus secara permanen changelog yang tersimpan untuk place saat ini.","sync.status.placePath":"Jalur Place","sync.status.placePath.tooltip":"Direktori place aktif tempat berkas explorer disinkronkan.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Area representatif","changelog.card.verification":"Verifikasi","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Arah desain brief yang digunakan untuk perubahan ini.","uiStudio.history.row.designCheck.tooltip":"Ringkasan saran Design Check setelah perubahan.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Jalankan aturan pembersihan yang tersimpan satu kali sekarang tanpa menunggu jadwal berikutnya.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Lihat fitur Pro dan opsi pembelian.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.manageStorage":"Kelola penyimpanan","settings.dataHistory.manageStorage.tooltip":"Tampilkan atau sembunyikan kebijakan penyimpanan dan kontrol pembersihan.","settings.dataHistory.manageStorage.projectChanges.aria":"Kelola penyimpanan ringkasan perubahan proyek","settings.dataHistory.manageStorage.uiStudio.aria":"Kelola penyimpanan riwayat dan tangkapan layar UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Saran Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Periksa lagi","uiStudio.actions.designCheckRunning":"Memeriksa saran...","uiStudio.actions.designCheckRunningDetail":"Jumlah item tinjau dahulu, disarankan, dan opsional akan ditampilkan setelah selesai.","uiStudio.actions.designCheckComplete":"Pemeriksaan saran selesai","uiStudio.actions.designCheckNoSnapshotSaved":"Tindakan ini tidak menyimpan file tangkapan layar baru.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Jumlah saran yang perlu ditinjau dahulu. Klik untuk detail.","uiStudio.gallery.priorityMediumBadge.tooltip":"Jumlah saran yang direkomendasikan.","uiStudio.priorityMedium":"Disarankan ditinjau","uiStudio.mediumPrioritySection":"Disarankan ditinjau","uiStudio.gallery.priorityLowBadge.tooltip":"Jumlah peningkatan opsional.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Error","uiStudio.analysis.expandChildren":"Tampilkan target turunan","uiStudio.analysis.openDetail":"Buka detail","uiStudio.analysis.childTargets":"Target turunan","uiStudio.analysis.childDetailHint":"Buka detail target turunan","uiStudio.compare.before":"Sebelum","uiStudio.compare.after":"Sesudah","uiStudio.history.drawer.changeDetails":"Detail perubahan","uiStudio.gallery.cardCheckbox":"Pilih tangkapan layar","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Semua cakupan","assets.explorer.label":"Penjelajah aset","assets.breadcrumb.label":"Jalur aset","assets.explorer.summary":"{direct} di folder ini · {descendant} di subfolder","assets.folder.count.one":"1 aset","assets.folder.count.many":"{count} aset","assets.folder.type":"Folder","assets.folders.title":"Folder","assets.folder.assetsTitle":"Aset di folder ini","assets.organization.label":"Jelajahi","assets.organization.folders":"Folder","assets.organization.all":"Semua aset","assets.organization.summary":"{count} aset","assets.view.options":"Opsi tampilan","assets.view.mode":"Mode tampilan","assets.view.grid":"Kisi","assets.view.list":"Daftar","assets.view.thumbnailSize":"Ukuran thumbnail","assets.view.thumbnailSize.listReason":"Ukuran thumbnail tersedia dalam tampilan kisi.","assets.view.size.small":"Kecil","assets.view.size.medium":"Sedang","assets.view.size.large":"Besar","assets.list.name":"Nama","assets.list.type":"Jenis","assets.list.scope":"Cakupan","assets.list.status":"Status","assets.list.updated":"Diperbarui","assets.loading.scope":"Memuat aset {scope}...","assets.partial.title":"Beberapa lokasi tidak dapat dimuat","assets.empty.folderTitle":"Tidak ada aset yang cocok di folder ini","assets.empty.folderBody":"Coba folder atau filter kategori lain.","assets.empty.filteredTitle":"Tidak ada aset yang cocok dengan filter ini","assets.empty.filteredBody":"Pilih kategori lain atau pindai ulang folder yang sesuai.","assets.place.selector":"Asset place","assets.place.context":"Konteks tempat aset","assets.place.sharedLibrary":"Pustaka bersama","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Cara kerjanya","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Periksa WEPPY Bridge bersama, MCP Adapter tiap agen AI, target Studio, dan log koneksi.","dashboardHelp.connection.needs.1":"WEPPY Bridge harus dapat dijangkau. Target Studio muncul setelah WEPPY Plugin mengirim heartbeat.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Tinjau bukti Playtest terstruktur untuk hasil UI, input, dan server yang disimpan oleh AI Agent.","dashboardHelp.playtest.needs.1":"Pro menampilkan laporan tersimpan yang sebenarnya. Basic menampilkan satu sampel. Bukti tangkapan layar Play tidak tersedia, tetapi bukti UI semantik dan interaksi tetap tersedia. WEPPY Plugin harus terhubung untuk mengenali Place aktif dengan tepat.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Tutup","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Jika target Studio tidak muncul, buka Roblox Studio dan jalankan WEPPY Plugin. Jika agen AI atau MCP Adapter tidak muncul, hubungkan kembali WEPPY MCP Server dari alat AI Anda.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Periksa status WEPPY Bridge bersama, MCP Adapter milik setiap agen AI, target Studio, dan log koneksi.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Perutean Studio","controls.studioRouting.title.tooltip":"Prioritas untuk permintaan MCP yang tidak menentukan Studio.","controls.studioRouting.settingLabel":"Permintaan tanpa Studio tertentu","controls.studioRouting.mode.auto":"Otomatis","controls.studioRouting.mode.pinned":"Studio tetap","controls.studioRouting.state.auto":"Saat ini: otomatis","controls.studioRouting.state.pinned":"Saat ini: Studio tetap","controls.studioRouting.saving":"Menerapkan…","controls.studioRouting.applied":"Diterapkan","controls.studioRouting.failed":"Gagal diterapkan","controls.studioRouting.pinnedUnavailable":"Hubungkan target Studio untuk menggunakan mode Studio tetap.","controls.studioRouting.helpLabel":"Cara kerja perutean Studio","controls.studioRouting.helpButton":"Bagaimana cara kerjanya?","controls.studioRouting.selectTarget":"Pilih Studio tetap","controls.studioRouting.select":"Pilih","controls.studioRouting.targetGroupLabel":"Target Studio tetap","controls.luauValidation.title":"Pemeriksaan sintaks Luau","controls.luauValidation.settingLabel":"Periksa otomatis setelah mengedit Script","controls.luauValidation.benefit":"Setelah AI mengedit Script, periksa error sintaks Luau.","controls.luauValidation.state.on":"Saat ini: aktif","controls.luauValidation.state.off":"Saat ini: nonaktif","controls.luauValidation.priority":"Jika permintaan AI berbeda dari opsi ini, pengaturan Dashboard yang digunakan. Aktifkan atau nonaktifkan di sini untuk mengubah cara pengeditan diperiksa.","controls.luauValidation.switchLabel":"Pemeriksaan otomatis setelah mengedit Script","controls.luauValidation.saving":"Menyimpan…","controls.luauValidation.applied":"Diterapkan","controls.luauValidation.failed":"Gagal diterapkan","controls.luauValidation.helpLabel":"Cara kerja pemeriksaan sintaks Luau otomatis","controls.luauValidation.helpButton":"Bagaimana cara kerjanya?","controls.luauValidation.help.behavior":"Saat aktif, setelah AI selesai mengganti, mengedit, menyisipkan, atau menghapus baris, WEPPY memeriksa seluruh kode yang benar-benar tersimpan. Saat nonaktif, Script hanya diedit tanpa pemeriksaan sintaks otomatis.","controls.luauValidation.help.response":"Jika Script benar, respons selesai tetap singkat seperti biasa. WEPPY hanya memberi detail saat menemukan error atau tidak dapat menyelesaikan pemeriksaan. Script besar mungkin memerlukan sedikit waktu tambahan.","controls.luauValidation.help.nonBlocking":"Jika WEPPY menemukan error sintaks atau tidak dapat menyelesaikan pemeriksaan, perubahan Script yang sudah tersimpan tidak dibatalkan. Hasilnya membantu AI segera memperbaiki Script yang sama.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Beberapa jendela Studio yang terhubung memiliki Place ID yang sama. Gunakan Studio ID untuk menentukan tempat tersebut.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Permintaan dengan Studio ID, Connection ID, atau Place ID melewati prioritas ini dan dikirim ke Studio yang ditentukan.","controls.studioRouting.state.currentTarget":"Target prioritas saat ini","controls.studioRouting.noPriorityTarget":"Tidak ada Studio yang terhubung","controls.studioRouting.help.auto":"Otomatis menggunakan Studio aktif berprioritas tertinggi berdasarkan perintah terbaru dan urutan koneksi.","controls.studioRouting.help.pinned":"Studio tetap menggunakan Studio yang dipilih saat permintaan tidak menentukan ID target.","sync.migration.title":"Pembaruan format Sync tersedia","sync.migration.description":"Tinjau perubahan metadata sebelum memperbarui Place ini dari format Sync v2 ke v3.","sync.migration.status.ready":"Siap ditinjau","sync.migration.status.blocked":"Diblokir","sync.migration.preview":"Tinjau perubahan","sync.migration.summary.add":"Tambah","sync.migration.summary.modify":"Ubah","sync.migration.summary.delete":"Hapus","sync.migration.summary.blocked":"Diblokir","sync.migration.changes":"Perubahan metadata","sync.migration.blockers":"Item yang perlu diselesaikan","sync.migration.operation.add":"tambah","sync.migration.operation.modify":"ubah","sync.migration.operation.delete":"hapus","sync.migration.reason.serializer_regeneration":"Menulis ulang metadata dalam format standar v3.","sync.migration.reason.volatile_metadata_removal":"Menghapus metadata Sync sementara.","sync.migration.reason.redundant_empty_metadata":"Menghapus metadata kosong yang tidak diperlukan.","sync.migration.reason.runtime_ignore_policy":"Memperbarui kebijakan pengecualian runtime terkelola.","sync.migration.reason.reverse_pending":"Terapkan atau buang perubahan lokal ke Studio yang tertunda terlebih dahulu.","sync.migration.reason.conflict":"Selesaikan konflik antara file lokal dan Studio terlebih dahulu.","sync.migration.reason.local_canonical_change":"Tinjau metadata standar yang diubah secara lokal terlebih dahulu.","sync.migration.reason.source_mutation_detected":"File sumber pengguna berubah selama validasi.","sync.migration.blocked":"Selesaikan konflik Sync sebelum memperbarui","sync.migration.stale":"Pratinjau berubah. Tinjau perbedaan terbaru.","sync.migration.error":"Format Sync tidak dapat diperbarui. Coba lagi.","sync.migration.refresh":"Segarkan pratinjau","sync.migration.refreshing":"Menyegarkan…","sync.migration.applying":"Menerapkan…","sync.migration.apply":"Terapkan pembaruan","sync.migration.confirm.title":"Terapkan pembaruan format Sync?","sync.migration.confirm.message":"Metadata Sync yang tercantum akan dicadangkan dan diperbarui. File sumber Luau Anda tidak akan berubah.","changelog.ownership.showGenerated":"Tampilkan metadata yang dihasilkan","changelog.ownership.userSource":"Sumber pengguna","changelog.ownership.canonicalMirror":"Metadata mirror","changelog.ownership.generated":"Dihasilkan","uiStudio.analysis.verdict.incomplete":"Bukti peninjauan belum lengkap","uiStudio.analysis.issueSummary.incomplete":"Tidak ada saran, tetapi peninjauan interaksi dan responsif masih tertunda.","uiStudio.analysis.coverageDimensions":"Cakupan peninjauan","uiStudio.analysis.coverageStatus.completed":"Selesai","uiStudio.analysis.coverageStatus.failed":"Gagal","uiStudio.analysis.coverageStatus.skipped":"Dilewati","uiStudio.history.row.readinessIncomplete":"Kesiapan: bukti belum lengkap","uiStudio.noSuggestionsIncomplete":"Tidak ada saran, tetapi sebagian cakupan peninjauan masih belum tersedia.","uiStudio.readiness.summary":"Kesiapan UI","uiStudio.primaryVisual.label":"Tampilan utama","uiStudio.primaryVisual.recompose":"Susun ulang","uiStudio.primaryVisual.refine":"Perbaiki","uiStudio.primaryVisual.approved":"Disetujui","uiStudio.primaryVisual.unknown":"Belum diketahui","uiStudio.functional.label":"Fungsional","uiStudio.functional.safe":"Aman","uiStudio.functional.risk":"Ada risiko","uiStudio.functional.unknown":"Belum diketahui","uiStudio.functional.safeCompact":"Fungsi aman","uiStudio.functional.riskCompact":"Risiko fungsi","uiStudio.functional.unknownCompact":"Fungsi belum diketahui","uiStudio.responsive.label":"Responsif","uiStudio.responsive.recommended":"Disarankan","uiStudio.responsive.required":"Wajib","uiStudio.responsive.unknown":"Belum diketahui","uiStudio.responsive.recommendedCompact":"Responsif disarankan","uiStudio.responsive.requiredCompact":"Responsif wajib","uiStudio.responsive.unknownCompact":"Responsif belum diketahui","uiStudio.readiness.ready":"Siap","uiStudio.readiness.reviewRequired":"Perlu ditinjau","uiStudio.readiness.insufficient":"Bukti belum lengkap","uiStudio.readiness.unknown":"Kesiapan belum diketahui","uiStudio.criticSummary":"Ringkasan tinjauan","playtest.history.kind.structured":"Terstruktur","playtest.history.kind.legacy":"Lama","playtest.history.kind.attention":"Perlu diperiksa","playtest.summary.title":"Ringkasan eksekusi","playtest.summary.status":"Status","playtest.summary.mode":"Mode","playtest.summary.duration":"Durasi","playtest.summary.cleanup":"Pembersihan","playtest.dimension.title":"Dimensi bukti","playtest.dimension.hint":"Bukti wajib ditandai di bawah.","playtest.dimension.server":"Server","playtest.dimension.clientUi":"UI klien","playtest.dimension.interaction":"Interaksi","playtest.dimension.visual":"Visual","playtest.dimension.required":"Wajib","playtest.dimension.optional":"Opsional","playtest.dimension.steps":"Langkah","playtest.steps.title":"Linimasa langkah","playtest.steps.expected":"Diharapkan","playtest.steps.observed":"Diamati","playtest.steps.evidence":"Bukti","playtest.steps.server":"Server","playtest.steps.details":"detail","playtest.capability.title":"Kemampuan dan batasan","playtest.capability.semanticUi":"Snapshot UI semantik","playtest.capability.virtualInput":"Input virtual","playtest.capability.fixedBootstrap":"Bootstrap Agent tetap","playtest.capability.projectAdapter":"Adaptor tes proyek","playtest.capability.available":"Tersedia","playtest.capability.unavailable":"Tidak tersedia","playtest.limitations.title":"Batasan","playtest.artifacts.title":"Artefak","playtest.result.status.passed":"Lulus","playtest.result.status.failed":"Gagal","playtest.result.status.timedOut":"Waktu habis","playtest.result.status.cancelled":"Dibatalkan","playtest.result.status.insufficientEvidence":"Bukti tidak cukup","playtest.result.status.unavailable":"Tidak tersedia","playtest.result.status.skipped":"Dilewati","playtest.result.status.notRequested":"Tidak diminta","playtest.result.status.unknown":"Tidak diketahui","playtest.record.incomplete":"Hasil terstruktur belum lengkap","playtest.record.corrupt":"Hasil terstruktur rusak","playtest.record.unsupported":"Versi hasil terstruktur tidak didukung","playtest.record.unavailable":"Detail hasil tidak tersedia.","playtest.sample.terminal":"Semua bukti wajib lulus","playtest.sample.limit.visual":"Bukti tangkapan layar Play tidak tersedia di sesi terstruktur v1","playtest.history.agents":"Agent","playtest.history.agentCounts":"Server {server} · Klien {client}","playtest.agents.title":"Agent tes","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Bukti visual tidak tersedia — Tangkapan layar Play tidak didukung di sesi terstruktur v1.","playtest.limitations.virtualInputUnavailable":"Input virtual tidak tersedia untuk sesi ini.","playtest.limitations.visualUnsupportedReason":"Tangkapan layar Play tidak didukung di sesi terstruktur v1.","playtest.dimension.reason.missing":"Bukti wajib tidak ada.","playtest.dimension.reason.capability":"Kemampuan wajib tidak tersedia.","playtest.artifacts.metadata":"Metadata hasil"},Xy={"sidebar.overview":"Übersicht","sidebar.changelog":"Änderungsprotokoll","sidebar.connection":"Verbindung","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Einstellungen","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP-Server-Verbindung erforderlich","sidebar.gate.l2":"Roblox Studio Plugin-Verbindung erforderlich","header.currentProject":"Aktuelles Projekt","header.unknownProject":"Unbekanntes Projekt","header.projectRoot.label":"Projektstamm","header.currentProject.loading":"Lade Projektstamm...","header.currentProject.unavailable":"Projektstamm nicht verfügbar","header.placeNotConnected":"Place nicht verbunden","header.currentProject.tooltip":"Aktuell ausgewählter Projektordner","header.currentProject.loading.tooltip":"Projektstamm-Informationen werden noch geladen","header.currentProject.unavailable.tooltip":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.currentProjectSyncRoot.label":"Sync-Stamm","header.currentProjectSyncRoot.loading":"Lade Sync-Stamm...","header.currentProjectSyncRoot.unavailable":"Sync-Stamm nicht verfügbar","header.currentProjectSyncRoot.tooltip":"Aktueller Sync-Stamm-Ordner für das ausgewählte Projekt","header.currentProjectSyncRoot.loading.tooltip":"Sync-Stamm-Informationen werden noch geladen","header.currentProjectSyncRoot.unavailable.tooltip":"Aktuelle Sync-Stamm-Informationen sind nicht verfügbar","header.testFiles.label":"Testdateien","header.testFiles.unavailable":"Testdateien nicht verfügbar","header.testFiles.tooltip":"Aktuelles Playtest-Dateiverzeichnis für den ausgewählten Place","header.places.title":"Places","header.places.active":"Aktiv","header.places.inactive":"Inaktiv","header.places.pluginRequired":"Plugin-Verbindung erforderlich","header.places.liveRequired":"Plugin-Verbindung für Live Active Place erforderlich","header.place.tooltip":"Verbundener Roblox Place","header.placeNotConnected.tooltip":"Place nicht verbunden","placeScope.current.label":"Aktueller Place","placeScope.lastActive.label":"Zuletzt aktiver Place","placeScope.selected.label":"Ausgewählter Place","placeScope.unknownPlace":"Unbekannter Place","placeScope.live":"Live","placeScope.stored":"Gespeichert","placeScope.pluginRequired":"Plugin erforderlich","placeScope.pluginRequired.note":"Verbinde das WEPPY Plugin, um den live aktiven Place zu bestätigen.","placeScope.noPlace.label":"Place-Bereich","placeScope.noPlace.value":"Noch keine Place-Daten verfügbar","placeScope.noPlace.badge":"Kein Place","placeScope.noPlace.note":"Verbinde das WEPPY Plugin und synchronisiere einen Place, um Place-bezogene Daten zu erstellen.","placeScope.selected.note":"Es werden nur gespeicherte Daten angezeigt. Das Studio-Routing bleibt unverändert.","placeScope.surface.sync":"Sync-Status und Logs verwenden diesen Place.","placeScope.surface.changelog":"Changelog-Sitzungen verwenden diesen Place.","placeScope.surface.playtest":"Playtest-Berichte verwenden diesen Place.","placeScope.surface.uiStudio":"UI-Aufnahmen und Änderungsverlauf verwenden diesen Place.","placeScope.surface.tools":"Tool-Verlauf und Statistiken verwenden diesen Place.","placeScope.loading":"Place-Bereich wird geladen...","placeScope.unavailable":"Place-Bereich nicht verfügbar","placeScope.selector.label":"Place-Daten","header.changeProjectRoot":"Projektstamm ändern","header.changeProjectRoot.ariaLabel":"Projektstamm ändern","header.changeProjectRoot.tooltip":"Den aktuellen Projektstamm ändern","header.changeProjectRoot.disabledTooltip.l0":"MCP-Server-Verbindung erforderlich, bevor der Projektstamm geändert werden kann","header.changeProjectRoot.disabledTooltip.loading":"Projektstamm-Informationen werden noch geladen","header.changeProjectRoot.disabledTooltip.unavailable":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.projectRootModal.initial.title":"Projektstamm ändern","header.projectRootModal.initial.body.connected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und der aktuelle Studio-Inhalt wird vollständig in das neue <ausgewählter Projektordner>/weppy-project-sync-Ziel resynced.","header.projectRootModal.initial.body.disconnected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und verwendet <ausgewählter Projektordner>/weppy-project-sync als nächstes Sync-Ziel.","header.projectRootModal.initial.nextSyncRoot":"Neues Sync-Ziel nach Auswahl","header.projectRootModal.initial.nextSyncRoot.placeholder":"<ausgewählter Projektordner>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Aktueller Sync wird sofort gestoppt.","header.projectRootModal.initial.warningFreshSync":"Der aktuelle Studio-Inhalt wird verwendet, um einen neuen Full-Sync im neuen Ziel zu erstellen.","header.projectRootModal.initial.warningNoMove":"Alte Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.initial.warningDeferredSync":"Wenn Studio nicht verbunden ist, startet der Full Resync beim nächsten Verbinden des Plugins.","header.projectRootModal.confirm.title":"Neuen Projektstamm bestätigen","header.projectRootModal.confirm.body":"Überprüfen Sie den ausgewählten Projektordner, bevor Sie ihn anwenden.","header.projectRootModal.confirm.projectRoot":"Ausgewählter Projektordner","header.projectRootModal.confirm.syncRoot":"Neues Sync-Ziel","header.projectRootModal.confirm.warningNoMove":"Bestehende Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.pick":"Ordner auswählen","header.projectRootModal.apply":"Änderung anwenden","header.projectRootModal.cancel":"Abbrechen","header.projectRootModal.error":"Projektstamm-Änderung fehlgeschlagen","status.online":"Online","status.offline":"Offline","status.idle":"Inaktiv","status.syncing":"Synchronisiere","status.error":"Fehler","status.initializing":"Initialisiere","level.l0.title":"Server getrennt","level.l0.message":"WEPPY Dashboard wurde geöffnet, aber der MCP-Server wurde gestoppt oder antwortet nicht.","level.l1.title":"Server verbunden","level.l1.hint":"Prüfen: Läuft Roblox Studio? Ist das Plugin installiert?","level.l2.ok":"Studio verbunden","tier.basic":"Basic","tier.basic.tooltip":"Basic-Tier mit dem Standard-Funktionsumfang des WEPPY Dashboards.","tier.pro":"Pro","tier.pro.tooltip":"Pro-Tier mit dem vollständigen Funktionsumfang des WEPPY Dashboards.","tier.mixed":"Gemischt","tier.upgrade":"Pro ansehen","tier.banner.save":"Sparen Sie KI-Token mit Pro!","tier.tool.query_instances.desc":"Inspizieren Sie Instanzen, durchsuchen Sie Children und Descendants und prüfen Sie Klasseninformationen. Pro fügt File Tree, Projektstruktur sowie Eigenschafts- oder Tag-Suche hinzu.","tier.tool.mutate_instances.desc":"Erstellen, löschen, klonen und verschieben Sie Instanzen. Pro fügt Tree-Erstellung und Massenerstellung, -löschung oder -klonierung hinzu.","tier.tool.manage_properties.desc":"Lesen und setzen Sie Eigenschaften, Attribute und Tags. Pro fügt berechnete Updates, relative Änderungen und Massen-Eigenschaftsoperationen hinzu.","tier.tool.manage_scripts.desc":"Lesen, schreiben, erstellen, löschen, bearbeiten und durchsuchen Sie Skript-Quelltext. Pro fügt Massenersetzung über mehrere Skripte hinzu.","tier.tool.manage_ui.desc":"Nur Pro. Spieltypische Menüs, HUDs, Buttons, Labels und Bildpanels erstellen oder verfeinern, dann Screenshots aufnehmen und Verbesserungsvorschläge prüfen.","tier.tool.manage_ui.action.design_brief":"UI-Richtung planen","tier.tool.manage_ui.action.create_tree":"Neue UI erstellen","tier.tool.manage_ui.action.update":"Bestehende UI aktualisieren","tier.tool.manage_ui.action.delete":"UI entfernen","tier.tool.manage_ui.action.preview":"UI-Bildschirm aufnehmen","tier.tool.manage_ui.action.check":"Verbesserungsvorschläge prüfen","tier.tool.manage_lighting.desc":"Nur Pro. Konfigurieren Sie Beleuchtung, Atmosphäre, Himmel, Terrain-Eigenschaften und Tageszeit-Einstellungen.","tier.tool.manage_selection.desc":"Lesen, setzen und löschen Sie die aktuelle Studio-Auswahl. Pro fügt Kontext, Details, Hinzufügen oder Entfernen sowie Auswahl-Watch-Unterstützung hinzu.","tier.tool.manage_camera.desc":"Inspizieren Sie Kamerastatus, fokussieren Sie nach Pfad oder Position und fordern Sie vorgeschlagene Ansichten an.","tier.tool.manage_tween.desc":"Nur Pro. Erstellen, abspielen, pausieren und abbrechen von Tweens für sanfte Animationen.","tier.tool.manage_audio.desc":"Nur Pro. Sounds abspielen, stoppen, pausieren und fortsetzen sowie den Audio-Listener konfigurieren.","tier.tool.manage_animation.desc":"Nur Pro. Animationen laden, abspielen und stoppen sowie aktive Animationstracks inspizieren.","tier.tool.manage_physics.desc":"Nur Pro. Kollisionsgruppen registrieren, Gruppenkollisionen konfigurieren und verfügbare Gruppen inspizieren.","tier.tool.manage_effects.desc":"Nur Pro. Partikel emittieren, Effekte löschen und Effektstatus umschalten.","tier.tool.manage_terrain.desc":"Nur Pro. Terrain-Formen füllen, Regionen löschen, Materialien ersetzen, Terrain-Farben verwalten, Voxel lesen oder schreiben, Terrain generieren und Terrain glätten.","tier.tool.spatial_query.desc":"Nur Pro. Raycasts ausführen, Boden finden, Platzierung validieren, Bereiche scannen, nach flachen oder Spawn-Positionen suchen, Begehbarkeit analysieren, Raum kartieren und Kollisionen inspizieren.","tier.tool.manage_assets.desc":"Nur Pro. Modelle einfügen, Asset-Informationen inspizieren, im Creator Store suchen, freie Assets oder Pakete einfügen und Assets exportieren.","tier.tool.manage_sync.desc":"Nur Pro. Sync-Status, -Konfiguration, -Verlauf, -Richtungen inspizieren und synchronisierte Dateien lesen oder schreiben.","tier.tool.workspace_state.desc":"Nur Pro. Full Sync ausführen, Screenshots erfassen, kürzliche Änderungen und Viewport-Status inspizieren und zugehörige Metadaten verwalten.","tier.tool.manage_logs.desc":"Inspizieren Sie Output-Logs mit Filterung, inkrementellem Polling, Buffer-Löschung und kürzlicher Fehlersuche.","tier.tool.system_info.desc":"Verbindungsstatus und aktuellen Tier inspizieren. Pro fügt Place-Info, Services, Studio-Einstellungen, Playtest-Steuerung und automatisierte Tests hinzu.","tier.tool.manage_studio.desc":"Nur Pro. Studio-Editor-Ansichtseinstellungen wie UI Preview für Screenshots und QA umschalten; es ändert Studio-Sitzungseinstellungen, nicht die UI-Objekte des Spiels.","tier.tool.batch_execute.desc":"Nur Pro. Mehrere Befehle in einem Batch ausführen, mit sequentieller Ausführung und optionalem Continue-on-Error-Verhalten.","tier.tool.execute_luau.desc":"Nur Pro. Beliebigen Luau-Code in der Roblox Studio Sandbox ausführen.","connection.server.title":"Bridge-Status","connection.server.version":"Version","connection.server.version.tooltip":"Laufzeitversion der WEPPY Bridge","connection.server.pid":"PID","connection.server.pid.tooltip":"Betriebssystem-Prozesskennung","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Verstrichene Zeit seit dem Start der WEPPY Bridge","connection.server.session":"Session","connection.server.session.tooltip":"Aktuelle Session-Kennung der WEPPY Bridge","connection.server.exec":"Exec","connection.server.exec.tooltip":"Pfad der ausführbaren Datei zum Starten der WEPPY Bridge","connection.reconnect":"Erneut verbinden","connection.checkSettings":"Einstellungen prüfen","connection.agents.title":"KI-Agenten","connection.agents.name":"Agent","connection.agents.version":"Version","connection.agents.version.tooltip":"Paketversion des MCP Adapters für diese Agent-Sitzung.","connection.agents.cwd":"Arbeitsverzeichnis","connection.agents.cwd.tooltip":"Aktuelles Arbeitsverzeichnis für den verbundenen KI-Agent","connection.agents.projectRoot":"Projektstamm","connection.agents.projectRoot.tooltip":"Maßgeblicher Projektstamm für die Sync-Eigentümerschaft","connection.agents.projectRoot.unresolved":"Nicht aufgelöst","connection.agents.connected":"Verbunden","connection.agents.unknown":"Unbekannt","connection.agents.none":"Keine Agenten verbunden","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Zuletzt gesehen","connection.plugins.lastSeen.tooltip":"Zuletzt empfangener Heartbeat vom Plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Vom Studio gemeldete installierte Plugin-Version","connection.plugins.none":"Keine Plugins verbunden","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test-Verbindung","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Jeder KI-Agent verbindet sich über seinen eigenen MCP Adapter mit einer gemeinsamen WEPPY Bridge, die die Verbindung zu Roblox Studio aufrechterhält.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Verbindungsprotokoll","connection.log.empty":"Noch keine Ereignisse","connection.time.secondsAgo":"s","connection.time.minutesAgo":"min","connection.time.hoursAgo":"Std","common.loading":"Lade...","common.retry":"Wiederholen","common.reconnecting":"Verbinde erneut...","common.expand":"Ausklappen","common.collapse":"Einklappen","tools.tab.history":"Verlauf","tools.tab.statistics":"Statistik","tools.tab.failures":"Fehler","tools.col.time":"Zeit","tools.col.time.tooltip":"Wann der Tool-Lauf aufgezeichnet wurde.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Name des Tools und ausgeführte Action.","tools.col.duration":"Dauer","tools.col.duration.tooltip":"Wie lange das Tool zum Beenden brauchte.","tools.col.status":"Status","tools.col.status.tooltip":"Ergebnis des aufgezeichneten Tool-Laufs.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Erforderlicher Lizenz-Tier für das Tool oder die Action.","tools.col.tierStats.tooltip":"Basic-, Pro- oder Mixed-Zusammenfassung für die Statistikzeile.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Konsolidierter Tool-Name in der Statistiktabelle.","tools.col.calls":"Aufrufe","tools.col.calls.tooltip":"Gesamtzahl der aufgezeichneten Aufrufe für dieses Tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Anzahl direkt erfolgreicher Läufe.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Anzahl der Läufe, die durch Fallback-Ausführung erfolgreich waren.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Anzahl blockierter Läufe ohne Fallback-Ausführung.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Anzahl erwarteter Fehler durch Eingabe, Projektstatus, Roblox-Richtlinie oder Benutzercode.","tools.col.err":"FAILED","tools.col.err.tooltip":"Anzahl fehlgeschlagener Läufe.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Prozentsatz der erfolgreich abgeschlossenen Aufrufe.","tools.col.avgTime":"Durchschnittszeit","tools.col.avgTime.tooltip":"Durchschnittliche Ausführungszeit über alle aufgezeichneten Aufrufe.","tools.col.error":"Fehler","tools.filter.tool":"Tool","tools.filter.all":"Alle","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Dieser Eintrag verwendete ein Pro-exklusives Tool oder eine Action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Die angeforderte Pro-Action wurde über einen Basic-Fallback erfolgreich ausgeführt.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Die angeforderte Pro-Action wurde blockiert und kein Fallback wurde ausgeführt.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"Der Tool-Aufruf ist wegen eines erwarteten Eingabe-, Projekt-, Richtlinien- oder Benutzercode-Problems fehlgeschlagen.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"Der Tool-Lauf ist fehlgeschlagen.","tools.status.ok":"OK","tools.status.ok.tooltip":"Der Tool-Lauf wurde erfolgreich abgeschlossen.","tools.tier.mixed.tooltip":"Dieses Tool enthält sowohl Basic- als auch Pro-Actions.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Eingabeparameter, die an diesen Tool-Lauf übergeben wurden.","tools.detail.result":"Ergebnis","tools.detail.result.tooltip":"Zurückgegebenes Ergebnis-Payload für diesen Tool-Lauf.","tools.detail.requestedCommand":"Gesendeter Befehl","tools.detail.executedCommand":"Ausgeführter Befehl","tools.detail.alternatives":"Alternativen","tools.detail.blockedMessage":"Blockierungsgrund","tools.detail.noFallback":"Kein Fallback","tools.detail.noFallback.value":"Kein Fallback ausgeführt.","tools.detail.warningMessage":"Warnmeldung","tools.detail.errorMessage":"Fehlermeldung","tools.detail.open":"Details","tools.detail.openLabel":"Details für {command} anzeigen","tools.detail.dialogLabel":"Details zur Werkzeugausführung","tools.detail.title":"Werkzeugausführung","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Verlauf löschen?","tools.clear.history.message":"Dies entfernt den aktuellen Place-Tools-Verlauf dauerhaft.","tools.clear.statistics.title":"Statistik löschen?","tools.clear.statistics.message":"Dies setzt die aktuelle Place-Tool-Statistik dauerhaft zurück.","tools.detail.error":"Fehler","tools.page.prev":"Zurück","tools.page.prev.tooltip":"Zur vorherigen Seite der Tool-Verlaufsergebnisse.","tools.page.next":"Weiter","tools.page.next.tooltip":"Zur nächsten Seite der Tool-Verlaufsergebnisse.","tools.empty.history":"Keine Verlaufseinträge","tools.empty.stats":"Keine Tool-Statistik","tools.empty.failures":"Keine Fehler","tools.summary.total":"Gesamt","tools.summary.calls":"Aufrufe","tools.summary.sessions":"Sessions","settings.license.title":"Lizenz","settings.license.title.tooltip":"Aktueller Lizenzstatus und Abonnement-Tier.","settings.license.status":"Status","settings.license.status.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Aktueller Abonnement-Tier für verfügbare WEPPY Dashboard-Funktionen.","settings.license.key":"Schlüssel","settings.license.key.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.keyValue.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.provider":"Anbieter","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.providerValue.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.active":"Aktiv","settings.license.active.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.status.activeCancelPending.tooltip":"Kündigung steht aus, aber Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.inactive":"Inaktiv","settings.license.inactive.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.expired":"Abgelaufen","settings.license.expired.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.unavailable":"Lizenzinformationen nicht verfügbar","settings.license.detail.cancelPending":"Kündigung ist geplant. Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.reset":"Lizenz zurücksetzen","settings.readOnly":"Schreibgeschützt","settings.readOnly.tooltip":"Dieser Abschnitt zeigt Werte, die nicht über das WEPPY Dashboard bearbeitet werden können.","settings.unavailable":"Einstellungen nicht verfügbar","settings.general.title":"Allgemeine Einstellungen","settings.general.title.tooltip":"Hot-Settings, die sofort beim Ändern angewendet werden.","settings.general.liveApply":"Live anwenden","settings.general.liveApply.tooltip":"Änderungen in diesem Abschnitt werden sofort ohne separate Speichern-Schaltfläche angewendet.","settings.general.applied":"Angewendet","settings.general.logLevel":"Log-Level","settings.general.logLevel.tooltip":"Legt fest, wie detailliert das WEPPY Dashboard in seine Logs schreibt.","settings.general.localHistory":"Tool-Verlaufsaufzeichnung","settings.general.localHistory.tooltip":"Speichert lokalen Tool-Ausführungsverlauf für die WEPPY Dashboard-Verlaufsansichten.","settings.general.localStatistics":"Tool-Statistiksammlung","settings.general.localStatistics.tooltip":"Aggregiert lokale Nutzungsstatistiken für WEPPY Dashboard-Berichte.","settings.general.contextCapture":"Kontext-Erfassung","settings.general.contextCapture.tooltip":"Wenn aktiviert, zeichnet das WEPPY Dashboard strukturierte Ausführungskontexte für Changelog- und Playtest-Ansichten auf.","settings.general.requestTimeout":"Aktions-Timeout","settings.general.requestTimeout.tooltip":"Maximale Wartezeit des WEPPY Dashboards auf eine Aktion, bevor sie fehlschlägt.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Aktions-Timeout wird in Millisekunden gemessen.","settings.cold.title":"Server-Umgebung","settings.cold.title.tooltip":"Schreibgeschützte Server-Umgebungswerte, die beim Start geladen werden.","settings.cold.httpPort.tooltip":"Portnummer, die vom MCP WEPPY Dashboard HTTP-Server verwendet wird.","settings.cold.httpHost.tooltip":"Host-Schnittstelle, an die sich der MCP WEPPY Dashboard HTTP-Server bindet.","settings.cold.hint":"Über Umgebungsvariablen setzen, um diese Werte zu ändern.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Legen Sie fest, wie sich das WEPPY Dashboard beim Start des MCP-Servers verhält.","settings.dashboard.nextStartBadge":"Nächster Start","settings.dashboard.autoOpen.label":"Dashboard beim Start von WEPPY öffnen","settings.dashboard.autoOpen.description":"Öffnet dieses Dashboard nach dem Start des MCP-Servers automatisch.","settings.dashboard.autoOpen.nextStart":"Wird beim nächsten Start des MCP-Servers angewendet.","settings.dashboard.settingsFile.label":"Einstellungsdatei","settings.dashboard.agentExample.label":"Fragen Sie Ihren Agent","settings.dashboard.agentExample.prompt":"„Automatisches Öffnen des Dashboards ausschalten.“","settings.dashboard.autoOpen.saving":"Wird gespeichert…","settings.dashboard.autoOpen.saved":"Für den nächsten Serverstart gespeichert.","settings.dashboard.autoOpen.error":"Speichern fehlgeschlagen. Die vorherige Einstellung wurde wiederhergestellt.","dashboardAutoOpenGuide.eyebrow":"Dashboard-Einstellung","dashboardAutoOpenGuide.title":"Festlegen, wie das WEPPY Dashboard geöffnet wird","dashboardAutoOpenGuide.currentOn":"Das automatische Öffnen ist derzeit aktiviert. Dieses Dashboard wird nach dem Start des MCP-Servers geöffnet.","dashboardAutoOpenGuide.currentOff":"Das automatische Öffnen ist derzeit deaktiviert. WEPPY öffnet beim Start des MCP-Servers keinen neuen Dashboard-Tab.","dashboardAutoOpenGuide.changeAnytime":"Sie können dies jederzeit in den Settings ändern.","dashboardAutoOpenGuide.agentHint":"Sie können Ihren Agent auch bitten: „Automatisches Öffnen des Dashboards ausschalten“.","dashboardAutoOpenGuide.statusOn":"Automatisches Öffnen an","dashboardAutoOpenGuide.statusOff":"Automatisches Öffnen aus","dashboardAutoOpenGuide.keep":"Aktuelle Einstellung beibehalten","dashboardAutoOpenGuide.turnOff":"Automatisches Öffnen ausschalten","dashboardAutoOpenGuide.openSettings":"Settings öffnen","dashboardAutoOpenGuide.close":"Hinweis zum automatischen Öffnen schließen","dashboardAutoOpenGuide.saving":"Wird gespeichert…","dashboardAutoOpenGuide.error":"Ihre Auswahl konnte nicht gespeichert werden. Versuchen Sie es erneut.","settings.language.title":"Sprache","settings.language.title.tooltip":"Wählen Sie, wie der WEPPY Dashboard-Oberflächentext lokalisiert wird.","settings.language.dashboard":"WEPPY Dashboard-Sprache","settings.language.dashboard.tooltip":"Überschreibt die WEPPY Dashboard-Sprache oder folgt der Systemsprache, wenn auf Auto eingestellt.","settings.language.auto":"Auto","overview.l0.title":"MCP-Server getrennt","overview.l0.message":"Der MCP-Server antwortet nicht. Das WEPPY Dashboard versucht automatisch, die Verbindung wiederherzustellen.","overview.l0.step1":"Prüfen Sie, ob der MCP-Server-Prozess läuft","overview.l0.step2":"Starten Sie den MCP-Server-Befehl bei Bedarf neu","overview.l0.reconnecting":"Automatische Wiederverbindung alle 3s...","overview.l0.reconnectBtn":"Erneut verbinden","overview.l0.settingsBtn":"Einstellungen prüfen","overview.l1.pluginGuide":"Roblox Studio Plugin ist nicht verbunden","overview.l1.check1":"Läuft Roblox Studio?","overview.l1.check2":"Ist das WEPPY Plugin installiert?","overview.l1.feedHint":"Änderungen erscheinen hier, sobald das Plugin verbunden ist","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP-Server-Laufzeit und Prozessstatus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio Plugin-Verbindungs- und Versionsstatus","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Verbundene KI-Coding-Agenten und ihr Laufzeitstatus","overview.metric.agent.instancesUnit":"Instanzen","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Aktuelle Studio-zu-Lokal-Sync-Aktivität","overview.metric.noAgent":"Kein Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installierte MCP-Server-Version","overview.meta.session":"Session","overview.meta.session.tooltip":"Aktuelle MCP-Session-Kennung","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Betriebssystem-Prozesskennung","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Verstrichene Zeit seit dem Start des MCP-Servers","overview.feed.title":"Letzte Spieländerungen","overview.feed.empty":"Keine kürzlichen Änderungen","overview.changelog.title":"Session-Änderungszusammenfassung","overview.changelog.entries":"Gesamt","overview.changelog.scripts":"Skripte","overview.changelog.instances":"Instanzen","overview.changelog.properties":"Eigenschaften","overview.changelog.assets":"Assets","overview.tier.title":"Tier-Nutzung","changelog.subtitle":"Spieländerungsverlauf","changelog.filter.all":"Alle","changelog.filter.active":"Aktiv","changelog.filter.completed":"Abgeschlossen","changelog.empty":"Noch keine Changelog-Einträge","changelog.basic.limit.title":"Basic-Vorschau zeigt die letzten 3 Sessions","changelog.basic.limit.body":"Upgraden Sie auf Pro, um die vollständige Changelog-Timeline für diesen Place zu durchsuchen.","changelog.basic.metricLabel":"Sichtbares Changelog / Gesamt","changelog.basic.visible":"sichtbar","changelog.basic.total":"gesamt","changelog.card.active":"Aktiv","changelog.card.active.tooltip":"Diese Session empfängt noch neue Spieländerungen.","changelog.card.completed":"Abgeschlossen","changelog.card.completed.tooltip":"Diese Session ist beendet und es werden keine weiteren Änderungen erwartet.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"Diese Session enthält nur den anfänglichen Sync-Bootstrap-Snapshot.","changelog.card.inProgress":"in Bearbeitung","changelog.card.noChanges":"Noch keine Änderungen","changelog.card.noChanges.tooltip":"Für diese Session wurden noch keine Spieländerungen extrahiert.","changelog.card.bootstrapSummary":"Anfänglicher Sync-Snapshot","changelog.card.bootstrapSummary.tooltip":"Anfängliche Datei-Sync-Schreibvorgänge werden zu einer einzigen Bootstrap-Snapshot-Zeile zusammengefasst.","changelog.card.sessionIntent":"Session-Absicht","changelog.card.scripts":"Skripte","changelog.card.scripts.tooltip":"In dieser Session vorgenommene Skript-Änderungen.","changelog.card.instances":"Instanzen","changelog.card.instances.tooltip":"Instanz-Erstellungs-, Lösch-, Verschiebe- oder Klonänderungen in dieser Session.","changelog.card.modified":"geändert","changelog.card.created":"erstellt","changelog.card.deleted":"gelöscht","changelog.card.moved":"verschoben","changelog.card.propertiesChanged":"Eigenschaften geändert","changelog.card.propertiesChanged.tooltip":"Für diese Session aufgezeichnete Eigenschaftswertänderungen.","changelog.card.lightingConfigured":"Beleuchtung konfiguriert","changelog.card.lightingConfigured.tooltip":"Beleuchtungs- oder Atmosphäreneinstellungen wurden in dieser Session geändert.","changelog.card.terrainConfigured":"Terrain konfiguriert","changelog.card.terrainConfigured.tooltip":"Terrain-Daten oder Terrain-Einstellungen wurden in dieser Session geändert.","changelog.card.assetsInserted":"Assets eingefügt","changelog.card.assetsInserted.tooltip":"In dieser Session in den Place eingefügte Assets.","changelog.category.script":"Skripte","changelog.category.instance":"Instanzen","changelog.category.property":"Eigenschaften","changelog.category.lighting":"Beleuchtung","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.dialogLabel":"Changelog-Details","changelog.detail.changeSummary":"Änderungszusammenfassung","changelog.detail.changeSummary.tooltip":"Anzahl der extrahierten Spieländerungen, gruppiert nach Kategorie für diese Session.","changelog.detail.changeTimeline":"Änderungs-Timeline","changelog.detail.changeTimeline.tooltip":"Chronologische Liste der extrahierten Spieländerungen für diese Session.","changelog.detail.context.title":"Kontextzusammenfassung","changelog.detail.context.tooltip":"Strukturierter Ausführungskontext, der für diese Changelog-Session erfasst wurde.","changelog.detail.verification.title":"Verifikation","changelog.detail.verification.tooltip":"Mit dieser Changelog-Session verknüpfte Verifikationssignale.","changelog.detail.verification.label":"Ergebnis","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Aufgezeichnet am","changelog.detail.beforeAfter":"Vorher & Nachher","changelog.detail.filterCategory":"Kategorie","changelog.detail.filterCategory.tooltip":"Filtert die Timeline nach einer einzigen Änderungskategorie.","changelog.detail.confidence.exact":"Exakt","changelog.detail.confidence.exact.tooltip":"Sowohl der Vorher- als auch der Nachher-Zustand wurden für diese Änderung bestätigt.","changelog.detail.confidence.partial":"Teilweise","changelog.detail.confidence.partial.tooltip":"Nur ein Teil des Vorher- und Nachher-Zustands konnte für diese Änderung bestätigt werden.","changelog.detail.confidence.afterOnly":"Nur nachher","changelog.detail.confidence.afterOnly.tooltip":"Nur der resultierende Zustand nach der Änderung konnte bestätigt werden.","changelog.detail.confidence.intentOnly":"Nur Absicht","changelog.detail.confidence.intentOnly.tooltip":"Nur die angeforderte Aktion wurde aufgezeichnet, nicht der resultierende Zustand.","changelog.detail.confidence.unknown":"Unbekannt","changelog.detail.confidence.unknown.tooltip":"Diese Änderung konnte aus den verfügbaren Daten nicht zuverlässig klassifiziert werden.","changelog.detail.noChanges":"Keine Änderungen in dieser Kategorie","changelog.detail.backToList":"Zurück zur Liste","changelog.diff.empty":"Kein Diff verfügbar","changelog.diff.unified":"Vereinheitlicht","changelog.diff.sideBySide":"Nebeneinander","changelog.diff.before":"Vorher","changelog.diff.after":"Nachher","sync.overlay.title":"Roblox Studio Plugin erforderlich","sync.overlay.message":"Sync-Status ist verfügbar, sobald das Roblox Studio Plugin verbunden ist.","sync.overlay.check1":"Läuft Roblox Studio?","sync.overlay.check2":"Ist das WEPPY Plugin installiert?","sync.status.title":"Sync-Status","sync.status.title.tooltip":"Aktueller Studio- und lokaler Datei-Sync-Status für diesen Place.","sync.status.forwardOnly":"Nur vorwärts","sync.status.forwardOnly.tooltip":"Basic-Tier erlaubt nur Studio-zu-Lokal-Vorwärts-Sync.","sync.status.place":"Place","sync.status.place.tooltip":"Verbundener Roblox Place-Name und Place-ID.","sync.status.path":"Pfad","sync.status.path.tooltip":"Lokaler Dateisystem-Stamm, der derzeit für die Sync-Ausgabe verwendet wird.","sync.status.instances":"Instanzen","sync.status.instances.tooltip":"Gesamtzahl synchronisierter Roblox-Instanzen, die im lokalen Spiegel verfolgt werden.","sync.status.scripts":"Skripte","sync.status.scripts.tooltip":"Gesamtzahl synchronisierter Skript-Dateien, die derzeit für diesen Place indiziert sind.","sync.status.state":"Status","sync.status.state.tooltip":"Aktueller Laufzeit-Sync-Status, der vom Server gemeldet wird.","sync.policy.title":"Sync-Richtlinie","sync.policy.title.tooltip":"Effektive Sync-Richtlinie, die vom verbundenen Studio-Plugin gemeldet wurde.","sync.policy.activation":"Aktivierung","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Arbeitsablauf","sync.policy.preset.studio_first":"Studio zuerst","sync.policy.preset.bidirectional_review":"Bidirektional","sync.policy.preset.local_code_studio_world":"Lokaler Code, Studio-Welt","sync.policy.preset.custom":"Benutzerdefiniert","sync.policy.apply.title":"Wie lokale Änderungen auf Studio angewendet werden","sync.policy.apply.description":"Zeigt, ob lokale Änderungen zuerst geprüft oder automatisch auf Studio angewendet werden.","sync.policy.apply.content":"Inhaltsänderungen","sync.policy.apply.content.tooltip":"Lokale Änderungen an Script-Quelltext, Eigenschaften und Service-Eigenschaften. Das Erstellen, Löschen, Umbenennen und Verschieben sind Strukturänderungen.","sync.policy.apply.structure":"Strukturänderungen","sync.policy.apply.structure.tooltip":"Lokales Erstellen, Löschen, Umbenennen und Verschieben von Instanzen. Automatisches lokales Löschen benötigt zusätzlich die separate Löschoption unten.","sync.policy.apply.manual":"Zuerst prüfen","sync.policy.apply.auto":"Automatisch anwenden","sync.policy.scope.disclosure":"Richtungen nach Bereich","sync.policy.scope.scriptSource":"Script-Quelltext","sync.policy.scope.properties":"Eigenschaften","sync.policy.scope.structure":"Struktur","sync.policy.scope.serviceProperties":"Service-Eigenschaften","sync.policy.endpoint.local":"Lokal","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Lokal","sync.policy.direction.forward.tooltip":"Änderungen aus Studio werden in lokale Dateien geschrieben.","sync.policy.direction.reverse":"Lokal → Studio","sync.policy.direction.reverse.tooltip":"Änderungen lokaler Dateien werden in Studio angewendet.","sync.policy.direction.bidirectional":"Beide Richtungen","sync.policy.direction.bidirectional.tooltip":"Änderungen können von Studio zu lokalen Dateien und von lokalen Dateien zu Studio übertragen werden.","sync.policy.safety.localDeletes":"Lokal löschen → Studio-Instanz löschen","sync.policy.safety.review":"Vor dem Löschen prüfen","sync.policy.safety.review.tooltip":"Lokale Dateilöschungen warten auf eine Prüfung, bevor passende Studio-Instanzen entfernt werden. Dies ist von der automatischen UI-Studio-Bereinigung getrennt.","sync.policy.safety.auto":"Automatisch in Studio löschen","sync.policy.safety.auto.tooltip":"Das Löschen lokaler Dateien kann passende Studio-Instanzen automatisch entfernen. Dies ist von der automatischen UI-Studio-Bereinigung getrennt.","sync.policy.reviewRequired":"Prüfen Sie diese Richtlinie im Studio-Plugin, bevor Sie Sync starten.","sync.log.title":"Sync-Protokoll","sync.log.empty":"Noch keine Sync-Ereignisse","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Eine neue Sync-Ausgabe wurde auf die Festplatte geschrieben.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Eine bestehende synchronisierte Datei oder Instanz wurde aktualisiert.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Eine synchronisierte Datei oder Instanz wurde entfernt.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Ein Sync-Ereignis wurde ohne Dateimutation aufgezeichnet.","sync.upgrade.title":"Vollständigen Sync mit Pro ansehen","sync.upgrade.benefit1":"Bidirektionaler Sync — Dateien bearbeiten, automatisch auf Studio anwenden","sync.upgrade.benefit2":"Reverse-Sync — Dateiänderungen zurück zu Studio pushen","sync.upgrade.benefit3":"Vollständiger Sync-Verlauf und detailliertes Änderungsprotokoll","sync.upgrade.buy":"Pro ansehen","playtest.status.title":"Playtest-Status","playtest.status.title.tooltip":"Aktueller Roblox Playtest-Sessionstatus, der von Studio gemeldet wird.","playtest.status.mode":"Modus","playtest.status.mode.tooltip":"Studio-Playtest-Startmodus für die aktuelle Session.","playtest.status.mode.value.tooltip":"Spezifischer Roblox Studio Playtest-Modus, der derzeit verwendet wird.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox Place, der derzeit mit dieser Playtest-Session verknüpft ist.","playtest.status.state.running":"Läuft","playtest.status.state.running.tooltip":"Eine Roblox Playtest-Session läuft derzeit.","playtest.status.state.paused":"Pausiert","playtest.status.state.paused.tooltip":"Die aktuelle Roblox Playtest-Session ist pausiert.","playtest.status.state.notRunning":"Läuft nicht","playtest.status.state.notRunning.tooltip":"Es läuft derzeit keine Roblox Playtest-Session.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Testverlauf","playtest.history.title.tooltip":"Aufgezeichnete automatisierte Playtest-Läufe für dieses Projekt.","playtest.history.empty":"Noch keine Testergebnisse","playtest.history.mode":"Modus","playtest.history.mode.tooltip":"Playtest-Modus, der für diesen aufgezeichneten Testlauf verwendet wurde.","playtest.history.status.passed":"Bestanden","playtest.history.status.failed":"Fehlgeschlagen","playtest.history.status.running":"Läuft","playtest.history.status.unknown":"Unbekannt","playtest.history.status.tooltip":"Aufgezeichneter Ergebnisstatus für diesen automatisierten Playtest-Lauf.","playtest.empty.title":"Noch keine Playtest-Ergebnisse","playtest.empty.message":"Testergebnisse erscheinen hier, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.before":"Testergebnisse erscheinen hier, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Ausgewählter Bericht","playtest.report.title.tooltip":"Detaillierte Ausgabe für den derzeit ausgewählten automatisierten Playtest-Lauf.","playtest.detail.dialogLabel":"Details zum Playtest-Bericht","playtest.detail.loading":"Bericht wird geladen...","playtest.detail.errorTitle":"Bericht nicht verfügbar","playtest.report.content":"Bericht","playtest.report.content.tooltip":"Markdown-Zusammenfassung für den ausgewählten automatisierten Playtest-Lauf.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Ausführungs-Logs, die für den ausgewählten automatisierten Playtest-Lauf erfasst wurden.","playtest.context.contextId":"Kontext-ID","playtest.context.why":"Warum dieser Test ausgeführt wurde","playtest.context.expected":"Erwartet","playtest.context.observed":"Beobachtet","playtest.report.empty":"Kein Berichtsinhalt verfügbar","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest ist eine Pro-exklusive Funktion","playtest.basic.desc":"Steuern Sie Playtesting vom WEPPY Dashboard aus, führen Sie automatisierte Tests aus und sehen Sie detaillierte Testberichte.","playtest.basic.benefit1":"Ein-Klick-Play/Pause/Stop-Steuerung","playtest.basic.benefit2":"Automatisierte Testausführung über KI-Agent","playtest.basic.benefit3":"Testverlauf mit Bestanden/Fehlgeschlagen-Verfolgung","playtest.basic.benefit4":"Detaillierte Markdown-Testberichte","playtest.sample.badge":"Vorschau der Pro-Playtest-Ansicht","playtest.sample.title":"Sie sehen eine Vorschau des Playtest-Bildschirms, der nach dem Upgrade auf Pro verfügbar wird.","playtest.sample.message":"Diese Vorschau verwendet Beispieldaten. Live-Playtest-Steuerung, Verlaufsverwaltung und echte Berichte werden mit Pro freigeschaltet.","playtest.sample.clearDisabled":"Upgraden Sie auf Pro, um den Live-Playtest-Verlauf zu löschen.","playtest.sample.place":"Arena-Vorschau","playtest.sample.history.name":"Beispiel-Arena-Smoke-Test","playtest.sample.context.why":"In die Arena spawnen, den Eröffnungsangriff überleben und prüfen, ob das HUD sofort reagiert.","playtest.sample.context.expected":"Der Spieler spawnt sicher, die Countdown-UI erscheint innerhalb einer Sekunde und die erste Welle startet ohne Fehler.","playtest.sample.context.observed":"Spawn-Schutz hielt, das HUD wurde rechtzeitig aktualisiert und Welle eins wurde ohne Gameplay-Regressionen abgeschlossen.","playtest.sample.report.markdown":`# Beispiel-Arena-Smoke-Test
|
|
130
|
-
|
|
131
|
-
- Spawn-Ablauf: BESTANDEN
|
|
132
|
-
- HUD-Countdown: BESTANDEN
|
|
133
|
-
- Wellen-Bootstrap: BESTANDEN
|
|
134
|
-
|
|
135
|
-
Dies ist eine Beispielvorschau. Upgraden Sie auf Pro, um Live-Playtests auszuführen und echte Berichte zu speichern.`,"playtest.sample.report.logs":`[sample] boot playtest preview
|
|
136
|
-
[sample] spawn protection active
|
|
137
|
-
[sample] hud countdown rendered
|
|
138
|
-
[sample] wave one completed
|
|
139
|
-
[sample] preview report finished`,"sidebar.whatsNew":"Neuigkeiten","sidebar.help.group":"Hilfe & Feedback","sidebar.help.bug":"Fehler melden","sidebar.help.bug.tooltip":"Lokales Diagnosepaket erstellen und einen vorausgefuellten Fehlerbericht auf GitHub oeffnen","bugReportDialog.title":"diagnostics.zip kann bei der Fehlersuche helfen","bugReportDialog.subtitle":"WEPPY hat auf diesem Computer eine Diagnose-Zip erstellt. Sie enthält Studio-, Plugin-, Sync- und Tool-Logs, die uns helfen können zu verstehen, was passiert ist.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Du kannst den Bug Report auch ohne diese Datei senden, aber mit der Zip finden wir die Ursache meist schneller.","bugReportDialog.attachHow":"Lade die Zip herunter oder öffne ihren Speicherort und füge sie vor dem Absenden im Feld Diagnostics ZIP (optional) des GitHub-Issues hinzu.","bugReportDialog.download":"1. diagnostics.zip herunterladen","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub-Issue öffnen","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Die Zip kann lokale Logs und Projektkontext enthalten. Prüfe sie vor dem Anhängen, wenn du sie teilen möchtest.","sidebar.help.feature":"Feature vorschlagen","sidebar.help.feature.tooltip":"Neues Feature oder Verbesserung auf GitHub vorschlagen","sidebar.help.discussions":"Hilfe zu Installation und Nutzung","sidebar.help.discussions.tooltip":"Hilfe zu Installation oder Nutzung über GitHub Issues anfragen","sidebar.help.troubleshooting":"Leitfaden zur Fehlerbehebung","sidebar.help.troubleshooting.tooltip":"Offiziellen Troubleshooting-Leitfaden auf weppyai.com öffnen","header.whatsNew":"Neuigkeiten","header.whatsNew.tooltip":"Neuigkeiten","upgrade.title":"Pro ansehen","upgrade.tagline":"Pro-Funktionen ansehen","upgrade.cta":"Pro ansehen","upgrade.licenseShortcut":"Lizenz eingeben","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Neuigkeiten","whatsNew.pageSubtitle":"Bleiben Sie über MCP-Änderungen auf dem Laufenden","whatsNew.unreadSection":"Ungelesen","whatsNew.allSection":"Alle Ankündigungen","whatsNew.empty":"Noch keine Ankündigungen","whatsNew.newBadge":"NEU","whatsNew.importantBadge":"WICHTIG","whatsNew.category.release":"Release","whatsNew.category.notice":"Hinweis","whatsNew.category.deprecation":"Veraltet","whatsNew.category.tip":"Tipp","uiStudio.title":"UI Studio","uiStudio.empty":"Noch keine Screenshots gespeichert. Sie werden automatisch erstellt, wenn ein KI-Agent den aktuellen UI-Zustand erfasst.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio Plugin ist nicht verbunden","uiStudio.pluginGuide.message":"UI Studio zeigt Screenshots und Änderungsverlauf aus dem verbundenen Studio-Place. Es wird automatisch aktualisiert, sobald Studio und das WEPPY Plugin verbunden sind.","uiStudio.pluginGuide.check1":"Läuft Roblox Studio?","uiStudio.pluginGuide.check2":"Ist das WEPPY Plugin installiert und aktiv?","uiStudio.pluginGuide.waiting":"Warten auf Plugin-Verbindung...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Zuerst prüfen","uiStudio.priorityLow":"Optionale Verbesserung","uiStudio.highPrioritySection":"Zuerst prüfen","uiStudio.lowPrioritySection":"Optionale Verbesserungen","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Verlauf","uiStudio.analysis.reportsTitle":"Neueste Analyse nach UI-Ziel","uiStudio.analysis.recentCapturesTitle":"Letzte Aufnahmen","uiStudio.analysis.detailDialog":"Analysedetails","uiStudio.analysis.targetCountLabel":"Analysierte Ziele","uiStudio.analysis.captureLabel":"Aufnahmen","uiStudio.analysis.verdict.hasSuggestions":"Verbesserungsvorschläge","uiStudio.analysis.verdict.needsFix":"Verbesserungsvorschläge","uiStudio.analysis.verdict.review":"Verbesserungsvorschläge","uiStudio.analysis.verdict.passed":"Keine aktuellen Vorschläge","uiStudio.analysis.verdictLabel":"Verbesserungsübersicht","uiStudio.analysis.coverage.structuralOnly":"Nur Strukturprüfung abgeschlossen","uiStudio.analysis.coverage.visualSkipped":"Strukturprüfung abgeschlossen · Visuelle Prüfung übersprungen","uiStudio.analysis.coverage.visualFailed":"Strukturprüfung abgeschlossen · Visuelle Prüfung fehlgeschlagen","uiStudio.analysis.coverage.full":"Struktur- und visuelle Prüfung abgeschlossen","uiStudio.analysis.coverage.deterministicFailed":"Strukturprüfung fehlgeschlagen","uiStudio.analysis.thresholds":"Prüfgrundlage","uiStudio.analysis.issueSummary.passed":"Auf der aktuellen Prüfgrundlage gibt es keine weiteren Verbesserungsvorschläge.","uiStudio.history.title":"Änderungsverlauf","uiStudio.history.empty":"Noch kein Verlauf vorhanden. Wenn ein KI-Agent die UI mit manage_ui ändert, wird es automatisch aufgezeichnet.","uiStudio.history.loading":"Wird geladen...","uiStudio.history.loadingPlace":"Aktueller Place wird geladen...","uiStudio.history.noPlace":"Für den aktuellen Place sind noch keine Daten verfügbar. Verbinde das WEPPY Plugin und synchronisiere einen Place, um den UI-Änderungsverlauf anzuzeigen.","uiStudio.history.noPlaceAction":"Der aktuelle Place ist noch nicht verfügbar.","uiStudio.history.error":"Fehler","uiStudio.history.clear":"Alles löschen","uiStudio.history.filter.actions":"Aktionstyp","uiStudio.history.filter.actionAll":"Alle","uiStudio.history.filter.actionCreate":"Erstellen","uiStudio.history.filter.actionUpdate":"Aktualisieren","uiStudio.history.filter.actionDelete":"Löschen","uiStudio.history.filter.period":"Zeitraum","uiStudio.history.filter.dateAll":"Alle","uiStudio.history.filter.today":"Heute","uiStudio.history.filter.yesterday":"Gestern","uiStudio.history.filter.last7Days":"Letzte 7 Tage","uiStudio.history.filter.last30Days":"Letzte 30 Tage","uiStudio.history.filter.customRange":"Eigener Zeitraum","uiStudio.history.filter.reset":"Zurücksetzen","uiStudio.history.filter.from":"Von","uiStudio.history.filter.to":"Bis","uiStudio.history.row.affectedPaths":"Pfade","uiStudio.history.row.mutations":"Änderungsdetails","uiStudio.history.row.expand":"▾ Erweitern","uiStudio.history.row.collapse":"▲ Einklappen","uiStudio.history.row.expandDetails":"{n} Änderungen anzeigen","uiStudio.history.row.collapseDetails":"Änderungen ausblenden","uiStudio.history.row.toggleDetails":"Änderungsdetails umschalten","uiStudio.history.row.mutationsEmpty":"Keine Änderungsdetails","uiStudio.history.row.toolLabel":"UI-Änderungen ({n})","uiStudio.history.row.compare":"Vorher / Nachher","uiStudio.history.row.noBeforeState":"Kein Vorher-Zustand","uiStudio.history.row.noAfterState":"Kein Nachher-Zustand","uiStudio.history.row.qualityPlan":"Designrichtung","uiStudio.history.row.designCheck":"Vorschläge","uiStudio.history.row.designCheckUnavailable":"Vorschläge: nicht verfügbar","uiStudio.history.row.designCheckNone":"Vorschläge: keine","uiStudio.history.selection.deleteSelected":"Ausgewählte löschen","uiStudio.history.selection.selectAll":"Alle auswählen","uiStudio.history.selection.clearSelection":"Auswahl aufheben","uiStudio.history.confirm.deleteRequestsTitle":"Änderungsprotokolle löschen","uiStudio.history.confirm.deleteRequestsMessage":"Die ausgewählten Änderungsprotokolle werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.history.confirm.clearRequestsTitle":"Änderungsverlauf löschen","uiStudio.history.confirm.clearRequestsMessage":"Der Änderungsverlauf des aktuellen Place wird gelöscht. Studio-Instanzen sind nicht betroffen.","uiStudio.history.confirm.cascadeOption":"Verknüpfte Screenshots ebenfalls löschen","uiStudio.history.drawer.close":"Schließen","uiStudio.actions.previewAgain":"Erneut vorschau","uiStudio.actions.deleteSnapshot":"Diesen Screenshot löschen","uiStudio.actions.proRequired":"Nach Pro-Upgrade verfügbar","uiStudio.actions.captureCurrentState":"Aktuellen Zustand erfassen","uiStudio.actions.checkSuggestionsAgain":"Vorschläge erneut prüfen","uiStudio.actions.previewRunning":"Wird erfasst…","uiStudio.actions.previewRunningDetail":"Nach Abschluss wird die neue Screenshot-Datei-ID angezeigt.","uiStudio.actions.previewNeedsSaveCheck":"Erfassung abgeschlossen, Speicherung prüfen","uiStudio.actions.previewSaved":"Neuer Screenshot gespeichert","uiStudio.actions.previewComplete":"Erfassung abgeschlossen","uiStudio.actions.previewSavedDetail":"Vorhandene Screenshots bleiben erhalten; dies wurde als neue Datei gespeichert.","uiStudio.actions.previewSavedPathMissing":"Eine neue Screenshot-ID wurde zurückgegeben, aber der Speicherpfad konnte nicht bestätigt werden.","uiStudio.actions.previewSnapshotIdMissing":"Die neue Screenshot-ID konnte nicht bestätigt werden. Aktualisiere die Liste, um zu prüfen, ob sie gespeichert wurde.","uiStudio.actions.more":"Mehr","uiStudio.gallery.selection.selectedCount":" ausgewählt","uiStudio.confirm.deleteSnapshotTitle":"Screenshot löschen","uiStudio.confirm.deleteSnapshotMessage":"Nur diese Screenshot-Datei wird gelöscht (Studio-Instanz bleibt erhalten).","uiStudio.confirm.deleteBatchTitle":"Ausgewählte Screenshots löschen","uiStudio.confirm.deleteBatchMessage":"Die ausgewählten Screenshots werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.gallery.selectMode":"Auswählen","uiStudio.gallery.exitSelectMode":"Abbrechen","uiStudio.gallery.selectAll":"Alle auswählen","uiStudio.gallery.clearSelection":"Auswahl aufheben","uiStudio.gallery.deleteSelected":"Auswahl löschen","common.save":"Speichern","common.cancel":"Abbrechen","common.delete":"Löschen","uiStudio.storage.title":"Gespeicherte UI Studio-Daten","uiStudio.storage.usageLabel":"In Verwendung","uiStudio.storage.historyBytes":"Verlauf","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Änderungsprotokolle","uiStudio.storage.mutationCount":"Änderungsdetails","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Letzte automatische Bereinigung","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freigegeben","uiStudio.storage.lastRunErrors":"Fehler","uiStudio.storage.loading":"Lädt...","uiStudio.cleanup.policy.title":"Richtlinie zur automatischen Löschung","uiStudio.cleanup.policy.modeOff":"Deaktiviert","uiStudio.cleanup.policy.modeAge":"Altersbasiert","uiStudio.cleanup.policy.modeSize":"Größenbasiert","uiStudio.cleanup.policy.cascade":"Auch verknüpfte Screenshots löschen","uiStudio.cleanup.policy.save":"Richtlinie speichern","uiStudio.cleanup.policy.runNow":"Gespeicherte Regel ausführen","uiStudio.cleanup.policy.proRequired":"Nach dem Upgrade auf Pro verfügbar","uiStudio.cleanup.policy.daysUnit":"T","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Richtlinie bestätigen","uiStudio.cleanup.policy.confirm.messageStrict":"Diese Richtlinie wird sofort löschen","uiStudio.cleanup.policy.confirm.requests":" Änderungsprotokolle","uiStudio.cleanup.policy.confirm.snapshots":" Screenshots","uiStudio.cleanup.policy.confirm.freed":"freigegeben — Anwenden?","uiStudio.cleanup.keepLastNDays":"Nur letzte {n} Tage behalten","uiStudio.cleanup.selectedDelete":"Auswahl löschen…","uiStudio.cleanup.deleteAll":"Alles löschen…","uiStudio.cleanup.cleanupConfirmTitle":"Bereinigung bestätigen","uiStudio.cleanup.cleanupConfirmMessage":"Die ausgewählten Elemente werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manuelle Bereinigung","uiStudio.cleanup.studioPreservedNote":"Diese Aktion löscht nur Verlaufs- und Screenshot-Dateien auf dem Datenträger; Roblox Studio-Instanzen sind nicht betroffen.","uiStudio.history.sample.bannerBadge":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerTitle":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerMessage":"Diese Vorschau verwendet Beispieldaten. Echter Anfrageverlauf, Vorher/Nachher-Vergleich und Massenlöschung sind in Pro verfügbar.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Auf Pro upgraden, um den vollständigen Verlauf freizuschalten","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Gespeicherte Regel ausführen","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clearAll":"Alles leeren","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP-Server verbunden","toast.serverDisconnected":"MCP-Server getrennt","toast.pluginConnected":"Plugin verbunden","toast.pluginDisconnected":"Plugin getrennt","toast.clearSuccess":"Erfolgreich geleert","toast.clearFailed":"Daten konnten nicht geleert werden","common.clear":"Leeren","settings.license.activate":"Lizenz aktivieren","settings.license.refresh":"Lizenz aktualisieren","settings.license.keyInput":"Lizenzschlüssel","settings.license.disconnected":"Getrennt","settings.license.disconnected.tooltip":"Verbinden Sie sich erneut mit dem MCP-Server, um Lizenzaktionen über das WEPPY Dashboard zu verwalten.","settings.license.live.tooltip":"Lizenzaktionen werden sofort an den MCP-Server gesendet.","settings.license.status.activationRequired":"Aktivierung erforderlich","settings.license.status.activationRequired.tooltip":"Eine manuelle Lizenzaktivierung ist erforderlich, bevor das WEPPY Dashboard diesen Status aktualisieren kann.","settings.license.status.grace":"Karenzzeit","settings.license.status.grace.tooltip":"Die Anbieterprüfung ist vorübergehend nicht verfügbar, der Pro-Zugriff bleibt während der Karenzzeit aktiv.","settings.license.status.graceBilling.tooltip":"Während einer abrechnungsbedingten Karenzzeit bleibt der Pro-Zugriff verfügbar.","settings.license.detail.graceBilling":"Der Pro-Zugriff bleibt während einer Abrechnungs-Karenzzeit verfügbar.","settings.license.detail.graceProviderUnavailable":"Anbieter nicht verfügbar. Der Pro-Zugriff bleibt im Karenzmodus aktiv.","settings.license.detail.manualActivation":"Manuelle Aktivierung erforderlich, um den Pro-Zugriff wiederherzustellen.","settings.license.detail.missingSessionToken":"Die Aktualisierung ist blockiert, da das aktuelle Session-Token fehlt.","settings.license.detail.refreshRecommended":"Die Lizenzprüfung sollte bald aktualisiert werden.","connection.agents.kill":"Beenden","connection.agents.kill.title":"Agent beenden?","connection.agents.killed":"Agent beendet","connection.agents.killFailed":"Agent konnte nicht beendet werden","connection.agents.lastCommand":"Letzter Befehl","connection.agents.lastCommand.tooltip":"Der zuletzt von diesem Agenten ausgeführte Tool-Aufruf","connection.agents.lastSeen":"Zuletzt aktiv","connection.agents.lastSeen.tooltip":"Der letzte Heartbeat oder die letzte Aktivität dieses Agenten","connection.clear.title":"Verbindungsprotokoll leeren?","connection.clear.message":"Dadurch wird das gespeicherte Verbindungsprotokoll des aktuellen Projekts dauerhaft entfernt.","sync.clear.title":"Synchronisierungsprotokoll leeren?","sync.clear.message":"Dadurch wird das gespeicherte Synchronisierungsprotokoll des aktuellen Place dauerhaft entfernt.","playtest.clear.title":"Testverlauf leeren?","playtest.clear.message":"Dadurch werden die gespeicherten Playtest-Berichte des aktuellen Place dauerhaft entfernt.","changelog.clear.title":"Änderungsprotokoll leeren?","changelog.clear.message":"Dadurch wird das gespeicherte Änderungsprotokoll des aktuellen Place dauerhaft entfernt.","sync.status.placePath":"Place-Pfad","sync.status.placePath.tooltip":"Aktives Place-Verzeichnis, in das Explorer-Dateien synchronisiert werden.","tier.progress.label":"Pro / Gesamt","changelog.card.representativeArea":"Repräsentativer Bereich","changelog.card.verification":"Überprüfung","uiStudio.designCheckResultsTitle":"Design-Check-Vorschläge","uiStudio.actions.designCheckAgain":"Erneut prüfen","uiStudio.actions.designCheckRunning":"Vorschläge werden geprüft...","uiStudio.actions.designCheckRunningDetail":"Nach Abschluss werden zuerst zu prüfende, empfohlene und optionale Elemente angezeigt.","uiStudio.actions.designCheckComplete":"Vorschlagsprüfung abgeschlossen","uiStudio.actions.designCheckNoSnapshotSaved":"Diese Aktion speichert keine neue Screenshot-Datei.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.priorityMedium":"Prüfung empfohlen","uiStudio.mediumPrioritySection":"Prüfung empfohlen","uiStudio.history.row.qualityPlan.tooltip":"Für diese Änderung verwendete Brief-Designrichtung.","uiStudio.history.row.designCheck.tooltip":"Zusammenfassung der Design-Check-Vorschläge nach der Änderung.","uiStudio.gallery.priorityHighBadge.tooltip":"Anzahl der zuerst zu prüfenden Vorschläge. Für Details klicken.","uiStudio.gallery.priorityMediumBadge.tooltip":"Anzahl der empfohlenen Vorschläge.","uiStudio.gallery.priorityLowBadge.tooltip":"Anzahl der optionalen Verbesserungen.","settings.dataHistory.clear.tooltip":"Nur die für diesen Eintrag gespeicherten Daten löschen. Roblox-Studio-Daten werden nicht geändert.","settings.dataHistory.connectionLog.metric.tooltip":"Anzahl gespeicherter Verbindungsereignisse und belegter Speicherplatz.","settings.dataHistory.open.tooltip":"Die Seite öffnen, die diesen Eintrag im Detail zeigt.","settings.dataHistory.playtestReports.metric.tooltip":"Anzahl gespeicherter Playtest-Berichte und belegter Speicherplatz.","settings.dataHistory.projectChanges.metric.tooltip":"Anzahl gespeicherter Projektänderungs-Zusammenfassungen und belegter Speicherplatz.","settings.dataHistory.syncLog.metric.tooltip":"Anzahl gespeicherter Sync-Ereignisse und belegter Speicherplatz.","settings.dataHistory.toggle.tooltip":"Diesen Abschnitt ein- oder ausklappen.","settings.dataHistory.manageStorage":"Speicher verwalten","settings.dataHistory.manageStorage.tooltip":"Speicherrichtlinie und Bereinigungsoptionen ein- oder ausblenden.","settings.dataHistory.manageStorage.projectChanges.aria":"Speicher der Projektänderungsübersicht verwalten","settings.dataHistory.manageStorage.uiStudio.aria":"Speicher für UI-Studio-Verlauf und Screenshots verwalten","settings.dataHistory.toolStats.metric.tooltip":"Aggregierte Gesamtaufrufe und Sitzungszahlen.","settings.dataHistory.toolsActivity.metric.tooltip":"Anzahl gespeicherter Tool-Ausführungen und belegter Speicherplatz.","settings.dataHistory.uiStudio.metric.tooltip":"UI-Studio-Änderungsdatensätze, Capture-Anzahlen und gesamte Speichernutzung.","settings.language.auto.tooltip":"Die Sprache des Betriebssystems verwenden. Fällt auf Englisch zurück, wenn sie nicht unterstützt wird.","settings.license.activate.tooltip":"Pro-Funktionen mit dem eingegebenen Lizenzschlüssel aktivieren.","settings.license.refresh.tooltip":"Den aktuellen Status erneut vom Lizenzserver abrufen. Nützlich, wenn eine Abrechnungsänderung noch nicht sichtbar ist.","settings.license.reset.tooltip":"Den aktuell registrierten Lizenzschlüssel entfernen. Vor dem Aktivieren mit einem anderen Schlüssel verwenden.","tier.upgrade.tooltip":"Pro-Funktionen und Kaufoptionen ansehen.","uiStudio.actions.captureCurrentState.tooltip":"Den aktuellen Zustand dieses UI-Ziels als neuen Screenshot erfassen.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Die Design-Check-Vorschläge für dieses UI-Ziel erneut prüfen.","uiStudio.actions.deleteSnapshot.tooltip":"Nur diese gespeicherte Screenshot-Datei löschen. Roblox Studio wird nicht geändert.","uiStudio.actions.more.tooltip":"Weitere Aktionen für diesen Screenshot anzeigen.","uiStudio.analysis.counts.tooltip":"Zeigt, wie viele Vorschläge als zuerst prüfen, empfohlen oder optional markiert sind.","uiStudio.analysis.recentCapturesTitle.tooltip":"Die zuletzt gespeicherten Screenshots für UI-Studio-Analyse und Debugging.","uiStudio.analysis.reportsTitle.tooltip":"Der neueste Analysebericht je UI-Ziel.","uiStudio.analysis.thresholds.tooltip":"Der für diese Prüfung verwendete Schwellenwertsatz (Standard oder benutzerdefiniert).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"In diesem UI wurden Verbesserungen gefunden. Karte anklicken, um Details zu sehen.","uiStudio.analysis.verdict.passed.tooltip":"Unter den aktuellen Prüfschwellen werden keine Verbesserungen vorgeschlagen.","uiStudio.analysis.verdictLabel.tooltip":"Gesamtbewertung der Verbesserungen für diesen Capture.","uiStudio.briefId.tooltip":"Kennung des Design-Briefs, der dieses UI erzeugt hat.","uiStudio.capturedAt.tooltip":"Zeitpunkt, zu dem dieser Screenshot gespeichert wurde.","uiStudio.cleanup.deleteAll.tooltip":"Alle Änderungsdatensätze und Captures für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.cleanup.keep30.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 30 Tage sind.","uiStudio.cleanup.keep7.tooltip":"Änderungsdatensätze und Captures löschen, die älter als 7 Tage sind.","uiStudio.cleanup.label.tooltip":"Änderungsdatensätze und Captures jederzeit manuell bereinigen.","uiStudio.cleanup.policy.ageInput.tooltip":"Einen beliebigen Wert zwischen 1 und 365 Tagen eingeben.","uiStudio.cleanup.policy.agePreset.tooltip":"Daten löschen, die älter als diese Anzahl von Tagen sind.","uiStudio.cleanup.policy.cascade.tooltip":"Auch die Capture-Bilder löschen, die mit diesen Datensätzen verknüpft sind. Wenn aus, bleiben die Bilder erhalten.","uiStudio.cleanup.policy.modeAge.tooltip":"Daten automatisch löschen, die älter als die konfigurierte Anzahl von Tagen sind.","uiStudio.cleanup.policy.modeOff.tooltip":"Automatische Bereinigung ausschalten. Daten bleiben erhalten, bis du sie manuell entfernst.","uiStudio.cleanup.policy.modeSize.tooltip":"Wenn die Gesamtnutzung das Limit überschreitet, werden die ältesten Daten zuerst entfernt.","uiStudio.cleanup.policy.runNow.tooltip":"Die gespeicherte Bereinigungsregel jetzt einmal ausführen, ohne auf den nächsten geplanten Lauf zu warten.","uiStudio.cleanup.policy.save.tooltip":"Die aktuelle Bereinigungsregel speichern. Danach läuft sie im Hintergrund.","uiStudio.cleanup.policy.sizeInput.tooltip":"Einen beliebigen Wert zwischen 50 MB und 10000 MB (10 GB) eingeben.","uiStudio.cleanup.policy.sizePreset.tooltip":"Die Gesamtnutzung unter dieser Größe halten.","uiStudio.cleanup.policy.title.tooltip":"Regeln, die alte oder große Captures automatisch entfernen.","uiStudio.colCurrent.tooltip":"Der aktuell angewendete Wert.","uiStudio.colRecommended.tooltip":"Der empfohlene Wert.","uiStudio.compare.after.tooltip":"Der Bildschirm, der direkt nach der KI-Änderung gespeichert wurde.","uiStudio.compare.before.tooltip":"Der Bildschirm, der direkt vor der KI-Änderung gespeichert wurde.","uiStudio.compare.path.tooltip":"Der UI-Instanzpfad für diesen Bildschirm.","uiStudio.copyFixCommand.tooltip":"Eine Eingabeaufforderung kopieren, die die KI bittet, dieses Problem zu beheben.","uiStudio.detailClose.tooltip":"Detailansicht schließen.","uiStudio.falsePositiveWarning.tooltip":"Diese Prüfung kann Fehlalarme erzeugen — vor dem Anwenden überprüfen.","uiStudio.gallery.cardCheckbox.tooltip":"Diesen Capture auswählen. Wähle mehrere aus, um sie zusammen zu löschen.","uiStudio.gallery.clearSelection.tooltip":"Die aktuelle Capture-Auswahl aufheben.","uiStudio.gallery.deleteSelected.tooltip":"Die ausgewählten Screenshot-Dateien löschen. Roblox Studio bleibt unverändert.","uiStudio.gallery.selectAll.tooltip":"Alle aktuell sichtbaren Captures auswählen.","uiStudio.groupSummary.tooltip":"Anzahl der UI-Elemente, die zu dieser Gruppe passen.","uiStudio.history.clear.tooltip":"Alle Änderungsdatensätze für dieses Projekt löschen. Das tatsächliche UI in Roblox Studio bleibt unverändert.","uiStudio.history.filter.actionAll.tooltip":"Alle Aktionsarten anzeigen.","uiStudio.history.filter.actionCreate.tooltip":"Nur Aktionen anzeigen, die ein neues UI erstellt haben.","uiStudio.history.filter.actionDelete.tooltip":"Nur Aktionen anzeigen, die ein UI gelöscht haben.","uiStudio.history.filter.actionUpdate.tooltip":"Nur Aktionen anzeigen, die ein bestehendes UI aktualisiert haben.","uiStudio.history.filter.actions.tooltip":"Datensätze nach der Art der KI-Änderung filtern.","uiStudio.history.filter.customRange.tooltip":"Ein benutzerdefiniertes Start- und Enddatum wählen.","uiStudio.history.filter.dateAll.tooltip":"Den gesamten Verlauf anzeigen.","uiStudio.history.filter.from.tooltip":"Startdatum für die Abfrage.","uiStudio.history.filter.last30Days.tooltip":"Änderungen der letzten 30 Tage anzeigen.","uiStudio.history.filter.last7Days.tooltip":"Änderungen der letzten 7 Tage anzeigen.","uiStudio.history.filter.period.tooltip":"Datensätze nach Zeitraum filtern.","uiStudio.history.filter.reset.tooltip":"Alle Filter auf Standardwerte zurücksetzen.","uiStudio.history.filter.to.tooltip":"Enddatum für die Abfrage.","uiStudio.history.filter.today.tooltip":"Nur heutige Änderungen anzeigen.","uiStudio.history.filter.yesterday.tooltip":"Nur gestrige Änderungen anzeigen.","uiStudio.history.row.affectedPaths.tooltip":"Anzahl der UIs, die von dieser Aktion betroffen sind.","uiStudio.history.row.compare.tooltip":"Vorher- und Nachher-Bildschirm vergleichen. Zum Öffnen der vollständigen Vergleichsansicht klicken.","uiStudio.history.row.extraPaths.tooltip":"Anzahl zusätzlicher UIs, die in dieser Aktion geändert wurden.","uiStudio.history.row.mutations.tooltip":"Anzahl detaillierter Änderungen (z. B. Eigenschaftsänderungen).","uiStudio.history.row.noAfterState.tooltip":"Nach dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.noBeforeState.tooltip":"Vor dieser Änderung wurde kein Capture gespeichert.","uiStudio.history.row.toggleDetails.tooltip":"Eine zeilenweise Aufschlüsselung der Änderungen ein- oder ausblenden.","uiStudio.history.title.tooltip":"Eine Zeitleiste aller UI-Änderungen, die von KI vorgenommen wurden.","uiStudio.scope.tooltip":"Capture-Bereich (voller Bildschirm oder ein bestimmtes UI).","uiStudio.storage.historyBytes.tooltip":"Speicherplatz für Änderungsdatensätze (JSON).","uiStudio.storage.lastRun.tooltip":"Wann die automatische Bereinigungsregel zuletzt lief und was entfernt wurde.","uiStudio.storage.mutationCount.tooltip":"Anzahl detaillierter Änderungen innerhalb von Aktionen (eine Eigenschaftsänderung = 1).","uiStudio.storage.requestCount.tooltip":"Anzahl der Aktionen, bei denen die KI das UI geändert hat.","uiStudio.storage.snapshotBytes.tooltip":"Speicherplatz für erfasste PNG-Bilddateien.","uiStudio.storage.snapshotCount.tooltip":"Anzahl gespeicherter Capture-Bilddateien.","uiStudio.storage.title.tooltip":"Speichernutzung von UI-Studio-Änderungsdatensätzen und Screenshots.","uiStudio.storage.usageLabel.tooltip":"Speicherplatz, den UI Studio aktuell für dieses Projekt verwendet.","uiStudio.suggestionGroup.tooltip":"Vorschläge derselben Art, gruppiert angezeigt. Zum Ein- oder Ausklappen klicken.","uiStudio.tabs.analysis.tooltip":"Neueste UI-Captures und Design-Check-Vorschläge überprüfen.","uiStudio.tabs.history.tooltip":"Von KI vorgenommene UI-Änderungen mit Vorher-/Nachher-Captures prüfen.","uiStudio.target.tooltip":"Exakter Pfad der erfassten UI-Instanz.","uiStudio.title.tooltip":"UI-Studio-Captures und Designvorschläge für Roblox-UI.","tier.banner.progressLabel":"Pro / Gesamt","uiStudio.error":"Fehler","uiStudio.analysis.expandChildren":"Unterziele anzeigen","uiStudio.analysis.openDetail":"Detail öffnen","uiStudio.analysis.childTargets":"Unterziele","uiStudio.analysis.childDetailHint":"Details zum Unterziel öffnen","uiStudio.compare.before":"Vorher","uiStudio.compare.after":"Nachher","uiStudio.history.drawer.changeDetails":"Änderungsdetails","uiStudio.gallery.cardCheckbox":"Screenshot auswählen","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Alle Bereiche","assets.explorer.label":"Asset-Explorer","assets.breadcrumb.label":"Asset-Pfad","assets.explorer.summary":"{direct} in diesem Ordner · {descendant} in Unterordnern","assets.folder.count.one":"1 Asset","assets.folder.count.many":"{count} Assets","assets.folder.type":"Ordner","assets.folders.title":"Ordner","assets.folder.assetsTitle":"Assets in diesem Ordner","assets.organization.label":"Durchsuchen","assets.organization.folders":"Ordner","assets.organization.all":"Alle Assets","assets.organization.summary":"{count} Assets","assets.view.options":"Ansichtsoptionen","assets.view.mode":"Ansichtsmodus","assets.view.grid":"Raster","assets.view.list":"Liste","assets.view.thumbnailSize":"Miniaturgröße","assets.view.thumbnailSize.listReason":"Die Miniaturgröße ist in der Rasteransicht verfügbar.","assets.view.size.small":"Klein","assets.view.size.medium":"Mittel","assets.view.size.large":"Groß","assets.list.name":"Name","assets.list.type":"Typ","assets.list.scope":"Bereich","assets.list.status":"Status","assets.list.updated":"Aktualisiert","assets.loading.scope":"Assets für {scope} werden geladen...","assets.partial.title":"Einige Speicherorte konnten nicht geladen werden","assets.empty.folderTitle":"Keine passenden Assets in diesem Ordner","assets.empty.folderBody":"Versuche einen anderen Ordner oder Kategoriefilter.","assets.empty.filteredTitle":"Keine Assets entsprechen diesem Filter","assets.empty.filteredBody":"Wähle eine andere Kategorie oder scanne die passenden Ordner erneut.","assets.place.selector":"Asset place","assets.place.context":"Asset-Place-Kontext","assets.place.sharedLibrary":"Gemeinsame Bibliothek","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Funktionsweise","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Prüfen Sie die gemeinsame WEPPY Bridge, den MCP Adapter jedes KI-Agenten, Studio-Ziele und Verbindungsereignisse.","dashboardHelp.connection.needs.1":"Die WEPPY Bridge muss erreichbar sein. Studio-Ziele erscheinen, sobald das WEPPY Plugin Heartbeats sendet.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Prüfen Sie strukturierte Playtest-Nachweise für UI-, Eingabe- und Serverergebnisse, die der AI Agent gespeichert hat.","dashboardHelp.playtest.needs.1":"Pro zeigt echte gespeicherte Berichte. Basic zeigt ein Beispiel. Screenshot-Nachweise im Play-Modus sind nicht verfügbar, semantische UI- und Interaktionsnachweise bleiben jedoch verfügbar. Für eine zuverlässige Erkennung des aktiven Place muss WEPPY Plugin verbunden sein.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Schließen","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Fehlt ein Studio-Ziel, öffnen Sie Roblox Studio und starten Sie das WEPPY Plugin. Fehlt ein KI-Agent oder MCP Adapter, verbinden Sie WEPPY MCP Server in Ihrem KI-Tool erneut.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Prüfen Sie den Status der gemeinsamen WEPPY Bridge, der MCP Adapter der einzelnen KI-Agenten, der Studio-Ziele und der Verbindungsprotokolle.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio-Routing","controls.studioRouting.title.tooltip":"Priorität für MCP-Anfragen ohne angegebenes Studio.","controls.studioRouting.settingLabel":"Anfragen ohne angegebenes Studio","controls.studioRouting.mode.auto":"Automatisch","controls.studioRouting.mode.pinned":"Studio festlegen","controls.studioRouting.state.auto":"Aktuell: automatisch","controls.studioRouting.state.pinned":"Aktuell: Studio festgelegt","controls.studioRouting.saving":"Wird angewendet…","controls.studioRouting.applied":"Angewendet","controls.studioRouting.failed":"Anwenden fehlgeschlagen","controls.studioRouting.pinnedUnavailable":"Verbinde ein Studio, um ein Studio festzulegen.","controls.studioRouting.helpLabel":"So funktioniert das Studio-Routing","controls.studioRouting.helpButton":"Wie funktioniert das?","controls.studioRouting.selectTarget":"Festes Studio auswählen","controls.studioRouting.select":"Auswählen","controls.studioRouting.targetGroupLabel":"Festgelegtes Studio","controls.luauValidation.title":"Luau-Syntaxprüfung","controls.luauValidation.settingLabel":"Nach Script-Änderungen automatisch prüfen","controls.luauValidation.benefit":"Nach einer Script-Änderung durch die KI auf Luau-Syntaxfehler prüfen.","controls.luauValidation.state.on":"Aktuell: Ein","controls.luauValidation.state.off":"Aktuell: Aus","controls.luauValidation.priority":"Wenn eine KI-Anfrage von dieser Option abweicht, gilt die Dashboard-Einstellung. Hier ein- oder ausschalten, um die Prüfung von Script-Änderungen anzupassen.","controls.luauValidation.switchLabel":"Automatische Prüfung nach Script-Änderungen","controls.luauValidation.saving":"Wird gespeichert…","controls.luauValidation.applied":"Angewendet","controls.luauValidation.failed":"Anwenden fehlgeschlagen","controls.luauValidation.helpLabel":"So funktioniert die automatische Luau-Syntaxprüfung","controls.luauValidation.helpButton":"Wie funktioniert das?","controls.luauValidation.help.behavior":"Wenn die Option eingeschaltet ist, prüft WEPPY nach dem Ersetzen, Bearbeiten, Einfügen oder Löschen von Script-Zeilen durch die KI den tatsächlich gespeicherten vollständigen Code. Wenn sie ausgeschaltet ist, wird nur das Script geändert.","controls.luauValidation.help.response":"Bei einem fehlerfreien Script bleibt die übliche kurze Abschlussmeldung erhalten. WEPPY zeigt nur dann Details, wenn ein Fehler gefunden oder die Prüfung nicht abgeschlossen wird. Große Scripts können etwas länger dauern.","controls.luauValidation.help.nonBlocking":"Wenn WEPPY einen Syntaxfehler findet oder die Prüfung nicht abschließen kann, wird die gespeicherte Script-Änderung nicht rückgängig gemacht. Das Ergebnis hilft der KI, dasselbe Script sofort zu korrigieren.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Mehrere verbundene Studio-Fenster haben dieselbe Place ID. Verwende für diesen Ort die Studio ID.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Anfragen mit Studio ID, Connection ID oder Place ID umgehen diese Priorität und werden an das angegebene Studio gesendet.","controls.studioRouting.state.currentTarget":"Aktuelles Prioritätsziel","controls.studioRouting.noPriorityTarget":"Kein Studio verbunden","controls.studioRouting.help.auto":"Automatisch nutzt das aktive Studio mit der höchsten Priorität anhand der letzten Befehle und der Verbindungsreihenfolge.","controls.studioRouting.help.pinned":"Studio festlegen nutzt das ausgewählte Studio, wenn die Anfrage keine Ziel-ID angibt.","sync.migration.title":"Update des Sync-Formats verfügbar","sync.migration.description":"Prüfe die Metadatenänderungen, bevor du diesen Place vom Sync-Format v2 auf v3 aktualisierst.","sync.migration.status.ready":"Bereit zur Prüfung","sync.migration.status.blocked":"Blockiert","sync.migration.preview":"Änderungen prüfen","sync.migration.summary.add":"Hinzufügen","sync.migration.summary.modify":"Ändern","sync.migration.summary.delete":"Löschen","sync.migration.summary.blocked":"Blockiert","sync.migration.changes":"Metadatenänderungen","sync.migration.blockers":"Zu lösende Punkte","sync.migration.operation.add":"hinzufügen","sync.migration.operation.modify":"ändern","sync.migration.operation.delete":"löschen","sync.migration.reason.serializer_regeneration":"Schreibt Metadaten im kanonischen v3-Format neu.","sync.migration.reason.volatile_metadata_removal":"Entfernt flüchtige Sync-Metadaten.","sync.migration.reason.redundant_empty_metadata":"Entfernt überflüssige leere Metadaten.","sync.migration.reason.runtime_ignore_policy":"Aktualisiert die verwaltete Runtime-Ausschlussregel.","sync.migration.reason.reverse_pending":"Wende ausstehende lokale Änderungen an Studio zuerst an oder verwirf sie.","sync.migration.reason.conflict":"Löse zuerst den Konflikt zwischen lokalen Dateien und Studio.","sync.migration.reason.local_canonical_change":"Prüfe zuerst die lokal geänderten kanonischen Metadaten.","sync.migration.reason.source_mutation_detected":"Eine Benutzerquelldatei wurde während der Prüfung geändert.","sync.migration.blocked":"Löse Sync-Konflikte vor dem Update","sync.migration.stale":"Die Vorschau hat sich geändert. Prüfe den neuesten Unterschied.","sync.migration.error":"Das Sync-Format konnte nicht aktualisiert werden. Versuche es erneut.","sync.migration.refresh":"Vorschau aktualisieren","sync.migration.refreshing":"Wird aktualisiert…","sync.migration.applying":"Wird angewendet…","sync.migration.apply":"Update anwenden","sync.migration.confirm.title":"Update des Sync-Formats anwenden?","sync.migration.confirm.message":"Die aufgeführten Sync-Metadaten werden gesichert und aktualisiert. Deine Luau-Quelldateien bleiben unverändert.","changelog.ownership.showGenerated":"Generierte Metadaten anzeigen","changelog.ownership.userSource":"Benutzerquelle","changelog.ownership.canonicalMirror":"Spiegel-Metadaten","changelog.ownership.generated":"Generiert","uiStudio.analysis.verdict.incomplete":"Prüfnachweise unvollständig","uiStudio.analysis.issueSummary.incomplete":"Keine Vorschläge, aber Interaktions- und Responsive-Prüfungen stehen noch aus.","uiStudio.analysis.coverageDimensions":"Prüfabdeckung","uiStudio.analysis.coverageStatus.completed":"Abgeschlossen","uiStudio.analysis.coverageStatus.failed":"Fehlgeschlagen","uiStudio.analysis.coverageStatus.skipped":"Übersprungen","uiStudio.history.row.readinessIncomplete":"Bereitschaft: Nachweise unvollständig","uiStudio.noSuggestionsIncomplete":"Keine Vorschläge, aber Teile der Prüfabdeckung fehlen noch.","uiStudio.readiness.summary":"UI-Bereitschaft","uiStudio.primaryVisual.label":"Hauptansicht","uiStudio.primaryVisual.recompose":"Neu anordnen","uiStudio.primaryVisual.refine":"Verfeinern","uiStudio.primaryVisual.approved":"Freigegeben","uiStudio.primaryVisual.unknown":"Unbekannt","uiStudio.functional.label":"Funktion","uiStudio.functional.safe":"Sicher","uiStudio.functional.risk":"Risiko erkannt","uiStudio.functional.unknown":"Unbekannt","uiStudio.functional.safeCompact":"Funktion sicher","uiStudio.functional.riskCompact":"Funktionsrisiko","uiStudio.functional.unknownCompact":"Funktion unbekannt","uiStudio.responsive.label":"Responsive","uiStudio.responsive.recommended":"Empfohlen","uiStudio.responsive.required":"Erforderlich","uiStudio.responsive.unknown":"Unbekannt","uiStudio.responsive.recommendedCompact":"Responsive empfohlen","uiStudio.responsive.requiredCompact":"Responsive erforderlich","uiStudio.responsive.unknownCompact":"Responsive unbekannt","uiStudio.readiness.ready":"Bereit","uiStudio.readiness.reviewRequired":"Prüfung erforderlich","uiStudio.readiness.insufficient":"Nachweise unvollständig","uiStudio.readiness.unknown":"Bereitschaft unbekannt","uiStudio.criticSummary":"Prüfzusammenfassung","playtest.history.kind.structured":"Strukturiert","playtest.history.kind.legacy":"Legacy","playtest.history.kind.attention":"Prüfung erforderlich","playtest.summary.title":"Ausführungsübersicht","playtest.summary.status":"Status","playtest.summary.mode":"Modus","playtest.summary.duration":"Dauer","playtest.summary.cleanup":"Bereinigung","playtest.dimension.title":"Nachweisdimensionen","playtest.dimension.hint":"Erforderliche Nachweise sind markiert.","playtest.dimension.server":"Server","playtest.dimension.clientUi":"Client-UI","playtest.dimension.interaction":"Interaktion","playtest.dimension.visual":"Visuell","playtest.dimension.required":"Erforderlich","playtest.dimension.optional":"Optional","playtest.dimension.steps":"Schritte","playtest.steps.title":"Schrittverlauf","playtest.steps.expected":"Erwartet","playtest.steps.observed":"Beobachtet","playtest.steps.evidence":"Nachweis","playtest.steps.server":"Server","playtest.steps.details":"Details","playtest.capability.title":"Funktionen und Grenzen","playtest.capability.semanticUi":"Semantischer UI-Snapshot","playtest.capability.virtualInput":"Virtuelle Eingabe","playtest.capability.fixedBootstrap":"Fester Agent-Bootstrap","playtest.capability.projectAdapter":"Projekttestadapter","playtest.capability.available":"Verfügbar","playtest.capability.unavailable":"Nicht verfügbar","playtest.limitations.title":"Einschränkungen","playtest.artifacts.title":"Artefakte","playtest.result.status.passed":"Bestanden","playtest.result.status.failed":"Fehlgeschlagen","playtest.result.status.timedOut":"Zeitüberschreitung","playtest.result.status.cancelled":"Abgebrochen","playtest.result.status.insufficientEvidence":"Unzureichende Nachweise","playtest.result.status.unavailable":"Nicht verfügbar","playtest.result.status.skipped":"Übersprungen","playtest.result.status.notRequested":"Nicht angefordert","playtest.result.status.unknown":"Unbekannt","playtest.record.incomplete":"Das strukturierte Ergebnis ist unvollständig","playtest.record.corrupt":"Das strukturierte Ergebnis ist beschädigt","playtest.record.unsupported":"Die Version des strukturierten Ergebnisses wird nicht unterstützt","playtest.record.unavailable":"Ergebnisdetails sind nicht verfügbar.","playtest.sample.terminal":"Alle erforderlichen Nachweise wurden bestanden","playtest.sample.limit.visual":"Screenshot-Nachweise im Play-Modus sind in der strukturierten Sitzung v1 nicht verfügbar","playtest.history.agents":"Agents","playtest.history.agentCounts":"Server {server} · Client {client}","playtest.agents.title":"Test-Agents","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Visuelle Nachweise nicht verfügbar — Play-Screenshots werden in der strukturierten Sitzung v1 nicht unterstützt.","playtest.limitations.virtualInputUnavailable":"Virtuelle Eingabe ist für diese Sitzung nicht verfügbar.","playtest.limitations.visualUnsupportedReason":"Play-Screenshots werden in der strukturierten Sitzung v1 nicht unterstützt.","playtest.dimension.reason.missing":"Erforderliche Nachweise fehlen.","playtest.dimension.reason.capability":"Die erforderliche Funktion ist nicht verfügbar.","playtest.artifacts.metadata":"Ergebnismetadaten"},Qy={"sidebar.overview":"Aperçu","sidebar.changelog":"Journal des modifications","sidebar.connection":"Connexion","sidebar.sync":"Synchroniser","sidebar.playtest":"Test de jeu","sidebar.tools":"Outils","sidebar.settings":"Paramètres","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Connexion au serveur MCP requise","sidebar.gate.l2":"Connexion au plugin Roblox Studio requise","header.currentProject":"Projet actuel","header.unknownProject":"Projet inconnu","header.projectRoot.label":"Racine du projet","header.currentProject.loading":"Chargement de la racine du projet...","header.currentProject.unavailable":"Racine Project indisponible","header.placeNotConnected":"Lieu non connecté","header.currentProject.tooltip":"Dossier de projet actuellement sélectionné","header.currentProject.loading.tooltip":"Les informations racine de Project sont toujours en cours de chargement","header.currentProject.unavailable.tooltip":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.currentProjectSyncRoot.label":"Synchroniser la racine","header.currentProjectSyncRoot.loading":"Chargement de la racine de synchronisation...","header.currentProjectSyncRoot.unavailable":"Racine de synchronisation indisponible","header.currentProjectSyncRoot.tooltip":"Dossier racine de synchronisation actuel pour le projet sélectionné","header.currentProjectSyncRoot.loading.tooltip":"Les informations sur la racine de synchronisation sont toujours en cours de chargement","header.currentProjectSyncRoot.unavailable.tooltip":"Les informations actuelles sur la racine de synchronisation ne sont pas disponibles","header.testFiles.label":"Fichiers de test","header.testFiles.unavailable":"Fichiers de test indisponibles","header.testFiles.tooltip":"Répertoire actuel des fichiers de test de lecture pour l'endroit sélectionné","header.places.title":"Lieux","header.places.active":"Actif","header.places.inactive":"Inactif","header.places.pluginRequired":"Connexion plug-in requise","header.places.liveRequired":"Connexion plug-in requise pour le lieu actif en direct","header.place.tooltip":"Lieu Roblox connecté","header.placeNotConnected.tooltip":"Lieu non connecté","placeScope.current.label":"Place actuel","placeScope.lastActive.label":"Dernier place actif","placeScope.selected.label":"Place sélectionné","placeScope.unknownPlace":"Place inconnu","placeScope.live":"En direct","placeScope.stored":"Enregistré","placeScope.pluginRequired":"Plugin requis","placeScope.pluginRequired.note":"Connectez le WEPPY Plugin pour confirmer le place actif en direct.","placeScope.noPlace.label":"Portée du place","placeScope.noPlace.value":"Aucune donnée de place disponible pour le moment","placeScope.noPlace.badge":"Aucun place","placeScope.noPlace.note":"Connectez le WEPPY Plugin et synchronisez un place pour créer des données par place.","placeScope.selected.note":"Seules les données enregistrées sont affichées. Le routage Studio reste inchangé.","placeScope.surface.sync":"L'état de synchronisation et les journaux utilisent ce place.","placeScope.surface.changelog":"Les sessions du journal des changements utilisent ce place.","placeScope.surface.playtest":"Les rapports de playtest utilisent ce place.","placeScope.surface.uiStudio":"Les captures UI et l'historique des changements utilisent ce place.","placeScope.surface.tools":"L'historique et les statistiques des outils utilisent ce place.","placeScope.loading":"Chargement de la portée du place...","placeScope.unavailable":"Portée du place indisponible","placeScope.selector.label":"Données du place","header.changeProjectRoot":"Changer la racine du projet Project","header.changeProjectRoot.ariaLabel":"Changer la racine du projet","header.changeProjectRoot.tooltip":"Changer la racine actuelle du projet","header.changeProjectRoot.disabledTooltip.l0":"Connexion au serveur MCP requise avant que la racine du projet puisse être modifiée","header.changeProjectRoot.disabledTooltip.loading":"Les informations racine de Project sont toujours en cours de chargement","header.changeProjectRoot.disabledTooltip.unavailable":"Les informations sur la racine du projet actuel ne sont pas disponibles","header.projectRootModal.initial.title":"Changer la racine du projet","header.projectRootModal.initial.body.connected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et le contenu actuel du Studio sera entièrement resynchronisé dans la nouvelle cible <dossier de projet sélectionné>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Après avoir choisi un dossier de projet, MCP basculera vers la nouvelle racine du projet et utilisera <dossier de projet sélectionné>/weppy-project-sync comme prochaine cible de synchronisation.","header.projectRootModal.initial.nextSyncRoot":"Nouvelle cible de synchronisation après sélection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<dossier de projet sélectionné>/weppy-project-sync","header.projectRootModal.initial.warningStop":"La synchronisation actuelle s'arrête immédiatement.","header.projectRootModal.initial.warningFreshSync":"Le contenu actuel du Studio sera utilisé pour créer une nouvelle synchronisation complète dans la nouvelle cible.","header.projectRootModal.initial.warningNoMove":"Les anciens dossiers de synchronisation ne sont pas déplacés automatiquement.","header.projectRootModal.initial.warningDeferredSync":"Si Studio n'est pas connecté, la resynchronisation complète démarre à la prochaine connexion du plugin.","header.projectRootModal.confirm.title":"Confirmer la nouvelle racine du projet","header.projectRootModal.confirm.body":"Examinez le dossier de projet sélectionné avant de postuler.","header.projectRootModal.confirm.projectRoot":"Dossier de projet sélectionné","header.projectRootModal.confirm.syncRoot":"Nouvelle cible de synchronisation","header.projectRootModal.confirm.warningNoMove":"Les dossiers de synchronisation existants ne sont pas déplacés automatiquement.","header.projectRootModal.pick":"Choisir un dossier","header.projectRootModal.apply":"Appliquer le changement","header.projectRootModal.cancel":"Annuler","header.projectRootModal.error":"Échec de la modification de la racine du projet","status.online":"En ligne","status.offline":"Hors ligne","status.idle":"Inactif","status.syncing":"Synchronisation","status.error":"Erreur","status.initializing":"Initialisation","level.l0.title":"Serveur déconnecté","level.l0.message":"WEPPY Dashboard ouvert mais le serveur MCP s'est arrêté ou ne répond pas.","level.l1.title":"Serveur connecté","level.l1.hint":"Vérifiez : Roblox Studio est-il en cours d'exécution ? Le plugin est-il installé ?","level.l2.ok":"Studio connecté","tier.basic":"Basic","tier.basic.tooltip":"Niveau Basic avec l'ensemble de fonctionnalités standard WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Niveau Pro avec l'ensemble complet de fonctionnalités WEPPY Dashboard.","tier.mixed":"Mixte","tier.upgrade":"Voir Pro","tier.banner.save":"Enregistrez les jetons IA avec Pro !","tier.tool.query_instances.desc":"Inspectez les instances, recherchez les enfants et les descendants et inspectez les données de classe. Pro ajoute une arborescence de fichiers, une structure de projet et une recherche de propriétés ou de balises.","tier.tool.mutate_instances.desc":"Créez, supprimez, clonez et déplacez des instances. Pro ajoute la création d'arborescence et les opérations de création, de suppression ou de clonage en masse.","tier.tool.manage_properties.desc":"Lisez et définissez les propriétés, les attributs et les balises. Pro ajoute des mises à jour calculées, des modifications relatives et des opérations de propriété en masse.","tier.tool.manage_scripts.desc":"Lisez, écrivez, créez, supprimez, modifiez et recherchez la source du script. Pro ajoute un remplacement groupé entre les scripts.","tier.tool.manage_ui.desc":"Pro uniquement. Créez ou affinez des menus de style jeu, des HUD, des boutons, des étiquettes et des panneaux d'images, puis capturez des écrans et examinez les suggestions d'amélioration.","tier.tool.manage_ui.action.design_brief":"Planifier l'orientation de l'interface utilisateur","tier.tool.manage_ui.action.create_tree":"Créer une nouvelle interface utilisateur","tier.tool.manage_ui.action.update":"Mettre à jour l'interface utilisateur existante","tier.tool.manage_ui.action.delete":"Supprimer l'interface utilisateur","tier.tool.manage_ui.action.preview":"Capturer l'écran de l'interface utilisateur","tier.tool.manage_ui.action.check":"Examiner les suggestions d'amélioration","tier.tool.manage_lighting.desc":"Pro uniquement. Configurez l'éclairage, l'atmosphère, le ciel, les propriétés du terrain et les paramètres d'heure.","tier.tool.manage_selection.desc":"Lisez, définissez et effacez la sélection actuelle de Studio. Pro ajoute le contexte, les détails, l'ajout ou la suppression et la prise en charge de la surveillance de la sélection.","tier.tool.manage_camera.desc":"Inspectez l’état de la caméra, faites la mise au point par chemin ou position et demandez des suggestions de vues.","tier.tool.manage_tween.desc":"Pro uniquement. Créez, lisez, mettez en pause et annulez des interpolations pour une animation fluide.","tier.tool.manage_audio.desc":"Pro uniquement. Jouez, arrêtez, mettez en pause et reprenez les sons, et configurez l'écouteur audio.","tier.tool.manage_animation.desc":"Pro uniquement. Chargez, lisez et arrêtez des animations, et inspectez les pistes d'animation actives.","tier.tool.manage_physics.desc":"Pro uniquement. Enregistrez les groupes de collision, configurez les collisions de groupe et inspectez les groupes disponibles.","tier.tool.manage_effects.desc":"Pro uniquement. Émettez des particules, supprimez les effets et basculez l'état de l'effet.","tier.tool.manage_terrain.desc":"Pro uniquement. Remplissez les formes du terrain, effacez les régions, remplacez les matériaux, gérez les couleurs du terrain, lisez ou écrivez des voxels, générez du terrain et lissez le terrain.","tier.tool.spatial_query.desc":"Pro uniquement. Exécutez des raycasts, trouvez le terrain, validez le placement, scannez des zones, recherchez des positions plates ou d'apparition, analysez la possibilité de marcher, cartographiez l'espace et inspectez les collisions.","tier.tool.manage_assets.desc":"Pro uniquement. Insérez des modèles, inspectez les informations sur les actifs, recherchez dans la boutique du créateur, insérez des actifs ou des packages gratuits et exportez des actifs.","tier.tool.manage_sync.desc":"Pro uniquement. Inspectez l’état de synchronisation, la configuration, l’historique, les instructions et lisez ou écrivez les fichiers synchronisés.","tier.tool.workspace_state.desc":"Pro uniquement. Exécutez une synchronisation complète, capturez des instantanés, inspectez les modifications récentes et l'état de la fenêtre d'affichage, et gérez les métadonnées associées.","tier.tool.manage_logs.desc":"Inspectez les journaux de sortie avec filtrage, interrogation incrémentielle, effacement de la mémoire tampon et recherche d'erreurs récentes.","tier.tool.system_info.desc":"Inspectez l’état de la connexion et le niveau actuel. Pro ajoute des informations sur le lieu, des services, des paramètres de Studio, un contrôle de test de jeu et des tests automatisés.","tier.tool.manage_studio.desc":"Pro uniquement. Basculez les paramètres d'affichage de l'éditeur Studio tels que l'aperçu de l'interface utilisateur pour les flux de capture d'écran et d'assurance qualité ; il modifie les paramètres de session Studio, pas les objets de l'interface utilisateur du jeu.","tier.tool.batch_execute.desc":"Pro uniquement. Exécutez plusieurs commandes par lots, avec une exécution séquentielle et un comportement facultatif de poursuite en cas d'erreur.","tier.tool.execute_luau.desc":"Pro uniquement. Exécutez du code Luau arbitraire dans le bac à sable Roblox Studio.","connection.server.title":"État du Bridge","connection.server.version":"Version","connection.server.version.tooltip":"Version de l'environnement d'exécution de WEPPY Bridge","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificateur de processus du système d'exploitation","connection.server.uptime":"Temps de disponibilité","connection.server.uptime.tooltip":"Temps écoulé depuis le démarrage de WEPPY Bridge","connection.server.session":"Session","connection.server.session.tooltip":"Identifiant de session actuel de WEPPY Bridge","connection.server.exec":"Exécutif","connection.server.exec.tooltip":"Chemin de l'exécutable utilisé pour lancer WEPPY Bridge","connection.reconnect":"Reconnecter","connection.checkSettings":"Vérifier les paramètres","connection.agents.title":"Agents IA","connection.agents.name":"Agent","connection.agents.version":"Version","connection.agents.version.tooltip":"Version du package MCP Adapter pour cette session d’agent.","connection.agents.cwd":"Directeur de travail","connection.agents.cwd.tooltip":"Répertoire de travail actuel pour l'agent AI connecté","connection.agents.projectRoot":"Racine du projet","connection.agents.projectRoot.tooltip":"Racine de projet faisant autorité pour la propriété de synchronisation","connection.agents.projectRoot.unresolved":"Non résolu","connection.agents.connected":"Connecté","connection.agents.unknown":"Inconnu","connection.agents.none":"Aucun agent connecté","connection.plugins.title":"Plugins","connection.plugins.place":"Lieu","connection.plugins.clientId":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","connection.plugins.lastSeen":"Vu pour la dernière fois","connection.plugins.lastSeen.tooltip":"Battement de cœur le plus récent reçu du plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Version du plugin installé signalée par Studio","connection.plugins.none":"Aucun plugin connecté","connection.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Connexion Play/Test de Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"Chaque agent IA se connecte via son propre MCP Adapter à un WEPPY Bridge partagé, qui maintient la connexion avec Roblox Studio.","connection.topology.serverTitle":"WEPPY Bridge","connection.topology.adapterRole":"MCP Adapter","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","connection.log.title":"Journal de connexion","connection.log.empty":"Aucun événement pour l'instant","connection.time.secondsAgo":"il y a","connection.time.minutesAgo":"il y a m","connection.time.hoursAgo":"il y a h","common.loading":"Chargement...","common.retry":"Réessayer","common.reconnecting":"Reconnexion...","common.expand":"Développer","common.collapse":"Effondrement","tools.tab.history":"Histoire","tools.tab.statistics":"Statistiques","tools.tab.failures":"Échecs","tools.col.time":"Temps","tools.col.time.tooltip":"Date à laquelle l'exécution de l'outil a été enregistrée.","tools.col.toolAction":"Outil.Action","tools.col.toolAction.tooltip":"Nom de l’outil et action exécutée.","tools.col.duration":"Durée","tools.col.duration.tooltip":"Combien de temps l'outil a mis pour terminer.","tools.col.status":"Statut","tools.col.status.tooltip":"Résultat de l'exécution de l'outil enregistrée.","tools.col.tier":"Étage","tools.col.tier.tooltip":"Niveau de licence requis pour l’outil ou l’action.","tools.col.tierStats.tooltip":"Basic, Pro ou résumé mixte pour la ligne de statistiques de l'outil.","tools.col.tool":"Outil","tools.col.tool.tooltip":"Nom de l'outil consolidé dans le tableau des statistiques.","tools.col.calls":"Appels","tools.col.calls.tooltip":"Nombre total d'appels enregistrés pour cet outil.","tools.col.ok":"OK","tools.col.ok.tooltip":"Nombre d'exécutions directes réussies.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Nombre d'exécutions réussies grâce à une exécution de secours.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Nombre d'exécutions bloquées sans exécution de secours.","tools.col.warn":"WARN","tools.col.warn.tooltip":"Nombre d'échecs attendus provoqués par l'entrée de l'appelant, l'état du projet, la stratégie Roblox ou le code utilisateur.","tools.col.err":"FAILED","tools.col.err.tooltip":"Nombre d'exécutions ayant échoué.","tools.col.okRate":"D'ACCORD%","tools.col.okRate.tooltip":"Pourcentage d'appels terminés avec succès.","tools.col.avgTime":"Temps moyen","tools.col.avgTime.tooltip":"Temps d'exécution moyen sur les appels enregistrés.","tools.col.error":"Erreur","tools.filter.tool":"Outil","tools.filter.all":"Tous","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Cette entrée utilisait un outil ou une action uniquement Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"L'action Pro demandée a réussi via un repli Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"L'action Pro demandée a été bloquée et aucune solution de secours n'a été exécutée.","tools.badge.warn":"WARN","tools.badge.warn.tooltip":"L’appel de l’outil a échoué en raison d’un problème attendu d’appelant, de projet, de stratégie ou de code utilisateur.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"L’exécution de l’outil a échoué.","tools.status.ok":"OK","tools.status.ok.tooltip":"L’exécution de l’outil s’est terminée avec succès.","tools.tier.mixed.tooltip":"Cet outil comprend à la fois les actions Basic et Pro.","tools.detail.params":"Paramètres","tools.detail.params.tooltip":"Paramètres d’entrée transmis à cette exécution d’outil.","tools.detail.result":"Résultat","tools.detail.result.tooltip":"Charge utile du résultat renvoyé pour cette exécution de cet outil.","tools.detail.requestedCommand":"Commande envoyée","tools.detail.executedCommand":"Commande exécutée","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Raison du blocage","tools.detail.noFallback":"Pas de solution de repli","tools.detail.noFallback.value":"Aucune solution de secours n'a été exécutée.","tools.detail.warningMessage":"Message d'avertissement","tools.detail.errorMessage":"Message d'erreur","tools.detail.open":"Détails","tools.detail.openLabel":"Voir les détails de {command}","tools.detail.dialogLabel":"Détail de l’exécution de l’outil","tools.detail.title":"Exécution de l’outil","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","tools.clear.history.title":"Effacer l'historique ?","tools.clear.history.message":"Cela supprime définitivement l’historique actuel des outils de lieu.","tools.clear.statistics.title":"Des statistiques claires ?","tools.clear.statistics.message":"Cela réinitialise définitivement les statistiques actuelles de l'outil de placement.","tools.detail.error":"Erreur","tools.page.prev":"Précédent","tools.page.prev.tooltip":"Accédez à la page précédente des résultats de l’historique des outils.","tools.page.next":"Suivant","tools.page.next.tooltip":"Accédez à la page suivante des résultats de l’historique des outils.","tools.empty.history":"Aucune entrée dans l'historique","tools.empty.stats":"Aucune statistique sur les outils","tools.empty.failures":"Aucun échec","tools.summary.total":"Total","tools.summary.calls":"appels","tools.summary.sessions":"Séances","settings.license.title":"Licence","settings.license.title.tooltip":"Statut actuel de la licence et niveau d'abonnement.","settings.license.status":"Statut","settings.license.status.tooltip":"État d'activation actuel de la licence.","settings.license.tier":"Étage","settings.license.tier.tooltip":"Niveau d'abonnement actuel pour les fonctionnalités WEPPY Dashboard disponibles.","settings.license.key":"Clé","settings.license.key.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.keyValue.tooltip":"Clé de licence masquée actuellement chargée par le serveur.","settings.license.provider":"Provider","settings.license.provider.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","settings.license.provider.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.providerValue.tooltip":"Fournisseur de licence utilisé pour valider cette clé.","settings.license.active":"Actif","settings.license.active.tooltip":"État d'activation actuel de la licence.","settings.license.status.activeCancelPending.tooltip":"L'annulation est en attente, mais l'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.inactive":"Inactif","settings.license.inactive.tooltip":"État d'activation actuel de la licence.","settings.license.expired":"Expiré","settings.license.expired.tooltip":"État d'activation actuel de la licence.","settings.license.unavailable":"Informations de licence indisponibles","settings.license.detail.cancelPending":"L'annulation est programmée. L'accès Pro reste actif jusqu'à la fin de la période de facturation en cours.","settings.license.reset":"Réinitialiser la licence","settings.readOnly":"Lecture seule","settings.readOnly.tooltip":"Cette section affiche les valeurs qui ne peuvent pas être modifiées à partir du WEPPY Dashboard.","settings.unavailable":"Paramètres indisponibles","settings.general.title":"Paramètres généraux","settings.general.title.tooltip":"Paramètres chauds qui s’appliquent immédiatement lorsqu’ils sont modifiés.","settings.general.liveApply":"Postuler en direct","settings.general.liveApply.tooltip":"Les modifications apportées à cette section sont appliquées immédiatement sans bouton de sauvegarde séparé.","settings.general.applied":"Appliqué","settings.general.logLevel":"Niveau de journalisation","settings.general.logLevel.tooltip":"Choisissez la quantité de détails que le serveur MCP écrit dans les journaux. Réduisez à « debug » lors de la recherche d’un problème.","settings.general.localHistory":"Enregistrement de l'historique des outils","settings.general.localHistory.tooltip":"Enregistrez les exécutions de l’outil AI sur le disque. Obligatoire pour les pages Outils et Historique.","settings.general.localStatistics":"Collecte de statistiques sur les outils","settings.general.localStatistics.tooltip":"Comptes agrégés d’utilisation des outils. Utilisé par les statistiques de présentation.","settings.general.contextCapture":"Capture de contexte","settings.general.contextCapture.tooltip":"Enregistrez le contexte d'exécution structuré afin que les vues Changelog et Playtest puissent le restituer.","settings.general.requestTimeout":"Expiration du délai d'action","settings.general.requestTimeout.tooltip":"Temps maximum (en ms) d'attente pour une seule action de l'outil avant d'échouer.","settings.general.requestTimeout.unit":"MS","settings.general.requestTimeout.unit.tooltip":"Le délai d’expiration de l’action est mesuré en millisecondes.","settings.cold.title":"Environnement serveur","settings.cold.title.tooltip":"Valeurs d'environnement de serveur en lecture seule chargées au démarrage.","settings.cold.httpPort.tooltip":"Numéro de port utilisé par le serveur HTTP MCP WEPPY Dashboard.","settings.cold.httpHost.tooltip":"Interface hôte à laquelle le serveur HTTP MCP WEPPY Dashboard se lie.","settings.cold.hint":"Définissez via des variables d’environnement pour modifier ces valeurs.","settings.dashboard.title":"Dashboard","settings.dashboard.title.tooltip":"Choisissez le comportement du WEPPY Dashboard au démarrage du serveur MCP.","settings.dashboard.nextStartBadge":"Prochain démarrage","settings.dashboard.autoOpen.label":"Ouvrir le Dashboard au démarrage de WEPPY","settings.dashboard.autoOpen.description":"Ouvre automatiquement ce Dashboard après le démarrage du serveur MCP.","settings.dashboard.autoOpen.nextStart":"S’applique au prochain démarrage du serveur MCP.","settings.dashboard.settingsFile.label":"Fichier de réglages","settings.dashboard.agentExample.label":"Demandez à votre Agent","settings.dashboard.agentExample.prompt":"« Désactive l’ouverture automatique du Dashboard. »","settings.dashboard.autoOpen.saving":"Enregistrement…","settings.dashboard.autoOpen.saved":"Enregistré pour le prochain démarrage du serveur.","settings.dashboard.autoOpen.error":"Échec de l’enregistrement. Le réglage précédent a été restauré.","dashboardAutoOpenGuide.eyebrow":"Préférence du Dashboard","dashboardAutoOpenGuide.title":"Choisissez comment ouvrir WEPPY Dashboard","dashboardAutoOpenGuide.currentOn":"L’ouverture automatique est activée. Ce Dashboard s’ouvre après le démarrage du serveur MCP.","dashboardAutoOpenGuide.currentOff":"L’ouverture automatique est désactivée. WEPPY n’ouvrira pas de nouvel onglet Dashboard au démarrage du serveur MCP.","dashboardAutoOpenGuide.changeAnytime":"Vous pouvez modifier ce choix à tout moment dans Settings.","dashboardAutoOpenGuide.agentHint":"Vous pouvez aussi demander à votre Agent : « Désactive l’ouverture automatique du Dashboard ».","dashboardAutoOpenGuide.statusOn":"Ouverture automatique activée","dashboardAutoOpenGuide.statusOff":"Ouverture automatique désactivée","dashboardAutoOpenGuide.keep":"Conserver le réglage actuel","dashboardAutoOpenGuide.turnOff":"Désactiver l’ouverture automatique","dashboardAutoOpenGuide.openSettings":"Ouvrir Settings","dashboardAutoOpenGuide.close":"Fermer le guide d’ouverture automatique","dashboardAutoOpenGuide.saving":"Enregistrement…","dashboardAutoOpenGuide.error":"Impossible d’enregistrer votre choix. Réessayez.","settings.language.title":"Langue","settings.language.title.tooltip":"Choisissez comment le texte de l'interface WEPPY Dashboard est localisé.","settings.language.dashboard":"WEPPY Dashboard Langue","settings.language.dashboard.tooltip":"Remplace la langue WEPPY Dashboard ou suit la langue du système lorsqu'elle est définie sur Auto.","settings.language.auto":"Auto","overview.l0.title":"Serveur MCP déconnecté","overview.l0.message":"Le serveur MCP ne répond pas. Le WEPPY Dashboard tentera automatiquement de se reconnecter.","overview.l0.step1":"Vérifiez que le processus serveur MCP est en cours d'exécution","overview.l0.step2":"Redémarrez la commande du serveur MCP si nécessaire","overview.l0.reconnecting":"Reconnexion automatique toutes les 3 secondes...","overview.l0.reconnectBtn":"Reconnecter","overview.l0.settingsBtn":"Vérifier les paramètres","overview.l1.pluginGuide":"Le plugin Roblox Studio n'est pas connecté","overview.l1.check1":"Roblox Studio est-il en cours d'exécution ?","overview.l1.check2":"Le WEPPY Plugin est-il installé ?","overview.l1.feedHint":"Les modifications apparaîtront ici une fois le plugin connecté","overview.metric.server":"Serveur","overview.metric.server.tooltip":"État d'exécution du serveur MCP et état du processus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Connexion du plugin Roblox Studio et état de la version","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Agents de codage IA connectés et leur état d'exécution","overview.metric.agent.instancesUnit":"cas","overview.metric.sync":"Synchroniser","overview.metric.sync.tooltip":"Activité actuelle de synchronisation entre Studio et local","overview.metric.noAgent":"Aucun agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Version du serveur MCP installée","overview.meta.session":"Session","overview.meta.session.tooltip":"Identifiant de session MCP actuel","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificateur de processus du système d'exploitation","overview.meta.uptime":"Temps de disponibilité","overview.meta.uptime.tooltip":"Temps écoulé depuis le démarrage du serveur MCP","overview.feed.title":"Modifications récentes du jeu","overview.feed.empty":"Aucun changement récent","overview.changelog.title":"Résumé des modifications de session","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"cas","overview.changelog.properties":"propriétés","overview.changelog.assets":"actifs","overview.tier.title":"Utilisation du niveau","changelog.subtitle":"Historique des changements de jeu","changelog.filter.all":"Tous","changelog.filter.active":"Actif","changelog.filter.completed":"Complété","changelog.empty":"Aucune entrée du journal des modifications pour l'instant","changelog.basic.limit.title":"L'aperçu Basic affiche les 3 dernières sessions","changelog.basic.limit.body":"Passez à Pro pour parcourir la chronologie complète du journal des modifications pour ce lieu.","changelog.basic.metricLabel":"Journal des modifications visible / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Actif","changelog.card.active.tooltip":"Cette session reçoit toujours de nouveaux changements de jeu.","changelog.card.completed":"Complété","changelog.card.completed.tooltip":"Cette session est terminée et aucun autre changement n'est attendu.","changelog.card.bootstrapStatus":"Amorçage","changelog.card.bootstrapStatus.tooltip":"Cette session contient uniquement l'instantané d'amorçage de synchronisation initial.","changelog.card.inProgress":"en cours","changelog.card.noChanges":"Aucun changement pour l'instant","changelog.card.noChanges.tooltip":"Aucun changement de jeu n'a encore été extrait pour cette session.","changelog.card.bootstrapSummary":"Instantané de synchronisation initial","changelog.card.bootstrapSummary.tooltip":"Les écritures initiales de synchronisation de fichiers sont regroupées en une seule ligne d'instantané d'amorçage.","changelog.card.sessionIntent":"Intention de session","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Modifications du script apportées au cours de cette session.","changelog.card.instances":"cas","changelog.card.instances.tooltip":"Instance créer, supprimer, déplacer ou cloner les modifications dans cette session.","changelog.card.modified":"modifié","changelog.card.created":"créé","changelog.card.deleted":"supprimé","changelog.card.moved":"déplacé","changelog.card.propertiesChanged":"propriétés modifiées","changelog.card.propertiesChanged.tooltip":"Modifications de la valeur Property enregistrées pour cette session.","changelog.card.lightingConfigured":"Éclairage configuré","changelog.card.lightingConfigured.tooltip":"Les paramètres d'éclairage ou d'ambiance ont été modifiés au cours de cette session.","changelog.card.terrainConfigured":"Terrain configuré","changelog.card.terrainConfigured.tooltip":"Les données de terrain ou les paramètres de terrain ont été modifiés au cours de cette session.","changelog.card.assetsInserted":"éléments insérés","changelog.card.assetsInserted.tooltip":"Actifs insérés dans le lieu lors de cette séance.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Éclairage","changelog.category.terrain":"Terrain","changelog.category.asset":"Actifs","changelog.detail.dialogLabel":"Détails du journal des modifications","changelog.detail.changeSummary":"Résumé des modifications","changelog.detail.changeSummary.tooltip":"Nombre de modifications de jeu extraites regroupées par catégorie pour cette session.","changelog.detail.changeTimeline":"Modifier la chronologie","changelog.detail.changeTimeline.tooltip":"Liste chronologique des modifications de jeu extraites pour cette session.","changelog.detail.context.title":"Résumé du contexte","changelog.detail.context.tooltip":"Contexte d'exécution structuré capturé pour cette session de journal des modifications.","changelog.detail.verification.title":"Vérification","changelog.detail.verification.tooltip":"Signaux de vérification liés à cette session de changelog.","changelog.detail.verification.label":"Résultat","changelog.detail.verification.status":"Statut","changelog.detail.verification.timestamp":"Enregistré à","changelog.detail.beforeAfter":"Avant et après","changelog.detail.filterCategory":"Catégorie","changelog.detail.filterCategory.tooltip":"Filtrez la chronologie sur une seule catégorie de changement.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Les états avant et après ont été confirmés pour ce changement.","changelog.detail.confidence.partial":"Partiel","changelog.detail.confidence.partial.tooltip":"Seule une partie de l’état avant et après a pu être confirmée pour ce changement.","changelog.detail.confidence.afterOnly":"Après seulement","changelog.detail.confidence.afterOnly.tooltip":"Seul l'état résultant après le changement a pu être confirmé.","changelog.detail.confidence.intentOnly":"Intention uniquement","changelog.detail.confidence.intentOnly.tooltip":"Seule l'action demandée a été enregistrée, pas l'état résultant.","changelog.detail.confidence.unknown":"Inconnu","changelog.detail.confidence.unknown.tooltip":"Ce changement n’a pas pu être classé avec certitude à partir des données disponibles.","changelog.detail.noChanges":"Aucun changement dans cette catégorie","changelog.detail.backToList":"Retour à la liste","changelog.diff.empty":"Aucune différence disponible","changelog.diff.unified":"Unifié","changelog.diff.sideBySide":"Côte à côte","changelog.diff.before":"Avant","changelog.diff.after":"Après","sync.overlay.title":"Plugin Roblox Studio requis","sync.overlay.message":"L'état de synchronisation sera disponible une fois le plugin Roblox Studio connecté.","sync.overlay.check1":"Roblox Studio est-il en cours d'exécution ?","sync.overlay.check2":"Le WEPPY Plugin est-il installé ?","sync.status.title":"Statut de synchronisation","sync.status.title.tooltip":"État actuel de synchronisation du Studio et des fichiers locaux pour cet emplacement.","sync.status.forwardOnly":"Transférer uniquement","sync.status.forwardOnly.tooltip":"Le niveau Basic permet à Studio d'effectuer une synchronisation directe locale uniquement.","sync.status.place":"Lieu","sync.status.place.tooltip":"Nom et identifiant du lieu Roblox connecté.","sync.status.path":"Chemin","sync.status.path.tooltip":"Racine du système de fichiers local actuellement utilisée pour la sortie de synchronisation.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Nombre total d'instances Roblox synchronisées suivies dans le miroir local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Nombre total de fichiers de script synchronisés actuellement indexés pour cet emplacement.","sync.status.state":"État","sync.status.state.tooltip":"État de synchronisation d'exécution actuel signalé par le serveur.","sync.policy.title":"Politique Sync","sync.policy.title.tooltip":"Politique Sync effective signalée par le plugin Studio connecté.","sync.policy.activation":"Activation","sync.policy.activation.on":"Sync ON","sync.policy.activation.off":"Sync OFF","sync.policy.preset":"Flux de travail","sync.policy.preset.studio_first":"Studio d'abord","sync.policy.preset.bidirectional_review":"Bidirectionnel","sync.policy.preset.local_code_studio_world":"Code local, monde Studio","sync.policy.preset.custom":"Personnalisé","sync.policy.apply.title":"Application des changements locaux à Studio","sync.policy.apply.description":"Indique si les changements locaux sont vérifiés d’abord ou appliqués automatiquement à Studio.","sync.policy.apply.content":"Modifications du contenu","sync.policy.apply.content.tooltip":"Changements locaux du code Script, des propriétés et des propriétés de service. Créer, supprimer, renommer et déplacer relèvent de la structure.","sync.policy.apply.structure":"Modifications de la structure","sync.policy.apply.structure.tooltip":"Création, suppression, renommage et déplacement locaux d’instances. La suppression locale automatique exige aussi l’option de suppression séparée ci-dessous.","sync.policy.apply.manual":"Vérifier d'abord","sync.policy.apply.auto":"Application automatique","sync.policy.scope.disclosure":"Directions par périmètre","sync.policy.scope.scriptSource":"Source des scripts","sync.policy.scope.properties":"Propriétés","sync.policy.scope.structure":"Structure","sync.policy.scope.serviceProperties":"Propriétés des services","sync.policy.endpoint.local":"Local","sync.policy.endpoint.studio":"Studio","sync.policy.direction.forward":"Studio → Local","sync.policy.direction.forward.tooltip":"Les modifications de Studio sont écrites dans les fichiers locaux.","sync.policy.direction.reverse":"Local → Studio","sync.policy.direction.reverse.tooltip":"Les modifications des fichiers locaux sont appliquées dans Studio.","sync.policy.direction.bidirectional":"Dans les deux sens","sync.policy.direction.bidirectional.tooltip":"Les modifications peuvent aller de Studio vers les fichiers locaux et des fichiers locaux vers Studio.","sync.policy.safety.localDeletes":"Suppression locale → supprimer l’instance Studio","sync.policy.safety.review":"Vérifier avant suppression","sync.policy.safety.review.tooltip":"Les suppressions de fichiers locaux attendent une vérification avant de retirer les instances Studio correspondantes. Cette fonction est distincte du nettoyage automatique de UI Studio.","sync.policy.safety.auto":"Suppression automatique dans Studio","sync.policy.safety.auto.tooltip":"La suppression de fichiers locaux peut retirer automatiquement les instances Studio correspondantes. Cette fonction est distincte du nettoyage automatique de UI Studio.","sync.policy.reviewRequired":"Vérifiez cette politique dans le plugin Studio avant de lancer Sync.","sync.log.title":"Journal de synchronisation","sync.log.empty":"Aucun événement de synchronisation pour l'instant","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Une nouvelle sortie de synchronisation a été écrite sur le disque.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Un fichier ou une instance synchronisée existante a été mise à jour.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Un fichier ou une instance synchronisé a été supprimé.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Un événement de synchronisation a été enregistré sans mutation de fichier.","sync.upgrade.title":"Découvrir la synchronisation complète avec Pro","sync.upgrade.benefit1":"Synchronisation bidirectionnelle : modifiez des fichiers, appliquez-les automatiquement à Studio","sync.upgrade.benefit2":"Synchronisation inversée : renvoyer les modifications de fichiers vers Studio","sync.upgrade.benefit3":"Historique de synchronisation complet et journal des modifications détaillé","sync.upgrade.buy":"Voir Pro","playtest.status.title":"Statut du test de jeu","playtest.status.title.tooltip":"État actuel de la session de test de jeu Roblox signalé par Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode de lancement du playtest Studio pour la session en cours.","playtest.status.mode.value.tooltip":"Mode de test de jeu Roblox Studio spécifique actuellement utilisé.","playtest.status.mode.play":"Jouer","playtest.status.mode.run":"Courir","playtest.status.mode.server":"Serveur","playtest.status.mode.edit":"Modifier","playtest.status.place.tooltip":"Lieu Roblox actuellement associé à cette session de playtest.","playtest.status.state.running":"En cours d'exécution","playtest.status.state.running.tooltip":"Une session de test de jeu Roblox est actuellement en cours.","playtest.status.state.paused":"En pause","playtest.status.state.paused.tooltip":"La session de test de jeu Roblox en cours est suspendue.","playtest.status.state.notRunning":"Ne fonctionne pas","playtest.status.state.notRunning.tooltip":"Aucune session de test de jeu Roblox n'est actuellement en cours.","playtest.control.play":"Jouer","playtest.control.pause":"Pause","playtest.control.resume":"CV","playtest.control.stop":"Arrêt","playtest.history.title":"Historique des tests","playtest.history.title.tooltip":"Exécutions de tests de jeu automatisés enregistrés pour ce projet.","playtest.history.empty":"Aucun résultat de test pour l'instant","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode Playtest utilisé pour ce test enregistré.","playtest.history.status.passed":"Passé","playtest.history.status.failed":"Échoué","playtest.history.status.running":"En cours d'exécution","playtest.history.status.unknown":"Inconnu","playtest.history.status.tooltip":"État des résultats enregistrés pour cette exécution de test de jeu automatisé.","playtest.empty.title":"Aucun résultat de test de jeu pour l'instant","playtest.empty.message":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.before":"Les résultats apparaîtront ici après l’exécution d’un Playtest par l’agent IA.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","playtest.report.title":"Rapport sélectionné","playtest.report.title.tooltip":"Sortie détaillée pour l’exécution de test de jeu automatisé actuellement sélectionnée.","playtest.detail.dialogLabel":"Détail du rapport de playtest","playtest.detail.loading":"Chargement du rapport...","playtest.detail.errorTitle":"Rapport indisponible","playtest.report.content":"Rapport","playtest.report.content.tooltip":"Résumé de la démarque pour l'exécution du test de jeu automatisé sélectionné.","playtest.report.logs":"Journaux","playtest.report.logs.tooltip":"Journaux d'exécution capturés pour l'exécution du test de lecture automatisé sélectionné.","playtest.context.contextId":"ID de contexte","playtest.context.why":"Pourquoi ce test a été exécuté","playtest.context.expected":"Attendu","playtest.context.observed":"Observé","playtest.report.empty":"Aucun contenu de rapport disponible","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest est une fonctionnalité réservée à Pro","playtest.basic.desc":"Contrôlez les tests de jeu à partir de WEPPY Dashboard, exécutez des tests automatisés et consultez des rapports de test détaillés.","playtest.basic.benefit1":"Commandes de lecture/pause/arrêt en un clic","playtest.basic.benefit2":"Exécution de tests automatisés via un agent IA","playtest.basic.benefit3":"Historique des tests avec suivi des réussites/échecs","playtest.basic.benefit4":"Rapports de tests de démarque détaillés","playtest.sample.badge":"Aperçu de la vue du playtest Pro","playtest.sample.title":"Vous prévisualisez l'écran de test de jeu qui devient disponible après la mise à niveau vers Pro.","playtest.sample.message":"Cet aperçu utilise des exemples de données. Le contrôle des tests de jeu en direct, la gestion de l'historique et les rapports réels sont débloqués avec Pro.","playtest.sample.clearDisabled":"Passez à Pro pour effacer l'historique des tests de jeu en direct.","playtest.sample.place":"Aperçu de l'arène","playtest.sample.history.name":"Exemple de test de fumée dans une arène","playtest.sample.context.why":"Apparaissez dans l'arène, survivez à l'ouverture et vérifiez que le HUD répond immédiatement.","playtest.sample.context.expected":"Le joueur apparaît en toute sécurité, l'interface utilisateur du compte à rebours apparaît en une seconde et la première vague démarre sans erreur.","playtest.sample.context.observed":"Protection contre l'apparition maintenue, le HUD mis à jour à temps et la première vague terminée sans régression de gameplay.","playtest.sample.report.markdown":`# Exemple de test de fumée d'arène
|
|
140
|
-
|
|
141
|
-
- Flux d'apparition : PASS
|
|
142
|
-
- Compte à rebours HUD : PASS
|
|
143
|
-
- Bootstrap de vague : PASS
|
|
144
|
-
|
|
145
|
-
Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu en direct et enregistrer de vrais rapports.`,"playtest.sample.report.logs":`[exemple] aperçu du test de démarrage
|
|
146
|
-
[exemple] protection contre l'apparition active
|
|
147
|
-
[exemple] compte à rebours hud rendu
|
|
148
|
-
[exemple] première vague terminée
|
|
149
|
-
[exemple] rapport d'aperçu terminé`,"sidebar.whatsNew":"Quoi de neuf","sidebar.help.group":"Aide et commentaires","sidebar.help.bug":"Signaler un bug","sidebar.help.bug.tooltip":"Créer un bundle de diagnostic local, puis ouvrir un rapport de bug pré-rempli sur GitHub","bugReportDialog.title":"diagnostics.zip peut nous aider à analyser le problème","bugReportDialog.subtitle":"WEPPY a créé un zip de diagnostic sur cet ordinateur. Il contient des logs Studio, plugin, Sync et outils qui peuvent nous aider à comprendre ce qui s’est passé.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Vous pouvez envoyer le rapport sans ce fichier, mais joindre le zip nous aide souvent à trouver la cause plus vite.","bugReportDialog.attachHow":"Pour le joindre, téléchargez ou affichez le zip, puis ajoutez-le au champ Diagnostics ZIP (optional) de l’issue GitHub avant de l’envoyer.","bugReportDialog.download":"1. Télécharger diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Ouvrir l’issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Le zip peut contenir des logs locaux et du contexte de projet. Vérifiez-le avant de le joindre si vous voulez le partager.","sidebar.help.feature":"Suggérer une fonctionnalité","sidebar.help.feature.tooltip":"Suggérer une nouvelle fonctionnalité ou une amélioration sur GitHub","sidebar.help.discussions":"Aide pour l’installation et l’utilisation","sidebar.help.discussions.tooltip":"Demander de l'aide pour l'installation ou l'utilisation via GitHub Issues","sidebar.help.troubleshooting":"Guide de dépannage","sidebar.help.troubleshooting.tooltip":"Ouvrez le guide de dépannage officiel sur weppyai.com","header.whatsNew":"Quoi de neuf","header.whatsNew.tooltip":"Quoi de neuf","upgrade.title":"Voir Pro","upgrade.tagline":"Découvrir les fonctions Pro","upgrade.cta":"Voir Pro","upgrade.licenseShortcut":"Saisir la licence","upgrade.validUntil":"Jusqu'au {{date}}","whatsNew.pageTitle":"Quoi de neuf","whatsNew.pageSubtitle":"Restez informé des modifications apportées à MCP","whatsNew.unreadSection":"Non lu","whatsNew.allSection":"Toutes les annonces","whatsNew.empty":"Aucune annonce pour l'instant","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Libérer","whatsNew.category.notice":"Avis","whatsNew.category.deprecation":"Obsolète","whatsNew.category.tip":"Conseil","uiStudio.title":"UI Studio","uiStudio.empty":"Aucune capture d'écran enregistrée pour l'instant. Ils sont créés automatiquement lorsqu'un agent IA capture l'état actuel de l'interface utilisateur.","uiStudio.loading":"Chargement…","uiStudio.pluginGuide.title":"Le plugin Roblox Studio n'est pas connecté","uiStudio.pluginGuide.message":"UI Studio affiche des captures d'écran et l'historique des modifications à partir du lieu Studio connecté. Il sera mis à jour automatiquement après la connexion de Studio et de WEPPY Plugin.","uiStudio.pluginGuide.check1":"Roblox Studio est-il en cours d'exécution ?","uiStudio.pluginGuide.check2":"Le WEPPY Plugin est-il installé et en cours d'exécution ?","uiStudio.pluginGuide.waiting":"En attente de connexion au plugin...","uiStudio.capturedAt":"Capturé à","uiStudio.scope":"Portée","uiStudio.target":"Cible","uiStudio.briefId":"Brève pièce d'identité","uiStudio.detailClose":"Fermer","uiStudio.colCheck":"Vérifier","uiStudio.colPriority":"Priorité","uiStudio.colCurrent":"Actuel","uiStudio.colRecommended":"Recommandé","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Examinez d'abord","uiStudio.priorityLow":"Amélioration facultative","uiStudio.highPrioritySection":"Examinez d'abord","uiStudio.lowPrioritySection":"Améliorations facultatives","uiStudio.groupSummary":"articles","uiStudio.fixLabel":"Réparer","uiStudio.copyFixCommand":"Copier l'instruction IA","uiStudio.copiedToClipboard":"Copié","uiStudio.fullPath":"Chemin complet","uiStudio.falsePositiveWarning":"Ce groupe peut contenir des faux positifs","uiStudio.noSuggestions":"Aucune suggestion d'amélioration actuelle","uiStudio.sample.badge":"Aperçu du Pro UI Studio","uiStudio.sample.title":"Vous prévisualisez le UI Studio qui se déverrouille après la mise à niveau vers Pro.","uiStudio.sample.message":"Cet aperçu utilise des exemples de données provenant d’une interface utilisateur d’inventaire de démonstration. De vraies captures d'écran, un historique des révisions et des correctifs basés sur l'IA sont déverrouillés avec Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Histoire","uiStudio.analysis.reportsTitle":"Dernière analyse par cible d'interface utilisateur","uiStudio.analysis.recentCapturesTitle":"Captures récentes","uiStudio.analysis.detailDialog":"Détail de l'analyse","uiStudio.analysis.targetCountLabel":"Cibles analysées","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Suggestions d'amélioration","uiStudio.analysis.verdict.needsFix":"Suggestions d'amélioration","uiStudio.analysis.verdict.review":"Suggestions d'amélioration","uiStudio.analysis.verdict.passed":"Aucune suggestion actuelle","uiStudio.analysis.verdictLabel":"Résumé des améliorations","uiStudio.analysis.coverage.structuralOnly":"Vérifications structurelles uniquement terminées","uiStudio.analysis.coverage.visualSkipped":"Vérifications structurelles terminées · Vérification visuelle ignorée","uiStudio.analysis.coverage.visualFailed":"Vérifications structurelles terminées · Échec de la vérification visuelle","uiStudio.analysis.coverage.full":"Vérifications structurelles et visuelles terminées","uiStudio.analysis.coverage.deterministicFailed":"Échec des vérifications structurelles","uiStudio.analysis.thresholds":"Base de révision","uiStudio.analysis.issueSummary.passed":"Aucune suggestion d’amélioration supplémentaire dans le cadre de l’examen actuel.","uiStudio.history.title":"Historique des modifications","uiStudio.history.empty":"Pas d'historique pour l'instant. Lorsqu'un agent IA modifie l'interface utilisateur à l'aide de manage_ui, cela sera automatiquement enregistré.","uiStudio.history.loading":"Chargement...","uiStudio.history.loadingPlace":"Chargement du place actuel...","uiStudio.history.noPlace":"Aucune donnée du place actuel n'est encore disponible. Connectez le WEPPY Plugin et synchronisez un place pour voir l'historique des changements UI.","uiStudio.history.noPlaceAction":"Le place actuel n'est pas encore disponible.","uiStudio.history.error":"Erreur","uiStudio.history.clear":"Clair","uiStudio.history.filter.actions":"Type d'action","uiStudio.history.filter.actionAll":"Tous","uiStudio.history.filter.actionCreate":"Créer","uiStudio.history.filter.actionUpdate":"Mise à jour","uiStudio.history.filter.actionDelete":"Supprimer","uiStudio.history.filter.period":"Période","uiStudio.history.filter.dateAll":"Tous","uiStudio.history.filter.today":"Aujourd'hui","uiStudio.history.filter.yesterday":"Hier","uiStudio.history.filter.last7Days":"7 derniers jours","uiStudio.history.filter.last30Days":"30 derniers jours","uiStudio.history.filter.customRange":"Gamme personnalisée","uiStudio.history.filter.reset":"Réinitialiser","uiStudio.history.filter.from":"Depuis","uiStudio.history.filter.to":"À","uiStudio.history.row.affectedPaths":"Chemins","uiStudio.history.row.mutations":"Modifier les détails","uiStudio.history.row.expand":"▾ Développer","uiStudio.history.row.collapse":"▲ Réduire","uiStudio.history.row.expandDetails":"Afficher les détails de la modification {n}","uiStudio.history.row.collapseDetails":"Masquer les détails des modifications","uiStudio.history.row.toggleDetails":"Toggle modifier les détails","uiStudio.history.row.mutationsEmpty":"Aucun détail de changement","uiStudio.history.row.toolLabel":"Modifications de l'interface utilisateur ({n})","uiStudio.history.row.compare":"Avant/Après","uiStudio.history.row.noBeforeState":"Non avant l'état","uiStudio.history.row.noAfterState":"Non après l'état","uiStudio.history.row.qualityPlan":"Direction de la conception","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: indisponible","uiStudio.history.row.designCheckNone":"Suggestions : aucune","uiStudio.history.selection.deleteSelected":"Supprimer la sélection","uiStudio.history.selection.selectAll":"Sélectionner tout","uiStudio.history.selection.clearSelection":"Effacer la sélection","uiStudio.history.confirm.deleteRequestsTitle":"Supprimer les enregistrements de modifications","uiStudio.history.confirm.deleteRequestsMessage":"Les enregistrements de modifications sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.history.confirm.clearRequestsTitle":"Effacer l'historique des modifications","uiStudio.history.confirm.clearRequestsMessage":"Cela efface l’historique actuel des changements de lieu. Les instances Studio ne sont pas affectées.","uiStudio.history.confirm.cascadeOption":"Supprimez également les captures d'écran liées","uiStudio.history.drawer.close":"Fermer","uiStudio.actions.previewAgain":"Aperçu à nouveau","uiStudio.actions.deleteSnapshot":"Supprimer cette capture d'écran","uiStudio.actions.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.actions.captureCurrentState":"Capturer l'état actuel","uiStudio.actions.checkSuggestionsAgain":"Revérifiez les suggestions","uiStudio.actions.previewRunning":"Capturer…","uiStudio.actions.previewRunningDetail":"Le nouvel ID de fichier de capture d'écran apparaîtra une fois la capture terminée.","uiStudio.actions.previewNeedsSaveCheck":"Capture terminée, la sauvegarde doit être révisée","uiStudio.actions.previewSaved":"Nouvelle capture d'écran enregistrée","uiStudio.actions.previewComplete":"Capture terminée","uiStudio.actions.previewSavedDetail":"Les captures d'écran existantes sont conservées ; cela a été enregistré en tant que nouveau fichier.","uiStudio.actions.previewSavedPathMissing":"Un nouvel ID de capture d'écran a été renvoyé, mais le chemin du fichier enregistré n'a pas pu être confirmé.","uiStudio.actions.previewSnapshotIdMissing":"Le nouvel ID de capture d'écran n'a pas pu être confirmé. Actualisez la liste pour vérifier si elle a été enregistrée.","uiStudio.actions.more":"Plus","uiStudio.gallery.selection.selectedCount":"choisi","uiStudio.confirm.deleteSnapshotTitle":"Supprimer la capture d'écran","uiStudio.confirm.deleteSnapshotMessage":"Seul ce fichier de capture d'écran sera supprimé (l'instance Studio est conservée).","uiStudio.confirm.deleteBatchTitle":"Supprimer les captures d'écran sélectionnées","uiStudio.confirm.deleteBatchMessage":"Les captures d'écran sélectionnées seront supprimées. Cette action ne peut pas être annulée.","uiStudio.gallery.selectMode":"Sélectionner","uiStudio.gallery.exitSelectMode":"Annuler","uiStudio.gallery.selectAll":"Sélectionner tout","uiStudio.gallery.clearSelection":"Effacer la sélection","uiStudio.gallery.deleteSelected":"Supprimer la sélection","common.save":"Enregistrer","common.cancel":"Annuler","common.delete":"Supprimer","uiStudio.storage.title":"UI Studio Données enregistrées","uiStudio.storage.usageLabel":"Utilisé","uiStudio.storage.historyBytes":"Changer l'historique","uiStudio.storage.snapshotBytes":"Captures d'écran","uiStudio.storage.requestCount":"Modifier les enregistrements","uiStudio.storage.mutationCount":"Modifier les détails","uiStudio.storage.snapshotCount":"Captures d'écran","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Dernier nettoyage automatique","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"libéré","uiStudio.storage.lastRunErrors":"Erreurs","uiStudio.storage.loading":"Chargement...","uiStudio.cleanup.policy.title":"Politique de suppression automatique","uiStudio.cleanup.policy.modeOff":"Désactivé","uiStudio.cleanup.policy.modeAge":"Basé sur l'âge","uiStudio.cleanup.policy.modeSize":"Basé sur la taille","uiStudio.cleanup.policy.cascade":"Supprimez également les captures d'écran liées","uiStudio.cleanup.policy.save":"Enregistrer la politique","uiStudio.cleanup.policy.runNow":"Exécuter la règle enregistrée","uiStudio.cleanup.policy.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmer la politique","uiStudio.cleanup.policy.confirm.messageStrict":"L'application de cette politique entraînera la suppression immédiate","uiStudio.cleanup.policy.confirm.requests":"modifier les enregistrements","uiStudio.cleanup.policy.confirm.snapshots":"captures d'écran","uiStudio.cleanup.policy.confirm.freed":"libéré — Postuler ?","uiStudio.cleanup.keepLastNDays":"Conserver les {n} derniers jours","uiStudio.cleanup.selectedDelete":"Supprimer la sélection…","uiStudio.cleanup.deleteAll":"Supprimer tout…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmer le nettoyage","uiStudio.cleanup.cleanupConfirmMessage":"Tous les éléments sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Les enregistrements de modifications et les captures d'écran datant de plus de 7 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Les enregistrements de modifications et les captures d'écran datant de plus de 30 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.all":"Les enregistrements de modifications enregistrées et les captures d'écran seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.label":"Nettoyage manuel","uiStudio.cleanup.studioPreservedNote":"Cela supprime uniquement les enregistrements de modifications enregistrées et les captures d'écran sur le disque ; Les instances Roblox Studio ne sont pas affectées.","uiStudio.history.sample.bannerBadge":"Aperçu de l'historique des modifications Pro","uiStudio.history.sample.bannerTitle":"Vous prévisualisez l'historique des modifications de l'interface utilisateur qui se déverrouille après la mise à niveau vers Pro.","uiStudio.history.sample.bannerMessage":"Cet aperçu utilise des exemples de données. Historique réel des modifications, comparaison avant/après et déverrouillage de suppression par lots avec Pro.","uiStudio.fix.touchTarget.label":"Taille de la cible tactile","uiStudio.fix.touchTarget.description":"Vérifie si les commandes sont suffisamment grandes pour appuyer confortablement sur mobile.","uiStudio.fix.touchTarget.howToFix":"Augmentez la taille du bouton à au moins 44 x 44 px ou agrandissez la zone tactile avec UIPadding.","uiStudio.fix.contrast.label":"Contraste du texte","uiStudio.fix.contrast.description":"Vérifie si le contraste du texte et de l’arrière-plan respecte les directives d’accessibilité.","uiStudio.fix.contrast.howToFix":"Utilisez un TextColor3 plus clair ou assombrissez le BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Les icônes Emoji peuvent être des faux positifs lorsque leur couleur est corrigée.","uiStudio.fix.textScaled.label":"Utilisation à l'échelle du texte","uiStudio.fix.textScaled.description":"TextScaled sans UITextSizeConstraint peut interrompre les mises en page lorsque le texte se développe.","uiStudio.fix.textScaled.howToFix":"Ajoutez un enfant UITextSizeConstraint au TextLabel et définissez MaxTextSize.","uiStudio.fix.safezone.label":"Placement en zone de sécurité","uiStudio.fix.safezone.description":"Vérifie si les contrôles restent à l’intérieur des zones de sécurité de la plate-forme.","uiStudio.fix.safezone.howToFix":"Déplacez la position à l’intérieur de la zone de sécurité ou réduisez le cadre parent.","uiStudio.fix.minTextSize.label":"Taille de police minimale","uiStudio.fix.minTextSize.description":"Vérifie si le texte est trop petit pour être lu confortablement.","uiStudio.fix.minTextSize.howToFix":"Augmentez TextSize à au moins 14 pour le corps du texte.","uiStudio.sample.history.request1.label":"Création initiale de la disposition du HUD","uiStudio.sample.history.request2.label":"Mise à jour de la conception modale de l'inventaire","uiStudio.sample.history.request3.label":"Mise à jour des couleurs du HUD HealthBar","uiStudio.sample.history.request4.label":"Cibles tactiles du bouton de l'onglet Développer l'inventaire","uiStudio.sample.history.request5.label":"Fenêtre contextuelle Supprimer les paramètres","uiStudio.sample.history.request6.label":"Ajouter un composant de mini-carte HUD","uiStudio.sample.history.request1.mutation1.diff":"Cadre créé + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Définir le point d'ancrage, la position et la taille","uiStudio.sample.history.request1.mutation5.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 pour un meilleur contraste","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, définissez BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (ton rouge)","uiStudio.sample.history.request3.mutation2.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request4.mutation1.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui supprimé (interface utilisateur réservée aux paramètres uniquement)","uiStudio.sample.history.request6.mutation1.diff":"Tentative de création de Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Définir la taille, la position et la transparence de l'arrière-plan","uiStudio.sample.history.request6.mutation3.diff":"Interrompu par le redémarrage du serveur lors de la configuration d'ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Capture d'écran partielle enregistrée","uiStudio.sample.history.request6.mutation3.error":"server_restart : connexion perdue","uiStudio.sample.history.request6.mutation4.error":"capture d'écran partielle : couches manquantes","uiStudio.sample.history.detail.backgroundColor":"Couleur de fond","uiStudio.sample.history.detail.anchorPoint":"Ancre","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Taille","uiStudio.sample.history.detail.textColor":"Couleur du texte","uiStudio.sample.history.detail.textSize":"Taille du texte","uiStudio.sample.history.detail.borderSize":"Taille de la bordure","uiStudio.sample.history.detail.borderColor":"Couleur de la bordure","settings.dataHistory.title":"Données et historique","settings.dataHistory.title.tooltip":"Gérez les données enregistrées du tableau de bord en un seul endroit.","settings.dataHistory.collapse":"Réduire {title}","settings.dataHistory.expand":"Développez {title}","settings.dataHistory.scope":"Projet actuel","settings.dataHistory.scope.tooltip":"Des actions claires s’appliquent au projet en cours et au lieu actif le cas échéant.","settings.dataHistory.intro":"Consultez les données enregistrées du tableau de bord, ouvrez la page associée ou effacez les enregistrements stockés à partir d'un seul endroit.","settings.dataHistory.toolsActivity.title":"Activité de l'outil","settings.dataHistory.toolsActivity.description":"Exécutions d'outils enregistrées affichées sur la page Outils.","settings.dataHistory.toolStats.title":"Statistiques d'utilisation des outils","settings.dataHistory.toolStats.description":"Nombre d’outils agrégés et totaux d’état.","settings.dataHistory.syncLog.title":"Journal de synchronisation","settings.dataHistory.syncLog.description":"Événements de synchronisation de fichiers enregistrés pour le lieu actif.","settings.dataHistory.playtest.title":"Rapports de tests de jeu","settings.dataHistory.playtest.description":"Rapports et journaux de tests de jeu automatisés enregistrés.","settings.dataHistory.projectChanges.title":"Prorésumé des modifications du projet","settings.dataHistory.projectChanges.description":"Résumés enregistrés des modifications du projet.","settings.dataHistory.projectChanges.clear.title":"Clear project change summaries?","settings.dataHistory.projectChanges.clear.message":"This deletes completed sessions and ended context history for the selected Place. Active work and Roblox Studio project data stay intact.","settings.dataHistory.projectChanges.clear.success":"Project change summaries cleared.","settings.projectChanges.cleanup.noPlace":"Select a Place to manage saved project changes.","settings.projectChanges.cleanup.loading":"Loading storage settings…","settings.projectChanges.cleanup.loadFailed":"Could not load storage settings.","settings.projectChanges.cleanup.title":"Storage management","settings.projectChanges.cleanup.title.tooltip":"Set how much Project Change Summary history each Place can keep.","settings.projectChanges.cleanup.scope":"One setting applies the selected limit separately to every Place.","settings.projectChanges.cleanup.usageAria":"Place storage usage","settings.projectChanges.cleanup.usageUnlimited":"{used} used · Unlimited","settings.projectChanges.cleanup.usageLimited":"{used} used of {limit}","settings.projectChanges.cleanup.sessions":"Sessions","settings.projectChanges.cleanup.contexts":"Contexts","settings.projectChanges.cleanup.limit":"Limit per Place","settings.projectChanges.cleanup.preset":"{sizeMb}MB","settings.projectChanges.cleanup.unlimited":"Unlimited","settings.projectChanges.cleanup.runNow":"Exécuter la règle enregistrée","settings.projectChanges.cleanup.saved":"Saved","settings.projectChanges.cleanup.protectedWarning":"Active changes are protected, so this Place may stay over the limit.","settings.projectChanges.cleanup.lastRun":"Last cleanup","settings.projectChanges.cleanup.lastRunSummary":"{sessions} sessions · {bytes} freed","settings.projectChanges.cleanup.neverRun":"Not run yet","settings.projectChanges.cleanup.actionFailed":"Could not update storage settings.","settings.projectChanges.cleanup.confirm.title":"Apply this limit and clean saved changes?","settings.projectChanges.cleanup.confirm.message":"{places} Places · {sessions} sessions · {bytes} expected to be freed.","settings.projectChanges.cleanup.confirm.protected":"{places} Place may remain over the limit because active data is protected.","settings.projectChanges.cleanup.confirm.apply":"Apply and clean","settings.dataHistory.connectionLog.title":"Journal de connexion","settings.dataHistory.connectionLog.description":"Enregistrement des événements de connexion MCP et Studio.","settings.dataHistory.uiStudio.title":"Historique et captures d'écran de UI Studio","settings.dataHistory.uiStudio.tooltip":"Gérez les enregistrements de modifications UI Studio enregistrés, les captures d'écran et la politique de suppression automatique.","settings.dataHistory.uiStudio.description":"Enregistrements de modifications, captures d'écran et politique de nettoyage UI Studio enregistrés.","settings.dataHistory.uiStudio.clear.title":"Effacer les données enregistrées UI Studio ?","settings.dataHistory.uiStudio.clear.message":"Cela supprime uniquement les enregistrements de modifications et les captures d'écran UI Studio enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.uiStudio.clear.success":"Les données enregistrées par UI Studio ont été effacées.","settings.dataHistory.uiStudio.clear.failed":"Échec de la suppression des données enregistrées UI Studio.","settings.dataHistory.metric.unavailable":"Indisponible","settings.dataHistory.metric.sizeUnavailable":"taille indisponible","settings.dataHistory.metric.records":"enregistrements","settings.dataHistory.metric.runs":"court","settings.dataHistory.metric.sessions":"séances","settings.dataHistory.metric.reports":"rapports","settings.dataHistory.open":"Ouvrir","settings.dataHistory.clearAll":"Tout effacer","settings.dataHistory.clear.title":"Effacer les données enregistrées ?","settings.dataHistory.clear.message":"Cela supprime uniquement les enregistrements de tableau de bord enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.clear.success":"Données enregistrées effacées.","settings.dataHistory.clear.failed":"Échec de la suppression des données enregistrées.","uiStudio.history.sample.tooltip":"Passez à Pro pour débloquer l'historique complet","toast.serverConnected":"Serveur MCP connecté","toast.serverDisconnected":"Serveur MCP déconnecté","toast.pluginConnected":"Plugin connecté","toast.pluginDisconnected":"Plugin déconnecté","toast.clearSuccess":"Effacé avec succès","toast.clearFailed":"Échec de la suppression des données","common.clear":"Clair","settings.license.activate":"Activer la licence","settings.license.refresh":"Actualiser la licence","settings.license.keyInput":"Clé de licence","settings.license.disconnected":"Déconnecté","settings.license.disconnected.tooltip":"Reconnectez-vous au serveur MCP pour gérer les actions de licence à partir de WEPPY Dashboard.","settings.license.live.tooltip":"Les actions de licence sont immédiatement envoyées au serveur MCP.","settings.license.status.activationRequired":"Activation requise","settings.license.status.activationRequired.tooltip":"L'activation manuelle de la licence est requise avant que WEPPY Dashboard puisse actualiser ce statut.","settings.license.status.grace":"Grâce","settings.license.status.grace.tooltip":"La vérification Provider est temporairement indisponible, mais l'accès Pro reste actif pendant la période de grâce.","settings.license.status.graceBilling.tooltip":"L'accès Pro est toujours disponible pendant une période de grâce liée à la facturation.","settings.license.detail.graceBilling":"L'accès Pro reste disponible pendant une période de grâce de facturation.","settings.license.detail.graceProviderUnavailable":"Provider indisponible. L'accès Pro reste actif pendant le mode grâce.","settings.license.detail.manualActivation":"Activation manuelle requise pour restaurer l'accès à Pro.","settings.license.detail.missingSessionToken":"L'actualisation est bloquée car le jeton de session en cours est manquant.","settings.license.detail.refreshRecommended":"La vérification des licences devrait être actualisée prochainement.","connection.agents.kill":"Tuer","connection.agents.kill.title":"Tuer l'agent ?","connection.agents.killed":"Agent tué","connection.agents.killFailed":"Impossible de tuer l'agent","connection.agents.lastCommand":"Dernière commande","connection.agents.lastCommand.tooltip":"Appel d'outil le plus récent exécuté par cet agent","connection.agents.lastSeen":"Vu pour la dernière fois","connection.agents.lastSeen.tooltip":"Battement de cœur ou activité la plus récente de cet agent","connection.clear.title":"Effacer le journal de connexion ?","connection.clear.message":"Cela supprime définitivement le journal de connexion stocké pour le projet en cours.","sync.clear.title":"Effacer le journal de synchronisation ?","sync.clear.message":"Cela supprime définitivement le journal de synchronisation stocké pour le lieu actuel.","playtest.clear.title":"Effacer l'historique des tests ?","playtest.clear.message":"Cela supprime définitivement les rapports de test de jeu stockés pour le lieu actuel.","changelog.clear.title":"Effacer le journal des modifications ?","changelog.clear.message":"Cela supprime définitivement le journal des modifications stocké pour le lieu actuel.","sync.status.placePath":"Placer le chemin","sync.status.placePath.tooltip":"Répertoire de lieu actif où les fichiers de l'explorateur sont synchronisés.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Zone représentative","changelog.card.verification":"Vérification","uiStudio.tabs.analysis.tooltip":"Parcourez les écrans d’interface utilisateur capturés par l’IA et trouvez rapidement quelles interfaces utilisateur doivent être améliorées.","uiStudio.tabs.history.tooltip":"Chaque changement d'interface utilisateur effectué par l'IA, dans l'ordre. Comparez les écrans avant et après.","uiStudio.title.tooltip":"Un endroit central pour examiner les écrans d’interface utilisateur générés par l’IA et les suggestions d’amélioration.","uiStudio.analysis.reportsTitle.tooltip":"Affiche le dernier résumé de capture et de suggestion par interface utilisateur (par exemple, fenêtre d'inventaire, menu principal).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Certaines améliorations ont été trouvées dans cette interface utilisateur. Cliquez sur la carte pour plus de détails.","uiStudio.analysis.verdict.passed.tooltip":"Aucune amélioration suggérée en vertu des seuils d'examen actuels.","uiStudio.analysis.counts.tooltip":"« Principal » sont les éléments clés à examiner en premier ; Les « notes » sont des raffinements agréables à avoir.","uiStudio.analysis.thresholds.tooltip":"Ensemble de seuils utilisé pour cet examen (par défaut ou personnalisé).","uiStudio.analysis.recentCapturesTitle.tooltip":"Toutes les captures récemment enregistrées par ordre chronologique.","uiStudio.gallery.selectAll.tooltip":"Sélectionnez toutes les captures visibles à la fois.","uiStudio.gallery.clearSelection.tooltip":"Effacez la sélection actuelle.","uiStudio.gallery.deleteSelected.tooltip":"Supprimez uniquement les fichiers de capture sélectionnés. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.gallery.cardCheckbox.tooltip":"Sélectionnez cette capture. Choisissez-en plusieurs pour les supprimer ensemble.","uiStudio.detailClose.tooltip":"Fermez ce panneau de détails.","uiStudio.actions.captureCurrentState.tooltip":"Enregistrez l'interface utilisateur actuellement affichée dans Studio en tant que nouvelle capture. Les captures existantes sont conservées.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recalculez les suggestions pour cette capture sans prendre une nouvelle capture d'écran.","uiStudio.actions.more.tooltip":"Ouvrez des actions supplémentaires.","uiStudio.actions.deleteSnapshot.tooltip":"Supprimez uniquement ce fichier de capture. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.capturedAt.tooltip":"Quand cet écran a été capturé.","uiStudio.scope.tooltip":"Portée de capture (plein écran ou interface utilisateur spécifique).","uiStudio.target.tooltip":"Chemin exact de l’instance d’interface utilisateur capturée.","uiStudio.briefId.tooltip":"Identifiant du cahier des charges qui a produit cette interface utilisateur.","uiStudio.analysis.verdictLabel.tooltip":"Verdict d'amélioration globale pour cette capture.","uiStudio.suggestionGroup.tooltip":"Suggestions du même genre regroupées. Cliquez pour agrandir ou réduire.","uiStudio.groupSummary.tooltip":"Nombre d'éléments d'interface utilisateur correspondant à ce groupe.","uiStudio.colCurrent.tooltip":"La valeur actuellement appliquée.","uiStudio.colRecommended.tooltip":"La valeur recommandée.","uiStudio.copyFixCommand.tooltip":"Copiez une invite demandant à l'IA de résoudre ce problème.","uiStudio.falsePositiveWarning.tooltip":"Cette vérification peut produire des faux positifs – vérifiez avant de postuler.","uiStudio.history.filter.actions.tooltip":"Filtrez les enregistrements en fonction du type de modification apportée par l'IA.","uiStudio.history.filter.period.tooltip":"Filtrer les enregistrements par plage horaire.","uiStudio.history.filter.from.tooltip":"Date de début de la requête.","uiStudio.history.filter.to.tooltip":"Date de fin de la requête.","uiStudio.history.filter.actionAll.tooltip":"Montrez tout type d'action.","uiStudio.history.filter.actionCreate.tooltip":"Afficher uniquement les actions qui ont créé une nouvelle interface utilisateur.","uiStudio.history.filter.actionUpdate.tooltip":"Afficher uniquement les actions qui ont mis à jour une interface utilisateur existante.","uiStudio.history.filter.actionDelete.tooltip":"Afficher uniquement les actions qui ont supprimé une interface utilisateur.","uiStudio.history.filter.dateAll.tooltip":"Afficher l'historique complet.","uiStudio.history.filter.today.tooltip":"Afficher uniquement les modifications apportées à aujourd'hui.","uiStudio.history.filter.yesterday.tooltip":"Afficher uniquement les modifications d'hier.","uiStudio.history.filter.last7Days.tooltip":"Afficher les modifications des 7 derniers jours.","uiStudio.history.filter.last30Days.tooltip":"Afficher les modifications des 30 derniers jours.","uiStudio.history.filter.customRange.tooltip":"Choisissez une date de début et de fin personnalisée.","uiStudio.history.filter.reset.tooltip":"Réinitialisez tous les filtres aux valeurs par défaut.","uiStudio.history.title.tooltip":"Une chronologie de chaque modification de l'interface utilisateur effectuée par l'IA.","uiStudio.history.clear.tooltip":"Supprimez tous les enregistrements de modifications pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.history.row.compare.tooltip":"Comparez les écrans avant et après. Cliquez pour ouvrir la vue de comparaison complète.","uiStudio.history.row.extraPaths.tooltip":"Nombre d'interfaces utilisateur supplémentaires modifiées dans cette action.","uiStudio.history.row.noBeforeState.tooltip":"Aucune capture enregistrée avant ce changement.","uiStudio.history.row.noAfterState.tooltip":"Aucune capture enregistrée après ce changement.","uiStudio.history.row.affectedPaths.tooltip":"Nombre d'interfaces utilisateur affectées par cette action.","uiStudio.history.row.mutations.tooltip":"Nombre de modifications détaillées (par exemple, modifications de propriétés).","uiStudio.history.row.qualityPlan.tooltip":"Brève direction de conception utilisée pour ce changement.","uiStudio.history.row.designCheck.tooltip":"Résumé des suggestions de contrôle de conception après modification.","uiStudio.history.row.toggleDetails.tooltip":"Afficher ou masquer une ventilation par ligne de ce qui a changé.","uiStudio.compare.before.tooltip":"L'écran a été enregistré juste avant que l'IA n'effectue la modification.","uiStudio.compare.after.tooltip":"L'écran a été enregistré juste après que l'IA ait effectué la modification.","uiStudio.compare.path.tooltip":"Chemin d'accès à l'instance d'interface utilisateur pour cet écran.","uiStudio.storage.title.tooltip":"Utilisation du disque des enregistrements de modifications et des captures d'écran de UI Studio.","uiStudio.storage.usageLabel.tooltip":"Espace disque actuellement utilisé par UI Studio pour ce projet.","uiStudio.storage.historyBytes.tooltip":"Espace occupé par les données d'enregistrement de modification (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Espace occupé par les fichiers image PNG capturés.","uiStudio.storage.requestCount.tooltip":"Nombre d'actions où l'IA a modifié l'interface utilisateur.","uiStudio.storage.mutationCount.tooltip":"Nombre de modifications détaillées dans les actions (une modification de propriété = 1).","uiStudio.storage.snapshotCount.tooltip":"Nombre de fichiers d'images de capture enregistrés.","uiStudio.storage.lastRun.tooltip":"Quand la stratégie de nettoyage automatique a été exécutée pour la dernière fois et ce qu’elle a supprimé.","uiStudio.cleanup.label.tooltip":"Nettoyez manuellement les enregistrements et les captures de modifications quand vous le souhaitez.","uiStudio.cleanup.keep7.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 7 jours.","uiStudio.cleanup.keep30.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 30 jours.","uiStudio.cleanup.deleteAll.tooltip":"Supprimez chaque enregistrement de modification et capture pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.cleanup.policy.title.tooltip":"Règles qui suppriment automatiquement les captures anciennes ou volumineuses.","uiStudio.cleanup.policy.modeOff.tooltip":"Désactivez le nettoyage automatique. Les données restent jusqu'à ce que vous les supprimiez manuellement.","uiStudio.cleanup.policy.modeAge.tooltip":"Supprimez automatiquement les données antérieures au nombre de jours configuré.","uiStudio.cleanup.policy.modeSize.tooltip":"Lorsque l'utilisation totale dépasse la limite, les données les plus anciennes sont supprimées en premier.","uiStudio.cleanup.policy.agePreset.tooltip":"Supprimez les données datant de plus de plusieurs jours.","uiStudio.cleanup.policy.ageInput.tooltip":"Entrez n'importe quelle valeur comprise entre 1 et 365 jours.","uiStudio.cleanup.policy.sizePreset.tooltip":"Gardez l’utilisation totale en dessous de cette taille.","uiStudio.cleanup.policy.sizeInput.tooltip":"Saisissez n'importe quelle valeur comprise entre 50 Mo et 10 000 Mo (10 Go).","uiStudio.cleanup.policy.cascade.tooltip":"Supprimez également les images de capture liées à ces enregistrements. Si cette option est désactivée, les images restent.","uiStudio.cleanup.policy.save.tooltip":"Enregistrez la règle de nettoyage actuelle. Il fonctionne désormais en arrière-plan.","uiStudio.cleanup.policy.runNow.tooltip":"Exécutez maintenant une fois la règle de nettoyage enregistrée, sans attendre la prochaine exécution planifiée.","settings.license.refresh.tooltip":"Récupérez à nouveau l'état actuel à partir du serveur de licences. Utile lorsqu'un changement de facturation n'est pas encore apparu.","settings.license.reset.tooltip":"Supprimez la clé de licence actuellement enregistrée. Utilisez-le avant d'activer avec une clé différente.","settings.license.activate.tooltip":"Activez les fonctionnalités Pro avec la clé de licence saisie.","tier.upgrade.tooltip":"Voir les fonctions Pro et les options d’achat.","settings.language.auto.tooltip":"Suivez la langue du système d'exploitation. Revient à l'anglais lorsqu'il n'est pas pris en charge.","settings.dataHistory.open.tooltip":"Ouvrez la page qui montre cet élément en détail.","settings.dataHistory.clear.tooltip":"Supprimez uniquement les enregistrements enregistrés pour cet élément. Les données Roblox Studio ne sont pas modifiées.","settings.dataHistory.toggle.tooltip":"Réduisez ou développez cette section.","settings.dataHistory.manageStorage":"Gérer le stockage","settings.dataHistory.manageStorage.tooltip":"Afficher ou masquer la politique de stockage et les options de nettoyage.","settings.dataHistory.manageStorage.projectChanges.aria":"Gérer le stockage du résumé des modifications du projet","settings.dataHistory.manageStorage.uiStudio.aria":"Gérer le stockage de l’historique et des captures d’écran UI Studio","settings.dataHistory.toolsActivity.metric.tooltip":"Nombre d'exécutions d'outils enregistrées et espace disque qu'elles utilisent.","settings.dataHistory.toolStats.metric.tooltip":"Nombre total d'exécutions et de sessions agrégées.","settings.dataHistory.syncLog.metric.tooltip":"Nombre d'événements de synchronisation enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.playtestReports.metric.tooltip":"Nombre de rapports de tests de jeu enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.projectChanges.metric.tooltip":"Nombre de résumés de modifications de projet enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.connectionLog.metric.tooltip":"Nombre d'événements de connexion enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio modifie le nombre d'enregistrements et de captures, ainsi que l'utilisation totale du disque.","uiStudio.designCheckResultsTitle":"Suggestions de contrôle de conception","uiStudio.designCheckResultsTitle.tooltip":"Toutes les suggestions d'amélioration trouvées dans cette capture.","uiStudio.actions.designCheckAgain":"Revérifier","uiStudio.actions.designCheckRunning":"Vérification des suggestions...","uiStudio.actions.designCheckRunningDetail":"Les décomptes d’articles examinés en premier, recommandés et facultatifs apparaîtront une fois la vérification terminée.","uiStudio.actions.designCheckComplete":"Vérification des suggestions terminée","uiStudio.actions.designCheckNoSnapshotSaved":"Cette action n'enregistre pas un nouveau fichier de capture d'écran.","uiStudio.sample.designCheck.contrast":"Le contraste du texte est inférieur à {expected} (actuel {actual}). Ajustez TextColor3 ou BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"La cible tactile est inférieure à {expected} (actuel {actual}). Augmentez la taille ou le rembourrage.","uiStudio.sample.designCheck.minTextSize":"TextSize est inférieur à {expected} (actuel {actual}). Augmentez-le pour plus de lisibilité.","uiStudio.gallery.priorityHighBadge.tooltip":"Nombre de suggestions à examiner en premier. Cliquez pour plus de détails.","uiStudio.gallery.priorityMediumBadge.tooltip":"Nombre de suggestions recommandées.","uiStudio.priorityMedium":"Examen recommandé","uiStudio.mediumPrioritySection":"Examen recommandé","uiStudio.gallery.priorityLowBadge.tooltip":"Nombre d'améliorations facultatives.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erreur","uiStudio.analysis.expandChildren":"Afficher les cibles enfants","uiStudio.analysis.openDetail":"Détail ouvert","uiStudio.analysis.childTargets":"Enfants cibles","uiStudio.analysis.childDetailHint":"Ouvrir les détails de la cible enfant","uiStudio.compare.before":"Avant","uiStudio.compare.after":"Après","uiStudio.history.drawer.changeDetails":"Modifier les détails","uiStudio.gallery.cardCheckbox":"Sélectionnez une capture d'écran","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.scope.all":"Toutes les portées","assets.explorer.label":"Explorateur de ressources","assets.breadcrumb.label":"Chemin de la ressource","assets.explorer.summary":"{direct} dans ce dossier · {descendant} dans les sous-dossiers","assets.folder.count.one":"1 ressource","assets.folder.count.many":"{count} ressources","assets.folder.type":"Dossier","assets.folders.title":"Dossiers","assets.folder.assetsTitle":"Ressources dans ce dossier","assets.organization.label":"Parcourir","assets.organization.folders":"Dossiers","assets.organization.all":"Toutes les ressources","assets.organization.summary":"{count} ressources","assets.view.options":"Options d’affichage","assets.view.mode":"Mode d’affichage","assets.view.grid":"Grille","assets.view.list":"Liste","assets.view.thumbnailSize":"Taille des miniatures","assets.view.thumbnailSize.listReason":"La taille des miniatures est disponible en vue Grille.","assets.view.size.small":"Petite","assets.view.size.medium":"Moyenne","assets.view.size.large":"Grande","assets.list.name":"Nom","assets.list.type":"Type","assets.list.scope":"Portée","assets.list.status":"Statut","assets.list.updated":"Mis à jour","assets.loading.scope":"Chargement des ressources de {scope}...","assets.partial.title":"Certains emplacements n’ont pas pu être chargés","assets.empty.folderTitle":"Aucune ressource correspondante dans ce dossier","assets.empty.folderBody":"Essayez un autre dossier ou filtre de catégorie.","assets.empty.filteredTitle":"Aucune ressource ne correspond à ce filtre","assets.empty.filteredBody":"Choisissez une autre catégorie ou analysez à nouveau les dossiers correspondants.","assets.place.selector":"Asset place","assets.place.context":"Contexte du lieu de la ressource","assets.place.sharedLibrary":"Bibliothèque partagée","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.howItWorks":"Fonctionnement","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Consultez le WEPPY Bridge partagé, le MCP Adapter de chaque agent IA, les cibles Studio et le journal des connexions.","dashboardHelp.connection.needs.1":"WEPPY Bridge doit être accessible. Les cibles Studio apparaissent lorsque WEPPY Plugin envoie des signaux d'activité.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Consultez les preuves Playtest structurées des résultats d’interface, d’entrée et de serveur enregistrés par l’AI Agent.","dashboardHelp.playtest.needs.1":"Pro affiche les rapports réellement enregistrés. Basic affiche un exemple. Les captures d’écran en mode Play ne sont pas disponibles, mais les preuves d’interface sémantique et d’interaction le restent. WEPPY Plugin doit être connecté pour identifier précisément le Place actif.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fermer","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"Si une cible Studio manque, ouvrez Roblox Studio et lancez WEPPY Plugin. Si un agent IA ou MCP Adapter manque, reconnectez WEPPY MCP Server depuis votre outil d'IA.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Consultez l'état du WEPPY Bridge partagé, des MCP Adapter de chaque agent IA, des cibles Studio et des journaux de connexion.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Routage de Studio","controls.studioRouting.title.tooltip":"Priorité des requêtes MCP qui n’indiquent aucun Studio.","controls.studioRouting.settingLabel":"Requêtes sans Studio indiqué","controls.studioRouting.mode.auto":"Automatique","controls.studioRouting.mode.pinned":"Studio fixe","controls.studioRouting.state.auto":"État actuel : automatique","controls.studioRouting.state.pinned":"État actuel : Studio fixe","controls.studioRouting.saving":"Application…","controls.studioRouting.applied":"Appliqué","controls.studioRouting.failed":"Échec de l’application","controls.studioRouting.pinnedUnavailable":"Connectez un Studio pour utiliser le mode Studio fixe.","controls.studioRouting.helpLabel":"Fonctionnement du routage de Studio","controls.studioRouting.helpButton":"Comment ça marche ?","controls.studioRouting.selectTarget":"Sélectionner le Studio fixe","controls.studioRouting.select":"Sélectionner","controls.studioRouting.targetGroupLabel":"Cible du Studio fixe","controls.luauValidation.title":"Vérification de la syntaxe Luau","controls.luauValidation.settingLabel":"Vérifier automatiquement après modification des Scripts","controls.luauValidation.benefit":"Après une modification de Script par l’IA, recherchez les erreurs de syntaxe Luau.","controls.luauValidation.state.on":"État actuel : activée","controls.luauValidation.state.off":"État actuel : désactivée","controls.luauValidation.priority":"Si une demande de l’IA diffère de cette option, le réglage du Dashboard est utilisé. Activez ou désactivez ici pour modifier la vérification des Scripts.","controls.luauValidation.switchLabel":"Vérification automatique après modification des Scripts","controls.luauValidation.saving":"Enregistrement…","controls.luauValidation.applied":"Appliqué","controls.luauValidation.failed":"Échec de l’application","controls.luauValidation.helpLabel":"Fonctionnement de la vérification automatique de syntaxe Luau","controls.luauValidation.helpButton":"Comment ça marche ?","controls.luauValidation.help.behavior":"Lorsque l’option est activée, après que l’IA a remplacé, modifié, inséré ou supprimé des lignes de Script, WEPPY vérifie tout le code réellement enregistré. Lorsqu’elle est désactivée, seul le Script est modifié.","controls.luauValidation.help.response":"Si le Script est correct, la réponse de fin habituelle reste courte. WEPPY affiche des détails uniquement lorsqu’une erreur est trouvée ou que la vérification ne peut pas être terminée. Les Scripts volumineux peuvent prendre un peu plus de temps.","controls.luauValidation.help.nonBlocking":"Si WEPPY détecte une erreur de syntaxe ou ne peut pas terminer la vérification, la modification enregistrée du Script n’est pas annulée. Le résultat aide l’IA à corriger immédiatement le même Script.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"Plusieurs fenêtres Studio connectées ont le même Place ID. Utilisez le Studio ID pour désigner cet endroit.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Les requêtes avec Studio ID, Connection ID ou Place ID ignorent cette priorité et sont envoyées au Studio indiqué.","controls.studioRouting.state.currentTarget":"Cible prioritaire actuelle","controls.studioRouting.noPriorityTarget":"Aucun Studio connecté","controls.studioRouting.help.auto":"Automatique utilise le Studio actif le plus prioritaire selon les commandes récentes et l’ordre de connexion.","controls.studioRouting.help.pinned":"Studio fixe utilise le Studio sélectionné lorsque la requête n’indique aucun identifiant de cible.","sync.migration.title":"Mise à jour du format Sync disponible","sync.migration.description":"Vérifiez les changements de métadonnées avant de faire passer ce Place du format Sync v2 au v3.","sync.migration.status.ready":"Prêt à vérifier","sync.migration.status.blocked":"Bloqué","sync.migration.preview":"Vérifier les changements","sync.migration.summary.add":"Ajouter","sync.migration.summary.modify":"Modifier","sync.migration.summary.delete":"Supprimer","sync.migration.summary.blocked":"Bloqué","sync.migration.changes":"Changements de métadonnées","sync.migration.blockers":"Éléments à résoudre","sync.migration.operation.add":"ajouter","sync.migration.operation.modify":"modifier","sync.migration.operation.delete":"supprimer","sync.migration.reason.serializer_regeneration":"Réécrit les métadonnées dans le format canonique v3.","sync.migration.reason.volatile_metadata_removal":"Supprime les métadonnées Sync temporaires.","sync.migration.reason.redundant_empty_metadata":"Supprime les métadonnées vides redondantes.","sync.migration.reason.runtime_ignore_policy":"Met à jour la règle d’exclusion du runtime gérée.","sync.migration.reason.reverse_pending":"Appliquez ou abandonnez d’abord les changements locaux en attente vers Studio.","sync.migration.reason.conflict":"Résolvez d’abord le conflit entre les fichiers locaux et Studio.","sync.migration.reason.local_canonical_change":"Vérifiez d’abord les métadonnées canoniques modifiées localement.","sync.migration.reason.source_mutation_detected":"Un fichier source utilisateur a changé pendant la validation.","sync.migration.blocked":"Résolvez les conflits Sync avant la mise à jour","sync.migration.stale":"L’aperçu a changé. Vérifiez la différence la plus récente.","sync.migration.error":"Impossible de mettre à jour le format Sync. Réessayez.","sync.migration.refresh":"Actualiser l’aperçu","sync.migration.refreshing":"Actualisation…","sync.migration.applying":"Application…","sync.migration.apply":"Appliquer la mise à jour","sync.migration.confirm.title":"Appliquer la mise à jour du format Sync ?","sync.migration.confirm.message":"Les métadonnées Sync indiquées seront sauvegardées puis mises à jour. Vos fichiers source Luau ne seront pas modifiés.","changelog.ownership.showGenerated":"Afficher les métadonnées générées","changelog.ownership.userSource":"Source utilisateur","changelog.ownership.canonicalMirror":"Métadonnées du miroir","changelog.ownership.generated":"Généré","uiStudio.analysis.verdict.incomplete":"Preuves de vérification incomplètes","uiStudio.analysis.issueSummary.incomplete":"Aucune suggestion, mais les vérifications d’interaction et d’adaptation restent à faire.","uiStudio.analysis.coverageDimensions":"Couverture de vérification","uiStudio.analysis.coverageStatus.completed":"Terminée","uiStudio.analysis.coverageStatus.failed":"Échouée","uiStudio.analysis.coverageStatus.skipped":"Ignorée","uiStudio.history.row.readinessIncomplete":"Préparation : preuves incomplètes","uiStudio.noSuggestionsIncomplete":"Aucune suggestion, mais une partie de la vérification reste manquante.","uiStudio.readiness.summary":"État de l’UI","uiStudio.primaryVisual.label":"Vue principale","uiStudio.primaryVisual.recompose":"Recomposer","uiStudio.primaryVisual.refine":"Affiner","uiStudio.primaryVisual.approved":"Approuvée","uiStudio.primaryVisual.unknown":"Inconnue","uiStudio.functional.label":"Fonctionnel","uiStudio.functional.safe":"Sûr","uiStudio.functional.risk":"Risque détecté","uiStudio.functional.unknown":"Inconnu","uiStudio.functional.safeCompact":"Fonctionnement sûr","uiStudio.functional.riskCompact":"Risque fonctionnel","uiStudio.functional.unknownCompact":"Fonctionnement inconnu","uiStudio.responsive.label":"Adaptation","uiStudio.responsive.recommended":"Recommandée","uiStudio.responsive.required":"Obligatoire","uiStudio.responsive.unknown":"Inconnue","uiStudio.responsive.recommendedCompact":"Adaptation recommandée","uiStudio.responsive.requiredCompact":"Adaptation obligatoire","uiStudio.responsive.unknownCompact":"Adaptation inconnue","uiStudio.readiness.ready":"Prête","uiStudio.readiness.reviewRequired":"Révision requise","uiStudio.readiness.insufficient":"Preuves incomplètes","uiStudio.readiness.unknown":"État inconnu","uiStudio.criticSummary":"Résumé de la révision","playtest.history.kind.structured":"Structuré","playtest.history.kind.legacy":"Hérité","playtest.history.kind.attention":"À vérifier","playtest.summary.title":"Résumé de l’exécution","playtest.summary.status":"État","playtest.summary.mode":"Mode","playtest.summary.duration":"Durée","playtest.summary.cleanup":"Nettoyage","playtest.dimension.title":"Dimensions de preuve","playtest.dimension.hint":"Les preuves requises sont indiquées.","playtest.dimension.server":"Serveur","playtest.dimension.clientUi":"UI client","playtest.dimension.interaction":"Interaction","playtest.dimension.visual":"Visuel","playtest.dimension.required":"Requise","playtest.dimension.optional":"Facultative","playtest.dimension.steps":"Étapes","playtest.steps.title":"Chronologie des étapes","playtest.steps.expected":"Attendu","playtest.steps.observed":"Observé","playtest.steps.evidence":"Preuve","playtest.steps.server":"Serveur","playtest.steps.details":"détails","playtest.capability.title":"Capacités et limites","playtest.capability.semanticUi":"Capture sémantique de l’UI","playtest.capability.virtualInput":"Entrée virtuelle","playtest.capability.fixedBootstrap":"Initialisation fixe de l’Agent","playtest.capability.projectAdapter":"Adaptateur de test du projet","playtest.capability.available":"Disponible","playtest.capability.unavailable":"Indisponible","playtest.limitations.title":"Limites","playtest.artifacts.title":"Artefacts","playtest.result.status.passed":"Réussi","playtest.result.status.failed":"Échoué","playtest.result.status.timedOut":"Délai dépassé","playtest.result.status.cancelled":"Annulé","playtest.result.status.insufficientEvidence":"Preuves insuffisantes","playtest.result.status.unavailable":"Indisponible","playtest.result.status.skipped":"Ignoré","playtest.result.status.notRequested":"Non demandé","playtest.result.status.unknown":"Inconnu","playtest.record.incomplete":"Le résultat structuré est incomplet","playtest.record.corrupt":"Le résultat structuré est endommagé","playtest.record.unsupported":"La version du résultat structuré n’est pas prise en charge","playtest.record.unavailable":"Les détails du résultat sont indisponibles.","playtest.sample.terminal":"Toutes les preuves requises ont réussi","playtest.sample.limit.visual":"La capture d’écran en mode Play n’est pas disponible dans la session structurée v1","playtest.history.agents":"Agents","playtest.history.agentCounts":"Serveur {server} · Client {client}","playtest.agents.title":"Agents de test","playtest.agents.unknown":"Agent","playtest.limitations.visualUnsupported":"Preuve visuelle indisponible — Les captures Play ne sont pas prises en charge dans la session structurée v1.","playtest.limitations.virtualInputUnavailable":"L’entrée virtuelle est indisponible pour cette session.","playtest.limitations.visualUnsupportedReason":"Les captures Play ne sont pas prises en charge dans la session structurée v1.","playtest.dimension.reason.missing":"Une preuve requise est manquante.","playtest.dimension.reason.capability":"La capacité requise est indisponible.","playtest.artifacts.metadata":"Métadonnées du résultat"},Zy=["en","ko","es","pt-br","ja","id","de","fr-fr"],To="auto",El={en:Fy,ko:Vy,es:Yy,"pt-br":Gy,ja:Ky,id:$y,de:Xy,"fr-fr":Qy},In="dashboard-locale";function Bl(i){return Zy.includes(i)}function Jy(){const n=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return n==="ko"||n.startsWith("ko-")?"ko":n==="pt-br"?"pt-br":n==="ja"||n.startsWith("ja-")?"ja":n==="es"||n.startsWith("es-")?"es":n==="id"||n.startsWith("id-")?"id":n==="de"||n.startsWith("de-")?"de":n==="fr"||n.startsWith("fr-")?"fr-fr":"en"}function ap(){if(typeof localStorage<"u"){const i=localStorage.getItem(In);if(i===To)return To;if(i&&Bl(i))return i}return To}function op(i){return i===To?Jy():i}const Mp=x.createContext(null);function ef({children:i}){const[n,r]=x.useState(ap),[d,u]=x.useState(()=>op(ap())),p=x.useCallback((y,h)=>{const v=El[d]??El.en??{};if(y in v)return v[y];const k=El.en;return k&&y in k?k[y]:h!==void 0?h:y},[d]),g=x.useCallback(y=>{typeof localStorage<"u"&&(y===To?localStorage.removeItem(In):Bl(y)?localStorage.setItem(In,y):localStorage.setItem(In,"en"));const h=y===To?To:Bl(y)?y:"en";r(h),u(op(h))},[]);return x.createElement(Mp.Provider,{value:{locale:d,selectedLocale:n,t:p,setLocale:g}},i)}function ma(){const i=x.useContext(Mp);if(!i)throw new Error("useLocale must be used within a LocaleProvider");return i}const tf="_container_6jg7e_2",af="_toast_6jg7e_14",of="_slideIn_6jg7e_1",sf="_success_6jg7e_39",nf="_info_6jg7e_44",rf="_warning_6jg7e_49",lf="_error_6jg7e_54",jl={container:tf,toast:af,slideIn:of,success:sf,info:nf,warning:rf,error:lf},Op=x.createContext(null),df=3e3;function uf({children:i}){const[n,r]=x.useState([]),d=x.useRef(0),u=x.useCallback((p,g="info")=>{const y=d.current++;r(h=>[...h,{id:y,message:p,type:g}]),setTimeout(()=>{r(h=>h.filter(v=>v.id!==y))},df)},[]);return w.jsxs(Op.Provider,{value:{show:u},children:[i,w.jsx("div",{className:jl.container,children:n.map(p=>w.jsx("div",{className:`${jl.toast} ${jl[p.type]}`,children:p.message},p.id))})]})}function cf(){const i=x.useContext(Op);return i||{show:()=>{}}}function pf(){const{level:i}=_n(),{show:n}=cf(),{t:r}=ma(),d=x.useRef(null);return x.useEffect(()=>{const u=d.current;d.current=i,u!==null&&u!==i&&(u==="disconnected"&&i==="serverOnly"?n(r("toast.serverConnected","MCP 서버 연결됨"),"success"):u==="serverOnly"&&i==="studioConnected"?n(r("toast.pluginConnected","플러그인 연결됨"),"success"):(u==="serverOnly"||u==="studioConnected")&&i==="disconnected"?n(r("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):u==="studioConnected"&&i==="serverOnly"&&n(r("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[i,n,r]),null}const gf="_wrapper_6ij3d_2",hf="_tooltip_6ij3d_11",mf="_tooltipVisible_6ij3d_33",Tl={wrapper:gf,tooltip:hf,tooltipVisible:mf},di=8,xn=6;function Vt({text:i,disabled:n=!1,children:r}){const d=x.useRef(null),u=x.useRef(null),[p,g]=x.useState(!1),[y,h]=x.useState("top"),[v,k]=x.useState("center"),[b,D]=x.useState(null),U=i.trim(),B=x.useCallback(()=>{const W=d.current,ae=u.current;if(!W||!ae)return;const Y=W.getBoundingClientRect(),pe=ae.getBoundingClientRect(),De=window.innerWidth,E=window.innerHeight;let X="top";Y.top-pe.height-xn<di&&Y.bottom+pe.height+xn<=E-di&&(X="bottom");let Se="center";const ce=Y.left+Y.width/2,Te=pe.width/2;ce-Te<di?Se="left":ce+Te>De-di&&(Se="right");const we=X==="top"?Y.top-pe.height-xn:Y.bottom+xn;let Ce;Se==="left"?Ce=Y.left:Se==="right"?Ce=Y.right-pe.width:Ce=ce-Te,Ce=Math.max(di,Math.min(Ce,De-pe.width-di)),h(X),k(Se),D({top:we,left:Ce})},[]);if(x.useLayoutEffect(()=>{p&&B()},[p,B]),x.useEffect(()=>{if(!p)return;const W=()=>B();return window.addEventListener("scroll",W,!0),window.addEventListener("resize",W),()=>{window.removeEventListener("scroll",W,!0),window.removeEventListener("resize",W)}},[p,B]),x.useEffect(()=>{n&&g(!1)},[n]),!U)return w.jsx(w.Fragment,{children:r});const z=()=>{n||g(!0)},N=()=>g(!1),le=w.jsx("span",{ref:u,className:[Tl.tooltip,p?Tl.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":v,"data-vertical":y,style:b?{top:b.top,left:b.left}:{top:-9999,left:-9999,visibility:"hidden"},children:U});return w.jsxs(w.Fragment,{children:[w.jsx("span",{ref:d,className:Tl.wrapper,"data-tooltip-text":U,onMouseEnter:z,onMouseLeave:N,onFocus:z,onBlur:N,children:r}),!n&&typeof document<"u"?Ln.createPortal(le,document.body):null]})}function yf(i){return i==="auto"||i==="polar"||i==="gumroad"?i:void 0}function ff(i){if(!i||typeof i!="object")return!1;const n=i.status;return(i.tier==="basic"||i.tier==="pro")&&(n==="active"||n==="grace"||n==="invalid"||n==="revoked"||n==="unlicensed"||n==="unknown")}function Np(i){return i&&typeof i=="object"&&"data"in i&&i.data?i.data:i}function _p(i){if(!i||typeof i!="object")return null;if(ff(i))return i;const n=i;if(typeof n.canUsePro!="boolean"||typeof n.status!="string"||n.status!=="active"&&n.status!=="grace"&&n.status!=="invalid"&&n.status!=="revoked"&&n.status!=="unlicensed"&&n.status!=="unknown")return null;const r=yf(n.provider);return{tier:n.canUsePro?"pro":"basic",status:n.status,...typeof n.statusDetail=="string"?{statusDetail:n.statusDetail}:{},...typeof n.maskedKey=="string"?{maskedKey:n.maskedKey}:{},...r?{provider:r}:{},refreshRequired:n.refreshRequired===!0,...typeof n.refreshBlockedReason=="string"?{refreshBlockedReason:n.refreshBlockedReason}:{}}}async function qp(i="auto"){const n=await Pt.get("/api/dashboard/license/status",{provider:i});return _p(Np(n))}function ed(i){const n=Np(i),r=n,d=_p(n),u=typeof(r==null?void 0:r.reasonCode)=="string"?r.reasonCode:void 0;return{ok:(r==null?void 0:r.ok)===!0,license:d?{...d,refreshRequired:d.refreshRequired||u==="missing_session_token",refreshBlockedReason:d.refreshBlockedReason??(u==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(r==null?void 0:r.message)=="string"?r.message:null,reasonCode:u,recoverable:(r==null?void 0:r.recoverable)===!0}}async function Qb(i){const n=i.provider??"auto",r=await Pt.post("/api/dashboard/license/activate",{provider:n,licenseKey:i.licenseKey,clientType:"dashboard"});return ed(r)}async function Zb(i={}){const n=i.provider??"auto",r=await Pt.post("/api/dashboard/license/refresh",{provider:n,clientType:"dashboard"});return ed(r)}async function Jb(i={}){const n=i.provider??"auto",r=await Pt.post("/api/dashboard/license/reset",{provider:n,clientType:"dashboard"});return ed(r)}/**
|
|
150
|
-
* @license lucide-react v1.8.0 - ISC
|
|
151
|
-
*
|
|
152
|
-
* This source code is licensed under the ISC license.
|
|
153
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
154
|
-
*/const Bp=(...i)=>i.filter((n,r,d)=>!!n&&n.trim()!==""&&d.indexOf(n)===r).join(" ").trim();/**
|
|
155
|
-
* @license lucide-react v1.8.0 - ISC
|
|
156
|
-
*
|
|
157
|
-
* This source code is licensed under the ISC license.
|
|
158
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
159
|
-
*/const Sf=i=>i.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();/**
|
|
160
|
-
* @license lucide-react v1.8.0 - ISC
|
|
161
|
-
*
|
|
162
|
-
* This source code is licensed under the ISC license.
|
|
163
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
164
|
-
*/const vf=i=>i.replace(/^([A-Z])|[\s-_]+(\w)/g,(n,r,d)=>d?d.toUpperCase():r.toLowerCase());/**
|
|
165
|
-
* @license lucide-react v1.8.0 - ISC
|
|
166
|
-
*
|
|
167
|
-
* This source code is licensed under the ISC license.
|
|
168
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
169
|
-
*/const ip=i=>{const n=vf(i);return n.charAt(0).toUpperCase()+n.slice(1)};/**
|
|
170
|
-
* @license lucide-react v1.8.0 - ISC
|
|
171
|
-
*
|
|
172
|
-
* This source code is licensed under the ISC license.
|
|
173
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
174
|
-
*/var Ul={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
|
175
|
-
* @license lucide-react v1.8.0 - ISC
|
|
176
|
-
*
|
|
177
|
-
* This source code is licensed under the ISC license.
|
|
178
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
179
|
-
*/const bf=i=>{for(const n in i)if(n.startsWith("aria-")||n==="role"||n==="title")return!0;return!1},Pf=x.createContext({}),kf=()=>x.useContext(Pf),wf=x.forwardRef(({color:i,size:n,strokeWidth:r,absoluteStrokeWidth:d,className:u="",children:p,iconNode:g,...y},h)=>{const{size:v=24,strokeWidth:k=2,absoluteStrokeWidth:b=!1,color:D="currentColor",className:U=""}=kf()??{},B=d??b?Number(r??k)*24/Number(n??v):r??k;return x.createElement("svg",{ref:h,...Ul,width:n??v??Ul.width,height:n??v??Ul.height,stroke:i??D,strokeWidth:B,className:Bp("lucide",U,u),...!p&&!bf(y)&&{"aria-hidden":"true"},...y},[...g.map(([z,N])=>x.createElement(z,N)),...Array.isArray(p)?p:[p]])});/**
|
|
180
|
-
* @license lucide-react v1.8.0 - ISC
|
|
181
|
-
*
|
|
182
|
-
* This source code is licensed under the ISC license.
|
|
183
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
184
|
-
*/const Ve=(i,n)=>{const r=x.forwardRef(({className:d,...u},p)=>x.createElement(wf,{ref:p,iconNode:n,className:Bp(`lucide-${Sf(ip(i))}`,`lucide-${i}`,d),...u}));return r.displayName=ip(i),r};/**
|
|
185
|
-
* @license lucide-react v1.8.0 - ISC
|
|
186
|
-
*
|
|
187
|
-
* This source code is licensed under the ISC license.
|
|
188
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
189
|
-
*/const Cf=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],Af=Ve("bell",Cf);/**
|
|
190
|
-
* @license lucide-react v1.8.0 - ISC
|
|
191
|
-
*
|
|
192
|
-
* This source code is licensed under the ISC license.
|
|
193
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
194
|
-
*/const xf=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],Rf=Ve("book-open",xf);/**
|
|
195
|
-
* @license lucide-react v1.8.0 - ISC
|
|
196
|
-
*
|
|
197
|
-
* This source code is licensed under the ISC license.
|
|
198
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
199
|
-
*/const If=[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]],Df=Ve("bug",If);/**
|
|
200
|
-
* @license lucide-react v1.8.0 - ISC
|
|
201
|
-
*
|
|
202
|
-
* This source code is licensed under the ISC license.
|
|
203
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
204
|
-
*/const Ef=[["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z",key:"1f1r0c"}]],jf=Ve("diamond",Ef);/**
|
|
205
|
-
* @license lucide-react v1.8.0 - ISC
|
|
206
|
-
*
|
|
207
|
-
* This source code is licensed under the ISC license.
|
|
208
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
209
|
-
*/const Tf=[["path",{d:"M12 15V3",key:"m9g1x1"}],["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["path",{d:"m7 10 5 5 5-5",key:"brsn70"}]],Uf=Ve("download",Tf);/**
|
|
210
|
-
* @license lucide-react v1.8.0 - ISC
|
|
211
|
-
*
|
|
212
|
-
* This source code is licensed under the ISC license.
|
|
213
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
214
|
-
*/const Lf=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],Wp=Ve("external-link",Lf);/**
|
|
215
|
-
* @license lucide-react v1.8.0 - ISC
|
|
216
|
-
*
|
|
217
|
-
* This source code is licensed under the ISC license.
|
|
218
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
219
|
-
*/const zf=[["path",{d:"M13.659 22H18a2 2 0 0 0 2-2V8a2.4 2.4 0 0 0-.706-1.706l-3.588-3.588A2.4 2.4 0 0 0 14 2H6a2 2 0 0 0-2 2v11.5",key:"4pqfef"}],["path",{d:"M14 2v5a1 1 0 0 0 1 1h5",key:"wfsgrz"}],["path",{d:"M8 12v-1",key:"1ej8lb"}],["path",{d:"M8 18v-2",key:"qcmpov"}],["path",{d:"M8 7V6",key:"1nbb54"}],["circle",{cx:"8",cy:"20",r:"2",key:"ckkr5m"}]],Hf=Ve("file-archive",zf);/**
|
|
220
|
-
* @license lucide-react v1.8.0 - ISC
|
|
221
|
-
*
|
|
222
|
-
* This source code is licensed under the ISC license.
|
|
223
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
224
|
-
*/const Mf=[["path",{d:"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2",key:"usdka0"}]],sp=Ve("folder-open",Mf);/**
|
|
225
|
-
* @license lucide-react v1.8.0 - ISC
|
|
226
|
-
*
|
|
227
|
-
* This source code is licensed under the ISC license.
|
|
228
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
229
|
-
*/const Of=[["path",{d:"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",key:"1kt360"}]],Nf=Ve("folder",Of);/**
|
|
230
|
-
* @license lucide-react v1.8.0 - ISC
|
|
231
|
-
*
|
|
232
|
-
* This source code is licensed under the ISC license.
|
|
233
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
234
|
-
*/const _f=[["line",{x1:"6",x2:"10",y1:"11",y2:"11",key:"1gktln"}],["line",{x1:"8",x2:"8",y1:"9",y2:"13",key:"qnk9ow"}],["line",{x1:"15",x2:"15.01",y1:"12",y2:"12",key:"krot7o"}],["line",{x1:"18",x2:"18.01",y1:"10",y2:"10",key:"1lcuu1"}],["path",{d:"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",key:"mfqc10"}]],qf=Ve("gamepad-2",_f);/**
|
|
235
|
-
* @license lucide-react v1.8.0 - ISC
|
|
236
|
-
*
|
|
237
|
-
* This source code is licensed under the ISC license.
|
|
238
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
239
|
-
*/const Bf=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],Wf=Ve("history",Bf);/**
|
|
240
|
-
* @license lucide-react v1.8.0 - ISC
|
|
241
|
-
*
|
|
242
|
-
* This source code is licensed under the ISC license.
|
|
243
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
244
|
-
*/const Ff=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Vf=Ve("image",Ff);/**
|
|
245
|
-
* @license lucide-react v1.8.0 - ISC
|
|
246
|
-
*
|
|
247
|
-
* This source code is licensed under the ISC license.
|
|
248
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
249
|
-
*/const Yf=[["path",{d:"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z",key:"1s6t7t"}],["circle",{cx:"16.5",cy:"7.5",r:".5",fill:"currentColor",key:"w0ekpg"}]],np=Ve("key-round",Yf);/**
|
|
250
|
-
* @license lucide-react v1.8.0 - ISC
|
|
251
|
-
*
|
|
252
|
-
* This source code is licensed under the ISC license.
|
|
253
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
254
|
-
*/const Gf=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],Kf=Ve("layout-dashboard",Gf);/**
|
|
255
|
-
* @license lucide-react v1.8.0 - ISC
|
|
256
|
-
*
|
|
257
|
-
* This source code is licensed under the ISC license.
|
|
258
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
259
|
-
*/const $f=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],Xf=Ve("lightbulb",$f);/**
|
|
260
|
-
* @license lucide-react v1.8.0 - ISC
|
|
261
|
-
*
|
|
262
|
-
* This source code is licensed under the ISC license.
|
|
263
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
264
|
-
*/const Qf=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Zf=Ve("loader-circle",Qf);/**
|
|
265
|
-
* @license lucide-react v1.8.0 - ISC
|
|
266
|
-
*
|
|
267
|
-
* This source code is licensed under the ISC license.
|
|
268
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
269
|
-
*/const Jf=[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]],eS=Ve("messages-square",Jf);/**
|
|
270
|
-
* @license lucide-react v1.8.0 - ISC
|
|
271
|
-
*
|
|
272
|
-
* This source code is licensed under the ISC license.
|
|
273
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
274
|
-
*/const tS=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],aS=Ve("monitor",tS);/**
|
|
275
|
-
* @license lucide-react v1.8.0 - ISC
|
|
276
|
-
*
|
|
277
|
-
* This source code is licensed under the ISC license.
|
|
278
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
279
|
-
*/const oS=[["path",{d:"M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z",key:"1a0edw"}],["path",{d:"M12 22V12",key:"d0xqtd"}],["polyline",{points:"3.29 7 12 12 20.71 7",key:"ousv84"}],["path",{d:"m7.5 4.27 9 5.15",key:"1c824w"}]],iS=Ve("package",oS);/**
|
|
280
|
-
* @license lucide-react v1.8.0 - ISC
|
|
281
|
-
*
|
|
282
|
-
* This source code is licensed under the ISC license.
|
|
283
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
284
|
-
*/const sS=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]],nS=Ve("plug",sS);/**
|
|
285
|
-
* @license lucide-react v1.8.0 - ISC
|
|
286
|
-
*
|
|
287
|
-
* This source code is licensed under the ISC license.
|
|
288
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
289
|
-
*/const rS=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Fp=Ve("refresh-cw",rS);/**
|
|
290
|
-
* @license lucide-react v1.8.0 - ISC
|
|
291
|
-
*
|
|
292
|
-
* This source code is licensed under the ISC license.
|
|
293
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
294
|
-
*/const lS=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],dS=Ve("settings",lS);/**
|
|
295
|
-
* @license lucide-react v1.8.0 - ISC
|
|
296
|
-
*
|
|
297
|
-
* This source code is licensed under the ISC license.
|
|
298
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
299
|
-
*/const uS=[["path",{d:"M10 5H3",key:"1qgfaw"}],["path",{d:"M12 19H3",key:"yhmn1j"}],["path",{d:"M14 3v4",key:"1sua03"}],["path",{d:"M16 17v4",key:"1q0r14"}],["path",{d:"M21 12h-9",key:"1o4lsq"}],["path",{d:"M21 19h-5",key:"1rlt1p"}],["path",{d:"M21 5h-7",key:"1oszz2"}],["path",{d:"M8 10v4",key:"tgpxqk"}],["path",{d:"M8 12H3",key:"a7s4jb"}]],Vp=Ve("sliders-horizontal",uS);/**
|
|
300
|
-
* @license lucide-react v1.8.0 - ISC
|
|
301
|
-
*
|
|
302
|
-
* This source code is licensed under the ISC license.
|
|
303
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
304
|
-
*/const cS=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],rp=Ve("sparkles",cS);/**
|
|
305
|
-
* @license lucide-react v1.8.0 - ISC
|
|
306
|
-
*
|
|
307
|
-
* This source code is licensed under the ISC license.
|
|
308
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
309
|
-
*/const pS=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],gS=Ve("wrench",pS);/**
|
|
310
|
-
* @license lucide-react v1.8.0 - ISC
|
|
311
|
-
*
|
|
312
|
-
* This source code is licensed under the ISC license.
|
|
313
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
314
|
-
*/const hS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],mS=Ve("x",hS),Yp=[{labelKey:"sidebar.overview",route:"/",icon:Kf,minLevel:"disconnected",lazy:()=>oa(()=>import("./OverviewPage-B8RMrIaQ.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]))},{labelKey:"sidebar.connection",route:"/connection",icon:nS,minLevel:"disconnected",lazy:()=>oa(()=>import("./ConnectionPage-BMIbBueG.js"),__vite__mapDeps([11,1,2,3,4,5,6,12,13,14,9,15,16]))},{labelKey:"sidebar.sync",route:"/sync",icon:Fp,minLevel:"serverOnly",lazy:()=>oa(()=>import("./SyncPage-BNadN0NU.js"),__vite__mapDeps([17,2,3,1,6,12,13,14,18,19,4,5,20]))},{labelKey:"sidebar.assets",route:"/assets",icon:iS,minLevel:"serverOnly",lazy:()=>oa(()=>import("./AssetsPage-_CPMetwm.js"),__vite__mapDeps([21,12,13,14,2,3,6,15,22]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:Wf,minLevel:"serverOnly",lazy:()=>oa(()=>import("./ChangelogPage-BpTjHwvr.js"),__vite__mapDeps([23,2,3,12,13,14,18,19,6,24,25,1,7,8,26,27,28]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:qf,minLevel:"serverOnly",lazy:()=>oa(()=>import("./PlaytestPage-CrCurhRT.js"),__vite__mapDeps([29,2,3,1,18,19,6,12,13,14,24,25,30]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Vf,minLevel:"serverOnly",lazy:()=>oa(()=>import("./UiStudioPage-CWQgLMHO.js"),__vite__mapDeps([31,1,6,2,3,32,33,24,25,26,27,18,19,34]))},{labelKey:"sidebar.tools",route:"/tools",icon:gS,minLevel:"serverOnly",lazy:()=>oa(()=>import("./ToolsPage-bHm2QbDR.js"),__vite__mapDeps([35,2,3,6,12,13,14,24,25,18,19,26,27,36]))}],Wl=[{labelKey:"sidebar.controls",route:"/controls",icon:Vp,minLevel:"serverOnly",lazy:()=>oa(()=>import("./ControlsPage-C828Cgwo.js"),__vite__mapDeps([37,2,3,1,13,14,6,38,39,15]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:Af,minLevel:"disconnected",lazy:()=>oa(()=>import("./WhatsNewPage-D-iibgAc.js"),__vite__mapDeps([40,2,3,41]))}],Ll="https://github.com/hope1026/weppy-roblox-mcp",yS="https://weppyai.com";function Fl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Gp(i){var v,k,b,D,U;const n=Fl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((k=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:k.pluginVersion)??"",p=((D=(b=r==null?void 0:r.pluginClients)==null?void 0:b[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((U=r==null?void 0:r.aiClientNames)==null?void 0:U[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function fS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Gp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function SS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Gp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const vS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Df,buildUrl:i=>`${Ll}/issues/new?${fS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Xf,buildUrl:()=>`${Ll}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:eS,buildUrl:i=>`${Ll}/issues/new?${SS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:Rf,buildUrl:i=>`${yS}/${i.locale}/docs/troubleshooting/`}];function bS(){const[i,n]=x.useState("basic"),[r,d]=x.useState(0),[u,p]=x.useState(0),[g,y]=x.useState(0),[h,v]=x.useState(!0);x.useEffect(()=>{let b=!1;async function D(){try{return await qp("auto")}catch{return null}}async function U(){var N,le;try{const[W,ae]=await Promise.all([D(),Pt.get("/api/dashboard/tool-stats").catch(()=>null)]);if(b)return;if(W!=null&&W.tier&&n(W.tier),ae!=null&&ae.tierSummary){const Y=((N=ae.tierSummary.basic)==null?void 0:N.totalCalls)??0,pe=((le=ae.tierSummary.pro)==null?void 0:le.totalCalls)??0;y(Y),p(pe),d(Y+pe)}}catch{}finally{b||v(!1)}}U();const B=new Jl;B.connect();const z=B.on("license",()=>{D().then(N=>{!b&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{b=!0,z(),B.disconnect()}},[]);const k=r>0?u/r*100:0;return{tier:i,proUsagePercent:k,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const PS="https://weppyai.com/plans/";function Ro(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${PS}?${n.toString()}`}const kS={sidebarUpgrade:Ro("sidebar_upgrade"),settingsLicense:Ro("settings_license"),sync:Ro("sync_tier_panel"),changelog:Ro("changelog_limit_notice"),playtest:Ro("playtest_sample_banner"),uiStudioAnalysis:Ro("ui_studio_analysis_banner"),uiStudioHistory:Ro("ui_studio_history_banner")},wS=5e3,CS=5;function AS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function xS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function us(i,n){const r=AS(i);if(n===void 0)return r;const d=xS(r,n);return d?{page:r,tab:d}:{page:r}}let pi=[],lp=null;function Kp(){if(pi.length===0)return;const i=pi.splice(0),n=`${Nn}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function RS(){lp||(lp=setInterval(Kp,wS))}function dp(i){pi.push(i),RS(),pi.length>=CS&&Kp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(pi.length===0)return;const i=`${Nn}/api/dashboard/analytics`,n=JSON.stringify({events:pi.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function cs(){const i=x.useCallback((r,d)=>{dp({name:r,params:d})},[]),n=x.useCallback(r=>{dp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const IS="_widget_1q1ab_1",DS="_header_1q1ab_12",ES="_sparkle_1q1ab_18",jS="_title_1q1ab_23",TS="_actions_1q1ab_31",US="_cta_1q1ab_37",LS="_licenseCta_1q1ab_38",zS="_collapsedGroup_1q1ab_70",HS="_collapsed_1q1ab_70",MS="_collapsedSecondary_1q1ab_91",aa={widget:IS,header:DS,sparkle:ES,title:jS,actions:TS,cta:US,licenseCta:LS,collapsedGroup:zS,collapsed:HS,collapsedSecondary:MS};function OS({collapsed:i=!1}){const{tier:n}=bS(),{t:r}=ma(),{trackEvent:d}=cs(),{pathname:u,search:p}=Yt();if(n==="pro")return null;const g=kS.sidebarUpgrade,y="/settings?section=license",h=us(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},k=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?w.jsxs("div",{className:aa.collapsedGroup,children:[w.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:aa.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:w.jsx(rp,{size:18,strokeWidth:1.75})}),w.jsx(jo,{to:y,className:`${aa.collapsed} ${aa.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:k,children:w.jsx(np,{size:18,strokeWidth:1.75})})]}):w.jsxs("div",{className:aa.widget,children:[w.jsxs("div",{className:aa.header,children:[w.jsx(rp,{size:16,strokeWidth:1.75,className:aa.sparkle}),w.jsx("span",{className:aa.title,children:r("upgrade.tagline","Check Pro features")})]}),w.jsxs("div",{className:aa.actions,children:[w.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:aa.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),w.jsxs(jo,{to:y,className:aa.licenseCta,onClick:k,children:[w.jsx(np,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),w.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const NS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",qS="_header_1r5ey_21",BS="_titleBlock_1r5ey_30",WS="_title_1r5ey_30",FS="_subtitle_1r5ey_42",VS="_closeButton_1r5ey_49",YS="_body_1r5ey_67",GS="_statusBox_1r5ey_73",KS="_errorBox_1r5ey_74",$S="_spin_1r5ey_92",XS="_bundleBlock_1r5ey_102",QS="_label_1r5ey_107",ZS="_bundleName_1r5ey_115",JS="_guidanceBox_1r5ey_127",ev="_includedList_1r5ey_143",tv="_includedItem_1r5ey_152",av="_actions_1r5ey_163",ov="_button_1r5ey_169",iv="_primaryLink_1r5ey_170",sv="_hint_1r5ey_206",We={backdrop:NS,dialog:_S,header:qS,titleBlock:BS,title:WS,subtitle:FS,closeButton:VS,body:YS,statusBox:GS,errorBox:KS,spin:$S,bundleBlock:XS,label:QS,bundleName:ZS,guidanceBox:JS,includedList:ev,includedItem:tv,actions:av,button:ov,primaryLink:iv,hint:sv};function zl(){return typeof navigator<"u"?navigator.userAgent:""}function nv(i){window.open(i,"_blank","noopener,noreferrer")}function rv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=ma(),p=x.useId(),[g,y]=x.useState(!1),[h,v]=x.useState(null),[k,b]=x.useState(null),[D,U]=x.useState("idle");if(x.useEffect(()=>{if(!i)return;let Y=!1;const pe=zl();return y(!0),v(null),b(null),U("idle"),Pt.post("/api/dashboard/support/bug-report",{os:Fl(pe),userAgent:pe,locale:d}).then(De=>{Y||(v(De),y(!1))}).catch(()=>{Y||(b(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{Y=!0}},[i,d]),x.useEffect(()=>{if(!i||g)return;function Y(pe){pe.key==="Escape"&&r()}return window.addEventListener("keydown",Y),()=>window.removeEventListener("keydown",Y)},[i,g,r]),!i)return null;async function B(){if(h)try{U("opening"),await Pt.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),U("opened")}catch{U("failed")}}const z=h!==null,N=(h==null?void 0:h.issueUrl)??n,le=(h==null?void 0:h.includedFiles)??[],W=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),ae=w.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:w.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:Y=>Y.stopPropagation(),children:[w.jsxs("div",{className:We.header,children:[w.jsxs("div",{className:We.titleBlock,children:[w.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),w.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),w.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:w.jsx(mS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),w.jsxs("div",{className:We.body,children:[g&&w.jsxs("div",{className:We.statusBox,role:"status",children:[w.jsx(Zf,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),w.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),k&&w.jsxs("div",{className:We.errorBox,role:"alert",children:[w.jsx(Hf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),w.jsx("span",{children:k})]}),z&&w.jsxs(w.Fragment,{children:[w.jsxs("div",{className:We.guidanceBox,children:[w.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),w.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),w.jsxs("div",{className:We.bundleBlock,children:[w.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),w.jsx("code",{className:We.bundleName,children:h.bundleName})]}),w.jsxs("div",{className:We.bundleBlock,children:[w.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),w.jsx("ul",{className:We.includedList,children:le.length>0?le.map(Y=>w.jsx("li",{className:We.includedItem,children:Y.label},`${Y.label}:${Y.archivePath??Y.path}`)):w.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&w.jsxs("div",{className:We.errorBox,role:"alert",children:[w.jsx(sp,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),w.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),w.jsxs("div",{className:We.actions,children:[z&&w.jsxs(w.Fragment,{children:[w.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[w.jsx(Uf,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),w.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[w.jsx(sp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),W]})]}),k&&!z&&w.jsxs("button",{type:"button",className:We.button,onClick:()=>{b(null),y(!0),Pt.post("/api/dashboard/support/bug-report",{os:Fl(zl()),userAgent:zl(),locale:d}).then(Y=>{v(Y),y(!1)}).catch(()=>{b(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[w.jsx(Fp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),w.jsxs("button",{type:"button",className:We.button,onClick:()=>nv(N),disabled:g,children:[w.jsx(Wp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),z?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),w.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?ae:Ln.createPortal(ae,document.body)}const lv="_sidebar_19hyu_2",dv="_brand_19hyu_17",uv="_brandIcon_19hyu_28",cv="_brandText_19hyu_33",pv="_brandTextPro_19hyu_44",gv="_nav_19hyu_50",hv="_spacer_19hyu_57",mv="_navLink_19hyu_63",yv="_active_19hyu_84",fv="_disabled_19hyu_91",Sv="_icon_19hyu_102",vv="_label_19hyu_113",bv="_secondaryDivider_19hyu_120",Pv="_secondaryNav_19hyu_127",kv="_secondaryNavEntry_19hyu_134",wv="_secondaryItemDivider_19hyu_140",Cv="_helpDivider_19hyu_147",Av="_helpGroupTitle_19hyu_154",xv="_helpNav_19hyu_165",Rv="_externalIcon_19hyu_172",Je={sidebar:lv,brand:dv,brandIcon:uv,brandText:cv,brandTextPro:pv,nav:gv,spacer:hv,navLink:mv,active:yv,disabled:fv,icon:Sv,label:vv,secondaryDivider:bv,secondaryNav:Pv,secondaryNavEntry:kv,secondaryItemDivider:wv,helpDivider:Cv,helpGroupTitle:Av,helpNav:xv,externalIcon:Rv},Iv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Dv(){const[i,n]=x.useState(!1);return x.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const up={disconnected:0,serverOnly:1,studioConnected:2};function Ev(i,n){return up[i]>=up[n]}function jv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function cp({item:i}){const{level:n}=_n(),{t:r}=ma(),d=Ev(n,i.minLevel),u=i.icon,p=w.jsxs(Ey,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[w.jsx("span",{className:Je.icon,children:w.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),w.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:w.jsx(Vt,{text:jv(i.minLevel,r),children:p})}function Tv({item:i,ctx:n}){const{t:r}=ma(),{trackEvent:d}=cs(),{pathname:u,search:p}=Yt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=us(u,p),[k,b]=x.useState(!1),D=w.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Iv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),b(!0))},children:[w.jsx("span",{className:Je.icon,children:w.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),w.jsx("span",{className:Je.label,children:r(i.labelKey)}),w.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:w.jsx(Wp,{size:12,strokeWidth:1.75})})]}),U=h?w.jsx(Vt,{text:h,children:D}):D;return w.jsxs(w.Fragment,{children:[U,i.id==="bug"&&w.jsx(rv,{open:k,fallbackHref:y,onClose:()=>b(!1)})]})}function Uv(){const[i,n]=x.useState("basic"),r=Dv(),{status:d}=_n(),{locale:u,t:p}=ma(),g={locale:u,status:d};return x.useEffect(()=>{let y=!1;async function h(){try{const b=await qp("auto");!y&&(b!=null&&b.tier)&&n(b.tier)}catch{y||n("basic")}}h();const v=new Jl;v.connect();const k=v.on("license",()=>{h()});return()=>{y=!0,k(),v.disconnect()}},[]),w.jsxs("aside",{className:Je.sidebar,children:[w.jsxs("div",{className:Je.brand,children:[w.jsx("span",{className:Je.brandIcon,children:w.jsx(jf,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),w.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),w.jsx("nav",{className:Je.nav,children:Yp.map(y=>w.jsx(cp,{item:y},y.route))}),w.jsx("div",{className:Je.secondaryDivider}),w.jsx("nav",{className:Je.secondaryNav,children:Wl.map((y,h)=>w.jsxs("div",{className:Je.secondaryNavEntry,children:[w.jsx(cp,{item:y}),h<Wl.length-1?w.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),w.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),w.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),w.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:vS.map(y=>w.jsx(Tv,{item:y,ctx:g},y.id))}),w.jsx("div",{className:Je.spacer}),w.jsx(OS,{collapsed:r})]})}async function Lv(){return Pt.get("/api/dashboard/place-summary")}const Vl=new Set;function zv(i){return Vl.add(i),()=>Vl.delete(i)}async function Hv(){return Pt.get("/api/dashboard/sync-root")}async function eP(){return Pt.post("/api/dashboard/sync-root/pick")}async function tP(i){const n=await Pt.patch("/api/dashboard/sync-root",{projectRoot:i});return Vl.forEach(r=>r(n)),n}const Mv=[{id:"2026-08-28-structured-playtest-results",date:"2026-08-28",title:{en:"AI can now test the player screen and server results together",ko:"AI가 플레이어 화면과 서버 결과를 함께 테스트하도록 개선되었습니다",es:"La IA ahora prueba conjuntamente la pantalla del jugador y los resultados del servidor","pt-br":"A IA agora testa a tela do jogador e os resultados do servidor em conjunto",ja:"AIがプレイヤー画面とサーバー結果をまとめてテストできるようになりました",id:"AI kini menguji layar pemain dan hasil server secara bersamaan",de:"Die KI testet jetzt Spieleransicht und Serverergebnisse gemeinsam","fr-fr":"L’IA teste désormais ensemble l’écran du joueur et les résultats du serveur"},body:{en:`Previously, automated Playtests ran Luau test code on the server and evaluated the logs. This was useful for flexible server diagnostics, but it could not fully verify whether UI appeared correctly on the player screen, whether client-only behavior worked, or whether an on-screen action produced the expected server result. A server test could pass while the player-facing experience still had a problem.
|
|
315
|
-
|
|
316
|
-
Now the AI Agent runs server and client checks separately. It verifies player readiness, UI visibility and content, game objects and properties, interaction results, and server state changes step by step. Even when server results are correct, the test does not pass if a required UI check fails or client evidence is missing.
|
|
317
|
-
|
|
318
|
-
The Dashboard Playtest report shows the overall result and duration together with Server, Client UI, Interaction, and Visual results. It also shows the expected and observed values for each step, failure reasons, and the cleanup result after the test ends.
|
|
319
|
-
|
|
320
|
-
Existing Raw Luau tests remain available for flexible server diagnostics, and saved reports remain unchanged. No settings change is required.`,ko:`기존 자동 플레이테스트는 서버에서 Luau 테스트 코드를 실행하고 로그를 확인하는 방식이었습니다. 서버 로직을 자유롭게 점검하는 데는 유용했지만, 플레이어 화면에 UI가 제대로 표시되는지, 클라이언트에서만 동작하는 기능이 정상인지, 화면의 동작이 실제 서버 결과로 이어졌는지까지 확인하기는 어려웠습니다. 서버 테스트가 통과해도 플레이어가 보는 화면에는 문제가 남을 수 있었습니다.
|
|
321
|
-
|
|
322
|
-
이제 AI Agent가 서버와 클라이언트의 테스트를 나누어 실행합니다. 플레이어 준비 상태, UI 표시 여부와 내용, 게임 오브젝트와 속성, 상호작용 결과, 서버 상태 변화를 단계별로 확인합니다. 서버 결과가 정상이더라도 필수 UI 확인이 실패하거나 클라이언트 증거가 부족하면 테스트를 성공으로 표시하지 않습니다.
|
|
323
|
-
|
|
324
|
-
Dashboard의 플레이테스트 리포트에서는 전체 결과와 소요 시간뿐 아니라 서버, 클라이언트 UI, 상호작용, 화면 항목별 결과를 확인할 수 있습니다. 각 단계에서 기대한 결과와 실제 관찰값, 실패 원인, 테스트 종료 후 정리 결과도 함께 표시됩니다.
|
|
325
|
-
|
|
326
|
-
기존 Raw Luau 테스트는 자유로운 서버 진단이 필요한 경우 계속 사용할 수 있으며, 저장된 기존 리포트도 그대로 유지됩니다. 별도 설정 변경은 필요 없습니다.`,es:`Antes, los Playtests automatizados ejecutaban código de prueba Luau en el servidor y evaluaban los logs. Era útil para diagnosticar libremente la lógica del servidor, pero resultaba difícil comprobar si la UI se mostraba correctamente en la pantalla del jugador, si las funciones exclusivas del cliente funcionaban o si una acción en pantalla producía el resultado esperado en el servidor. Una prueba del servidor podía aprobarse aunque la experiencia del jugador todavía tuviera un problema.
|
|
327
|
-
|
|
328
|
-
Ahora el AI Agent ejecuta por separado las comprobaciones del servidor y del cliente. Verifica paso a paso que el jugador esté listo, la visibilidad y el contenido de la UI, los objetos y propiedades del juego, los resultados de la interacción y los cambios en el estado del servidor. Aunque el resultado del servidor sea correcto, la prueba no se aprueba si falla una comprobación obligatoria de la UI o falta evidencia del cliente.
|
|
329
|
-
|
|
330
|
-
El informe de Playtest del Dashboard muestra el resultado general y la duración, además de los resultados de Servidor, UI del cliente, Interacción y Visual. También muestra los valores esperados y observados en cada paso, los motivos de los fallos y el resultado de la limpieza al finalizar la prueba.
|
|
331
|
-
|
|
332
|
-
Las pruebas Raw Luau existentes siguen disponibles para diagnósticos flexibles del servidor y los informes guardados se conservan sin cambios. No es necesario cambiar ningún ajuste.`,"pt-br":`Antes, os Playtests automatizados executavam código de teste Luau no servidor e avaliavam os logs. Isso era útil para diagnosticar livremente a lógica do servidor, mas não permitia verificar por completo se a UI aparecia corretamente na tela do jogador, se recursos exclusivos do cliente funcionavam ou se uma ação na tela produzia o resultado esperado no servidor. Um teste do servidor podia passar mesmo com um problema ainda visível para o jogador.
|
|
333
|
-
|
|
334
|
-
Agora o AI Agent executa verificações separadas no servidor e no cliente. Ele confirma, etapa por etapa, se o jogador está pronto, a visibilidade e o conteúdo da UI, objetos e propriedades do jogo, resultados de interação e alterações no estado do servidor. Mesmo que o resultado do servidor esteja correto, o teste não passa se uma verificação obrigatória da UI falhar ou se faltarem evidências do cliente.
|
|
335
|
-
|
|
336
|
-
O relatório de Playtest no Dashboard mostra o resultado geral e a duração, além dos resultados de Servidor, UI do cliente, Interação e Visual. Também exibe valores esperados e observados em cada etapa, motivos de falha e o resultado da limpeza após o término do teste.
|
|
337
|
-
|
|
338
|
-
Os testes Raw Luau existentes continuam disponíveis para diagnósticos flexíveis do servidor, e os relatórios salvos permanecem inalterados. Não é necessário alterar nenhuma configuração.`,ja:`従来の自動Playtestは、サーバーでLuauのテストコードを実行し、ログを確認する方式でした。サーバーロジックを柔軟に診断するには便利でしたが、プレイヤー画面にUIが正しく表示されるか、クライアントだけで動く機能が正常か、画面上の操作が期待したサーバー結果につながったかまで確認するのは困難でした。サーバーテストが通っても、プレイヤーが見る画面に問題が残る場合がありました。
|
|
339
|
-
|
|
340
|
-
今回からAI Agentは、サーバーとクライアントのテストを分けて実行します。プレイヤーの準備状態、UIの表示と内容、ゲームオブジェクトとプロパティ、操作結果、サーバー状態の変化をステップごとに確認します。サーバー結果が正常でも、必須のUI確認に失敗した場合やクライアントのエビデンスが不足した場合はテストを成功と判定しません。
|
|
341
|
-
|
|
342
|
-
DashboardのPlaytestレポートでは、全体結果と所要時間に加え、サーバー、クライアントUI、インタラクション、画面の各結果を確認できます。各ステップの期待値と観測値、失敗理由、テスト終了後のクリーンアップ結果も表示されます。
|
|
343
|
-
|
|
344
|
-
既存のRaw Luauテストは柔軟なサーバー診断に引き続き利用でき、保存済みレポートもそのまま維持されます。設定変更は必要ありません。`,id:`Sebelumnya, Playtest otomatis menjalankan kode pengujian Luau di server dan menilai hasilnya melalui log. Cara ini berguna untuk diagnosis logika server secara fleksibel, tetapi sulit memastikan apakah UI tampil dengan benar di layar pemain, apakah perilaku khusus klien bekerja, atau apakah tindakan di layar menghasilkan perubahan server yang diharapkan. Pengujian server dapat lulus meski pengalaman yang dilihat pemain masih bermasalah.
|
|
345
|
-
|
|
346
|
-
Kini AI Agent menjalankan pemeriksaan server dan klien secara terpisah. Kesiapan pemain, tampilan dan isi UI, objek dan properti game, hasil interaksi, serta perubahan status server diperiksa langkah demi langkah. Walaupun hasil server benar, pengujian tidak dinyatakan lulus jika pemeriksaan UI wajib gagal atau bukti dari klien tidak tersedia.
|
|
347
|
-
|
|
348
|
-
Laporan Playtest di Dashboard menampilkan hasil keseluruhan dan durasi, beserta hasil Server, UI Klien, Interaksi, dan Visual. Nilai yang diharapkan dan diamati pada setiap langkah, penyebab kegagalan, serta hasil pembersihan setelah pengujian selesai juga ditampilkan.
|
|
349
|
-
|
|
350
|
-
Pengujian Raw Luau yang ada tetap tersedia untuk diagnosis server yang fleksibel, dan laporan yang telah disimpan tetap dipertahankan. Tidak ada pengaturan yang perlu diubah.`,de:`Bisher führten automatisierte Playtests Luau-Testcode auf dem Server aus und werteten die Logs aus. Das eignete sich für flexible Diagnosen der Serverlogik, konnte aber nicht vollständig prüfen, ob die UI in der Spieleransicht korrekt erscheint, ob reine Client-Funktionen arbeiten oder ob eine Aktion auf dem Bildschirm zum erwarteten Serverergebnis führt. Ein Servertest konnte bestehen, obwohl in der Spieleransicht noch ein Problem vorhanden war.
|
|
351
|
-
|
|
352
|
-
Jetzt führt der AI Agent Server- und Client-Prüfungen getrennt aus. Spielerbereitschaft, Sichtbarkeit und Inhalt der UI, Spielobjekte und Eigenschaften, Interaktionsergebnisse sowie Änderungen des Serverzustands werden Schritt für Schritt geprüft. Auch bei einem korrekten Serverergebnis gilt der Test nicht als bestanden, wenn eine erforderliche UI-Prüfung fehlschlägt oder Client-Nachweise fehlen.
|
|
353
|
-
|
|
354
|
-
Der Playtest-Bericht im Dashboard zeigt das Gesamtergebnis und die Dauer sowie die Ergebnisse für Server, Client-UI, Interaktion und Visuell. Zusätzlich werden für jeden Schritt erwartete und beobachtete Werte, Fehlerursachen und das Bereinigungsergebnis nach Testende angezeigt.
|
|
355
|
-
|
|
356
|
-
Bestehende Raw-Luau-Tests bleiben für flexible Serverdiagnosen verfügbar, und gespeicherte Berichte bleiben unverändert erhalten. Es sind keine Einstellungsänderungen erforderlich.`,"fr-fr":`Auparavant, les Playtests automatisés exécutaient du code de test Luau sur le serveur et évaluaient les logs. Cette méthode était utile pour diagnostiquer librement la logique serveur, mais elle ne permettait pas de vérifier complètement si l’UI s’affichait correctement sur l’écran du joueur, si les fonctions propres au client marchaient ou si une action à l’écran produisait le résultat serveur attendu. Un test serveur pouvait réussir alors qu’un problème subsistait dans l’expérience du joueur.
|
|
357
|
-
|
|
358
|
-
Désormais, l’AI Agent exécute séparément les vérifications serveur et client. Il vérifie étape par étape que le joueur est prêt, l’affichage et le contenu de l’UI, les objets et propriétés du jeu, les résultats d’interaction et les changements d’état du serveur. Même si le résultat serveur est correct, le test ne réussit pas si une vérification UI obligatoire échoue ou si les preuves côté client sont insuffisantes.
|
|
359
|
-
|
|
360
|
-
Le rapport Playtest du Dashboard affiche le résultat global et la durée, ainsi que les résultats Serveur, UI client, Interaction et Visuel. Il présente aussi, pour chaque étape, les valeurs attendues et observées, les causes d’échec et le résultat du nettoyage après le test.
|
|
361
|
-
|
|
362
|
-
Les tests Raw Luau existants restent disponibles pour les diagnostics serveur flexibles, et les rapports enregistrés restent inchangés. Aucun réglage n’est nécessaire.`},severity:"info",category:"release"},{id:"2026-08-27-studio-connection-recovery",date:"2026-08-27",title:{en:"We rebuilt the MCP runtime to reduce Studio disconnects and reconnection delays",ko:"Studio 연결 끊김과 재연결 지연을 줄이기 위해 MCP 구조를 개편했습니다",es:"Reestructuramos MCP para reducir las desconexiones de Studio y las demoras al reconectar","pt-br":"Reestruturamos o MCP para reduzir desconexões do Studio e atrasos na reconexão",ja:"Studioの切断と再接続の待ち時間を減らすため、MCPの構造を刷新しました",id:"Kami merombak struktur MCP untuk mengurangi koneksi Studio yang terputus dan jeda saat tersambung kembali",de:"Wir haben die MCP-Struktur überarbeitet, um Studio-Verbindungsabbrüche und Wartezeiten beim Wiederverbinden zu reduzieren","fr-fr":"Nous avons restructuré MCP pour réduire les déconnexions de Studio et les délais de reconnexion"},body:{en:`Previously, when an AI Agent closed or the MCP Server encountered a problem, the Studio Plugin connection could also be affected, leaving you waiting for reconnection or retrying a request. This update reduces unnecessary disconnects and reconnection delays.
|
|
363
|
-
|
|
364
|
-
When an Agent session closes, the Studio Plugin connection remains active. If the process responsible for the connection exits unexpectedly, an active Agent recovers it automatically and waits for the Studio Plugin to reconnect before processing the next request. A mutating command whose completion cannot be confirmed is not replayed automatically, preventing the same change from being applied twice.
|
|
365
|
-
|
|
366
|
-
To support this, the MCP runtime is separated into one MCP Adapter per Agent and a shared WEPPY Bridge that owns the Studio connection. The Dashboard Connection page shows AI Agents → WEPPY Bridge → Studio Targets and the state of each connection. No settings change is required.`,ko:`기존에는 AI Agent가 종료되거나 MCP Server에 문제가 생기면 Studio Plugin 연결도 영향을 받아, 다시 연결될 때까지 기다리거나 요청을 다시 시도해야 하는 경우가 있었습니다. 이번 업데이트에서는 이런 불필요한 연결 끊김과 재연결 대기를 줄였습니다.
|
|
367
|
-
|
|
368
|
-
Agent 세션이 종료되어도 Studio Plugin 연결은 유지됩니다. 연결을 담당하는 프로세스가 예기치 않게 종료되면 활성 Agent가 자동으로 복구하고, Studio Plugin이 다시 연결된 뒤 다음 요청을 처리합니다. 완료 여부를 확인할 수 없는 변경 명령은 자동으로 반복하지 않아 중복 적용을 막습니다.
|
|
369
|
-
|
|
370
|
-
이를 위해 Agent별 MCP Adapter와 Studio 연결을 담당하는 공유 WEPPY Bridge로 MCP 런타임 구조를 분리했습니다. Dashboard의 Connection 페이지에는 AI Agents → WEPPY Bridge → Studio Targets 구조와 각 연결 상태가 표시됩니다. 별도 설정 변경은 필요 없습니다.`,es:`Antes, si un AI Agent se cerraba o el servidor MCP tenía un problema, la conexión del plugin de Studio también podía verse afectada. Esto podía obligarte a esperar la reconexión o repetir una solicitud. Esta actualización reduce las desconexiones innecesarias y las demoras al reconectar.
|
|
371
|
-
|
|
372
|
-
Cuando termina una sesión del Agent, la conexión del plugin de Studio se mantiene activa. Si el proceso responsable de la conexión se cierra de forma inesperada, un Agent activo lo recupera automáticamente y espera a que el plugin de Studio vuelva a conectarse antes de procesar la siguiente solicitud. Los comandos que modifican contenido y cuyo resultado no puede confirmarse no se repiten automáticamente, lo que evita aplicar dos veces el mismo cambio.
|
|
373
|
-
|
|
374
|
-
Para conseguirlo, el runtime de MCP se divide en un MCP Adapter por Agent y un WEPPY Bridge compartido que mantiene la conexión con Studio. La página Connection del Dashboard muestra AI Agents → WEPPY Bridge → Studio Targets y el estado de cada conexión. No es necesario cambiar ningún ajuste.`,"pt-br":`Antes, quando um AI Agent era encerrado ou o servidor MCP encontrava um problema, a conexão do plugin do Studio também podia ser afetada. Isso podia exigir que você aguardasse a reconexão ou repetisse uma solicitação. Esta atualização reduz desconexões desnecessárias e atrasos na reconexão.
|
|
375
|
-
|
|
376
|
-
Quando uma sessão do Agent é encerrada, a conexão do plugin do Studio permanece ativa. Se o processo responsável pela conexão for encerrado inesperadamente, um Agent ativo o recupera automaticamente e aguarda o plugin do Studio se reconectar antes de processar a próxima solicitação. Comandos que alteram conteúdo e cujo resultado não pode ser confirmado não são repetidos automaticamente, evitando que a mesma alteração seja aplicada duas vezes.
|
|
377
|
-
|
|
378
|
-
Para isso, o runtime do MCP foi separado em um MCP Adapter por Agent e um WEPPY Bridge compartilhado que mantém a conexão com o Studio. A página Connection do Dashboard mostra AI Agents → WEPPY Bridge → Studio Targets e o estado de cada conexão. Não é necessário alterar nenhuma configuração.`,ja:`これまでは、AI Agentが終了したりMCP Serverで問題が発生したりすると、Studio Pluginの接続にも影響し、再接続を待つかリクエストをやり直す場合がありました。今回のアップデートでは、不要な切断と再接続の待ち時間を減らしました。
|
|
379
|
-
|
|
380
|
-
Agentセッションが終了しても、Studio Pluginの接続は維持されます。接続を担当するプロセスが予期せず終了した場合は、稼働中のAgentが自動的に復旧し、Studio Pluginの再接続後に次のリクエストを処理します。完了したか確認できない変更コマンドは自動で繰り返さず、同じ変更が二重に適用されるのを防ぎます。
|
|
381
|
-
|
|
382
|
-
このため、MCPランタイムをAgentごとのMCP Adapterと、Studio接続を管理する共有WEPPY Bridgeに分離しました。DashboardのConnectionページには、AI Agents → WEPPY Bridge → Studio Targetsの構造と各接続状態が表示されます。設定変更は必要ありません。`,id:`Sebelumnya, saat AI Agent ditutup atau MCP Server mengalami masalah, koneksi Studio Plugin juga dapat terdampak. Anda mungkin harus menunggu koneksi pulih atau mengulangi permintaan. Pembaruan ini mengurangi koneksi yang terputus tanpa perlu dan jeda saat tersambung kembali.
|
|
383
|
-
|
|
384
|
-
Saat sesi Agent berakhir, koneksi Studio Plugin tetap aktif. Jika proses yang menangani koneksi berhenti secara tidak terduga, Agent yang aktif memulihkannya secara otomatis dan menunggu Studio Plugin tersambung kembali sebelum memproses permintaan berikutnya. Perintah yang mengubah konten dan hasil akhirnya tidak dapat dipastikan tidak diulang secara otomatis, sehingga perubahan yang sama tidak diterapkan dua kali.
|
|
385
|
-
|
|
386
|
-
Untuk mendukungnya, runtime MCP dipisahkan menjadi satu MCP Adapter untuk setiap Agent dan WEPPY Bridge bersama yang menangani koneksi Studio. Halaman Connection di Dashboard menampilkan AI Agents → WEPPY Bridge → Studio Targets beserta status setiap koneksi. Tidak ada pengaturan yang perlu diubah.`,de:`Bisher konnte die Verbindung des Studio Plugins beeinträchtigt werden, wenn ein AI Agent beendet wurde oder beim MCP Server ein Problem auftrat. Dadurch mussten Sie unter Umständen auf die Wiederverbindung warten oder eine Anfrage erneut senden. Dieses Update reduziert unnötige Verbindungsabbrüche und Wartezeiten beim Wiederverbinden.
|
|
387
|
-
|
|
388
|
-
Wenn eine Agent-Sitzung endet, bleibt die Verbindung des Studio Plugins aktiv. Wird der für die Verbindung zuständige Prozess unerwartet beendet, stellt ein aktiver Agent ihn automatisch wieder her und wartet auf die erneute Verbindung des Studio Plugins, bevor die nächste Anfrage verarbeitet wird. Ändernde Befehle, deren Abschluss nicht bestätigt werden kann, werden nicht automatisch wiederholt. So wird dieselbe Änderung nicht doppelt angewendet.
|
|
389
|
-
|
|
390
|
-
Dafür wurde die MCP-Laufzeit in einen MCP Adapter pro Agent und eine gemeinsame WEPPY Bridge aufgeteilt, die die Studio-Verbindung verwaltet. Die Connection-Seite im Dashboard zeigt AI Agents → WEPPY Bridge → Studio Targets sowie den Status jeder Verbindung. Es sind keine Einstellungsänderungen erforderlich.`,"fr-fr":`Auparavant, la fermeture d’un AI Agent ou un problème du serveur MCP pouvait aussi affecter la connexion du plugin Studio. Il fallait alors parfois attendre la reconnexion ou relancer une requête. Cette mise à jour réduit les déconnexions inutiles et les délais de reconnexion.
|
|
391
|
-
|
|
392
|
-
Lorsqu’une session Agent se termine, la connexion du plugin Studio reste active. Si le processus chargé de la connexion s’arrête de manière inattendue, un Agent actif le rétablit automatiquement et attend que le plugin Studio se reconnecte avant de traiter la requête suivante. Une commande de modification dont l’achèvement ne peut pas être confirmé n’est pas relancée automatiquement, ce qui évite d’appliquer deux fois le même changement.
|
|
393
|
-
|
|
394
|
-
Pour cela, le runtime MCP est séparé entre un MCP Adapter par Agent et un WEPPY Bridge partagé qui gère la connexion Studio. La page Connection du Dashboard affiche AI Agents → WEPPY Bridge → Studio Targets ainsi que l’état de chaque connexion. Aucun réglage n’est nécessaire.`},severity:"info",category:"release",version:"mcp-server 2.15.0"},{id:"2026-08-25-dashboard-auto-open-settings",date:"2026-08-25",title:{en:"Dashboard auto-open has moved to Settings",ko:"Dashboard 자동 열기를 Settings에서 설정하세요",es:"La apertura automática del Dashboard se trasladó a Settings","pt-br":"A abertura automática do Dashboard foi movida para Settings",ja:"Dashboardの自動起動設定をSettingsに移動しました",id:"Pengaturan buka otomatis Dashboard pindah ke Settings",de:"Das automatische Öffnen des Dashboards ist jetzt in den Settings","fr-fr":"L’ouverture automatique du Dashboard se règle maintenant dans Settings"},body:{en:`Dashboard auto-open is now a saved Dashboard setting. DASHBOARD_AUTO_OPEN is no longer used. Auto-open is On by default, and changes apply from the next MCP Server start.
|
|
395
|
-
|
|
396
|
-
Open Settings to turn it on or off at any time. You can also ask your Agent to change Dashboard auto-open for you.`,ko:`Dashboard 자동 열기는 이제 Dashboard에 저장되는 설정으로 관리합니다. DASHBOARD_AUTO_OPEN 환경변수는 더 이상 사용하지 않습니다. 기본값은 켜짐이며, 변경한 값은 다음 MCP 서버 시작부터 적용됩니다.
|
|
397
|
-
|
|
398
|
-
Settings에서 언제든지 켜거나 끌 수 있습니다. Agent에게 Dashboard 자동 열기 설정을 변경해 달라고 요청할 수도 있습니다.`,es:`La apertura automática del Dashboard ahora es una opción guardada en el propio Dashboard. DASHBOARD_AUTO_OPEN ya no se utiliza. Está activada de forma predeterminada y los cambios se aplican en el próximo inicio del servidor MCP.
|
|
399
|
-
|
|
400
|
-
Abre Settings para activarla o desactivarla cuando quieras. También puedes pedirle a tu Agent que cambie la apertura automática del Dashboard.`,"pt-br":`A abertura automática do Dashboard agora é uma configuração salva no próprio Dashboard. DASHBOARD_AUTO_OPEN não é mais usada. Ela fica ativada por padrão e as alterações valem a partir da próxima inicialização do servidor MCP.
|
|
401
|
-
|
|
402
|
-
Abra Settings para ativar ou desativar quando quiser. Você também pode pedir ao Agent para alterar a abertura automática do Dashboard.`,ja:`Dashboardの自動起動は、Dashboardに保存される設定になりました。DASHBOARD_AUTO_OPENは使用されなくなりました。初期値はオンで、変更は次回のMCPサーバー起動時から適用されます。
|
|
403
|
-
|
|
404
|
-
Settingsでいつでもオンまたはオフにできます。AgentにDashboardの自動起動設定を変更するよう依頼することもできます。`,id:`Buka otomatis Dashboard kini menjadi pengaturan yang disimpan di Dashboard. DASHBOARD_AUTO_OPEN tidak lagi digunakan. Pengaturan ini aktif secara default dan perubahan berlaku saat server MCP dimulai berikutnya.
|
|
405
|
-
|
|
406
|
-
Buka Settings untuk mengaktifkan atau menonaktifkannya kapan saja. Anda juga dapat meminta Agent mengubah pengaturan buka otomatis Dashboard.`,de:`Das automatische Öffnen des Dashboards ist jetzt eine im Dashboard gespeicherte Einstellung. DASHBOARD_AUTO_OPEN wird nicht mehr verwendet. Die Einstellung ist standardmäßig aktiviert; Änderungen gelten ab dem nächsten Start des MCP-Servers.
|
|
407
|
-
|
|
408
|
-
Unter Settings können Sie sie jederzeit ein- oder ausschalten. Sie können auch Ihren Agent bitten, das automatische Öffnen des Dashboards zu ändern.`,"fr-fr":`L’ouverture automatique du Dashboard est maintenant un réglage enregistré dans le Dashboard. DASHBOARD_AUTO_OPEN n’est plus utilisé. Ce réglage est activé par défaut et les modifications s’appliquent au prochain démarrage du serveur MCP.
|
|
409
|
-
|
|
410
|
-
Ouvrez Settings pour l’activer ou le désactiver à tout moment. Vous pouvez aussi demander à votre Agent de modifier l’ouverture automatique du Dashboard.`},severity:"warning",category:"deprecation",links:[{url:"/settings?section=dashboard",label:{en:"Open Dashboard Settings",ko:"Dashboard 설정 열기",es:"Abrir ajustes del Dashboard","pt-br":"Abrir configurações do Dashboard",ja:"Dashboard設定を開く",id:"Buka pengaturan Dashboard",de:"Dashboard-Einstellungen öffnen","fr-fr":"Ouvrir les réglages du Dashboard"}}]},{id:"2026-08-24-sync-policy-workflows",date:"2026-08-24",title:{en:"Sync settings are now simpler and workflow-based",ko:"Sync 설정을 workflow 중심으로 단순화했습니다",es:"Simplificamos la configuración de Sync con workflows","pt-br":"Simplificamos as configurações do Sync com workflows",ja:"Sync設定をワークフロー中心に簡素化しました",id:"Pengaturan Sync kini lebih sederhana dengan workflow",de:"Sync-Einstellungen sind jetzt einfacher und workflow-basiert","fr-fr":"Les réglages Sync sont maintenant simplifiés autour de workflows"},body:{en:`Sync settings are now easier to understand and use. Common choices are grouped into purpose-based workflows: Studio First, Bidirectional Review, and Local Code, Studio World. Choosing one sets the related sync directions and apply behavior together. Use Custom only when you need to configure script source, properties, structure, and service properties separately. Each setting now explains what it controls and why it may be unavailable.
|
|
411
|
-
|
|
412
|
-
For first-time use, Sync and Start on connection are both Off, and the default workflow is Studio First. Existing saved Sync and Start on connection values are preserved. A local file deletion can remove the matching Studio instance only when you explicitly enable the separate delete-safety setting.
|
|
413
|
-
|
|
414
|
-
Your previous Sync settings are converted to the new workflow model automatically, so most users do not need to configure anything again. If your old settings combine multiple directions and automatic apply options in a way that cannot be converted safely, Sync pauses to prevent unintended changes. Open the Sync tab in the Studio Plugin and choose a workflow once to continue.
|
|
415
|
-
|
|
416
|
-
The MCP Server and Studio Plugin must use the same release. If their versions differ, connection and Sync are blocked. Update both to the same release, then restart Roblox Studio.`,ko:`Sync 설정이 복잡하고 각 옵션의 동작을 이해하기 어려웠던 부분을 개선했습니다. 자주 사용하는 설정을 작업 목적별 workflow로 묶어 Studio 우선, 양방향 검토, 로컬 코드 + Studio 월드 중 하나를 선택하면 필요한 동기화 방향과 적용 방식이 함께 설정됩니다. 세부 조정이 필요할 때만 Custom에서 스크립트 소스, 속성, 구조, 서비스 속성을 각각 설정할 수 있으며, 각 항목에서 기능 범위와 현재 사용할 수 없는 이유를 바로 확인할 수 있습니다.
|
|
417
|
-
|
|
418
|
-
처음 Sync를 사용하는 경우 Sync와 연결 시 자동 시작은 모두 꺼진 상태로 시작하며, 기본 workflow는 Studio 우선입니다. 기존에 저장한 Sync 켜짐/꺼짐과 자동 시작 값은 그대로 유지됩니다. 로컬 파일 삭제가 Studio 인스턴스 삭제로 이어지는 기능은 별도 안전 설정을 직접 켠 경우에만 적용됩니다.
|
|
419
|
-
|
|
420
|
-
업데이트 전에 사용하던 Sync 설정은 새 방식에 맞게 자동으로 바뀌므로 대부분 별도로 설정할 필요가 없습니다. 다만 기존 설정에 여러 동기화 방향과 자동 적용 옵션이 복잡하게 조합되어 있으면, 의도하지 않은 변경을 막기 위해 Sync를 바로 시작하지 않습니다. 이때 Studio Plugin의 Sync 탭에서 원하는 workflow를 한 번 선택하면 계속 사용할 수 있습니다.
|
|
421
|
-
|
|
422
|
-
MCP Server와 Studio Plugin은 같은 release를 사용해야 합니다. 버전이 다르면 연결과 Sync가 차단되므로 둘을 같은 release로 업데이트하고 Roblox Studio를 재시작하세요.`,es:`La configuración de Sync ahora es más sencilla de entender y usar. Las opciones habituales se agrupan en workflows según el objetivo: Studio primero, Revisión bidireccional y Código local + mundo de Studio. Al elegir uno, las direcciones de sincronización y la forma de aplicar los cambios se configuran juntas. Usa Personalizado solo cuando necesites ajustar por separado el código de scripts, las propiedades, la estructura y las propiedades de servicios. Cada opción explica qué controla y por qué puede no estar disponible.
|
|
423
|
-
|
|
424
|
-
La primera vez, Sync y el inicio al conectar comienzan desactivados, y el workflow predeterminado es Studio primero. Se conservan los valores de Sync y de inicio al conectar que ya hayas guardado. Eliminar un archivo local solo puede borrar la instancia correspondiente de Studio cuando activas expresamente la opción de seguridad independiente.
|
|
425
|
-
|
|
426
|
-
La configuración de Sync que usabas antes se adapta automáticamente al nuevo modelo, por lo que la mayoría de los usuarios no tiene que configurarla de nuevo. Si la configuración anterior combina varias direcciones y opciones de aplicación automática de una forma que no puede convertirse con seguridad, Sync se detiene para evitar cambios no deseados. Abre la pestaña Sync del plugin de Studio y elige un workflow una vez para continuar.
|
|
427
|
-
|
|
428
|
-
El servidor MCP y el plugin de Studio deben usar la misma versión. Si las versiones son diferentes, la conexión y Sync se bloquean. Actualiza ambos a la misma versión y reinicia Roblox Studio.`,"pt-br":`As configurações do Sync agora estão mais fáceis de entender e usar. As opções mais comuns foram agrupadas em workflows por objetivo: Studio primeiro, Revisão bidirecional e Código local + mundo do Studio. Ao escolher um deles, as direções de sincronização e a forma de aplicar as mudanças são configuradas em conjunto. Use Personalizado apenas quando precisar ajustar separadamente o código dos scripts, as propriedades, a estrutura e as propriedades dos serviços. Cada opção explica o que controla e por que pode estar indisponível.
|
|
429
|
-
|
|
430
|
-
No primeiro uso, o Sync e a inicialização ao conectar começam desativados, e o workflow padrão é Studio primeiro. Os valores já salvos para o Sync e a inicialização ao conectar são mantidos. A exclusão de um arquivo local só pode remover a instância correspondente no Studio quando você ativa explicitamente a opção de segurança separada.
|
|
431
|
-
|
|
432
|
-
As configurações do Sync usadas antes da atualização são adaptadas automaticamente ao novo modelo, então a maioria dos usuários não precisa configurar tudo novamente. Se as configurações anteriores combinarem várias direções e opções de aplicação automática de uma forma que não possa ser convertida com segurança, o Sync será pausado para evitar mudanças indesejadas. Abra a aba Sync no plugin do Studio e escolha um workflow uma vez para continuar.
|
|
433
|
-
|
|
434
|
-
O servidor MCP e o plugin do Studio devem usar a mesma versão. Se as versões forem diferentes, a conexão e o Sync serão bloqueados. Atualize ambos para a mesma versão e reinicie o Roblox Studio.`,ja:`Sync設定を理解しやすく、使いやすい形に整理しました。よく使う設定を目的別のワークフローにまとめ、Studio優先、双方向レビュー、ローカルコード+Studioワールドのいずれかを選ぶと、必要な同期方向と適用方法がまとめて設定されます。個別調整が必要な場合だけ、カスタムでスクリプトソース、プロパティ、構造、サービスプロパティを別々に設定できます。各項目では、対象となる機能と現在使用できない理由も確認できます。
|
|
435
|
-
|
|
436
|
-
初めてSyncを使う場合、Syncと接続時の自動開始はどちらもOFFで始まり、標準のワークフローはStudio優先です。保存済みのSyncと接続時の自動開始の値はそのまま維持されます。ローカルファイルの削除で対応するStudioインスタンスを削除する機能は、別の安全設定を明示的に有効にした場合のみ適用されます。
|
|
437
|
-
|
|
438
|
-
アップデート前のSync設定は新しい方式に自動で切り替わるため、ほとんどの場合は再設定する必要がありません。ただし、以前の設定で複数の同期方向と自動適用オプションが複雑に組み合わされている場合は、意図しない変更を防ぐためSyncを一時停止します。その場合はStudio PluginのSyncタブを開き、使用するワークフローを一度選択すると続行できます。
|
|
439
|
-
|
|
440
|
-
MCP ServerとStudio Pluginは同じリリースを使用する必要があります。バージョンが異なる場合は接続とSyncがブロックされます。両方を同じリリースに更新してからRoblox Studioを再起動してください。`,id:`Pengaturan Sync kini lebih mudah dipahami dan digunakan. Pilihan yang umum dikelompokkan ke dalam workflow berdasarkan tujuan: Studio First, Bidirectional Review, dan Local Code + Studio World. Saat Anda memilih salah satunya, arah sinkronisasi dan cara penerapan perubahan terkait akan diatur bersama. Gunakan Kustom hanya jika Anda perlu mengatur sumber script, properti, struktur, dan properti layanan secara terpisah. Setiap opsi menjelaskan apa yang dikontrol dan mengapa opsi tersebut mungkin tidak tersedia.
|
|
441
|
-
|
|
442
|
-
Saat pertama kali digunakan, Sync dan mulai saat terhubung sama-sama dalam keadaan Off, dengan Studio First sebagai workflow default. Nilai Sync dan mulai saat terhubung yang sudah disimpan tetap dipertahankan. Penghapusan file lokal hanya dapat menghapus instance Studio yang sesuai jika Anda secara khusus mengaktifkan pengaturan keamanan terpisah.
|
|
443
|
-
|
|
444
|
-
Pengaturan Sync sebelum pembaruan disesuaikan secara otomatis ke model baru, sehingga sebagian besar pengguna tidak perlu mengaturnya kembali. Jika pengaturan lama menggabungkan beberapa arah dan opsi penerapan otomatis dengan cara yang tidak dapat dikonversi dengan aman, Sync akan dijeda untuk mencegah perubahan yang tidak diinginkan. Buka tab Sync di Studio Plugin dan pilih workflow satu kali untuk melanjutkan.
|
|
445
|
-
|
|
446
|
-
MCP Server dan Studio Plugin harus menggunakan rilis yang sama. Jika versinya berbeda, koneksi dan Sync akan diblokir. Perbarui keduanya ke rilis yang sama, lalu mulai ulang Roblox Studio.`,de:`Die Sync-Einstellungen sind jetzt leichter zu verstehen und zu verwenden. Häufige Optionen sind nach Zweck in Workflows zusammengefasst: Studio zuerst, Bidirektionale Prüfung und Lokaler Code + Studio-Welt. Mit der Auswahl werden die zugehörigen Sync-Richtungen und die Anwendung der Änderungen gemeinsam eingestellt. Benutzerdefiniert benötigen Sie nur, wenn Sie Script-Quelltext, Eigenschaften, Struktur und Service-Eigenschaften einzeln festlegen möchten. Jede Option erklärt, was sie steuert und warum sie möglicherweise nicht verfügbar ist.
|
|
447
|
-
|
|
448
|
-
Bei der ersten Nutzung sind Sync und Start beim Verbinden ausgeschaltet; der Standard-Workflow ist Studio zuerst. Bereits gespeicherte Werte für Sync und Start beim Verbinden bleiben erhalten. Das Löschen einer lokalen Datei kann die passende Studio-Instanz nur entfernen, wenn Sie die separate Sicherheitseinstellung ausdrücklich aktivieren.
|
|
449
|
-
|
|
450
|
-
Ihre bisherigen Sync-Einstellungen werden automatisch an das neue Modell angepasst, sodass die meisten Nutzer nichts neu konfigurieren müssen. Wenn die bisherigen Einstellungen mehrere Richtungen und automatische Anwendungsoptionen so kombinieren, dass sie nicht sicher konvertiert werden können, wird Sync angehalten, um unbeabsichtigte Änderungen zu verhindern. Öffnen Sie dann im Studio Plugin den Tab Sync und wählen Sie einmal einen Workflow aus, um fortzufahren.
|
|
451
|
-
|
|
452
|
-
MCP Server und Studio Plugin müssen dasselbe Release verwenden. Bei unterschiedlichen Versionen werden Verbindung und Sync blockiert. Aktualisieren Sie beide auf dasselbe Release und starten Sie Roblox Studio neu.`,"fr-fr":`Les réglages Sync sont maintenant plus simples à comprendre et à utiliser. Les choix courants sont regroupés dans des workflows adaptés à chaque objectif : Studio d’abord, Révision bidirectionnelle et Code local + monde Studio. En choisissant l’un d’eux, les directions de synchronisation et le mode d’application correspondant sont configurés ensemble. Utilisez Personnalisé uniquement si vous devez régler séparément la source des scripts, les propriétés, la structure et les propriétés des services. Chaque option explique ce qu’elle contrôle et pourquoi elle peut être indisponible.
|
|
453
|
-
|
|
454
|
-
Lors de la première utilisation, Sync et le démarrage à la connexion sont désactivés, et le workflow par défaut est Studio d’abord. Les valeurs déjà enregistrées pour Sync et le démarrage à la connexion sont conservées. La suppression d’un fichier local ne peut retirer l’instance Studio correspondante que si vous activez explicitement le réglage de sécurité séparé.
|
|
455
|
-
|
|
456
|
-
Vos anciens réglages Sync sont automatiquement adaptés au nouveau modèle. La plupart des utilisateurs n’ont donc rien à reconfigurer. Si les anciens réglages combinent plusieurs directions et options d’application automatique d’une manière qui ne peut pas être convertie sans risque, Sync se met en pause pour éviter des changements involontaires. Ouvrez l’onglet Sync du Studio Plugin et choisissez une fois le workflow souhaité pour continuer.
|
|
457
|
-
|
|
458
|
-
MCP Server et Studio Plugin doivent utiliser la même release. Si leurs versions diffèrent, la connexion et Sync sont bloqués. Mettez les deux à jour vers la même release, puis redémarrez Roblox Studio.`},severity:"info",category:"release"},{id:"2026-08-20-ui-studio-visual-workflow",date:"2026-08-20",title:{en:"UI Studio now connects UI creation and review",ko:"UI Studio의 UI 제작과 검토 흐름을 개선했습니다",es:"UI Studio mejora el flujo de creación y revisión de interfaces","pt-br":"O UI Studio melhora o fluxo de criação e revisão de interfaces",ja:"UI StudioのUI制作とレビューの流れを改善しました",id:"UI Studio meningkatkan alur pembuatan dan review UI",de:"UI Studio verbindet UI-Erstellung und Prüfung","fr-fr":"UI Studio améliore le workflow de création et de révision des interfaces"},body:{en:`UI Studio now uses your game's existing screens and assets to shape the UI direction, then reviews the result in a representative view. The AI first clarifies the purpose, target screen, and devices, plans the composition, and compares actual captures and reference material to decide whether to recompose, refine, or approve the result.
|
|
459
|
-
|
|
460
|
-
For UI that sits over gameplay, such as a HUD, the review includes the actual gameplay view. UI Studio detects panel overlap that hides important content or buttons, and keeps image-dependent compositions in review until the required asset is ready.
|
|
461
|
-
|
|
462
|
-
With an agent that supports image generation, such as Codex, you can create icons, backgrounds, and decorative artwork in the conversation. WEPPY then continues with Asset Library storage, Roblox upload, and UI application in the same workflow. This connects image generation, Roblox upload, and UI application while reducing the need to move files or paste asset IDs manually. Image generation and Roblox upload require separate user approval.
|
|
463
|
-
|
|
464
|
-
In Dashboard UI Studio, visual quality, functional issues, and per-screen-size review status are shown separately. Work that requires per-screen-size review is marked ready only after the declared screens are checked. No setup or migration is required. UI Studio is available on Pro.`,ko:`UI Studio가 기존 게임의 화면과 에셋을 참고해 UI 방향을 잡고, 제작한 결과를 대표 화면에서 다시 검토하도록 개선했습니다. AI는 목적, 대상 화면, 기기를 먼저 정리한 뒤 화면 구성을 계획하고, 실제 캡처와 참고 자료를 비교해 다시 구성할지, 세부를 다듬을지, 완료할지 판단합니다.
|
|
465
|
-
|
|
466
|
-
HUD처럼 게임 화면 위에 놓이는 UI는 실제 플레이 화면과 함께 검토합니다. 중요한 콘텐츠나 버튼을 가리는 패널 겹침을 찾고, 이미지가 필요한 구성은 사용할 에셋이 준비될 때까지 완료로 표시하지 않습니다.
|
|
467
|
-
|
|
468
|
-
Codex처럼 이미지 생성 기능을 지원하는 AI agent를 사용하면 UI에 필요한 아이콘, 배경, 장식 이미지를 대화 안에서 만들고 Asset Library 저장, Roblox 업로드, UI 적용까지 같은 작업 흐름에서 이어갈 수 있습니다. 이미지 생성과 Roblox 업로드는 각각 사용자의 승인을 거치며, 파일을 직접 옮기거나 asset ID를 복사해 붙이는 단계를 줄일 수 있습니다.
|
|
469
|
-
|
|
470
|
-
Dashboard의 UI Studio에서는 시각 완성도, 기능상 문제, 화면 크기별 검토 상태를 나눠 볼 수 있습니다. 화면 크기별 검토가 필수인 작업은 지정한 화면까지 확인해야 준비 완료로 표시됩니다. 별도 설정이나 migration은 필요하지 않습니다. UI Studio는 Pro에서 사용할 수 있습니다.`,es:`UI Studio ahora usa las pantallas y los assets existentes de tu juego para definir la dirección visual y revisa el resultado en una vista representativa. La IA primero aclara el propósito, la pantalla de destino y los dispositivos, planifica la composición y compara capturas reales con el material de referencia para decidir si debe recomponer, ajustar o aprobar el resultado.
|
|
471
|
-
|
|
472
|
-
En interfaces superpuestas al juego, como un HUD, la revisión incluye la vista real de juego. UI Studio detecta paneles que se solapan y ocultan contenido o botones importantes, y mantiene en revisión las composiciones que necesitan imágenes hasta que el asset requerido esté listo.
|
|
473
|
-
|
|
474
|
-
Con un agente que admita generación de imágenes, como Codex, puedes crear iconos, fondos y elementos decorativos dentro de la conversación y continuar en el mismo flujo con el guardado en Asset Library, la subida a Roblox y la aplicación en la interfaz. La generación de imágenes y la subida a Roblox requieren aprobaciones separadas del usuario y reducen la necesidad de mover archivos o copiar asset IDs manualmente.
|
|
475
|
-
|
|
476
|
-
En UI Studio del Dashboard, la calidad visual, los problemas funcionales y el estado de revisión por tamaño de pantalla se muestran por separado. Los trabajos que requieren revisar varios tamaños solo aparecen como listos después de comprobar las pantallas definidas. No se necesita configuración ni migración adicional. UI Studio está disponible en Pro.`,"pt-br":`O UI Studio agora usa as telas e os assets existentes do seu jogo para definir a direção visual e revisa o resultado em uma visualização representativa. A IA primeiro esclarece o objetivo, a tela de destino e os dispositivos, planeja a composição e compara capturas reais com o material de referência para decidir se deve recompor, refinar ou aprovar o resultado.
|
|
477
|
-
|
|
478
|
-
Em interfaces sobrepostas ao jogo, como um HUD, a revisão inclui a tela real de gameplay. O UI Studio detecta painéis sobrepostos que escondem conteúdo ou botões importantes e mantém em revisão as composições que precisam de imagens até que o asset necessário esteja pronto.
|
|
479
|
-
|
|
480
|
-
Com um agente que oferece geração de imagens, como o Codex, você pode criar ícones, fundos e elementos decorativos na conversa e seguir no mesmo fluxo com o armazenamento na Asset Library, o upload para o Roblox e a aplicação na interface. A geração da imagem e o upload para o Roblox exigem aprovações separadas do usuário e reduzem a necessidade de mover arquivos ou copiar asset IDs manualmente.
|
|
481
|
-
|
|
482
|
-
No UI Studio do Dashboard, a qualidade visual, os problemas funcionais e o status da revisão por tamanho de tela aparecem separadamente. Trabalhos que exigem revisão em vários tamanhos só ficam prontos depois que as telas definidas são verificadas. Nenhuma configuração ou migração adicional é necessária. O UI Studio está disponível no Pro.`,ja:`UI Studioは、ゲーム内の既存画面やアセットを参考にUIの方向性を決め、完成した結果を代表画面で再確認するようになりました。AIは目的、対象画面、デバイスを先に整理して構成を計画し、実際のキャプチャと参考資料を比較して、再構成、調整、承認のどれが必要かを判断します。
|
|
483
|
-
|
|
484
|
-
HUDのようにゲーム画面に重なるUIは、実際のゲームプレイ画面と一緒に確認します。重要なコンテンツやボタンを隠すパネルの重なりを検出し、画像が必要な構成は必要なアセットが準備されるまでレビュー中として扱います。
|
|
485
|
-
|
|
486
|
-
Codexのように画像生成に対応したAIエージェントを使うと、会話の中でアイコン、背景、装飾画像を作成し、Asset Libraryへの保存、Robloxへのアップロード、UIへの適用まで同じ作業フローで進められます。画像生成とRobloxへのアップロードはそれぞれユーザーの承認を必要とし、ファイルの移動やasset IDの手動コピーを減らせます。
|
|
487
|
-
|
|
488
|
-
DashboardのUI Studioでは、見た目の完成度、機能上の問題、画面サイズ別のレビュー状態を分けて確認できます。画面サイズ別レビューが必須の作業は、指定した画面を確認した後に準備完了と表示されます。追加設定や移行は不要です。UI StudioはProで利用できます。`,id:`UI Studio kini menggunakan layar dan asset yang sudah ada di game Anda untuk menentukan arah UI, lalu meninjau hasilnya pada tampilan yang mewakili penggunaan sebenarnya. AI terlebih dahulu memperjelas tujuan, layar target, dan perangkat, merencanakan komposisi, lalu membandingkan tangkapan aktual dengan materi referensi untuk memutuskan apakah hasil perlu disusun ulang, disempurnakan, atau disetujui.
|
|
489
|
-
|
|
490
|
-
Untuk UI yang berada di atas gameplay, seperti HUD, review menyertakan tampilan gameplay sebenarnya. UI Studio mendeteksi panel bertumpuk yang menutupi konten atau tombol penting dan mempertahankan komposisi yang memerlukan gambar dalam status review sampai asset yang diperlukan siap.
|
|
491
|
-
|
|
492
|
-
Dengan agen yang mendukung pembuatan gambar, seperti Codex, Anda dapat membuat ikon, latar, dan gambar dekoratif di dalam percakapan, lalu melanjutkan penyimpanan ke Asset Library, upload ke Roblox, dan penerapan ke UI dalam alur kerja yang sama. Pembuatan gambar dan upload ke Roblox memerlukan persetujuan pengguna yang terpisah serta mengurangi kebutuhan memindahkan file atau menyalin asset ID secara manual.
|
|
493
|
-
|
|
494
|
-
Di UI Studio pada Dashboard, kualitas visual, masalah fungsional, dan status review per ukuran layar ditampilkan secara terpisah. Pekerjaan yang mewajibkan review per ukuran layar baru ditandai siap setelah layar yang ditentukan diperiksa. Tidak diperlukan pengaturan atau migrasi tambahan. UI Studio tersedia di Pro.`,de:`UI Studio verwendet jetzt vorhandene Bildschirme und Assets Ihres Spiels, um die UI-Richtung festzulegen, und prüft das Ergebnis anschließend in einer repräsentativen Ansicht. Die KI klärt zuerst Zweck, Zielbildschirm und Geräte, plant die Komposition und vergleicht tatsächliche Aufnahmen mit Referenzmaterial, um zu entscheiden, ob das Ergebnis neu aufgebaut, verfeinert oder freigegeben werden soll.
|
|
495
|
-
|
|
496
|
-
Bei UI über dem Spielgeschehen, etwa einem HUD, umfasst die Prüfung die tatsächliche Gameplay-Ansicht. UI Studio erkennt überlappende Panels, die wichtige Inhalte oder Schaltflächen verdecken, und lässt bildabhängige Kompositionen in Prüfung, bis das benötigte Asset bereitsteht.
|
|
497
|
-
|
|
498
|
-
Mit einem Agenten, der Bilder erzeugen kann, etwa Codex, erstellen Sie Icons, Hintergründe und dekorative Grafiken im Gespräch und setzen denselben Workflow mit der Speicherung in der Asset Library, dem Roblox-Upload und der Anwendung auf die UI fort. Bilderzeugung und Roblox-Upload benötigen jeweils eine separate Zustimmung des Benutzers und verringern das manuelle Verschieben von Dateien oder Kopieren von asset IDs.
|
|
499
|
-
|
|
500
|
-
In UI Studio im Dashboard werden visuelle Qualität, funktionale Probleme und der Prüfstatus je Bildschirmgröße getrennt angezeigt. Arbeiten mit verpflichtender Prüfung mehrerer Bildschirmgrößen gelten erst als bereit, nachdem die festgelegten Ansichten geprüft wurden. Zusätzliche Einrichtung oder Migration ist nicht erforderlich. UI Studio ist in Pro verfügbar.`,"fr-fr":`UI Studio utilise maintenant les écrans et assets existants de votre jeu pour définir la direction visuelle, puis vérifie le résultat dans une vue représentative. L’IA précise d’abord l’objectif, l’écran cible et les appareils, planifie la composition et compare les captures réelles aux références pour déterminer s’il faut recomposer, affiner ou approuver le résultat.
|
|
501
|
-
|
|
502
|
-
Pour une interface superposée au jeu, comme un HUD, la révision inclut la vue de gameplay réelle. UI Studio détecte les panneaux qui se chevauchent et masquent du contenu ou des boutons importants, et conserve en révision les compositions qui nécessitent une image jusqu’à ce que l’asset requis soit prêt.
|
|
503
|
-
|
|
504
|
-
Avec un agent capable de générer des images, comme Codex, vous pouvez créer des icônes, des arrière-plans et des éléments décoratifs dans la conversation, puis poursuivre le même workflow avec l’enregistrement dans l’Asset Library, l’import dans Roblox et l’application à l’interface. La génération d’image et l’import dans Roblox nécessitent des approbations utilisateur distinctes et réduisent les déplacements de fichiers ou la copie manuelle des asset IDs.
|
|
505
|
-
|
|
506
|
-
Dans UI Studio du Dashboard, la qualité visuelle, les problèmes fonctionnels et l’état de la révision par taille d’écran sont affichés séparément. Un travail qui exige la vérification de plusieurs tailles n’est indiqué comme prêt qu’après le contrôle des écrans définis. Aucune configuration ni migration supplémentaire n’est nécessaire. UI Studio est disponible avec Pro.`},severity:"info",category:"release",version:"mcp-server 2.14.0",links:[{url:{en:"https://weppyai.com/en/blog/roblox-ui-ai-workflow/",ko:"https://weppyai.com/ko/blog/roblox-ui-ai-workflow/",es:"https://weppyai.com/es/blog/roblox-ui-ai-workflow/","pt-br":"https://weppyai.com/pt-br/blog/roblox-ui-ai-workflow/",ja:"https://weppyai.com/ja/blog/roblox-ui-ai-workflow/",id:"https://weppyai.com/id/blog/roblox-ui-ai-workflow/",de:"https://weppyai.com/de/blog/roblox-ui-ai-workflow/","fr-fr":"https://weppyai.com/fr-fr/blog/roblox-ui-ai-workflow/"},label:{en:"See the full Roblox UI workflow",ko:"UI Studio로 Roblox UI 만드는 전체 흐름 보기",es:"Ver el flujo completo para crear interfaces de Roblox","pt-br":"Veja o fluxo completo para criar interfaces do Roblox",ja:"Roblox UI制作の全フローを見る",id:"Lihat alur lengkap pembuatan UI Roblox",de:"Vollständigen Roblox-UI-Workflow ansehen","fr-fr":"Voir le workflow complet de création d’interface Roblox"}}]},{id:"2026-08-13-asset-organization",date:"2026-08-13",title:{en:"Browse your Assets by folder or as one list",ko:"Assets를 폴더별로 정리해서 보세요",es:"Organiza tus Assets por carpetas o en una sola lista","pt-br":"Organize seus Assets por pastas ou em uma lista única",ja:"Assetsをフォルダー別または一覧で表示できます",id:"Kelola Asset berdasarkan folder atau dalam satu daftar",de:"Assets nach Ordnern oder als eine Liste anzeigen","fr-fr":"Parcourez vos Assets par dossier ou dans une seule liste"},body:{en:`The Dashboard Assets page now has a folder-based view. Open a folder to see its subfolders and assets, then use the breadcrumb to move back through nested folders.
|
|
507
|
-
|
|
508
|
-
Choose All assets when you want to see the matching assets without folder grouping. Choose All scopes to view assets from the current Place and the shared library together.
|
|
509
|
-
|
|
510
|
-
The existing Images, Decals, and RBXM category filters remain available. Grid and List layouts and Small, Medium, and Large thumbnail sizes can be changed independently. Your choices are remembered the next time you open Assets.
|
|
511
|
-
|
|
512
|
-
Your existing Asset Library data and folder paths are unchanged. No migration is required.`,ko:`Dashboard Assets 페이지에서 에셋을 폴더 단위로 탐색할 수 있습니다. 폴더를 열면 하위 폴더와 해당 위치의 에셋을 확인할 수 있고, breadcrumb로 중첩된 폴더에서 이전 위치로 돌아갈 수 있습니다.
|
|
513
|
-
|
|
514
|
-
폴더 구분 없이 조건에 맞는 에셋을 한 번에 보고 싶다면 All assets를 선택하세요. All scopes를 선택하면 현재 Place와 공용 라이브러리의 에셋을 함께 확인할 수 있습니다.
|
|
515
|
-
|
|
516
|
-
기존 Images, Decals, RBXM 카테고리 필터는 그대로 사용할 수 있습니다. Grid, List 레이아웃과 Small, Medium, Large 썸네일 크기도 독립적으로 바꿀 수 있으며, 선택한 보기 방식은 다음에 Assets를 열 때 유지됩니다.
|
|
517
|
-
|
|
518
|
-
기존 Asset Library 데이터와 폴더 경로는 변경되지 않습니다. 별도 마이그레이션도 필요하지 않습니다.`,es:`La página Assets del Dashboard ahora ofrece una vista por carpetas. Abre una carpeta para ver sus subcarpetas y assets, y usa la ruta de navegación para volver por las carpetas anidadas.
|
|
519
|
-
|
|
520
|
-
Elige All assets para ver en una sola lista los assets que coinciden, sin agruparlos por carpeta. Elige All scopes para ver juntos los assets del Place actual y de la biblioteca compartida.
|
|
521
|
-
|
|
522
|
-
Los filtros de categoría Images, Decals y RBXM siguen disponibles. Puedes cambiar por separado los diseños Grid y List y los tamaños de miniatura Small, Medium y Large. Tus opciones se conservan al volver a abrir Assets.
|
|
523
|
-
|
|
524
|
-
Los datos existentes de Asset Library y las rutas de carpeta no cambian. No se necesita ninguna migración.`,"pt-br":`A página Assets do Dashboard agora oferece uma visualização por pastas. Abra uma pasta para ver suas subpastas e assets e use o caminho de navegação para voltar pelas pastas aninhadas.
|
|
525
|
-
|
|
526
|
-
Escolha All assets para ver em uma única lista os assets correspondentes, sem agrupá-los por pasta. Escolha All scopes para ver juntos os assets do Place atual e da biblioteca compartilhada.
|
|
527
|
-
|
|
528
|
-
Os filtros de categoria Images, Decals e RBXM continuam disponíveis. Você pode alterar separadamente os layouts Grid e List e os tamanhos de miniatura Small, Medium e Large. Suas opções são mantidas quando você abre Assets novamente.
|
|
529
|
-
|
|
530
|
-
Os dados existentes da Asset Library e os caminhos das pastas não são alterados. Nenhuma migração é necessária.`,ja:`DashboardのAssetsページでフォルダー別に表示できるようになりました。フォルダーを開くと、配下のサブフォルダーとアセットを確認できます。パンくずを使えば、ネストしたフォルダーを前の場所まで戻れます。
|
|
531
|
-
|
|
532
|
-
フォルダーで分けずに条件に合うアセットを一覧で見たい場合は、All assetsを選択してください。All scopesを選択すると、現在のPlaceと共有ライブラリのアセットをまとめて表示できます。
|
|
533
|
-
|
|
534
|
-
Images、Decals、RBXMのカテゴリーフィルターはこれまでどおり利用できます。GridとListのレイアウト、Small・Medium・Largeのサムネイルサイズは個別に変更できます。選択した表示設定は、次にAssetsを開いたときも保持されます。
|
|
535
|
-
|
|
536
|
-
既存のAsset Libraryデータとフォルダーのパスは変更されません。手動の移行は必要ありません。`,id:`Halaman Assets di Dashboard kini memiliki tampilan berdasarkan folder. Buka folder untuk melihat subfolder dan asset di dalamnya, lalu gunakan breadcrumb untuk kembali melalui folder bertingkat.
|
|
537
|
-
|
|
538
|
-
Pilih All assets jika ingin melihat asset yang sesuai dalam satu daftar tanpa pengelompokan folder. Pilih All scopes untuk melihat asset dari Place saat ini dan library bersama secara bersamaan.
|
|
539
|
-
|
|
540
|
-
Filter kategori Images, Decals, dan RBXM tetap tersedia. Tata letak Grid dan List serta ukuran thumbnail Small, Medium, dan Large dapat diubah secara terpisah. Pilihan Anda akan tetap tersimpan saat membuka Assets kembali.
|
|
541
|
-
|
|
542
|
-
Data Asset Library dan jalur folder yang sudah ada tidak berubah. Tidak diperlukan migrasi.`,de:`Die Assets-Seite im Dashboard bietet jetzt eine Ordneransicht. Öffnen Sie einen Ordner, um seine Unterordner und Assets zu sehen, und verwenden Sie die Breadcrumb-Navigation, um durch verschachtelte Ordner zurückzugehen.
|
|
543
|
-
|
|
544
|
-
Wählen Sie All assets, wenn passende Assets ohne Ordnergruppierung in einer Liste erscheinen sollen. Wählen Sie All scopes, um Assets aus dem aktuellen Place und der gemeinsamen Bibliothek zusammen anzuzeigen.
|
|
545
|
-
|
|
546
|
-
Die vorhandenen Kategoriefilter Images, Decals und RBXM bleiben verfügbar. Die Layouts Grid und List sowie die Miniaturgrößen Small, Medium und Large lassen sich unabhängig voneinander ändern. Ihre Auswahl bleibt beim nächsten Öffnen von Assets erhalten.
|
|
547
|
-
|
|
548
|
-
Ihre vorhandenen Asset-Library-Daten und Ordnerpfade bleiben unverändert. Eine Migration ist nicht erforderlich.`,"fr-fr":`La page Assets du Dashboard propose maintenant une vue par dossiers. Ouvrez un dossier pour voir ses sous-dossiers et ses assets, puis utilisez le fil d’Ariane pour revenir dans les dossiers imbriqués.
|
|
549
|
-
|
|
550
|
-
Choisissez All assets pour afficher dans une seule liste les assets correspondants, sans regroupement par dossier. Choisissez All scopes pour voir ensemble les assets de la Place actuelle et de la bibliothèque partagée.
|
|
551
|
-
|
|
552
|
-
Les filtres de catégorie Images, Decals et RBXM restent disponibles. Les affichages Grid et List ainsi que les tailles de miniature Small, Medium et Large peuvent être modifiés séparément. Vos choix sont conservés à la prochaine ouverture d’Assets.
|
|
553
|
-
|
|
554
|
-
Vos données Asset Library et vos chemins de dossiers existants restent inchangés. Aucune migration n’est nécessaire.`},severity:"info",category:"release"},{id:"2026-07-30-luau-syntax-validation",date:"2026-07-30",title:{en:"Catch Luau syntax errors before Playtest",ko:"Playtest 전에 Luau 문법 오류를 확인하세요",es:"Detecta errores de sintaxis Luau antes de Playtest","pt-br":"Encontre erros de sintaxe Luau antes do Playtest",ja:"Playtestの前にLuauの構文エラーを確認できます",id:"Temukan error sintaks Luau sebelum Playtest",de:"Luau-Syntaxfehler vor dem Playtest erkennen","fr-fr":"Détectez les erreurs de syntaxe Luau avant le Playtest"},body:{en:`Luau syntax validation is available for script work. It is Off by default. Turn it on under Controls > Luau Syntax Validation to check the source that was actually saved after supported script writes, without starting Playtest.
|
|
555
|
-
|
|
556
|
-
When a check is valid, automatic validation does not expand the normal write response. If syntax errors are found or validation is unavailable, WEPPY returns details. The script change remains applied in either case so the AI can fix it in the same script. You can also ask the AI to validate raw source or an existing Script directly on Basic and Pro.`,ko:`스크립트 작업에 Luau 문법 검사가 추가되었습니다. 기본값은 꺼짐입니다. Controls > Luau Syntax Validation에서 켜면 지원되는 스크립트 쓰기 후 실제로 저장된 source를 Playtest 없이 검사합니다.
|
|
557
|
-
|
|
558
|
-
정상인 자동 검사는 기존 쓰기 응답을 늘리지 않습니다. 문법 오류가 있거나 검사를 사용할 수 없을 때만 자세한 결과를 보여줍니다. 어느 경우에도 적용된 변경은 그대로 유지되므로 AI가 같은 스크립트에서 바로 고칠 수 있습니다. Basic과 Pro에서 raw source 또는 기존 Script를 직접 검사하도록 AI에 요청할 수도 있습니다.`,es:`La validación de sintaxis Luau ya está disponible para trabajar con scripts. Está desactivada de forma predeterminada. Actívala en Controls > Luau Syntax Validation para comprobar el source que se guardó realmente después de una escritura compatible, sin iniciar Playtest.
|
|
559
|
-
|
|
560
|
-
Cuando el código es válido, la validación automática no amplía la respuesta normal de escritura. Si se detectan errores de sintaxis o la validación no está disponible, WEPPY muestra los detalles. El cambio del script permanece aplicado en ambos casos para que la IA pueda corregirlo en el mismo script. También puedes pedir a la IA que valide directamente source sin procesar o un Script existente en Basic y Pro.`,"pt-br":`A validação de sintaxe Luau está disponível para o trabalho com scripts. Ela fica desativada por padrão. Ative em Controls > Luau Syntax Validation para verificar o source que foi realmente salvo após uma escrita compatível, sem iniciar o Playtest.
|
|
561
|
-
|
|
562
|
-
Quando o código é válido, a validação automática não aumenta a resposta normal da escrita. Se houver erros de sintaxe ou se a validação não estiver disponível, o WEPPY mostra os detalhes. A alteração do script continua aplicada nos dois casos para que a IA possa corrigi-la no mesmo script. Você também pode pedir à IA para validar diretamente um source bruto ou um Script existente no Basic e no Pro.`,ja:`スクリプト作業でLuauの構文検証を利用できるようになりました。初期設定はOffです。Controls > Luau Syntax ValidationでOnにすると、対応するスクリプト書き込み後に実際に保存されたsourceをPlaytestを開始せずに確認します。
|
|
563
|
-
|
|
564
|
-
コードが正常な場合、自動検証は通常の書き込み応答を増やしません。構文エラーが見つかった場合や検証を利用できない場合は、WEPPYが詳細を返します。どちらの場合もスクリプトの変更は適用されたままなので、AIは同じスクリプトですぐに修正できます。BasicとProでは、raw sourceまたは既存のScriptを直接検証するようAIに依頼することもできます。`,id:`Validasi sintaks Luau kini tersedia untuk pekerjaan script. Fitur ini Off secara default. Aktifkan di Controls > Luau Syntax Validation untuk memeriksa source yang benar-benar tersimpan setelah penulisan script yang didukung, tanpa memulai Playtest.
|
|
565
|
-
|
|
566
|
-
Saat kode valid, validasi otomatis tidak menambah respons penulisan normal. Jika ditemukan error sintaks atau validasi tidak tersedia, WEPPY menampilkan detailnya. Perubahan script tetap diterapkan dalam kedua keadaan agar AI dapat langsung memperbaikinya di script yang sama. Anda juga dapat meminta AI memvalidasi raw source atau Script yang sudah ada secara langsung di Basic dan Pro.`,de:`Die Luau-Syntaxprüfung ist jetzt für die Skriptarbeit verfügbar. Sie ist standardmäßig Off. Aktivieren Sie sie unter Controls > Luau Syntax Validation, um nach unterstützten Skriptänderungen die tatsächlich gespeicherte Source ohne Playtest zu prüfen.
|
|
567
|
-
|
|
568
|
-
Bei gültigem Code vergrößert die automatische Prüfung die normale Schreibantwort nicht. Wenn Syntaxfehler gefunden werden oder die Prüfung nicht verfügbar ist, zeigt WEPPY Details an. Die Skriptänderung bleibt in beiden Fällen angewendet, damit die KI sie direkt im selben Skript korrigieren kann. Auf Basic und Pro können Sie die KI außerdem bitten, Raw Source oder ein vorhandenes Script direkt zu prüfen.`,"fr-fr":`La validation de syntaxe Luau est maintenant disponible pour le travail sur les scripts. Elle est désactivée par défaut. Activez-la dans Controls > Luau Syntax Validation pour vérifier le source réellement enregistré après une écriture de script compatible, sans lancer de Playtest.
|
|
569
|
-
|
|
570
|
-
Lorsque le code est valide, la validation automatique n'allonge pas la réponse d'écriture normale. Si des erreurs de syntaxe sont détectées ou si la validation est indisponible, WEPPY affiche les détails. La modification du script reste appliquée dans les deux cas afin que l'IA puisse la corriger immédiatement dans le même script. Sur Basic et Pro, vous pouvez aussi demander à l'IA de valider directement un source brut ou un Script existant.`},severity:"info",category:"release"},{id:"2026-07-24-preflight-and-script-improvements",date:"2026-07-24",title:{en:"Preflight checks and script work are more precise",ko:"AI 작업 전 점검과 스크립트 작업을 개선했습니다",es:"Mejoramos las comprobaciones previas y el trabajo con scripts","pt-br":"Aprimoramos as verificações prévias e o trabalho com scripts",ja:"事前チェックとスクリプト作業を改善しました",id:"Pemeriksaan awal dan pekerjaan script telah ditingkatkan",de:"Vorabprüfungen und Skriptarbeit wurden verbessert","fr-fr":"Les vérifications préalables et le travail sur les scripts ont été améliorés"},body:{en:`AI agents can now check the Studio connection, current place, Edit or Play state, publish status, and screen capture and image or mesh readiness before starting work. If something needs attention, WEPPY explains what to check without changing Studio settings or game data.
|
|
571
|
-
|
|
572
|
-
Before Open Cloud uploads, Pro users can check saved API key authentication, Assets Read and Write permissions, the Creator target, file format, and file size. This check does not upload or modify assets.
|
|
573
|
-
|
|
574
|
-
For large scripts, AI agents can read only the lines they need instead of loading the entire source each time. This is available on Basic and helps the AI focus on the area being changed.
|
|
575
|
-
|
|
576
|
-
If a request includes options that are not used by the selected operation, WEPPY now shows a warning. Runnable work continues, and the AI can correct the options on the next request.
|
|
577
|
-
|
|
578
|
-
Duplicate logs and signals no longer appear in completed Playtest reports. No setup or migration is required.`,ko:`AI가 Roblox Studio 작업을 시작하기 전에 연결 상태, 현재 place, Edit·Play 상태, 게시 여부, 화면 캡처와 이미지·메시 기능의 준비 상태를 먼저 확인할 수 있습니다. 필요한 설정이 있으면 해결 방법을 안내하며, 점검 과정에서 Studio 설정이나 게임 데이터는 변경하지 않습니다.
|
|
579
|
-
|
|
580
|
-
Open Cloud 업로드 전에는 저장된 API Key의 인증 상태와 Assets 읽기·쓰기 권한, Creator 대상, 파일 형식과 크기를 확인할 수 있습니다. 점검만으로 에셋이 업로드되거나 기존 에셋이 변경되지는 않습니다. Open Cloud 점검은 Pro에서 사용할 수 있습니다.
|
|
581
|
-
|
|
582
|
-
큰 스크립트는 전체 내용을 매번 불러오지 않고 필요한 줄만 읽을 수 있습니다. Basic에서도 사용할 수 있으며, AI가 수정할 부분 주변을 더 효율적으로 확인할 수 있습니다.
|
|
583
|
-
|
|
584
|
-
선택한 작업에서 사용하지 않는 옵션이 함께 전달되면 경고를 표시합니다. 경고가 있어도 실행 가능한 작업은 계속 진행되며, AI는 잘못 전달한 옵션을 다음 요청에서 바로 수정할 수 있습니다.
|
|
585
|
-
|
|
586
|
-
Playtest 완료 리포트에서 같은 로그와 신호가 중복으로 표시되던 문제도 수정했습니다. 별도 설정이나 마이그레이션은 필요 없습니다.`,es:`Los agentes de IA ahora pueden comprobar la conexión con Studio, el place actual, el estado Edit o Play, el estado de publicación y la disponibilidad de captura de pantalla y de las funciones de imagen o malla antes de empezar a trabajar. Si algo requiere atención, WEPPY explica qué revisar sin cambiar la configuración de Studio ni los datos del juego.
|
|
587
|
-
|
|
588
|
-
Antes de subir archivos con Open Cloud, los usuarios Pro pueden comprobar la autenticación de la API key guardada, los permisos Assets Read y Write, el Creator de destino, el formato y el tamaño del archivo. Esta comprobación no sube ni modifica assets.
|
|
589
|
-
|
|
590
|
-
En scripts grandes, los agentes de IA pueden leer solo las líneas necesarias en lugar de cargar todo el código cada vez. Esta función está disponible en Basic y permite que la IA se concentre en la parte que se va a modificar.
|
|
591
|
-
|
|
592
|
-
Si una solicitud incluye opciones que la operación elegida no utiliza, WEPPY muestra una advertencia. El trabajo que puede ejecutarse continúa y la IA puede corregir las opciones en la siguiente solicitud.
|
|
593
|
-
|
|
594
|
-
Los informes de Playtest completados ya no muestran logs y señales duplicados. No se requiere configuración ni migración.`,"pt-br":`Os agentes de IA agora podem verificar a conexão com o Studio, o place atual, o estado Edit ou Play, o status de publicação e a disponibilidade de captura de tela e dos recursos de imagem ou malha antes de iniciar o trabalho. Se algo precisar de atenção, o WEPPY explica o que verificar sem alterar as configurações do Studio nem os dados do jogo.
|
|
595
|
-
|
|
596
|
-
Antes de uploads pelo Open Cloud, usuários Pro podem verificar a autenticação da API key salva, as permissões Assets Read e Write, o Creator de destino, o formato e o tamanho do arquivo. Essa verificação não envia nem modifica assets.
|
|
597
|
-
|
|
598
|
-
Em scripts grandes, os agentes de IA podem ler apenas as linhas necessárias em vez de carregar todo o código a cada vez. O recurso está disponível no Basic e ajuda a IA a se concentrar na área que será alterada.
|
|
599
|
-
|
|
600
|
-
Se uma solicitação incluir opções que a operação selecionada não usa, o WEPPY exibe um aviso. O trabalho que pode ser executado continua, e a IA pode corrigir as opções na próxima solicitação.
|
|
601
|
-
|
|
602
|
-
Relatórios de Playtest concluídos não exibem mais logs e sinais duplicados. Nenhuma configuração ou migração é necessária.`,ja:`AIエージェントは作業を始める前に、Studioの接続、現在のplace、EditまたはPlay状態、公開状態、画面キャプチャ、画像・メッシュ機能の準備状況を確認できるようになりました。確認が必要な項目がある場合、WEPPYはStudioの設定やゲームデータを変更せずに確認方法を案内します。
|
|
603
|
-
|
|
604
|
-
Open Cloudでアップロードする前に、Proユーザーは保存済みAPI Keyの認証状態、Assets Read・Write権限、Creatorの対象、ファイル形式、ファイルサイズを確認できます。この確認だけでassetがアップロードされたり変更されたりすることはありません。
|
|
605
|
-
|
|
606
|
-
大きなスクリプトでは、毎回ソース全体を読み込まず、必要な行だけを読み取れるようになりました。Basicでも利用でき、AIが変更対象の周辺に集中して確認できます。
|
|
607
|
-
|
|
608
|
-
選択した操作で使われないオプションがリクエストに含まれている場合、WEPPYが警告を表示します。実行可能な作業は続行され、AIは次のリクエストでオプションを修正できます。
|
|
609
|
-
|
|
610
|
-
完了したPlaytestレポートに同じログやシグナルが重複して表示される問題も修正しました。追加の設定や移行は必要ありません。`,id:`AI Agent kini dapat memeriksa koneksi Studio, place saat ini, status Edit atau Play, status publikasi, serta kesiapan tangkapan layar dan fitur gambar atau mesh sebelum mulai bekerja. Jika ada yang perlu diperhatikan, WEPPY menjelaskan apa yang harus diperiksa tanpa mengubah pengaturan Studio atau data game.
|
|
611
|
-
|
|
612
|
-
Sebelum upload Open Cloud, pengguna Pro dapat memeriksa autentikasi API key tersimpan, izin Assets Read dan Write, Creator tujuan, format file, dan ukuran file. Pemeriksaan ini tidak mengunggah atau mengubah asset.
|
|
613
|
-
|
|
614
|
-
Untuk script besar, AI Agent dapat membaca hanya baris yang diperlukan tanpa memuat seluruh source setiap kali. Fitur ini tersedia di Basic dan membantu AI fokus pada bagian yang akan diubah.
|
|
615
|
-
|
|
616
|
-
Jika permintaan menyertakan opsi yang tidak digunakan oleh operasi yang dipilih, WEPPY menampilkan peringatan. Pekerjaan yang dapat dijalankan tetap berlanjut, dan AI dapat memperbaiki opsi pada permintaan berikutnya.
|
|
617
|
-
|
|
618
|
-
Laporan Playtest yang selesai tidak lagi menampilkan log dan sinyal duplikat. Tidak diperlukan pengaturan atau migrasi.`,de:`KI-Agents können vor Arbeitsbeginn die Studio-Verbindung, den aktuellen Place, den Edit- oder Play-Status, den Veröffentlichungsstatus sowie die Bereitschaft für Bildschirmaufnahmen und Bild- oder Mesh-Funktionen prüfen. Wenn etwas beachtet werden muss, erklärt WEPPY die erforderliche Prüfung, ohne Studio-Einstellungen oder Spieldaten zu ändern.
|
|
619
|
-
|
|
620
|
-
Vor Open-Cloud-Uploads können Pro-Nutzer die Authentifizierung des gespeicherten API Keys, die Berechtigungen Assets Read und Write, das Creator-Ziel, das Dateiformat und die Dateigröße prüfen. Diese Prüfung lädt keine Assets hoch und ändert keine bestehenden Assets.
|
|
621
|
-
|
|
622
|
-
Bei großen Skripten können KI-Agents nur die benötigten Zeilen lesen, statt jedes Mal den gesamten Quelltext zu laden. Diese Funktion ist in Basic verfügbar und hilft der KI, sich auf den zu ändernden Bereich zu konzentrieren.
|
|
623
|
-
|
|
624
|
-
Enthält eine Anfrage Optionen, die von der ausgewählten Aktion nicht verwendet werden, zeigt WEPPY eine Warnung an. Ausführbare Arbeiten werden fortgesetzt und die KI kann die Optionen bei der nächsten Anfrage korrigieren.
|
|
625
|
-
|
|
626
|
-
Abgeschlossene Playtest-Berichte zeigen keine doppelten Logs und Signale mehr. Es sind keine zusätzlichen Einstellungen oder Migrationen erforderlich.`,"fr-fr":`Les agents IA peuvent désormais vérifier la connexion à Studio, la place actuelle, l'état Edit ou Play, l'état de publication ainsi que la disponibilité de la capture d'écran et des fonctions d'image ou de maillage avant de commencer. Si un point demande votre attention, WEPPY indique quoi vérifier sans modifier les réglages de Studio ni les données du jeu.
|
|
627
|
-
|
|
628
|
-
Avant un upload Open Cloud, les utilisateurs Pro peuvent vérifier l'authentification de l'API key enregistrée, les autorisations Assets Read et Write, le Creator ciblé, le format et la taille du fichier. Cette vérification n'envoie ni ne modifie aucun asset.
|
|
629
|
-
|
|
630
|
-
Pour les scripts volumineux, les agents IA peuvent lire uniquement les lignes nécessaires au lieu de charger tout le code source à chaque fois. Cette fonction est disponible dans Basic et aide l'IA à se concentrer sur la zone à modifier.
|
|
631
|
-
|
|
632
|
-
Si une requête contient des options qui ne sont pas utilisées par l'opération choisie, WEPPY affiche un avertissement. Les opérations exécutables continuent et l'IA peut corriger les options lors de la requête suivante.
|
|
633
|
-
|
|
634
|
-
Les rapports Playtest terminés n'affichent plus de logs ni de signaux en double. Aucun réglage ni aucune migration n'est nécessaire.`},severity:"info",category:"release"},{id:"2026-07-18-sync-file-format-update",date:"2026-07-18",title:{en:"Review changes before applying the Sync update",ko:"Sync 업데이트 전 변경 내용을 확인하세요",es:"Revisa los cambios antes de aplicar la actualización de Sync","pt-br":"Revise as alterações antes de aplicar a atualização do Sync",ja:"Syncアップデートを適用する前に変更内容を確認してください",id:"Tinjau perubahan sebelum menerapkan pembaruan Sync",de:"Änderungen vor dem Sync-Update prüfen","fr-fr":"Vérifiez les changements avant d’appliquer la mise à jour Sync"},body:{en:`The Sync file format has changed. Existing Sync projects are not changed automatically. Open the Sync page in WEPPY Dashboard to review the files that would change, then apply the update when you are ready.
|
|
635
|
-
|
|
636
|
-
Before updating, make sure the place file contains your latest work first. If a problem occurs, use the saved Roblox Studio place file as the original copy and start a fresh Sync.
|
|
637
|
-
|
|
638
|
-
The update only reorganizes files managed by Sync and does not modify Luau source files. Existing Sync continues to work if you choose not to update yet. New Sync projects use an updated file format that reduces unnecessary Git diffs when the same Studio state is synced again.`,ko:`Sync 파일 형식이 변경되었습니다. 기존 Sync 프로젝트는 자동으로 변경되지 않습니다. WEPPY Dashboard의 Sync 페이지에서 변경될 파일을 확인한 뒤 업데이트를 적용하세요.
|
|
639
|
-
|
|
640
|
-
업데이트 전에 Roblox Studio place 파일에 최신 작업 내용이 저장되어 있는지 먼저 확인하세요. 문제가 발생하면 Roblox Studio의 place 저장 파일을 원본으로 삼아 새 Sync를 시작할 수 있습니다.
|
|
641
|
-
|
|
642
|
-
업데이트는 Sync가 관리하는 파일만 정리하며 Luau source 파일은 변경하지 않습니다. 업데이트하지 않아도 기존 Sync는 계속 동작합니다. 새 Sync 프로젝트는 같은 Studio 상태를 다시 동기화할 때 불필요한 Git diff가 줄어드는 새 파일 형식을 사용합니다.`,es:`El formato de archivos Sync ha cambiado. Los proyectos Sync existentes no cambian automáticamente. Abre la página Sync de WEPPY Dashboard para revisar los archivos que cambiarían y aplica la actualización cuando estés listo.
|
|
643
|
-
|
|
644
|
-
Antes de actualizar, comprueba que el archivo del place de Roblox Studio contenga tu trabajo más reciente. Si aparece un problema, usa ese archivo guardado como copia original e inicia un Sync nuevo.
|
|
645
|
-
|
|
646
|
-
La actualización solo reorganiza los archivos administrados por Sync y no modifica los archivos fuente Luau. Sync seguirá funcionando aunque decidas no actualizar por ahora. Los proyectos Sync nuevos usan un formato que reduce los diffs de Git innecesarios al volver a sincronizar el mismo estado de Studio.`,"pt-br":`O formato de arquivos Sync mudou. Projetos Sync existentes não são alterados automaticamente. Abra a página Sync no WEPPY Dashboard para revisar os arquivos que seriam modificados e aplique a atualização quando estiver pronto.
|
|
647
|
-
|
|
648
|
-
Antes de atualizar, confirme se o arquivo do place no Roblox Studio contém o seu trabalho mais recente. Se ocorrer um problema, use esse arquivo salvo como cópia original e inicie um novo Sync.
|
|
649
|
-
|
|
650
|
-
A atualização reorganiza apenas os arquivos gerenciados pelo Sync e não modifica arquivos de código Luau. O Sync continua funcionando mesmo se você optar por não atualizar agora. Novos projetos Sync usam um formato que reduz diffs desnecessários no Git ao sincronizar novamente o mesmo estado do Studio.`,ja:`Syncファイル形式が変更されました。既存のSyncプロジェクトは自動では変更されません。WEPPY DashboardのSyncページで変更対象のファイルを確認してから、準備ができた時点で更新を適用してください。
|
|
651
|
-
|
|
652
|
-
更新前に、Roblox Studio placeファイルへ最新の作業内容が保存されていることを確認してください。問題が発生した場合は、その保存済みファイルを元データとして新しいSyncを開始できます。
|
|
653
|
-
|
|
654
|
-
更新で整理されるのはSyncが管理するファイルのみで、Luauソースファイルは変更されません。今すぐ更新しなくても既存のSyncは引き続き動作します。新しいSyncプロジェクトでは、同じStudioの状態を再同期したときに不要なGit差分を減らす新しいファイル形式を使用します。`,id:`Format file Sync telah berubah. Proyek Sync yang sudah ada tidak diubah secara otomatis. Buka halaman Sync di WEPPY Dashboard untuk meninjau file yang akan berubah, lalu terapkan pembaruan saat Anda siap.
|
|
655
|
-
|
|
656
|
-
Sebelum memperbarui, pastikan file place Roblox Studio berisi pekerjaan terbaru Anda. Jika terjadi masalah, gunakan file tersimpan tersebut sebagai salinan asli lalu mulai Sync baru.
|
|
657
|
-
|
|
658
|
-
Pembaruan hanya merapikan file yang dikelola oleh Sync dan tidak mengubah file sumber Luau. Sync yang sudah ada tetap berfungsi jika Anda memilih untuk belum memperbaruinya. Proyek Sync baru menggunakan format yang mengurangi diff Git yang tidak perlu saat status Studio yang sama disinkronkan kembali.`,de:`Das Sync-Dateiformat wurde geändert. Bestehende Sync-Projekte werden nicht automatisch geändert. Öffnen Sie die Sync-Seite im WEPPY Dashboard, prüfen Sie die betroffenen Dateien und wenden Sie das Update an, wenn Sie bereit sind.
|
|
659
|
-
|
|
660
|
-
Prüfen Sie vor dem Update, ob die Roblox-Studio-Place-Datei Ihren neuesten Arbeitsstand enthält. Falls ein Problem auftritt, verwenden Sie diese gespeicherte Datei als Original und starten Sie einen neuen Sync.
|
|
661
|
-
|
|
662
|
-
Das Update ordnet nur die von Sync verwalteten Dateien neu und ändert keine Luau-Quelldateien. Sync funktioniert auch weiter, wenn Sie das Update vorerst nicht anwenden. Neue Sync-Projekte verwenden ein Format, das unnötige Git-Diffs beim erneuten Synchronisieren desselben Studio-Stands reduziert.`,"fr-fr":`Le format de fichiers Sync a changé. Les projets Sync existants ne sont pas modifiés automatiquement. Ouvrez la page Sync du WEPPY Dashboard pour vérifier les fichiers concernés, puis appliquez la mise à jour lorsque vous êtes prêt.
|
|
663
|
-
|
|
664
|
-
Avant la mise à jour, vérifiez que le fichier de place Roblox Studio contient votre travail le plus récent. Si un problème survient, utilisez ce fichier enregistré comme copie d’origine et démarrez un nouveau Sync.
|
|
665
|
-
|
|
666
|
-
La mise à jour réorganise uniquement les fichiers gérés par Sync et ne modifie aucun fichier source Luau. Sync continue de fonctionner si vous choisissez de ne pas mettre à jour immédiatement. Les nouveaux projets Sync utilisent un format qui réduit les diffs Git inutiles lorsque le même état Studio est synchronisé à nouveau.`},severity:"warning",category:"release",links:[{url:"/sync",label:{en:"Review changes in WEPPY Dashboard",ko:"WEPPY Dashboard에서 변경 내용 확인",es:"Revisar cambios en WEPPY Dashboard","pt-br":"Revisar alterações no WEPPY Dashboard",ja:"WEPPY Dashboardで変更内容を確認",id:"Tinjau perubahan di WEPPY Dashboard",de:"Änderungen im WEPPY Dashboard prüfen","fr-fr":"Vérifier les changements dans WEPPY Dashboard"}}]},{id:"2026-07-17-natural-environment-generation",date:"2026-07-17",title:{en:"Natural environment generation is more detailed and controllable",ko:"자연 배경 생성 품질과 조절 기능을 개선했습니다",es:"Mejoramos la calidad y el control de la generación de entornos","pt-br":"Melhoramos a qualidade e o controle da geração de ambientes",ja:"自然な背景生成の品質と調整機能を改善しました",id:"Kualitas dan kontrol pembuatan lingkungan telah ditingkatkan",de:"Qualität und Steuerung der Umgebungsgenerierung wurden verbessert","fr-fr":"La qualité et le contrôle de la génération d’environnements ont été améliorés"},body:{en:`Existing terrain generation now produces more natural shapes. Large landforms and small surface variations appear together, materials change between ground and cliffs based on slope, and water and shorelines follow the terrain. Use mountain, hill, plain, dune, island, and canyon presets to adjust the result quickly.
|
|
667
|
-
|
|
668
|
-
Environment controls have also been expanded. Apply clear daylight, sunset, fog, storm, or night moods, then place tree and rock templates after checking ground slope and water. Set minimum spacing, rotation, and scale variation, and reuse the same seed to reproduce the terrain and placement.
|
|
669
|
-
|
|
670
|
-
Terrain generation, mood changes, and prop placement each work as one Studio Undo step. These improvements are available in Pro.`,ko:`기존 지형 생성이 더 자연스러운 형태를 만들도록 개선되었습니다. 큰 지형 형태와 작은 굴곡이 함께 나타나고, 경사에 따라 지표와 절벽 재질이 나뉘며, 물과 해안도 지형에 맞춰 생성됩니다. 산, 언덕, 평원, 사구, 섬, 협곡 프리셋으로 결과를 빠르게 조절할 수 있습니다.
|
|
671
|
-
|
|
672
|
-
배경 조절 범위도 넓어졌습니다. 맑은 낮, 일몰, 안개, 폭풍, 밤 등의 분위기를 적용하고, 나무나 바위 템플릿을 지면 경사와 물을 확인해 배치할 수 있습니다. 최소 간격, 회전, 크기 변화를 설정할 수 있고 같은 seed를 사용하면 같은 지형과 배치를 다시 만들 수 있습니다.
|
|
673
|
-
|
|
674
|
-
지형 생성, 무드 적용, 소품 배치는 각각 Studio Undo 한 번으로 되돌릴 수 있습니다. 이 개선 사항은 Pro에서 사용할 수 있습니다.`,es:`La generación de terreno existente se ha mejorado para crear formas más naturales. Las grandes formaciones y las pequeñas variaciones de la superficie aparecen juntas, los materiales cambian entre suelo y acantilado según la pendiente, y el agua y las orillas se adaptan al terreno. Usa los ajustes de montañas, colinas, llanuras, dunas, islas y cañones para ajustar el resultado con rapidez.
|
|
675
|
-
|
|
676
|
-
También ampliamos los controles del entorno. Aplica ambientes de día despejado, atardecer, niebla, tormenta o noche y coloca plantillas de árboles y rocas después de comprobar la pendiente y el agua. Define la separación mínima y las variaciones de rotación y escala, y reutiliza la misma semilla para reproducir el terreno y la distribución.
|
|
677
|
-
|
|
678
|
-
La generación de terreno, los cambios de ambiente y la colocación de objetos funcionan cada uno como un único paso de Undo en Studio. Estas mejoras están disponibles en Pro.`,"pt-br":`A geração de terreno existente foi aprimorada para criar formas mais naturais. Grandes formações e pequenas variações da superfície aparecem juntas, os materiais mudam entre solo e penhasco conforme a inclinação, e a água e as margens acompanham o terreno. Use predefinições de montanhas, colinas, planícies, dunas, ilhas e cânions para ajustar o resultado rapidamente.
|
|
679
|
-
|
|
680
|
-
Os controles do ambiente também foram ampliados. Aplique climas de dia claro, pôr do sol, neblina, tempestade ou noite e posicione modelos de árvores e rochas após verificar a inclinação e a água. Defina o espaçamento mínimo e as variações de rotação e escala, e reutilize a mesma seed para reproduzir o terreno e o posicionamento.
|
|
681
|
-
|
|
682
|
-
A geração de terreno, as mudanças de clima e o posicionamento de objetos funcionam, cada um, como uma única etapa de Undo no Studio. Essas melhorias estão disponíveis no Pro.`,ja:`既存の地形生成を、より自然な形状を作れるように改善しました。大きな地形の起伏と細かな表面変化が同時に現れ、傾斜に応じて地表と崖のマテリアルが切り替わり、水面と海岸線も地形に沿って生成されます。山、丘、平原、砂丘、島、峡谷のプリセットで結果をすばやく調整できます。
|
|
683
|
-
|
|
684
|
-
背景の調整範囲も広がりました。晴天、夕焼け、霧、嵐、夜のムードを適用し、地面の傾斜と水面を確認して木や岩のテンプレートを配置できます。最小間隔、回転、サイズの変化を設定し、同じseedで同じ地形と配置を再現できます。
|
|
685
|
-
|
|
686
|
-
地形生成、ムード適用、小物配置は、それぞれStudioのUndo 1回で元に戻せます。これらの改善はProで利用できます。`,id:`Pembuatan terrain yang sudah ada telah ditingkatkan agar menghasilkan bentuk yang lebih alami. Bentuk lahan besar dan variasi permukaan kecil muncul bersama, material berubah antara tanah dan tebing berdasarkan kemiringan, serta air dan garis pantai mengikuti terrain. Gunakan preset pegunungan, perbukitan, dataran, bukit pasir, pulau, dan ngarai untuk menyesuaikan hasil dengan cepat.
|
|
687
|
-
|
|
688
|
-
Kontrol lingkungan juga telah diperluas. Terapkan suasana siang cerah, matahari terbenam, kabut, badai, atau malam, lalu tempatkan template pohon dan batu setelah memeriksa kemiringan tanah dan air. Atur jarak minimum serta variasi rotasi dan skala, lalu gunakan seed yang sama untuk menghasilkan ulang terrain dan penempatan.
|
|
689
|
-
|
|
690
|
-
Pembuatan terrain, perubahan suasana, dan penempatan prop masing-masing dapat dibatalkan dengan satu langkah Undo di Studio. Peningkatan ini tersedia di Pro.`,de:`Die bestehende Geländegenerierung wurde verbessert und erzeugt natürlichere Formen. Große Landschaftsformen und kleine Oberflächenvariationen erscheinen gemeinsam, Materialien wechseln je nach Neigung zwischen Boden und Fels, und Wasser sowie Uferlinien folgen dem Gelände. Mit Presets für Berge, Hügel, Ebenen, Dünen, Inseln und Schluchten lässt sich das Ergebnis schnell anpassen.
|
|
691
|
-
|
|
692
|
-
Auch die Umgebungssteuerung wurde erweitert. Wenden Sie Stimmungen für klares Tageslicht, Sonnenuntergang, Nebel, Sturm oder Nacht an und platzieren Sie Baum- und Felsvorlagen nach Prüfung von Bodenneigung und Wasser. Legen Sie Mindestabstand sowie Rotations- und Größenvariationen fest und verwenden Sie denselben Seed, um Gelände und Platzierung zu reproduzieren.
|
|
693
|
-
|
|
694
|
-
Geländegenerierung, Stimmungsänderungen und Objektplatzierung lassen sich jeweils mit einem einzelnen Studio-Undo-Schritt zurücknehmen. Diese Verbesserungen sind in Pro verfügbar.`,"fr-fr":`La génération de terrain existante a été améliorée pour produire des formes plus naturelles. Les grandes formes du relief et les petites variations de surface apparaissent ensemble, les matériaux changent entre le sol et les falaises selon la pente, et l’eau ainsi que les rivages suivent le terrain. Utilisez les préréglages de montagnes, collines, plaines, dunes, îles et canyons pour ajuster rapidement le résultat.
|
|
695
|
-
|
|
696
|
-
Les réglages de l’environnement ont également été étendus. Appliquez une ambiance de plein jour, coucher de soleil, brouillard, orage ou nuit, puis placez des modèles d’arbres et de rochers après vérification de la pente et de l’eau. Définissez l’espacement minimal et les variations de rotation et d’échelle, puis réutilisez la même seed pour reproduire le terrain et la disposition.
|
|
697
|
-
|
|
698
|
-
La génération du terrain, les changements d’ambiance et le placement des objets correspondent chacun à une seule étape Undo dans Studio. Ces améliorations sont disponibles dans Pro.`},severity:"info",category:"release"},{id:"2026-07-03-sync-delete-policy-undo",date:"2026-07-03",title:{en:"Sync delete settings now work with Studio Undo",ko:"Sync 삭제 설정과 Studio Undo 처리를 추가했습니다",es:"Los ajustes de borrado de Sync ahora funcionan con Undo de Studio","pt-br":"As configurações de exclusão do Sync agora funcionam com Undo do Studio",ja:"Sync削除設定がStudioのUndoに対応しました",id:"Pengaturan hapus Sync sekarang bekerja dengan Undo Studio",de:"Sync-Löschoptionen funktionieren jetzt mit Studio Undo","fr-fr":"Les réglages de suppression Sync fonctionnent maintenant avec Undo dans Studio"},body:{en:`Sync now has a separate delete policy for cases where a local file deletion can remove the matching Studio instance. The default is to ask before deleting. You can change the Studio delete policy in the Sync direction card to Auto Delete, and WEPPY asks for confirmation before that setting is enabled.
|
|
699
|
-
|
|
700
|
-
When Sync applies local changes to Roblox Studio, those changes are now recorded in Studio history. Script edits, created instances, and local delete applies can be undone from Roblox Studio with Undo.
|
|
701
|
-
|
|
702
|
-
No manual migration is required. Turn on Auto Delete only when you want local file deletions to be treated as Studio delete intent.`,ko:`Sync에서는 로컬 파일 삭제가 대응하는 Studio 인스턴스 삭제로 이어질 때의 정책을 따로 설정할 수 있습니다. 기본값은 삭제 전 확인입니다. Sync direction 카드에서 Studio 삭제 정책을 자동 삭제로 바꿀 수 있으며, 이 설정을 켤 때 WEPPY가 먼저 확인을 요청합니다.
|
|
703
|
-
|
|
704
|
-
Sync가 로컬 변경을 Roblox Studio에 적용할 때 이제 Studio history에 기록됩니다. 스크립트 수정, 인스턴스 생성, 로컬 삭제 적용은 Roblox Studio의 Undo로 되돌릴 수 있습니다.
|
|
705
|
-
|
|
706
|
-
수동 마이그레이션은 필요 없습니다. 로컬 파일 삭제를 Studio 삭제 의도로 바로 적용하고 싶을 때만 자동 삭제를 켜세요.`,es:`Sync ahora tiene una política de borrado separada para los casos en que borrar un archivo local puede eliminar la instancia correspondiente en Studio. El valor predeterminado es preguntar antes de borrar. Puedes cambiar la política de borrado de Studio en la tarjeta de dirección de Sync a Auto Delete, y WEPPY pide confirmación antes de activar esa opción.
|
|
707
|
-
|
|
708
|
-
Cuando Sync aplica cambios locales en Roblox Studio, esos cambios ahora quedan registrados en el historial de Studio. Las ediciones de scripts, las instancias creadas y las eliminaciones locales aplicadas se pueden revertir con Undo en Roblox Studio.
|
|
709
|
-
|
|
710
|
-
No se requiere migración manual. Activa Auto Delete solo cuando quieras tratar los borrados de archivos locales como intención de borrar en Studio.`,"pt-br":`O Sync agora tem uma política de exclusão separada para casos em que excluir um arquivo local pode remover a instância correspondente no Studio. O padrão é perguntar antes de excluir. Você pode mudar a política de exclusão do Studio no card de direção do Sync para Auto Delete, e o WEPPY pede confirmação antes de ativar essa opção.
|
|
711
|
-
|
|
712
|
-
Quando o Sync aplica mudanças locais no Roblox Studio, essas mudanças agora entram no histórico do Studio. Edições de scripts, instâncias criadas e exclusões locais aplicadas podem ser revertidas com Undo no Roblox Studio.
|
|
713
|
-
|
|
714
|
-
Nenhuma migração manual é necessária. Ative Auto Delete somente quando quiser tratar exclusões de arquivos locais como intenção de excluir no Studio.`,ja:`Syncでは、ローカルファイルの削除が対応するStudioインスタンスの削除につながる場合のポリシーを別に設定できます。既定では削除前に確認します。Sync directionカードでStudio削除ポリシーをAuto Deleteに変更できます。この設定を有効にする前に、WEPPYが確認を求めます。
|
|
715
|
-
|
|
716
|
-
Syncがローカル変更をRoblox Studioに適用すると、その変更はStudio historyに記録されます。スクリプト編集、作成されたインスタンス、ローカル削除の適用は、Roblox StudioのUndoで元に戻せます。
|
|
717
|
-
|
|
718
|
-
手動移行は不要です。ローカルファイルの削除をStudioでの削除意図として扱いたい場合だけ、Auto Deleteを有効にしてください。`,id:`Sync sekarang memiliki kebijakan hapus terpisah untuk kasus ketika penghapusan file lokal dapat menghapus instance Studio yang sesuai. Nilai defaultnya adalah bertanya sebelum menghapus. Anda dapat mengubah kebijakan hapus Studio di kartu arah Sync menjadi Auto Delete, dan WEPPY akan meminta konfirmasi sebelum pengaturan itu diaktifkan.
|
|
719
|
-
|
|
720
|
-
Saat Sync menerapkan perubahan lokal ke Roblox Studio, perubahan itu sekarang dicatat di history Studio. Edit script, instance yang dibuat, dan penghapusan lokal yang diterapkan dapat dibatalkan dengan Undo di Roblox Studio.
|
|
721
|
-
|
|
722
|
-
Tidak ada migrasi manual yang diperlukan. Aktifkan Auto Delete hanya jika Anda ingin penghapusan file lokal dianggap sebagai niat menghapus di Studio.`,de:`Sync hat jetzt eine separate Löschrichtlinie für Fälle, in denen das Löschen einer lokalen Datei die passende Studio-Instanz entfernen kann. Standardmäßig wird vor dem Löschen gefragt. Sie können die Studio-Löschrichtlinie in der Sync-Richtungskarte auf Auto Delete ändern, und WEPPY fragt nach einer Bestätigung, bevor diese Einstellung aktiviert wird.
|
|
723
|
-
|
|
724
|
-
Wenn Sync lokale Änderungen in Roblox Studio anwendet, werden diese Änderungen jetzt in der Studio-History aufgezeichnet. Script-Bearbeitungen, erstellte Instanzen und angewendete lokale Löschungen können Sie in Roblox Studio mit Undo zurücknehmen.
|
|
725
|
-
|
|
726
|
-
Eine manuelle Migration ist nicht erforderlich. Aktivieren Sie Auto Delete nur, wenn lokale Dateilöschungen als Löschabsicht in Studio gelten sollen.`,"fr-fr":`Sync dispose maintenant d'une politique de suppression séparée pour les cas où la suppression d'un fichier local peut supprimer l'instance Studio correspondante. Par défaut, WEPPY demande confirmation avant de supprimer. Vous pouvez passer la politique de suppression Studio à Auto Delete dans la carte de direction Sync, et WEPPY demande une confirmation avant d'activer ce réglage.
|
|
727
|
-
|
|
728
|
-
Quand Sync applique des changements locaux dans Roblox Studio, ces changements sont maintenant enregistrés dans l'historique Studio. Les modifications de scripts, les instances créées et les suppressions locales appliquées peuvent être annulées avec Undo dans Roblox Studio.
|
|
729
|
-
|
|
730
|
-
Aucune migration manuelle n'est requise. Activez Auto Delete uniquement si vous voulez traiter les suppressions de fichiers locaux comme une intention de suppression dans Studio.`},severity:"info",category:"release"},{id:"2026-07-03-studio-generated-models-rbxm",date:"2026-07-03",title:{en:"Use Roblox Studio model generation from WEPPY",ko:"WEPPY에서 Roblox Studio의 모델 생성 기능을 사용할 수 있습니다",es:"Usa la generación de modelos de Roblox Studio desde WEPPY","pt-br":"Use a geração de modelos do Roblox Studio pelo WEPPY",ja:"WEPPYからRoblox Studioのモデル生成機能を使えます",id:"Gunakan fitur pembuatan model Roblox Studio dari WEPPY",de:"Roblox Studio-Modellgenerierung aus WEPPY verwenden","fr-fr":"Utilisez la génération de modèles Roblox Studio depuis WEPPY"},body:{en:`WEPPY can now call Roblox Studio's model generation feature from an AI agent request. The generated model is created inside Studio, where you can review it, save it to the Asset Library as RBXM, and upload the selected model when you need a Roblox asset ID.
|
|
731
|
-
|
|
732
|
-
If the generated model contains mesh or texture data without Roblox asset IDs, WEPPY asks before using Studio-local upload to preserve that embedded content before saving the RBXM.
|
|
733
|
-
|
|
734
|
-
The Dashboard Assets page shows generation details, review results, and upload status for saved RBXM assets.
|
|
735
|
-
|
|
736
|
-
No manual migration is required. Use this when you want to keep the Studio generation result as a local RBXM backup or upload it for reuse through a Roblox asset ID.`,ko:`WEPPY는 AI Agent 요청에서 Roblox Studio가 제공하는 모델 생성 기능을 호출할 수 있습니다. 생성된 모델은 Studio 안에 만들어지며, 결과를 검토한 뒤 Asset Library에 RBXM으로 저장하거나 Roblox asset ID가 필요할 때 선택한 모델을 업로드할 수 있습니다.
|
|
737
|
-
|
|
738
|
-
생성 모델 안에 Roblox asset ID가 없는 mesh/texture 데이터가 있으면, WEPPY가 저장 전에 Studio-local 업로드로 해당 내용을 보존할지 먼저 확인합니다.
|
|
739
|
-
|
|
740
|
-
Dashboard의 Assets 페이지에서는 저장된 RBXM의 생성 정보, 리뷰 결과, 업로드 상태를 확인할 수 있습니다.
|
|
741
|
-
|
|
742
|
-
수동 마이그레이션은 필요 없습니다. Studio의 모델 생성 결과를 로컬 RBXM 백업으로 보관하거나 Roblox asset ID로 재사용하고 싶을 때 사용하세요.`,es:`WEPPY ahora puede llamar a la función de generación de modelos que ofrece Roblox Studio desde una solicitud del agente de IA. El modelo se crea dentro de Studio, donde puedes revisarlo, guardarlo en la Asset Library como RBXM y subir el modelo seleccionado cuando necesites un Roblox asset ID.
|
|
743
|
-
|
|
744
|
-
Si el modelo generado contiene datos de mesh o textura sin Roblox asset IDs, WEPPY pregunta antes de usar una subida local de Studio para preservar ese contenido antes de guardar el RBXM.
|
|
745
|
-
|
|
746
|
-
La página Assets del Dashboard muestra los detalles de generación, los resultados de revisión y el estado de upload de los RBXM guardados.
|
|
747
|
-
|
|
748
|
-
No se requiere migración manual. Usa esto cuando quieras conservar el resultado de generación de Studio como copia RBXM local o subirlo para reutilizarlo con un Roblox asset ID.`,"pt-br":`O WEPPY agora pode chamar a função de geração de modelos oferecida pelo Roblox Studio a partir de uma solicitação do agente de IA. O modelo é criado dentro do Studio, onde você pode revisá-lo, salvá-lo na Asset Library como RBXM e enviar o modelo selecionado quando precisar de um Roblox asset ID.
|
|
749
|
-
|
|
750
|
-
Se o modelo gerado tiver dados de mesh ou textura sem Roblox asset IDs, o WEPPY pergunta antes de usar um upload local do Studio para preservar esse conteúdo antes de salvar o RBXM.
|
|
751
|
-
|
|
752
|
-
A página Assets do Dashboard mostra detalhes da geração, resultados da revisão e status de upload dos RBXM salvos.
|
|
753
|
-
|
|
754
|
-
Nenhuma migração manual é necessária. Use isso quando quiser manter o resultado da geração do Studio como backup RBXM local ou enviá-lo para reutilização por meio de um Roblox asset ID.`,ja:`WEPPYは、AI AgentのリクエストからRoblox Studioが提供するモデル生成機能を呼び出せるようになりました。生成されたモデルはStudio内に作成され、結果を確認してAsset LibraryにRBXMとして保存できます。Roblox asset IDが必要な場合は、選択したモデルをアップロードできます。
|
|
755
|
-
|
|
756
|
-
生成モデルにRoblox asset IDのないmesh/textureデータが含まれる場合、WEPPYはRBXM保存前にStudio-local uploadでその内容を保持するか確認します。
|
|
757
|
-
|
|
758
|
-
DashboardのAssetsページでは、保存されたRBXMの生成情報、レビュー結果、アップロード状態を確認できます。
|
|
759
|
-
|
|
760
|
-
手動移行は不要です。Studioのモデル生成結果をローカルRBXMバックアップとして残したい場合や、Roblox asset IDで再利用したい場合に使ってください。`,id:`WEPPY sekarang dapat memanggil fitur pembuatan model yang disediakan Roblox Studio dari permintaan AI Agent. Model dibuat di dalam Studio, lalu Anda dapat meninjaunya, menyimpannya ke Asset Library sebagai RBXM, dan mengunggah model yang dipilih saat membutuhkan Roblox asset ID.
|
|
761
|
-
|
|
762
|
-
Jika model buatan berisi data mesh atau tekstur tanpa Roblox asset IDs, WEPPY akan meminta konfirmasi sebelum memakai upload lokal Studio untuk menjaga konten itu sebelum RBXM disimpan.
|
|
763
|
-
|
|
764
|
-
Halaman Assets di Dashboard menampilkan detail pembuatan, hasil review, dan status upload untuk RBXM yang disimpan.
|
|
765
|
-
|
|
766
|
-
Tidak ada migrasi manual yang diperlukan. Gunakan ini saat Anda ingin menyimpan hasil pembuatan dari Studio sebagai backup RBXM lokal atau mengunggahnya agar bisa dipakai kembali melalui Roblox asset ID.`,de:`WEPPY kann jetzt die von Roblox Studio bereitgestellte Modellgenerierung aus einer AI-Agent-Anfrage aufrufen. Das Modell wird in Studio erstellt. Dort können Sie es prüfen, als RBXM in der Asset Library speichern und das ausgewählte Modell hochladen, wenn Sie eine Roblox asset ID benötigen.
|
|
767
|
-
|
|
768
|
-
Wenn das generierte Modell Mesh- oder Texturdaten ohne Roblox asset IDs enthält, fragt WEPPY nach, bevor ein Studio-local Upload diese eingebetteten Inhalte vor dem RBXM-Speichern erhält.
|
|
769
|
-
|
|
770
|
-
Die Assets-Seite im Dashboard zeigt Generierungsdetails, Prüfergebnisse und den Upload-Status gespeicherter RBXM-Assets.
|
|
771
|
-
|
|
772
|
-
Eine manuelle Migration ist nicht erforderlich. Nutzen Sie dies, wenn Sie das Ergebnis der Studio-Modellgenerierung als lokale RBXM-Sicherung behalten oder es über eine Roblox asset ID wiederverwenden möchten.`,"fr-fr":`WEPPY peut maintenant appeler la fonction de génération de modèles fournie par Roblox Studio depuis une demande de l'agent IA. Le modèle est créé dans Studio, où vous pouvez le vérifier, l'enregistrer dans l'Asset Library en RBXM, puis envoyer le modèle sélectionné lorsque vous avez besoin d'un Roblox asset ID.
|
|
773
|
-
|
|
774
|
-
Si le modèle généré contient des données mesh ou texture sans Roblox asset IDs, WEPPY demande confirmation avant d'utiliser un upload local Studio pour préserver ce contenu avant d'enregistrer le RBXM.
|
|
775
|
-
|
|
776
|
-
La page Assets du Dashboard affiche les détails de génération, les résultats de revue et le statut d'upload des RBXM enregistrés.
|
|
777
|
-
|
|
778
|
-
Aucune migration manuelle n'est requise. Utilisez cette fonction lorsque vous voulez conserver le résultat de génération Studio comme sauvegarde RBXM locale ou l'envoyer pour le réutiliser avec un Roblox asset ID.`},severity:"info",category:"release"}],td="weppy-dashboard.whatsNew.readIds";function $p(){try{const i=localStorage.getItem(td);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function Ov(i){try{localStorage.setItem(td,JSON.stringify([...i]))}catch{}}let ui=$p(),Xp=ui;const Yl=new Set;function Qp(){Xp=new Set(ui);for(const i of Yl)i()}const Hl={subscribe(i){return Yl.add(i),()=>{Yl.delete(i)}},getSnapshot(){return Xp},markRead(i){let n=!1;for(const r of i)ui.has(r)||(ui.add(r),n=!0);n&&(Ov(ui),Qp())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===td&&(ui=$p(),Qp())});function Nv(){const i=x.useSyncExternalStore(Hl.subscribe,Hl.getSnapshot),n=Mv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:Hl.markRead}}const _v="_header_1do17_2",qv="_row1_1do17_17",Bv="_contextGroups_1do17_25",Wv="_projectGroup_1do17_33",Fv="_studioGroup_1do17_34",Vv="_groupTitleRow_1do17_52",Yv="_groupLabel_1do17_59",Gv="_groupIcon_1do17_73",Kv="_projectName_1do17_78",$v="_placeChips_1do17_90",Xv="_metaActions_1do17_99",Qv="_placeChip_1do17_90",Zv="_placeChipStatic_1do17_122",Jv="_placeChipMuted_1do17_123",eb="_placeChipActive_1do17_127",tb="_placeChipInactive_1do17_134",ab="_placeChipId_1do17_145",ob="_placeChipClient_1do17_160",ib="_placeChipState_1do17_166",sb="_placeChipBadge_1do17_172",nb="_placeDot_1do17_180",rb="_placeChipName_1do17_188",lb="_row2_1do17_196",db="_pathRow_1do17_208",ub="_auxiliaryPath_1do17_209",cb="_pathLabel_1do17_221",pb="_projectPath_1do17_232",gb="_changeButton_1do17_242",hb="_iconButton_1do17_276",be={header:_v,row1:qv,contextGroups:Bv,projectGroup:Wv,studioGroup:Fv,groupTitleRow:Vv,groupLabel:Yv,groupIcon:Gv,projectName:Kv,placeChips:$v,metaActions:Xv,placeChip:Qv,placeChipStatic:Zv,placeChipMuted:Jv,placeChipActive:eb,placeChipInactive:tb,placeChipId:ab,placeChipClient:ob,placeChipState:ib,placeChipBadge:sb,placeDot:nb,placeChipName:rb,row2:lb,pathRow:db,auxiliaryPath:ub,pathLabel:cb,projectPath:pb,changeButton:gb,iconButton:hb},mb="_bellWrapper_tae21_2",yb="_unreadDot_tae21_8",pp={bellWrapper:mb,unreadDot:yb};function fb(){const{t:i}=ma(),{unreadCount:n}=Nv(),{trackEvent:r}=cs(),{pathname:d,search:u}=Yt(),p=us(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return w.jsx(Vt,{text:i("header.whatsNew.tooltip","What's New"),children:w.jsxs("span",{className:pp.bellWrapper,children:[w.jsx(jo,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&w.jsx("span",{className:pp.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function Zp(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>Sb(u,p,d))}function aP(i,n,r){return Zp(i,n,r)[0]}function Sb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function gp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function vb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function hp(i,n){return i??n}function bb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Pb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function kb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function mp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function wb(i,n){const r=i.studioState??"unknown",d={edit:n("connection.targets.studioState.edit","Edit"),running:n("connection.targets.studioState.running","Running"),paused:n("connection.targets.studioState.paused","Paused"),unknown:n("connection.targets.studioState.unknown","Unknown")},u=i.playtestMode&&i.playtestMode!=="unknown"?`/${i.playtestMode}`:"";return`${d[r]}${u}`}function Cb(){var L,ye;const{pathname:i,search:n}=Yt(),{level:r,status:d}=_n(),{t:u}=ma(),{trackEvent:p}=cs(),[g,y]=x.useState(null),[h,v]=x.useState(null),[k,b]=x.useState(null),[D,U]=x.useState(!1),B=u("header.placeNotConnected","Place not connected"),z=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,le=Zp((d==null?void 0:d.pluginClients)??[],z,N),W=le[0],ae=bb(i),Y=Pb(i),pe=us(i,n);x.useEffect(()=>{let F=!1;async function oe(){if(r==="disconnected"){y(null);return}try{const ue=await Pt.get("/connection-info");F||y(ue)}catch{F||y(null)}}return oe(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),x.useEffect(()=>{let F=!1;async function oe(){if(r==="disconnected"){v(null),U(!1);return}v(null),U(!1);try{const ue=await Hv();F||(v(ue),U(!1))}catch{F||(v(null),U(!0))}}return oe(),()=>{F=!0}},[ae,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),x.useEffect(()=>zv(F=>{v(F),U(!1)}),[]),x.useEffect(()=>{let F=!1;async function oe(){if(r==="disconnected"){b(null);return}try{const ue=await Lv();F||b(ue)}catch{F||b(null)}}return oe(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=vb(g)??"",E=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",X=E==="ready"?(h==null?void 0:h.projectRoot)??"":E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Se=E==="ready"?(h==null?void 0:h.projectRoot)??"":ae?"":De,ce=ae||E==="ready"?E==="ready"?gp(Se)||u("header.unknownProject","Unknown project"):E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):gp(Se)||u("header.unknownProject","Unknown project"),Te=hp((ye=(L=d==null?void 0:d.pluginClients)==null?void 0:L[0])==null?void 0:ye.placeName,B),we=k!=null&&k.pluginConnected?k.activePlaceId:(k==null?void 0:k.lastActivePlaceId)??null,Ce=[...(k==null?void 0:k.places)??[]].sort((F,oe)=>{const ue=F.placeId===we,Pe=oe.placeId===we;return ue!==Pe?ue?-1:1:F.isConnected!==oe.isConnected?F.isConnected?-1:1:F.placeName.localeCompare(oe.placeName)}),Me=le.length>0?Ce.filter(F=>!le.some(oe=>oe.placeId!==void 0&&oe.placeId===F.placeId)):Ce,et=ae?E==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):E==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),at=u("header.manageProjectRoot.tooltip","Open Project Root controls"),Oe=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),_=Ce.find(F=>F.placeId===we)??null,de=kb(i),K=h!=null&&h.projectSyncRoot&&_?`${h.projectSyncRoot}/${_.placeDirName}`:null,C=de==="playtest"?_!=null&&_.testsPath?{label:u("header.testFiles.label","Test Files"),value:_.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&K?{label:u("header.placeData.label","Place Data"),value:K,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return w.jsx(w.Fragment,{children:w.jsxs("header",{className:be.header,children:[w.jsxs("div",{className:be.row1,children:[w.jsxs("div",{className:be.contextGroups,children:[w.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[w.jsxs("div",{className:be.groupTitleRow,children:[w.jsxs("span",{className:be.groupLabel,children:[w.jsx(Nf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),w.jsx(Vt,{text:et,children:w.jsx("h1",{className:be.projectName,children:ce})}),w.jsx(Vt,{text:at,children:w.jsx(jo,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...pe}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),w.jsxs("div",{className:be.pathRow,children:[w.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),w.jsx("span",{className:be.projectPath,title:X,children:X})]})]}),w.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[w.jsx(Vt,{text:Oe,children:w.jsxs("span",{className:be.groupLabel,children:[w.jsx(aS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),w.jsxs("div",{className:be.placeChips,children:[le.map(F=>{const oe=F.targetAlias,ue=hp(F.placeName,B),Pe=F.connectionState??"connected",Ae=le.filter(ya=>ya.placeId!==void 0&&ya.placeId===F.placeId).length>1,Ue=z==="pinned"&&N===F.clientId?u("connection.routing.pinnedBadge","Pinned"):z==="recentPriority"&&(W==null?void 0:W.clientId)===F.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=mp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}"),{studioId:oe,connectionId:F.clientId,placeName:ue,placeId:F.placeId!==void 0?String(F.placeId):"-",state:Pe,runtimeState:wb(F,u),routing:Ue});return w.jsx(Vt,{text:gt,children:w.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[w.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),w.jsx("span",{className:be.placeChipName,children:ue}),F.placeId!==void 0?w.jsx("span",{className:be.placeChipId,children:F.placeId}):null,w.jsx("span",{className:be.placeChipState,children:Pe}),Ae?w.jsx("span",{className:be.placeChipClient,children:oe}):null,Ue!=="-"?w.jsx("span",{className:be.placeChipBadge,children:Ue}):null]})},F.clientId)}),le.length===0&&Me.length===0?w.jsx(Vt,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:w.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:w.jsx("span",{className:be.placeChipName,children:Te})})}):Me.map(F=>{const oe=F.placeId===we,ue=!!(k!=null&&k.pluginConnected)&&F.isConnected,Pe=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),Ae=mp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:F.placeName,placeId:String(F.placeId),state:Pe}),Ue=[be.placeChip,be.placeChipStatic,oe&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return w.jsx(Vt,{text:Ae,children:w.jsxs("span",{className:Ue,children:[oe&&ue?w.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,w.jsx("span",{className:be.placeChipName,children:F.placeName}),w.jsx("span",{className:be.placeChipId,children:F.placeId})]})},`${F.placeId}:${F.placeDirName}`)})]})]})]}),w.jsxs("div",{className:be.metaActions,children:[!Y&&w.jsx(fb,{}),w.jsx(Vt,{text:u("sidebar.controls","Controls"),children:w.jsx(jo,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...pe}),children:w.jsx(Vp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),w.jsx(Vt,{text:u("sidebar.settings","Settings"),children:w.jsx(jo,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...pe}),children:w.jsx(dS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),w.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":C?"visible":"empty","aria-hidden":C?void 0:!0,children:C?w.jsx(Vt,{text:C.tooltip,children:w.jsxs("div",{className:be.auxiliaryPath,children:[w.jsx("span",{className:be.pathLabel,children:C.label}),w.jsx("span",{className:be.projectPath,title:C.value,children:C.value})]})}):null})]})})}const Ab="_guide_42h5y_1",xb="_headingRow_42h5y_14",Rb="_bodyRow_42h5y_15",Ib="_actionRow_42h5y_16",Db="_headingCopy_42h5y_26",Eb="_eyebrow_42h5y_32",jb="_closeButton_42h5y_50",Tb="_primaryButton_42h5y_73",Ub="_secondaryButton_42h5y_74",Lb="_linkButton_42h5y_75",zb="_message_42h5y_87",Hb="_statusBadge_42h5y_101",Mb="_feedback_42h5y_169",Ob="_feedbackError_42h5y_177",Et={guide:Ab,headingRow:xb,bodyRow:Rb,actionRow:Ib,headingCopy:Db,eyebrow:Eb,closeButton:jb,primaryButton:Tb,secondaryButton:Ub,linkButton:Lb,message:zb,statusBadge:Hb,feedback:Mb,feedbackError:Ob};function Nb(){const{t:i}=ma(),n=Mn(),r=x.useId(),[d,u]=x.useState(null),[p,g]=x.useState(!1),[y,h]=x.useState(!1);if(x.useEffect(()=>{let k=!1;return Pt.get("/api/dashboard/settings").then(b=>{!k&&!b.dashboard.autoOpenGuideSeen&&u({autoOpen:b.dashboard.autoOpen})}).catch(()=>{}),()=>{k=!0}},[]),!d)return null;const v=async(k,b=!1)=>{g(!0),h(!1);try{await Pt.patch("/api/dashboard/preferences",k),u(null),b&&n("/settings?section=dashboard")}catch{h(!0)}finally{g(!1)}};return w.jsxs("section",{className:Et.guide,role:"region","aria-labelledby":r,children:[w.jsxs("div",{className:Et.headingRow,children:[w.jsxs("div",{className:Et.headingCopy,children:[w.jsx("span",{className:Et.eyebrow,children:i("dashboardAutoOpenGuide.eyebrow","Dashboard preference")}),w.jsx("h2",{id:r,children:i("dashboardAutoOpenGuide.title","Choose how WEPPY Dashboard opens")})]}),w.jsx("button",{type:"button",className:Et.closeButton,"aria-label":i("dashboardAutoOpenGuide.close","Close auto-open guide"),disabled:p,onClick:()=>{v({autoOpenGuideSeen:!0})},children:"×"})]}),w.jsxs("div",{className:Et.bodyRow,children:[w.jsxs("div",{className:Et.message,children:[w.jsx("p",{children:d.autoOpen?i("dashboardAutoOpenGuide.currentOn","Auto-open is currently On. This Dashboard opens after the MCP Server starts."):i("dashboardAutoOpenGuide.currentOff","Auto-open is currently Off. WEPPY will not open a new Dashboard tab when the MCP Server starts.")}),w.jsxs("p",{children:[i("dashboardAutoOpenGuide.changeAnytime","You can change this anytime in Settings.")," ",i("dashboardAutoOpenGuide.agentHint","You can also ask your Agent, “Turn off Dashboard auto-open.”")]})]}),w.jsx("span",{className:Et.statusBadge,children:d.autoOpen?i("dashboardAutoOpenGuide.statusOn","Auto-open On"):i("dashboardAutoOpenGuide.statusOff","Auto-open Off")})]}),w.jsxs("div",{className:Et.actionRow,children:[w.jsx("button",{type:"button",className:Et.primaryButton,disabled:p,onClick:()=>{v({autoOpenGuideSeen:!0})},children:i("dashboardAutoOpenGuide.keep","Keep current setting")}),w.jsx("button",{type:"button",className:Et.secondaryButton,disabled:p,onClick:()=>{v({autoOpen:!1,autoOpenGuideSeen:!0})},children:i("dashboardAutoOpenGuide.turnOff","Turn off auto-open")}),w.jsx("button",{type:"button",className:Et.linkButton,disabled:p,onClick:()=>{v({autoOpenGuideSeen:!0},!0)},children:i("dashboardAutoOpenGuide.openSettings","Open Settings")}),w.jsx("span",{className:`${Et.feedback} ${y?Et.feedbackError:""}`,"aria-live":"polite",children:p?i("dashboardAutoOpenGuide.saving","Saving…"):y?i("dashboardAutoOpenGuide.error","Could not save your choice. Please try again."):" "})]})]})}const _b="_layout_19mmz_2",qb="_mainShell_19mmz_8",Bb="_content_19mmz_17",Wb="_loading_19mmz_26",Dn={layout:_b,mainShell:qb,content:Bb,loading:Wb};function Fb(){const{pathname:i,search:n}=Yt(),{trackPageView:r}=cs();return x.useEffect(()=>{r(us(i,n))},[i,n,r]),null}function Vb(){const{t:i}=ma();return w.jsx("div",{className:Dn.loading,children:i("common.loading","Loading...")})}function Yb(){return w.jsx(ef,{children:w.jsx(uf,{children:w.jsxs(Wy,{children:[w.jsx(pf,{}),w.jsx(Fb,{}),w.jsxs("div",{className:Dn.layout,children:[w.jsx(Uv,{}),w.jsxs("div",{className:Dn.mainShell,children:[w.jsx(Cb,{}),w.jsxs("main",{className:Dn.content,children:[w.jsx(Nb,{}),w.jsx(x.Suspense,{fallback:w.jsx(Vb,{}),children:w.jsx(ly,{})})]})]})]})]})})})}function yp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:i.route==="/changelog"?{path:"changelog/:id?",lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Gb=fy([{path:"/",element:w.jsx(Yb,{}),children:[...Yp.map(yp),...Wl.map(yp),{path:"settings",lazy:()=>oa(()=>import("./SettingsPage-B_9NwPEF.js"),__vite__mapDeps([42,2,3,1,6,38,39,12,13,14,32,33,43]))}]}]);Wh.createRoot(document.getElementById("root")).render(w.jsx(Ay,{router:Gb}));export{To as A,Qb as B,Zb as C,Jl as D,Wp as E,Nf as F,Jb as G,Nv as H,Vf as I,Mv as J,jo as L,aS as M,$b as N,iS as P,Fp as R,Zy as S,kS as T,mS as X,cs as a,Pt as b,Yt as c,_n as d,bS as e,Ve as f,Lv as g,Vt as h,cf as i,w as j,Oy as k,us as l,Nn as m,Uf as n,dS as o,Mn as p,Xb as q,x as r,Zp as s,Ln as t,ma as u,Hv as v,tP as w,eP as x,aP as y,qp as z};
|