{ "app": { "title": "Spine Particle Editor - Yeomai", "resizeTimeline": "Drag to resize the timeline", "systems": "Systems", "particlesBones": "Particles (bones)", "rootBone": "Root bone", "hudTip": "Scroll to zoom · Drag with left mouse to pan" }, "language": { "label": "Language", "zhCN": "中文", "zhTW": "繁體中文", "en": "English", "ja": "日本語", "ko": "한국어", "fr": "Français", "de": "Deutsch", "ptBR": "Português", "es": "Español" }, "welcome": { "documentTitle": "Yeomai Spine Tools", "titleLead": "From Spine particles", "titleAccent": "to the Spine toolchain", "backToTools": "Back to tools", "editor": { "badge": "PARTICLE EDITOR", "title": "Particle Editor", "description": "Build Spine particle systems and freely export JSON and Spine project files.", "tagPreview": "Live preview", "tagSequence": "Spine project export", "tagExport": "JSON export", "cta": "Open Particle Editor" }, "viewer": { "badge": "EAGLE PLUGIN", "description": "Easily review your Spine assets inside Eagle.", "tagVersions": "3.4–4.3", "tagSkins": "Animation preview", "tagTimeline": "Format support", "cta": "View SpineViewer" }, "thumbnail": { "badge": "EAGLE PLUGIN", "auto": "Auto generate", "description": "Detect Spine assets and generate thumbnails, a companion tool for SpineViewer.", "tagPairing": "Asset pairing", "tagModes": "Static / animated", "tagBatch": "Batch output", "cta": "View SpineThumbnails" } }, "common": { "close": "Close", "collapse": "Collapse", "reset": "Reset", "add": "Add", "remove": "Remove", "delete": "Delete", "clear": "Clear", "cancel": "Cancel", "confirm": "Confirm", "none": "None", "enabled": "Enabled", "disabled": "Disabled", "fixed": "Fixed", "random": "Random", "curve": "Curve", "followExport": "Follow export", "linear": "Linear", "bezier": "Bézier", "above": "Above", "below": "Below", "left": "Left", "right": "Right", "seconds": "s", "frames": "f" }, "toolbar": { "settings": "Settings", "undo": "Undo (Ctrl+Z)", "pan": "Pan canvas (Q)", "translate": "Move (W)", "rotate": "Rotate (E)", "scale": "Scale (R)", "zoomIn": "Zoom in", "zoomOut": "Zoom out", "fitView": "Fit canvas", "toggleGrid": "Toggle grid", "resetView": "Reset view", "background": "Background", "backgroundSettings": "Background settings", "changeBackground": "Replace image", "uploadBackground": "Upload image", "clearBackground": "Clear background", "noBackground": "No image", "backgroundX": "Background X offset", "backgroundY": "Background Y offset", "backgroundOpacity": "Background opacity", "opacity": "Opacity", "help": "Help", "openHelp": "Open help" }, "settings": { "title": "Settings", "layout": "Layout", "floatingMenu": "Floating menu", "floatingMenuParticleOnly": "Select a particle system first", "parameterPanelPosition": "Parameter panel position", "panelOnRight": "Show parameter panel on the right", "history": "History", "maxUndo": "Maximum undo steps", "canvasGuides": "Canvas guides", "emitter": "Emitter point", "bones": "Bone links", "bonePointSize": "Bone point size", "boneAxisSize": "Axis size", "skinMesh": "Skin mesh", "enableTicks": "Show ticks", "tickFontSize": "Tick text size", "tickWidth": "Tick line width", "axisColor": "Axis color", "showAxisLabels": "Show tick values", "unsavedPrompt": "Prompt for unsaved changes", "showProjectSize": "Show configuration storage usage", "cacheNote": "Settings are saved automatically in this browser" }, "config": { "title": "Configuration", "save": "Save Config", "saveTitle": "Save configuration to browser cache", "load": "Load Config", "loadTitle": "Load an editor configuration file", "presets": "Preset list", "selectPreset": "Select preset", "noPresets": "No presets", "saved": "Configuration saved locally", "loading": "Loading configuration…", "loaded": "Loaded: {name}", "presetLoading": "Loading preset…", "presetLoaded": "Preset loaded: {name}", "presetNamingError": "{message}. Check the preset file name.", "presetTransferTitle": "Load Preset", "presetDownloading": "Downloading {file}…", "presetParsing": "Parsing preset configuration…", "presetRestoring": "Parsing and restoring preset resources…", "presetComplete": "Preset loaded", "presetListError": "Unable to read preset list", "presetReadError": "Unable to read preset: {file}", "local": { "listTitle": "Configuration List", "empty": "No configurations saved in this browser", "saveTitle": "Save configuration to browser cache", "name": "Configuration name", "namePlaceholder": "For example: Firework effect", "load": "Load", "loadHint": "Double-click to load", "download": "Download", "delete": "Delete", "downloadCurrent": "Download Current Configuration", "downloadAll": "Download All Configurations", "loadAll": "Load All Configurations", "loadAllConfirm": "Import {count} configuration files? Existing configurations with the same names will be overwritten.", "loadAllDone": "Loaded {count} configurations from files", "loadAllPartial": "Imported {imported} configurations; {failed} files failed", "overwriteSave": "“{name}” already exists. Overwrite it?", "loadOverwrite": "Loading “{name}” will replace the current scene and discard unsaved changes. Continue?", "deleteConfirm": "Delete “{name}”?", "nameRequired": "Enter a configuration name", "nameInvalid": "The name cannot contain \\ / : * ? \" < > |", "storageUnavailable": "Browser local storage is unavailable", "saved": "Saved to browser: {name}", "loaded": "Loaded from browser: {name}", "deleted": "Deleted browser configuration: {name}", "downloadEmpty": "No configurations to download", "downloaded": "Downloaded: {name}" } }, "curve": { "bezierHint": "Drag square handles · Double-click empty space to add · Double-click a node to delete", "linearHint": "Double-click empty space to add · Double-click a node to delete · Drag nodes to adjust", "resetTitle": "Restore default curve" }, "gradient": { "addTitle": "Double-click the color bar to add a stop", "color": "Stop color", "colorValue": "Stop color value", "position": "Stop position", "addMiddle": "Add color in the middle", "delete": "Delete selected stop", "hint": "Double-click to add · Drag a stop to move · Double-click a stop to delete" }, "attributeControl": { "angleOffset": "Angle offset", "value": "Value", "lower": "Min", "upper": "Max", "rangeLower": "Range min", "rangeUpper": "Range max", "curveInput": "Curve input →", "direction": "Emission direction" }, "pivot": { "title": "Texture Pivot", "zoomOut": "Zoom out", "zoomIn": "Zoom in", "expand": "Open full-screen pivot editor", "interaction": "Click/drag to set pivot · Right-drag to pan · Scroll to zoom", "previewAlt": "Pivot preview", "noImage": "No image selected", "resetCenter": "Center (50%, 50%)", "coordinates": "Pivot coordinates (%)", "rotationTest": "Pivot rotation test", "static": "Static", "spin": "Spin", "swing": "Swing", "rotationAlt": "Rotation test", "topLeft": "Top left", "top": "Top", "topRight": "Top right", "left": "Left", "center": "Center", "right": "Right", "bottomLeft": "Bottom left", "bottom": "Bottom", "bottomRight": "Bottom right" }, "image": { "chooseSequence": "Choose sequence images", "chooseLocal": "Choose local image", "subfolder": "Subfolder", "name": "Name", "restore": "Restore {name}", "deleteResource": "Delete image resource", "imageMode": "Image mode", "fixed": "Single image", "sequence": "Sequence", "playbackMode": "Playback", "onceHide": "Once, hide at end", "onceHold": "Once, hold last frame", "loopForward": "Loop forward", "loopReverse": "Loop reverse", "playbackFps": "Playback FPS", "chooseSequenceMulti": "Choose sequence images (multiple)", "weight": "Weight %", "unlockWeight": "Unlock weight", "lockWeight": "Lock current weight", "pivot": "Texture Pivot", "collapsePivot": "Collapse pivot editor", "expandPivot": "Expand pivot editor", "pivotModal": "Full-screen texture pivot editor", "pivotModalDesc": "Click or drag on the texture to set the exact particle rotation center", "pivotZoomHint": "Zoom from 100% to 400% to align tips or roots precisely:", "confirmPivot": "Apply and save pivot", "noSequence": "No sequence selected", "firstFrame": "Frame 1", "firstImage": "first image", "lastImage": "last image", "pivotOn": "Enabled: X {x}% | Y {y}%", "pivotOff": "Disabled, using image center (50%, 50%)", "pivotCustom": "Custom pivot: X {x}% | Y {y}%", "frameCountOne": "1 frame · {name}", "frameCountMany": "{count} frames · {first} → {last}", "sequenceSelected": "{count} frames selected, playing {first} to {last}" }, "timeline": { "play": "Play (D)", "pause": "Pause (D)", "toStart": "Go to first frame (S)", "previous": "Previous frame", "next": "Next frame", "toEnd": "Go to last frame", "continuousLoop": "Continuous loop playback", "abLoop": "Independent A/B range loop", "abLoopShort": "AB Loop", "abRange": "A/B loop range", "playbackStart": "Custom playback start frame", "playbackEnd": "Custom playback end frame", "startFrame": "Playback start frame", "endFrame": "Playback end frame", "frame": "Frame", "emission": "Emitting", "particleLife": "Particles alive", "spineAnimation": "Spine animation", "ownerAnimation": "Owner animation", "setOwnerAnimation": "Set the animation that owns this particle system", "chooseOwnerAnimation": "Choose owner animation", "animationName": "Animation name", "renameAnimation": "Rename current animation", "rename": "Rename", "newAnimation": "+ New", "keepOneAnimation": "At least one animation is required", "spinePreview": "Spine preview animation", "noSpineAnimation": "No Spine animation available", "none": "None", "systemName": "System {index}", "dragLoopDuration": "Drag to change loop duration", "dragEmissionDuration": "Drag to change emission duration", "dragSpineStart": "Drag to change animation start time", "noAnimationData": "No animation data", "animationNameEmpty": "Animation name cannot be empty", "animationNameDuplicate": "Animation name already exists", "animationRenameFailed": "Unable to rename animation", "zoomIn": "Zoom in", "zoomOut": "Zoom out", "zoomFit": "Fit", "frameStatus": "Frame {current} / {total}" }, "emission": { "title": "Emission", "reset": "Reset emission settings", "stream": "Stream", "burst": "Burst", "normalStream": "Standard stream", "loopStream": "Loop stream", "rate": "Emission rate", "duration": "Emission duration", "loopDuration": "Emission duration (f)", "generateStart": "Generate loop start animation", "generateEnd": "Generate loop end animation", "customDuration": "Custom duration", "auto": "Auto {frames}f", "startLoopDuration": "Loop start duration", "endLoopDuration": "Loop end duration", "loopWarning": "Bone and path following are unavailable in loop stream mode and will be reset when entering or leaving it.", "burstCount": "Burst count", "delay": "Delay", "shapeTitle": "Emitter Shape", "shapeReset": "Reset emitter shape settings", "shape": "Shape", "point": "Point", "circle": "Circle", "rect": "Rectangle", "cone": "Cone", "path": "Path", "innerDiameter": "Inner diameter", "outerDiameter": "Outer diameter", "innerRadius": "Inner radius", "outerRadius": "Outer radius", "coneDirection": "Cone direction", "coneAngle": "Cone opening angle", "innerWidth": "Inner width", "innerHeight": "Inner height", "outerWidth": "Outer width", "outerHeight": "Outer height", "selectPath": "Spawn path", "noPath": "No path (point emission)", "birthDistribution": "Birth distribution", "evenDistribution": "Even spacing", "randomDistribution": "Random", "emissionAngle": "Emission angle", "radial": "Radial (outward)", "pathNormal": "Path normal", "pathTangent": "Path tangent", "fixedAngle": "Fixed angle", "baseAngle": "Base angle", "randomRange": "Random range", "showShape": "Show shape" }, "attributes": { "title": "Particle Attributes", "reset": "Reset particle attribute settings", "initialParams": "Initial particle values", "initialLife": "Initial life", "randomSample": "Random sample →", "initialSpeed": "Initial speed", "initialScale": "Initial scale", "uniform": "Uniform", "separateXY": "Separate XY", "scaleX": "Scale X", "scaleY": "Scale Y", "initialRotation": "Initial rotation", "lifecycleTitle": "Values over particle life", "speedOverLife": "Speed over life", "speedMultiplier": "Speed multiplier", "lifeTo": "Lifetime →", "scaleOverLife": "Scale over life", "scaleMultiplier": "Scale multiplier", "multiplierX": "Multiplier X", "multiplierY": "Multiplier Y", "rotationOverLife": "Rotation over life", "rotationSpeed": "Rotation speed" }, "appearance": { "title": "Appearance & Resources", "reset": "Reset appearance and resource settings", "opacity": "Opacity", "curveMode": "Curve mode", "transparent": "0 (transparent)", "opaque": "1 (opaque)", "renderLayer": "Render layer (Spine slot)", "top": "Topmost", "spineSlot": "Spine slot", "selectSpine": "Select Spine", "noSpine": "No Spine available", "noSlot": "No slot selected", "reselect": "Reselect", "selectSlot": "Select slot", "searchSlots": "Search slots or attachments…", "searchSlotsAria": "Search slots", "emptySlot": "Empty slot", "noMatchingSlots": "No matching slots", "above": "Above slot image", "below": "Below slot image", "followAttachment": "Follow attachment visibility", "previewOnly": "Render layer changes only affect the editor preview and are not exported.", "imageResources": "Image Resources", "addImage": "Add image resource", "scale": "Scale", "color": "Color", "fixedColor": "Fixed color", "randomColor": "Random color", "lifetime": "Over lifetime", "normal": "Normal", "add": "Add", "multiply": "Multiply", "screen": "Screen", "fixedColorValue": "Fixed color value", "randomColorHint": "Each particle samples a color from the gradient at birth and keeps it for its lifetime", "independentAlpha": "Independent opacity", "off": "Off" }, "renderLayer": { "slotLabelAbove": "{spine} / {slot} · above image", "slotLabelBelow": "{spine} / {slot} · below image", "resolvedAbove": "Render above {slot} and below the following slot", "resolvedBetween": "Render between {previous} and {slot}", "warningNoSpine": "No loaded Spine resource. Particles are temporarily rendered on top.", "warningNoSelection": "No Spine selected. Particles are temporarily rendered on top.", "warningMissingSpine": "The target Spine no longer exists. Particles are temporarily rendered on top.", "warningNotReady": "The target Spine is not ready. Particles are temporarily rendered on top.", "warningMissingSlot": "The target slot no longer exists. Particles are temporarily rendered on top.", "warningFirstSlot": "This is the first slot, so particles cannot render below it and are temporarily shown on top." }, "export": { "title": "Export Resources", "reset": "Reset export resources", "imagesPath": "Image path (Spine Images Path)", "spineVersion": "Spine version", "keyframeCurve": "Keyframe interpolation", "linear": "Linear", "smoothBezier": "Smooth Bézier", "bezierHelp": "Smooth Bézier fits continuous motion within the error tolerance; birth, death, attachment changes, and jumps still use stepped keys.", "spine38Help": "Spine 3.8 does not support per-channel array Bézier curves. Export converts them to tolerance-reduced piecewise linear keys.", "fps": "Export FPS", "omitFps": "Omit fps", "fpsHelp": "Changing FPS preserves real animation duration. “Omit fps” only removes the Spine fps metadata.", "integerFrames": "Integer frame alignment", "bonePool": "Bone object pool", "excludeEmpty": "Exclude empty animations", "baking": "Recalculating and baking animation", "exportJsonTitle": "Export Spine {version} JSON", "preparing": "Preparing export…", "exportJson": "Export Spine JSON", "exportImagesTitle": "Download the images used by the current particle systems as a ZIP", "organizingImages": "Collecting images…", "exportImages": "Export images ZIP", "generatingProject": "Generating project…", "exportSpine": "Export .spine package", "authorize": "Authorize this site", "authorizeTitle": "Authorize this site in the local connector", "refreshConnector": "Check connector again", "refresh": "Refresh", "recalculating": "Recalculating particle animation…", "exported": "Exported Spine {version}: {systems} particle systems, {animations} animations, {bones} bones{warning}", "resourceWarning": "; {count} resource warnings (export continued without missing images)", "timeout": "Baking timed out. Ensure the page is still running and try again.", "preparingProject": "Collecting images and calling local Spine…", "projectExported": "Generated {fileName}: .spine project with {images} images, Spine {version}", "collectingImages": "Collecting images used by the current particle systems…", "imagesExported": "Generated {fileName}: {images} images in {folder}/", "connectorChecking": "Checking the local Spine connector…", "connectorOffline": "Local Spine connector is not running", "spineNotFound": "Connector is running, but Spine was not found", "notAuthorized": "Connector is running, but this site is not authorized", "connectorReady": "Connector available · Spine ready", "connectorBusy": "Recalculating and generating the Spine project", "connectorGenerate": "Generate a Spine {version} project with the local Spine", "unknown": "Unknown", "checking": "Checking", "offline": "Offline", "notFound": "Spine not found", "unauthorized": "Not authorized", "projectTransferTitle": "Export Spine Package", "projectTransferDetail": "Recalculating particle animation…", "projectTransferDownload": "Spine project download started", "generatingJson": "Generating Spine JSON…", "preparingProjectFiles": "Preparing project images…", "uploading": "Uploading data to the Spine connector…", "spineProcessing": "Spine is converting the project…", "downloadingProject": "Downloading the generated Spine project…", "handingToBrowser": "Starting browser download…" }, "transfer": { "completed": "Completed", "failed": "Operation failed" }, "scene": { "title": "Scene Objects", "addParticle": "Add particle system", "addParticleShort": "+ Particle", "addCollider": "Add collider", "addColliderShort": "+ Collider", "addPath": "Add path", "addPathShort": "+ Path", "addSpine": "Add Spine", "copyTitle": "Duplicate selected scene object", "showParticle": "Show particle system", "hideParticle": "Hide particle system", "showCollider": "Show collider", "hideCollider": "Hide collider", "showPath": "Show path", "hidePath": "Hide path", "showSpine": "Show Spine", "hideSpine": "Hide Spine", "particle": "Particle", "subEmitter": "Sub-emitter", "collision": "Collision", "path": "Path", "deleteParticle": "Delete particle system", "deleteCollider": "Delete collider", "deletePath": "Delete path", "deleteSpine": "Delete Spine", "empty": "No scene objects", "name": "Name", "positionX": "Position X", "positionY": "Position Y", "offsetX": "Offset X", "offsetY": "Offset Y", "rotation": "Rotation", "scaleX": "Scale X", "scaleY": "Scale Y", "warmupFrames": "Warm-up frames", "seed": "Random seed", "seedTitle": "Controls random attributes, resource selection, and modifier sampling", "randomizeSeed": "Generate a new global random seed", "seedHint": "Controls initial random values, resource selection, and modifier sampling. The same seed reproduces the same result.", "colliderTitle": "Collider Properties", "colliderName": "Collider name", "type": "Type", "circle": "Circle", "ellipse": "Ellipse", "rect": "Rectangle", "polygon": "Polygon", "custom": "Custom", "enabled": "Enabled", "xPosition": "X position", "yPosition": "Y position", "scaleXShort": "Scale X", "scaleYShort": "Scale Y", "radius": "Radius", "radiusX": "X radius", "radiusY": "Y radius", "width": "Width", "height": "Height", "sides": "Sides", "collisionResponse": "Collision response", "physics": "Physics (bounce / friction)", "pause": "Pause in place", "destroy": "Destroy immediately", "elasticity": "Elasticity (0-1)", "friction": "Friction (0-1)", "followPath": "Follow a path", "targetPath": "Target path", "notSelected": "(Not selected)", "moveDuration": "Move duration (s)", "followDirection": "Orient along path", "moveProgressCurve": "Movement progress curve", "moveProgressHelp": "X: elapsed / duration · Y: path progress (0 = start, 1 = end)", "pathTitle": "Path Properties", "pathName": "Path name", "closedPath": "Closed path", "pathColor": "Path color", "pathHelp": "Controls:", "pathHelpItems": [ "Double-click empty space or a curve to add an anchor", "Double-click an anchor to delete it", "Double-click, hold on the second click, and drag to create handles", "Drag anchors to move them and handles to reshape the curve", "Shift + handle drag: symmetric handles", "Alt + handle drag: independent handles", "Ctrl + click / box select: add nodes", "Alt + click / box select: remove nodes", "Alt + click empty space: clear selection", "Move multiple selected anchors together" ], "applyPresetShape": "Apply preset shape", "choosePreset": "Choose preset…", "square": "Square", "star": "Star", "applyPreset": "Apply preset", "clearAnchors": "Clear anchors", "panelHint": "Use the buttons above to create a scene object" }, "modifiers": { "title": "Modifiers", "reset": "Reset modifiers", "damping": "Damping", "enableNoise": "Enable movement noise", "strength": "Strength", "noiseRange": "Wander range", "noiseSpeed": "Time speed", "noiseHint": "Strength controls influence · Wander range controls maximum offset · Time speed controls variation rate", "enableGravity": "Enable gravity", "gravityStrength": "Gravity strength", "strengthMin": "Strength min", "strengthMax": "Strength max", "direction": "Direction", "gravityOverLife": "Gravity over lifetime", "windOverLife": "Wind over lifetime", "axisStrength": "Y: strength 0–1", "directionHint": "0° right · -90° down · Negative strength reverses direction", "enableWind": "Enable wind", "windStrength": "Wind strength", "enableForceField": "Enable force field", "centerX": "Center X", "centerY": "Center Y", "forceStrength": "Force strength", "forceRadius": "Force radius", "falloffMode": "Falloff", "constant": "Constant", "linearFalloff": "Linear (zero at edge)", "inverseFalloff": "Inverse distance (strongest at center)", "forceHint": "Positive attracts · Negative repels · Drag the force circle on the canvas", "showShape": "Show shape", "enableVortex": "Enable vortex", "vortexHint": "Positive counter-clockwise · Negative clockwise", "enableAttraction": "Enable attraction", "attractionX": "Attraction point X", "attractionY": "Attraction point Y", "attractionRadius": "Arrival radius", "attractionDuration": "Attraction duration", "delay": "Delay", "delayMode": "Delay mode", "globalTime": "Global time", "particleLife": "Per particle life", "attractionPath": "Attraction path", "straight": "Straight", "attractionHint": "Starts attraction after the delay · Dies on reaching the red radius · Drag the attraction circle on the canvas", "enableTrail": "Enable trail", "trailImages": "Trail Images", "addTrailImage": "Add trail image resource", "trailRotation": "Rotation", "trailBones": "Trail bones", "trailRatio": "Trail ratio (%)", "trailLength": "Trail length", "randomRange": "Random range", "lengthRatio": "Length ratio (%)", "lengthMin": "Length min (%)", "lengthMax": "Length max (%)", "trailWidth": "Trail width", "widthRatio": "Width ratio (%)", "widthMin": "Width min (%)", "widthMax": "Width max (%)", "widthScale": "Width scale", "followParticle": "Follow particle", "lifeLengthCurve": "Length over lifetime", "shapeCurve": "Shape curve (head to tail width)", "colorMode": "Color mode", "blendMode": "Blend mode", "fixedColor": "Fixed color", "alphaMode": "Opacity mode", "opacity": "Opacity", "gridRows": "Grid rows", "gridCols": "Grid columns", "trailHint": "Each particle creates a sibling trail bone group according to the resource ratio. Random length and width are fixed at birth and reproducible with the same seed.", "enableFollow": "Enable emitter following", "followMode": "Follow mode", "noFollow": "None", "followPath": "Follow path", "selectedBone": "Selected bone", "emitterAngleMode": "Emitter angle mode", "fixedAngle": "Fixed angle", "followMoveDirection": "Follow movement direction", "moveProgressCurve": "Movement progress curve (0→1)", "moveDuration": "Move duration (s)", "followSpace": "Follow space", "localSpace": "Local space (move emitter)", "worldSpace": "World space (move spawn point)", "moveDirection": "Movement direction", "forward": "Forward (start → end)", "reverse": "Reverse (end → start)", "followOffset": "Start offset (0-1)", "followSpaceHint": "Local space moves the entire emitter. World space moves only the spawn point; existing particles stay in world position.", "followTarget": "Follow target: ", "noValidBone": "No valid bone is bound. Select a bone in the Spine hierarchy first.", "rebind": "Rebind", "bind": "Bind", "selectedBoneLabel": "Selected bone: ", "boneLocalSpace": "Local space (follow bone)", "boneWorldSpace": "World space (keep particle position)", "offsetX": "Position offset X", "offsetY": "Position offset Y", "rotationOffset": "Rotation offset", "scaleOffsetX": "Scale offset X", "scaleOffsetY": "Scale offset Y", "boneFollowHint": "The emitter follows only the selected Spine bone position. Particle transforms use the particle system settings and offsets above.", "enableCollision": "Enable collision", "collisionObjects": "Collision objects", "colliderDisabled": "{name} (disabled)", "clearCollider": "Remove collider {name}", "addCollider": "Add a scene collider", "noAvailableColliders": "No colliders available", "noCollidersSelected": "No collider selected. Current particles will not collide.", "available": "Available", "disabled": "Disabled", "collisionHint": "Only enabled scene colliders added here participate in this particle system's collisions.", "enableSubEmitter": "Enable sub-emitters", "triggerTiming": "Choose trigger event", "birth": "Birth", "death": "Death", "collision": "Collision", "chooseTarget": "Choose target particle system", "noTarget": "None (particle system)", "deleteSubEmitter": "Delete this sub-emitter", "probability": "Trigger probability", "collisionLimit": "Collision trigger limit", "inherit": "Inherit", "colorInheritMode": "Color inheritance", "add": "Add", "replace": "Replace", "addSubEmitter": "+ Add sub-emitter", "inheritNone": "None (default)", "inheritAll": "All attributes", "inheritColor": "Color", "inheritScale": "Size", "inheritRotation": "Rotation", "inheritLife": "Lifetime" }, "spine": { "title": "Spine Properties", "name": "Spine name", "xPosition": "X position", "yPosition": "Y position", "rotation": "Rotation", "scaleX": "Scale X", "scaleY": "Scale Y", "startTime": "Start time", "resources": "Spine Resources", "chooseFolder": "Choose folder and load", "folderHint": "Reads JSON / SKEL, Atlas, and all textures from the folder. Assets can still be replaced individually below.", "choose": "Choose", "chooseMultiple": "Choose multiple", "loading": "Loading…", "load": "↧ Load", "clear": "Clear", "supportNote": "Supports Spine 3.8 / 4.0 / 4.1 / 4.2 / 4.3 JSON · Runtime loaded on demand · Fully local", "currentResource": "Current asset {version}", "animations": "Spine Animations", "noAnimations": "No animations available", "timelineAnimation": "Timeline animation", "no": "None", "hierarchy": "Hierarchy", "clearBoneTitle": "Click to clear bone selection", "noBoneTitle": "No bone selected", "clearBone": "Clear selected bone: {name}", "currentBone": "Current bone: ", "clearSlotTitle": "Click to clear slot selection", "noSlotTitle": "No slot selected", "clearSlot": "Clear selected slot: {name}", "currentSlot": "Current slot: ", "notSelected": "Not selected", "expandAll": "Expand all", "collapseAll": "Collapse all", "bones": "Bones", "slots": "Slots", "notLoaded": "Spine not loaded", "searchBones": "Search bones", "searchBonesPlaceholder": "Search bone names…", "clearSearch": "Clear search", "clearBoneSearch": "Clear bone search", "noMatchingBones": "No matching bones", "expandChildren": "Expand child bones", "collapseChildren": "Collapse child bones", "notLoadedSlots": "Spine slots not loaded", "searchSlots": "Search slots", "searchSlotsPlaceholder": "Search slots or attachments…", "clearSlotSearch": "Clear slot search", "noMatchingSlots": "No matching slots", "slotTitle": "{name} (bone: {bone}, attachment: {attachment})", "empty": "Empty", "textureSummary": "{count} textures: {names}", "textureImages": "texture images", "missingFolderAssets": "The selected folder is missing: {missing}", "chooseAssets": "Select Spine data, Atlas, and all texture images" }, "help": { "title": "Help", "subtitle": "Quick start from creating particles to saving and exporting", "close": "Close help", "closeShort": "Close (Esc)", "quickStart": "Quick Start", "stepCreate": "Create objects: use + Particle / + Collider / + Path / + Spine in Scene Objects.", "stepEdit": "Edit particles: select a particle system, then adjust Emission → Emitter Shape → Particle Attributes → Appearance & Resources → Modifiers.", "stepPreview": "Preview: play, pause, step, or scrub on the timeline. Parameter changes are recalculated automatically.", "stepExport": "Save and export: Save Config keeps the project; Export Spine JSON / images ZIP / .spine package produces the deliverable.", "quickNote": "Reset beside each section restores that section's defaults. Settings are saved automatically in this browser.", "commonOps": "Common Actions", "eye": "Visibility", "eyeDesc": "Show or hide an object independently. Hidden particle systems are not exported.", "copyDesc": "Duplicate the selected object for parameter comparisons.", "backgroundDesc": "Upload a reference image and adjust its position and opacity for canvas preview only.", "settingsDesc": "Manage layout, canvas guides, tick display, and other editor settings.", "undoDesc": "Ctrl+Z undoes one step. The maximum history size is configurable.", "spineBoneDesc": "Search and select bones in the hierarchy for emitter following.", "shortcuts": "Shortcuts", "undoShortcut": "Undo", "saveShortcut": "Save config", "panShortcut": "Pan canvas", "translateShortcut": "Move tool", "rotateShortcut": "Rotate tool", "scaleShortcut": "Scale tool", "playShortcut": "Play / pause", "startShortcut": "Go to first frame", "shortcutNote": "Click the canvas before using Q / W / E / R. Single-key shortcuts are disabled while typing in inputs.", "modules": "Module Guide", "configTitle": "Configuration", "saveConfigDesc": "Save all scene objects and parameters to a project JSON file. Ctrl+S is supported.", "loadConfigDesc": "Load a local configuration and restore the complete project.", "presetDesc": "Choose a preset from the dropdown. Open the dropdown to refresh the list.", "configScope": "Scope", "configScopeDesc": "The project includes objects and parameters. Interface settings are stored separately in the browser.", "sceneTitle": "Scene Objects", "particleDesc": "The core object. Set position, offset, rotation, scale, and random seed. The same seed reproduces the same result.", "colliderDesc": "Circle, ellipse, rectangle, polygon, or custom shape with physics, pause, destroy, and path-following responses.", "pathDesc": "Bézier path with anchors, handles, closing, color, and preset shapes.", "spineDesc": "Load Spine data, Atlas, and textures; browse bones and slots, and use them for emitter following.", "sceneCommonDesc": "Objects can be hidden and duplicated independently. Hidden particle systems are not exported.", "emissionDesc": "Streaming, burst, delay, and three-part loop streaming with start, loop, and end sections.", "burstDesc": "Emit a fixed number of particles once.", "delayDesc": "Wait time before emission starts, shown at the left edge of the particle bar.", "loopNote": "Loop streaming does not support bone or path following and resets those settings when enabled.", "shapeDesc": "Point, circle, rectangle, cone, or path spawn areas. Circle/cone use inner and outer radii; rectangles use inner and outer dimensions.", "angleDesc": "Fixed, random, radial, path normal, or path tangent.", "initialDesc": "Life, speed, scale, and rotation support fixed, random, and curve modes. Rotation can follow emission direction.", "overLifeDesc": "Speed, scale, and rotation can be controlled by lifetime curves.", "alphaDesc": "Opacity can be fixed or curved. Curve mode can follow export, linear, or Bézier.", "imageDesc": "Single images or sequence frames, weighted image selection, pivots, colors, blend modes, and independent opacity.", "sequenceDesc": "Playback can hide after one pass, hold the last frame, loop forward, or loop in reverse.", "noiseDesc": "Adds movement noise with strength, range, and speed controls.", "gravityDesc": "Gravity, wind, and lifetime strength curves.", "forceDesc": "Global force field, vortex, attraction, and collision.", "trailDesc": "Independent trail resources with bones, length, width, shape, color, and opacity curves.", "followDesc": "The emitter can follow a path or a Spine bone.", "collisionDesc": "Choose scene colliders and particle collision response.", "exportDesc": "Configure image path, Spine version, keyframe curves, FPS, frame alignment, bone pool, and empty animations.", "exportButtonsDesc": "Export Spine JSON, an images ZIP, or a complete .spine project through the connector.", "connectorTitle": "Spine Connector", "connectorIntro": "The connector sends generated JSON and images to a locally installed and activated Spine editor and converts them into an editable .spine project.", "prerequisite": "Requirements", "prerequisiteDesc": "Install and activate Spine, then start the desktop connector.", "download": "Download", "webSide": "Website", "webSideDesc": "When the connector reports ready, click Export .spine package.", "authorization": "First authorization", "authorizationDesc": "Approve the website origin once. The connector stores the local allowlist.", "pathSetup": "Application path", "pathSetupDesc": "The connector detects Spine automatically. Set the application path manually if detection fails.", "downloadResult": "Output", "downloadResultDesc": "The downloaded ZIP contains the .spine project and image folder.", "version": "Version", "versionDesc": "The connector matches Spine 3.8–4.3 from the JSON version.", "security": "Security", "securityDesc": "The connector listens only on the local machine and deletes temporary conversion files.", "differenceTitle": "Config vs. export", "differenceDesc": "Save Config preserves editable objects and parameters. Export Spine JSON includes only visible particle systems and bakes collisions, following, trails, and sub-emitters into editable animation data." }, "errors": { "confirmLoopFollowEnter": "Enabling loop stream disables particle following, resets its settings, and disables warm-up frames. Continue?", "confirmLoopFollowExit": "Leaving loop stream disables particle following and resets its settings. Continue?", "invalidJson": "The configuration file is not valid JSON", "invalidConfigFormat": "This is not a SpineParticle editor configuration", "unsupportedConfigVersion": "Unsupported configuration version: {version}", "missingScene": "The configuration is missing complete scene data", "missingEmbeddedSpine": "The configuration does not contain reusable Spine source assets", "chooseJsonConfig": "Choose a .json configuration file", "settingsInvalidJson": "The cached settings are not valid JSON", "settingsFormat": "This is not a SpineParticle settings cache", "settingsVersion": "Unsupported settings version: {version}", "settingsMissing": "The settings cache is missing settings", "noExportableImages": "The visible particle systems have no exportable images", "invalidZipPath": "Invalid ZIP file path", "spineFileType": "Spine data must be .json or .skel", "atlasFileType": "Atlas files must use .atlas", "chooseTexture": "Choose at least one texture image", "binaryParseFailed": "Spine binary parsing failed (4.3: {v43}; legacy: {v42})", "invalidSpineJson": "Invalid Spine JSON format", "unsupportedSpineJsonVersion": "Unsupported Spine JSON version. Supported versions: {versions}", "unsupportedSpineDataVersion": "Unsupported Spine data version. Supported versions: {versions}", "embeddedReadFailed": "Unable to read embedded Spine file: {name}", "missingImageWarning": "Image “{file}” is missing or has unreadable dimensions. Its path was kept.", "missingTrailImageWarning": "Trail image “{file}” is missing. Its path was kept.", "emptyCacheWarning": "“{name}” has no baked frame cache.", "readExportImageFailed": "Unable to read export image: {name}", "connectorOffline": "Local Spine connector was not detected. Start the connector first.", "connectorHttpError": "Spine connector returned HTTP {status}", "invalidTrailUV": "Trail mesh “{name}” has invalid UV data", "missingTrailVertices": "Trail mesh “{name}” has no vertex data", "trailIndexOutOfRange": "Trail mesh “{name}” has an out-of-range triangle index", "invalidTrailHull": "Trail mesh “{name}” has an invalid hull size", "trailHullIndexOutOfRange": "Trail mesh “{name}” has an out-of-range hull edge index", "invalidInfluenceCount": "Trail mesh “{name}” has an invalid bone influence count", "missingBoneReference": "Trail mesh “{name}” references a missing bone", "invalidWeight": "Trail mesh “{name}” contains invalid weights", "weightSum": "Trail mesh “{name}” vertex weights do not sum to 1", "vertexCountMismatch": "Trail mesh “{name}” vertex count does not match its UV count", "invalidInherit": "Bone “{name}” has inherit value “{inherit}” incompatible with Spine {version} JSON", "trailBoneParent": "Trail bone “{name}” must be a direct child of the particle system bone, not a bone chain", "trailSlotEmpty": "Weighted trail slot “{name}” cannot use an empty attachment. Hide the bones with zero scale instead.", "spine38Version": "Spine 3.8 export must identify its version as 3.8", "spine38Inherit": "Spine 3.8 bone “{name}” must use transform instead of inherit", "spine38SlotColor": "Spine 3.8 slot color timelines must use color / twoColor", "spine38AttachmentName": "Spine 3.8 hidden attachment frames must explicitly write name: null", "spine38RotationAngle": "Spine 3.8 rotation timelines must use angle", "spine38Curve": "Spine 3.8 does not support Spine 4.x array curves", "unsupportedExportVersion": "Unsupported export version. Supported Spine versions: {versions}", "exportVersionMismatch": "Export version mismatch: expected Spine {expected}, JSON reports Spine {actual}", "exportMissingBones": "Export result contains no bones", "missingAtlasTexture": "Atlas texture was not selected: {name}" } }