中英双语

This commit is contained in:
tianmo committed 2026-10-22 18:13:43 +08:00
1 parent ea26af26ee
commit b98c0333e6
50 files changed
+4082 -2049

No files matched your search

+857
View File
@@ -0,0 +1,857 @@
{
"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": "中文",
"en": "English"
},
"common": {
"close": "Close",
"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",
"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",
"cacheNote": "Settings are saved automatically in this browser"
},
"config": {
"title": "Configuration",
"save": "Save Config",
"saveTitle": "Save the complete editor configuration (Ctrl+S)",
"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}"
},
"presets": {
"particleSweep": "1. Particle Sweep",
"barBlocks": "2. Bar Blocks",
"forceTrail": "3. Force Field Trail",
"lightningSequence": "4. Lightning Sequence",
"texturePivot": "5. Texture Pivot",
"subEmitter": "6. Sub-emitter"
},
"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 Settings",
"reset": "Reset export settings",
"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",
"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 and resets its settings. 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}"
}
}