Skip to main content
Glama
base.tsβ€’10.3 kB
/** * Base Translation Template * * This file contains the structure for all translations. * Each locale file should follow this structure. * * Tool descriptions are kept in English for AI/LLM processing, * but UI-facing strings (names, errors, success messages) are translated. */ import { TranslationKeys } from '../types.js'; /** * Creates a base translation with common tool descriptions. * Tool descriptions remain in English for optimal AI understanding, * while user-facing messages are translated. */ export function createBaseTranslation(overrides: Partial<TranslationKeys>): TranslationKeys { const base: TranslationKeys = { tools: { // Tool descriptions are intentionally kept in English // for optimal AI/LLM understanding and consistency pinepaper_create_item: { name: overrides.tools?.pinepaper_create_item?.name || 'Create Item', description: `Create an item on the PinePaper canvas. USE WHEN: - User wants to add text, shapes, or graphics to the canvas - Creating new visual elements (circles, stars, rectangles, etc.) - Starting a new scene or composition ITEM TYPES: - text: Text content with font styling - circle: Circular shape with radius - star: Star shape with inner/outer radius - rectangle: Rectangle with width/height - triangle: Triangular shape - polygon: Regular polygon with N sides - ellipse: Oval shape - path: Custom path with segments or SVG data - line: Line between two points - arc: Curved arc through three points`, }, pinepaper_modify_item: { name: overrides.tools?.pinepaper_modify_item?.name || 'Modify Item', description: `Modify an existing item's properties. USE WHEN: - Changing color, size, position of an existing item - Updating text content - Adjusting styling properties`, }, pinepaper_delete_item: { name: overrides.tools?.pinepaper_delete_item?.name || 'Delete Item', description: `Delete an item from the canvas. USE WHEN: - Removing unwanted items - Clearing specific elements - Cleaning up the scene`, }, pinepaper_add_relation: { name: overrides.tools?.pinepaper_add_relation?.name || 'Add Relation', description: `Create a behavior relationship between two items. Relations are the PRIMARY way to add animation in PinePaper. RELATION TYPES: - orbits: Circular motion around target - follows: Move toward target with smoothing - attached_to: Fixed offset from target - maintains_distance: Stay fixed distance from target - points_at: Rotate to face target - mirrors: Mirror position across axis - parallax: Move relative by depth - bounds_to: Stay within bounds`, }, pinepaper_remove_relation: { name: overrides.tools?.pinepaper_remove_relation?.name || 'Remove Relation', description: 'Remove a relationship between items.', }, pinepaper_query_relations: { name: overrides.tools?.pinepaper_query_relations?.name || 'Query Relations', description: 'Query relationships for an item.', }, pinepaper_animate: { name: overrides.tools?.pinepaper_animate?.name || 'Animate', description: `Apply a simple LOOP animation to an item. ANIMATION TYPES: pulse, rotate, bounce, fade, wobble, slide, typewriter`, }, pinepaper_keyframe_animate: { name: overrides.tools?.pinepaper_keyframe_animate?.name || 'Keyframe Animation', description: 'Apply keyframe-based animation with precise timing.', }, pinepaper_play_timeline: { name: overrides.tools?.pinepaper_play_timeline?.name || 'Play Timeline', description: 'Control keyframe animation playback.', }, pinepaper_execute_generator: { name: overrides.tools?.pinepaper_execute_generator?.name || 'Execute Generator', description: 'Execute a background generator to create procedural patterns.', }, pinepaper_list_generators: { name: overrides.tools?.pinepaper_list_generators?.name || 'List Generators', description: 'Get a list of all available background generators.', }, pinepaper_apply_effect: { name: overrides.tools?.pinepaper_apply_effect?.name || 'Apply Effect', description: 'Apply a visual effect to an item.', }, pinepaper_get_items: { name: overrides.tools?.pinepaper_get_items?.name || 'Get Items', description: 'Get all or filtered items from the canvas.', }, pinepaper_get_relation_stats: { name: overrides.tools?.pinepaper_get_relation_stats?.name || 'Get Relation Stats', description: 'Get statistics about active relations in the scene.', }, pinepaper_set_background_color: { name: overrides.tools?.pinepaper_set_background_color?.name || 'Set Background Color', description: 'Set the canvas background color.', }, pinepaper_set_canvas_size: { name: overrides.tools?.pinepaper_set_canvas_size?.name || 'Set Canvas Size', description: 'Change the canvas dimensions.', }, pinepaper_export_svg: { name: overrides.tools?.pinepaper_export_svg?.name || 'Export SVG', description: 'Export the scene as animated SVG.', }, pinepaper_export_training_data: { name: overrides.tools?.pinepaper_export_training_data?.name || 'Export Training Data', description: 'Export relation data as training pairs for LLM fine-tuning.', }, }, errors: { itemNotFound: overrides.errors?.itemNotFound || 'Item not found: {{itemId}}', invalidRelation: overrides.errors?.invalidRelation || 'Invalid relation: {{relationType}}', invalidParams: overrides.errors?.invalidParams || 'Invalid parameters: {{details}}', generatorNotFound: overrides.errors?.generatorNotFound || 'Generator not found: {{generatorName}}', exportFailed: overrides.errors?.exportFailed || 'Export failed: {{reason}}', executionError: overrides.errors?.executionError || 'Execution error: {{message}}', validationError: overrides.errors?.validationError || 'Validation error: {{message}}', unknownTool: overrides.errors?.unknownTool || 'Unknown tool: {{toolName}}', apiKeyRequired: overrides.errors?.apiKeyRequired || 'API key required', apiKeyInvalid: overrides.errors?.apiKeyInvalid || 'Invalid API key', apiKeyExpired: overrides.errors?.apiKeyExpired || 'API key expired', rateLimitExceeded: overrides.errors?.rateLimitExceeded || 'Rate limit exceeded. Try again in {{seconds}} seconds.', }, success: { itemCreated: overrides.success?.itemCreated || 'Created {{itemType}} at position ({{x}}, {{y}})', itemModified: overrides.success?.itemModified || 'Modified item {{itemId}}', itemDeleted: overrides.success?.itemDeleted || 'Deleted item {{itemId}}', relationAdded: overrides.success?.relationAdded || 'Added {{relationType}} relation: {{sourceId}} β†’ {{targetId}}', relationRemoved: overrides.success?.relationRemoved || 'Removed relation between {{sourceId}} and {{targetId}}', animationApplied: overrides.success?.animationApplied || 'Applied {{animationType}} animation to {{itemId}}', generatorExecuted: overrides.success?.generatorExecuted || 'Executed {{generatorName}} generator', effectApplied: overrides.success?.effectApplied || 'Applied {{effectType}} effect to {{itemId}}', backgroundSet: overrides.success?.backgroundSet || 'Set background color to {{color}}', canvasSizeSet: overrides.success?.canvasSizeSet || 'Set canvas size to {{width}}Γ—{{height}}', exported: overrides.success?.exported || 'Exported {{format}} successfully', }, itemTypes: { text: overrides.itemTypes?.text || 'Text', circle: overrides.itemTypes?.circle || 'Circle', star: overrides.itemTypes?.star || 'Star', rectangle: overrides.itemTypes?.rectangle || 'Rectangle', triangle: overrides.itemTypes?.triangle || 'Triangle', polygon: overrides.itemTypes?.polygon || 'Polygon', ellipse: overrides.itemTypes?.ellipse || 'Ellipse', path: overrides.itemTypes?.path || 'Path', line: overrides.itemTypes?.line || 'Line', arc: overrides.itemTypes?.arc || 'Arc', }, relationTypes: { orbits: overrides.relationTypes?.orbits || 'Orbits', follows: overrides.relationTypes?.follows || 'Follows', attached_to: overrides.relationTypes?.attached_to || 'Attached to', maintains_distance: overrides.relationTypes?.maintains_distance || 'Maintains distance', points_at: overrides.relationTypes?.points_at || 'Points at', mirrors: overrides.relationTypes?.mirrors || 'Mirrors', parallax: overrides.relationTypes?.parallax || 'Parallax', bounds_to: overrides.relationTypes?.bounds_to || 'Bounds to', }, animationTypes: { pulse: overrides.animationTypes?.pulse || 'Pulse', rotate: overrides.animationTypes?.rotate || 'Rotate', bounce: overrides.animationTypes?.bounce || 'Bounce', fade: overrides.animationTypes?.fade || 'Fade', wobble: overrides.animationTypes?.wobble || 'Wobble', slide: overrides.animationTypes?.slide || 'Slide', typewriter: overrides.animationTypes?.typewriter || 'Typewriter', }, generators: { drawSunburst: overrides.generators?.drawSunburst || 'Sunburst', drawSunsetScene: overrides.generators?.drawSunsetScene || 'Sunset Scene', drawGrid: overrides.generators?.drawGrid || 'Grid', drawStackedCircles: overrides.generators?.drawStackedCircles || 'Stacked Circles', drawCircuit: overrides.generators?.drawCircuit || 'Circuit Board', drawWaves: overrides.generators?.drawWaves || 'Waves', drawPattern: overrides.generators?.drawPattern || 'Pattern', }, common: { at: overrides.common?.at || 'at', with: overrides.common?.with || 'with', to: overrides.common?.to || 'to', from: overrides.common?.from || 'from', position: overrides.common?.position || 'position', radius: overrides.common?.radius || 'radius', color: overrides.common?.color || 'color', speed: overrides.common?.speed || 'speed', duration: overrides.common?.duration || 'duration', }, }; return base; }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/pinepaper/mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server