This commit is contained in:
th committed 2026-04-19 22:32:06 +02:00
1 parent fcefd258eb
commit 6b6157d786
23 files changed
+1140 -237

No files matched your search

+232
View File
@@ -0,0 +1,232 @@
export const en = {
app: {
undo: 'Undo (Ctrl+Z)',
redo: 'Redo (Ctrl+Shift+Z)',
jumpToStart: 'Jump to start',
pause: 'Pause (Space)',
play: 'Play (Space)',
stop: 'Stop',
recentProjects: 'Recent projects',
saveProject: 'Save project (browser storage)',
documentSettings: 'Document settings',
export: 'Export',
mainTimeline: 'Main timeline',
dragResize: 'Drag to resize timeline',
loadFailed: 'Failed to load project.',
savedToast: '"{name}" saved',
saveDialog: {
title: 'Save project',
message: 'What should the project be called?',
confirm: 'Save',
defaultName: 'Project {date}',
},
replaceDialog: {
title: 'Replace project?',
message:
'The current project will be replaced by the loaded file. Unsaved changes will be lost.',
confirm: 'Continue',
},
},
welcome: {
heading: 'Welcome to Animatr',
subheading: 'Recent projects',
loading: 'Loading…',
empty: 'No saved projects yet.',
layerCount: '{n} layers',
today: 'today {time}',
deleteTooltip: 'Delete project',
newProject: 'New project',
importFile: 'Import file…',
exportCurrent: 'Export current',
deleteDialog: {
title: 'Delete project?',
message: '"{name}" will be permanently removed from browser storage.',
confirm: 'Delete',
},
},
sidebar: {
addFile: 'Add SVG / image',
library: 'Library',
thumbnailsHide: 'Hide thumbnails',
thumbnailsShow: 'Show thumbnails',
imageLabel: 'Image',
addLayerTooltip: 'Insert as layer (or drag to stage)',
noImages: 'No images imported',
clips: 'Clips',
createClipTooltip: 'Create new clip',
clipLayerCount: '{n} layers',
renameTooltip: 'Rename',
deleteTooltip: 'Delete',
noClips: 'No clips',
shape: {
rect: 'Rect',
circle: 'Circle',
text: 'Text',
},
newTextDialog: {
title: 'New text object',
message: 'Text:',
default: 'Hello',
confirm: 'Insert',
fallback: 'Text',
},
newClipDialog: {
title: 'New clip',
message: 'Clip name:',
default: 'Clip',
confirm: 'Create',
},
renameClipDialog: {
title: 'Rename clip',
confirm: 'Apply',
},
deleteClipDialog: {
title: 'Delete clip?',
message: 'The clip and all placed instances will be removed.',
confirm: 'Delete',
},
},
properties: {
keyframeLabel: 'Keyframe',
interpolated: 'Interpolated',
removeKeyframe: 'Remove keyframe here',
deleteLayer: 'Delete layer',
noLayer: 'No layer selected.',
},
fullscreen: {
pause: 'Pause',
play: 'Play',
jumpToStart: 'Jump to start',
close: 'Close (Esc)',
},
timeline: {
colors: {
none: 'None',
red: 'Red',
orange: 'Orange',
yellow: 'Yellow',
green: 'Green',
cyan: 'Cyan',
blue: 'Blue',
purple: 'Purple',
pink: 'Pink',
gray: 'Gray',
},
noTracks: 'No tracks yet.',
addClipTrack: 'Add clip track',
addClipTrackTooltip: 'Add another clip track',
clipTrackName: 'Clip track',
toggleTimeUnit: 'Toggle time unit',
snapOn: 'Snapping on (playhead & keyframes snap together)',
snapOff: 'Snapping off',
stillFrameTooltip: 'Still frame {time} — holds until the next keyframe',
keyframeTooltip: 'Keyframe {time} — drag to move, right-click for options',
trimTooltip: '{name} · {duration}s{trims} · Drag edges to trim, double-click to open',
trimStart: 'Start -{value}s',
trimEnd: 'End -{value}s',
easing: 'Easing',
easingLinear: 'Linear',
easingEaseIn: 'Ease In',
easingEaseOut: 'Ease Out',
easingEaseInOut: 'Ease In-Out',
firstKfHint: 'First keyframe — easing has no effect',
holdDisabledHint: 'Still frame — easing disabled',
lastKfHint: 'Last keyframe — still frame has no effect',
stillFrame: 'Still frame',
duplicate: 'Duplicate',
delete: 'Delete',
color: 'Color',
lock: 'Lock',
unlock: 'Unlock',
deleteLayer: 'Delete layer',
deleteClipTrack: 'Delete clip track',
separate: 'Separate Position and Rotation',
rotation: 'Rotation',
position: 'Position',
removeInstanceDialog: {
title: 'Remove clip instance?',
message: 'Remove "{name}" at {time}s from the timeline.',
generic: 'Remove this clip instance from the timeline.',
confirm: 'Remove',
},
},
canvas: {
zoomIn: 'Zoom in',
zoomOut: 'Zoom out',
zoomOneToOne: 'Zoom 1:1',
fitToView: 'Fit to view',
cropOn: 'Show stage only (crop)',
cropOff: 'Show everything',
},
settings: {
title: 'Settings',
tab: {
document: 'Document',
timeline: 'Timeline',
theme: 'UI Theme',
},
canvas: 'Canvas',
width: 'Width',
height: 'Height',
background: 'Background',
duration: 'Duration (s)',
fps: 'FPS',
timelineHint: 'Timeline length sets the ruler scale. Playback stops at the last keyframe.',
themeHint: 'Saved in the browser and reused on next open.',
themeDark: 'Dark',
themeLight: 'Light',
done: 'Done',
},
export: {
title: 'Export',
runtimeBadge: '1× per page',
runtimeDesc: 'Engine — include once; all scenes on the page share the runtime',
sceneBadge: 'Scene',
sceneDesc: 'Scene data only — requires the runtime to be loaded',
exampleTitle: 'Example HTML',
exampleDesc: 'Standalone HTML — just open it in a browser',
mp4Badge: 'Server · Frame-accurate',
mp4Desc: 'H.264, any resolution — requires render server',
webmBadge: 'Browser · Realtime',
webmDesc: 'No server — recorded in real time',
webmNotSupported: 'Browser does not support MediaRecorder',
cancel: 'Cancel',
failed: 'Export failed',
back: 'Back',
labelWebm: 'Rendering WebM (browser, realtime)…',
labelMp4: 'Rendering MP4 (server)…',
},
tests: {
running: 'Tests running',
title: 'Test Runner',
runAgain: 'Run again',
close: 'Close',
copyTooltip: 'Copy report to clipboard',
copiedTooltip: 'Report copied',
copiedBanner: 'Error report copied to clipboard.',
copyFailedBanner: 'Copy failed — use the clipboard icon to trigger manually.',
emptyState: 'No results — click "Run again" or press {shortcut}.',
testsCountLabel: '{n} tests',
passedLabel: '{n} passed',
failedLabel: '{n} failed',
},
dialog: {
confirm: 'Confirm',
input: 'Input',
ok: 'OK',
cancel: 'Cancel',
close: 'Close',
},
} as const
export type Messages = typeof en