/** * Paperclip AI - Hebrew Translation Injection * Replaces English UI text with Hebrew after React renders. * Uses MutationObserver to catch route changes and dynamic content. */ (function () { "use strict"; // ========================================================================= // TRANSLATION MAP // ========================================================================= const T = { // --- Sidebar / Navigation --- "Dashboard": "לוח בקרה", "Inbox": "תיבת דואר", "Work": "עבודה", "Issues": "משימות", "Routines": "שגרות", "Goals": "יעדים", "Company": "חברה", "Org": "ארגון", "Skills": "כישורים", "Costs": "עלויות", "Activity": "פעילות", "Settings": "הגדרות", "General": "כללי", "Heartbeats": "פעימות", "Experimental": "ניסיוני", "Plugins": "תוספים", "Me": "אני", "Agents": "סוכנים", "Projects": "פרויקטים", "Home": "בית", "Create": "צור", "Not Found": "לא נמצא", "Open sidebar": "פתח סרגל צד", "Close sidebar": "סגור סרגל צד", "Skip to Main Content": "דלג לתוכן הראשי", // --- Common Buttons --- "Save": "שמור", "Cancel": "ביטול", "Delete": "מחק", "Edit": "ערוך", "Update": "עדכן", "Close": "סגור", "Confirm": "אשר", "Back": "חזור", "Next": "הבא", "Previous": "הקודם", "Done": "סיום", "Apply": "החל", "Continue": "המשך", "Dismiss": "סגור", "Clear": "נקה", "Reset": "אפס", "Retry": "נסה שוב", "Submit": "שלח", "OK": "אישור", "Yes": "כן", "No": "לא", "Go": "עבור", "Search": "חיפוש", "Filter": "סינון", "Sort": "מיון", "Copy": "העתק", "Download": "הורד", "Upload": "העלה", "Export": "ייצוא", "Import": "ייבוא", "Enable": "הפעל", "Disable": "השבת", "Install": "התקן", "Uninstall": "הסר התקנה", "Start": "התחל", "Stop": "עצור", "Pause": "השהה", "Resume": "חדש", "Run": "הפעל", "Launch": "הפעל", "Approve": "אשר", "Reject": "דחה", "Archive": "ארכיון", "Restore": "שחזר", "Pin": "הצמד", "Revoke": "בטל", "Assign": "הקצה", "Block": "חסום", "Link": "קישור", "View": "צפה", "Show": "הצג", "Hide": "הסתר", "Open": "פתח", "Select": "בחר", "Remove": "הסר", "Comment": "תגובה", "Restart": "הפעל מחדש", "Schedule": "תזמן", "Configure": "הגדר", "Choose": "בחר", // --- Action Buttons --- "Save changes": "שמור שינויים", "Save Configuration": "שמור הגדרות", "Save note": "שמור הערה", "Save routine": "שמור שגרה", "Save trigger": "שמור טריגר", "Save failed": "השמירה נכשלה", "Add Agent": "הוסף סוכן", "Add Goal": "הוסף יעד", "Add Project": "הוסף פרויקט", "Add company": "הוסף חברה", "Add item": "הוסף פריט", "Add trigger": "הוסף טריגר", "Add a new agent": "הוסף סוכן חדש", "Add a skill source": "הוסף מקור כישורים", "Add a short note": "הוסף הערה קצרה", "Add a comment...": "הוסף תגובה...", "Add a description...": "הוסף תיאור...", "Add description...": "הוסף תיאור...", "Add instructions...": "הוסף הוראות...", "Adding...": "מוסיף...", "Create Issue": "צור משימה", "Create Item": "צור פריט", "Create Account": "צור חשבון", "Create API Key": "צור מפתח API", "Create agent": "צור סוכן", "Create document": "צור מסמך", "Create goal": "צור יעד", "Create label": "צור תווית", "Create one": "צור אחד", "Create one here": "צור כאן", "Create project": "צור פרויקט", "Create routine": "צור שגרה", "Create skill": "צור כישור", "Create new agent": "צור סוכן חדש", "Create new company": "צור חברה חדשה", "Create new issue": "צור משימה חדשה", "Create new project": "צור פרויקט חדש", "Create another company": "צור חברה נוספת", "Create a new agent": "צור סוכן חדש", "Create your Paperclip account": "צור את חשבון Paperclip שלך", "Create your first agent": "צור את הסוכן הראשון שלך", "Create your first company": "צור את החברה הראשונה שלך", "Delete Company": "מחק חברה", "Delete attachment": "מחק קובץ מצורף", "Delete document": "מחק מסמך", "Delete failed": "המחיקה נכשלה", "Delete image": "מחק תמונה", "Delete issue": "מחק משימה", "Edit document": "ערוך מסמך", "Edit image": "ערוך תמונה", "Copy Agent ID": "העתק מזהה סוכן", "Copy to clipboard": "העתק ללוח", "Copy snippet": "העתק קטע", "Copy document": "העתק מסמך", "Approve CLI access": "אשר גישת CLI", "Approve Paperclip CLI access": "אשר גישת Paperclip CLI", "Approving...": "מאשר...", "Archive company": "העבר חברה לארכיון", "Assign Task": "הקצה משימה", "Assign to me": "הקצה לי", "Assign to requester": "הקצה למבקש", "Import company": "ייבא חברה", "Import complete": "הייבוא הושלם", "Import failed": "הייבוא נכשל", "Import preview": "תצוגה מקדימה של ייבוא", "Import source": "מקור ייבוא", "Export company": "ייצא חברה", "Export downloaded": "הייצוא הורד", "Export failed": "הייצוא נכשל", "Install Plugin": "התקן תוסף", "Install Example": "התקן דוגמה", "Install update": "התקן עדכון", "Uninstall Plugin": "הסר תוסף", "Run now": "הפעל עכשיו", "Run routine": "הפעל שגרה", "Run Activity": "הפעל פעילות", "Run Heartbeat": "הפעל פעימה", "Open board": "פתח לוח", "Open budgets": "פתח תקציבים", "Open command palette": "פתח לוח פקודות", "Open Command Palette": "פתח לוח פקודות", "Open dashboard": "פתח לוח בקרה", "Open docs": "פתח מסמכים", "Open Settings": "פתח הגדרות", "Open Issues": "משימות פתוחות", "Open Side Panel": "פתח פאנל צדי", "View agent": "צפה בסוכן", "View details": "צפה בפרטים", "View full error": "צפה בשגיאה מלאה", "View inbox": "צפה בתיבת דואר", "View run": "צפה בהרצה", "Mark all as read": "סמן הכל כנקרא", "Mark as done": "סמן כבוצע", "Mark as read": "סמן כנקרא", "Clear all": "נקה הכל", "Clear repo": "נקה מאגר", "Clear local folder": "נקה תיקיה מקומית", "Sign in": "התחבר", "Sign in required": "נדרשת התחברות", "Sign in to Paperclip": "התחבר ל-Paperclip", "Sign in / Create account": "התחבר / צור חשבון", "Go home": "חזור לדף הבית", "Back to all workspaces": "חזור לכל סביבות העבודה", "Back to approvals": "חזור לאישורים", "Back to runs": "חזור להרצות", "Back to workspaces": "חזור לסביבות עבודה", "Check for updates": "בדוק עדכונים", "Start Onboarding": "התחל הקמה", "Stop editing": "הפסק עריכה", "Deploy to production": "פרוס לייצור", "Restart Required": "נדרש הפעלה מחדש", "Reset Sessions": "אפס הפעלות", "Reset defaults": "אפס ברירות מחדל", "Reset filters": "אפס מסננים", "Download document": "הורד מסמך", "Upload attachment": "העלה קובץ מצורף", "Upload an image": "העלה תמונה", "Upload failed": "ההעלאה נכשלה", "Filter Bar": "סרגל סינון", "Filter by agent name": "סנן לפי שם סוכן", "Filter by type": "סנן לפי סוג", "Filter skills": "סנן כישורים", "Show properties": "הצג מאפיינים", "Show secret": "הצג סוד", "Hide secret": "הסתר סוד", "Show full log": "הצג יומן מלא", "Hide full log": "הסתר יומן מלא", "Set repo": "הגדר מאגר", "Change repo": "שנה מאגר", "Submit join request": "שלח בקשת הצטרפות", "Join request submitted": "בקשת ההצטרפות נשלחה", "Accept bootstrap invite": "קבל הזמנת הקמה", "Return to latest": "חזור לעדכני", "Jump to live": "עבור לשידור חי", "Select company": "בחר חברה", "Select model": "בחר מודל", "Select status": "בחר סטטוס", "Select an option": "בחר אפשרות", "Watch issue": "עקוב אחר משימה", "Wake now": "העיר עכשיו", "Keep my draft": "שמור את הטיוטה שלי", "Keep paused": "השאר מושהה", "Discard Draft": "מחק טיוטה", // --- Navigation Tabs --- "Overview": "סקירה כללית", "Instructions": "הוראות", "Configuration": "הגדרות", "Runs": "הרצות", "Budget": "תקציב", "Workspaces": "סביבות עבודה", "All": "הכל", "Active": "פעיל", "Paused": "מושהה", "Error": "שגיאה", "Recent": "אחרונים", "Mine": "שלי", "Unread": "לא נקרא", "Status": "סטטוס", // --- Status Labels --- "Backlog": "רשימת המתנה", "Todo": "לביצוע", "In Progress": "בביצוע", "In Review": "בסקירה", "Planned": "מתוכנן", "Completed": "הושלם", "Cancelled": "בוטל", "Critical": "קריטי", "High": "גבוה", "Medium": "בינוני", "Low": "נמוך", "Default": "ברירת מחדל", "Blocked": "חסום", "Queued": "בתור", "Running": "פועל", "Enabled": "מופעל", "Disabled": "מושבת", "Pending": "ממתין", "Resolved": "נפתר", "Unknown": "לא ידוע", "New": "חדש", "Archived": "בארכיון", "Passed": "עבר", "Failed": "נכשל", "Managed": "מנוהל", "Live": "חי", "Observed": "נצפה", "Cached": "במטמון", "Sealed": "חתום", "Recommended": "מומלץ", "Beta": "בטא", "Unlimited budget": "תקציב ללא הגבלה", "Under budget": "בתוך התקציב", "Out of date": "לא מעודכן", "Up to date": "מעודכן", "Not set.": "לא הוגדר.", "Not installed": "לא מותקן", // --- Thinking Effort --- "Auto": "אוטומטי", "Minimal": "מינימלי", "X-High": "גבוה מאוד", "Max": "מקסימום", // --- Workspace Options --- "Project default": "ברירת מחדל של פרויקט", "New isolated workspace": "סביבת עבודה מבודדת חדשה", "Reuse existing workspace": "שימוש חוזר בסביבה קיימת", "Remote git repo": "מאגר git מרוחק", "Local git checkout": "checkout מקומי של git", "Local non-git path": "נתיב מקומי ללא git", "Remote-managed workspace": "סביבת עבודה מנוהלת מרחוק", "Git worktree": "Git worktree", "Local folder": "תיקיה מקומית", // --- Frequency Options --- "Every minute": "כל דקה", "Every hour": "כל שעה", "Every day": "כל יום", "Weekdays": "ימי חול", "Weekly": "שבועי", "Monthly": "חודשי", "Custom (cron)": "מותאם אישית (cron)", // --- Dashboard Cards --- "Agents Enabled": "סוכנים מופעלים", "Tasks In Progress": "משימות בביצוע", "Month Spend": "הוצאות החודש", "Pending Approvals": "אישורים ממתינים", "Active Agents": "סוכנים פעילים", "Active incidents": "תקלות פעילות", "Active Keys": "מפתחות פעילים", "Companies": "חברות", "Live Runs": "הרצות חיות", "Recent Activity": "פעילות אחרונה", "Recent Issues": "משימות אחרונות", "Recent Tasks": "משימות אחרונות", "Success Rate": "אחוז הצלחה", "Failed runs": "הרצות שנכשלו", "Cost Summary": "סיכום עלויות", // --- Page Titles --- "Company Settings": "הגדרות חברה", "Instance Settings": "הגדרות מופע", "Approvals": "אישורים", "Plugin Manager": "מנהל תוספים", "Available Plugins": "תוספים זמינים", "Installed Plugins": "תוספים מותקנים", "Design Guide": "מדריך עיצוב", "Org Chart": "מבנה ארגוני", "Finance": "כספים", "Budgets": "תקציבים", "Budget control plane": "מישור בקרת תקציב", "Scheduler Heartbeats": "פעימות מתזמן", "Run Detail": "פרטי הרצה", "Issue List": "רשימת משימות", "Issue Properties": "מאפייני משימה", "Execution Workspaces": "סביבות ביצוע", "Company Packages": "חבילות חברה", "Keyboard Shortcuts": "קיצורי מקלדת", "Danger Zone": "אזור מסוכן", "New Agent": "סוכן חדש", "New Company": "חברה חדשה", "New Issue": "משימה חדשה", "New document": "מסמך חדש", "New issue": "משימה חדשה", "New project": "פרויקט חדש", "New routine": "שגרה חדשה", "Revision history": "היסטוריית גרסאות", // --- Form Labels --- "Name": "שם", "Title": "כותרת", "Description": "תיאור", "Priority": "עדיפות", "Assignee": "מוקצה", "Project": "פרויקט", "Labels": "תוויות", "Created": "נוצר", "Updated": "עודכן", "Target Date": "תאריך יעד", "Start date": "תאריך התחלה", "Lead": "אחראי", "Author": "מחבר", "Email": "אימייל", "Password": "סיסמה", "Company name": "שם חברה", "Agent name": "שם סוכן", "Branch name": "שם ענף", "Branch template": "תבנית ענף", "Base ref": "הפניית בסיס", "Repo URL": "כתובת מאגר", "Brand color": "צבע מותג", "Command": "פקודה", "Adapter type": "סוג מתאם", "Prompt Template": "תבנית פרומפט", "Environment variables": "משתני סביבה", "Timeout (sec)": "זמן קצוב (שניות)", "Max concurrent runs": "הרצות מקבילות מקסימום", "Max turns per run": "סיבובים מקסימום להרצה", "Model": "מודל", "Thinking effort": "מאמץ חשיבה", "Reports to": "מדווח ל", "Capabilities": "יכולות", "Capabilities (optional)": "יכולות (אופציונלי)", "Role": "תפקיד", "Budget (USD)": "תקציב (דולר)", "New budget (USD)": "תקציב חדש (דולר)", "Heartbeat on interval": "פעימה במרווחי זמן", "Wake on demand": "התעוררות לפי דרישה", "Default model": "מודל ברירת מחדל", "Collision strategy": "אסטרטגיית התנגשות", "Description (optional)": "תיאור (אופציונלי)", "Workspace name": "שם סביבת עבודה", "Execution workspace": "סביבת ביצוע", "Provision command": "פקודת הקמה", "Teardown command": "פקודת פירוק", "Cleanup command": "פקודת ניקוי", "Runtime services": "שירותי ריצה", "Plugin Key": "מפתח תוסף", "Plugin ID": "מזהה תוסף", "Key": "מפתח", "Skill name": "שם כישור", "Document key": "מפתח מסמך", "Variables": "משתנים", "Default value": "ערך ברירת מחדל", "Source": "מקור", "Mode": "מצב", "Kind": "סוג", "Type": "סוג", "Concurrency": "מקביליות", "Version": "גרסה", "PID": "PID", "Uptime": "זמן פעילות", "Auto-Restart On": "הפעלה מחדש אוטומטית", "AI feedback sharing": "שיתוף משוב AI", "Feedback Sharing": "שיתוף משוב", // --- Placeholders --- "Search icons...": "חפש אייקונים...", "Search issues, agents, projects...": "חפש משימות, סוכנים, פרויקטים...", "Search issues...": "חפש משימות...", "Search assignees...": "חפש מוקצים...", "Search labels...": "חפש תוויות...", "Search projects...": "חפש פרויקטים...", "Search models...": "חפש מודלים...", "Search files...": "חפש קבצים...", "Search inbox\u2026": "חפש בתיבת דואר\u2026", "Type a command or search...": "הקלד פקודה או חפש...", "Issue title": "כותרת משימה", "Project name": "שם פרויקט", "Target date": "תאריך יעד", "Goal title": "כותרת יעד", "Leave a comment...": "השאר תגובה...", "Write something...": "כתוב משהו...", "Enter a name": "הזן שם", "Describe...": "תאר...", "Choose a value": "בחר ערך", "Choose frequency...": "בחר תדירות...", "Category": "קטגוריה", "Approval status": "סטטוס אישור", "Routine title": "כותרת שגרה", "Optional title": "כותרת אופציונלית", "Markdown body": "גוף Markdown", "New label": "תווית חדשה", "Short description": "תיאור קצר", "Optional company description": "תיאור חברה אופציונלי", "Execution workspace name": "שם סביבת ביצוע", "NPM Package Name": "שם חבילת NPM", // --- Empty States --- "No results found.": "לא נמצאו תוצאות.", "No issues": "אין משימות", "No labels": "אין תוויות", "No goal": "אין יעד", "No project": "אין פרויקט", "No parent": "אין הורה", "No manager": "אין מנהל", "No assignee": "אין מוקצה", "No value": "אין ערך", "No default": "אין ברירת מחדל", "No runs yet": "אין הרצות עדיין", "No runs yet.": "אין הרצות עדיין.", "No revisions yet": "אין גרסאות עדיין", "No icons match": "לא נמצאו אייקונים", "No agents match the selected filter.": "אין סוכנים שתואמים למסנן שנבחר.", "No agents attached": "לא צורפו סוכנים", "No active API keys.": "אין מפתחות API פעילים.", "No activity yet.": "אין פעילות עדיין.", "No plugins installed": "לא הותקנו תוספים", "No goals.": "אין יעדים.", "No tasks yet.": "אין משימות עדיין.", "No triggers configured yet.": "לא הוגדרו טריגרים עדיין.", "No description": "אין תיאור", "No diagnostics": "אין אבחנות", "No company selected": "לא נבחרה חברה", "No cost data yet.": "אין נתוני עלויות עדיין.", "No cost events yet.": "אין אירועי עלות עדיין.", "No items added yet.": "לא נוספו פריטים עדיין.", "No recent agent runs.": "אין הרצות סוכנים אחרונות.", "No recent issues.": "אין משימות אחרונות.", "No sub-goals.": "אין תת-יעדים.", "No sub-issues.": "אין תת-משימות.", "None": "ללא", "Unassigned": "לא מוקצה", "You have no agents.": "אין לך סוכנים.", "No unsaved changes.": "אין שינויים שלא נשמרו.", "No configuration options available.": "אין אפשרויות הגדרה זמינות.", // --- Loading States --- "Loading...": "טוען...", "Loading\u2026": "טוען\u2026", "Loading companies...": "טוען חברות...", "Loading plugins...": "טוען תוספים...", "Loading revisions...": "טוען גרסאות...", "Loading workspaces...": "טוען סביבות עבודה...", "Loading workspace\u2026": "טוען סביבת עבודה\u2026", "Loading run logs...": "טוען יומני הרצה...", "Loading log...": "טוען יומן...", "Loading keys...": "טוען מפתחות...", "Loading invite...": "טוען הזמנה...", "Loading plugin details...": "טוען פרטי תוסף...", "Checking health...": "בודק תקינות...", "Uploading logo...": "מעלה לוגו...", "Building export...": "בונה ייצוא...", // --- Toast & Notifications --- "Copied!": "הועתק!", "Saved": "נשמר", "Approval confirmed": "האישור אושר", "CLI access approved": "גישת CLI אושרה", "Bootstrap complete": "ההקמה הושלמה", "Action failed": "הפעולה נכשלה", "Comment failed": "התגובה נכשלה", "Copy failed": "ההעתקה נכשלה", "Archive failed": "הארכוב נכשל", "Approve failed": "האישור נכשל", "Reject failed": "הדחייה נכשלה", "Update failed": "העדכון נכשל", "Routine created": "השגרה נוצרה", "Routine saved": "השגרה נשמרה", "Routine run failed": "הרצת השגרה נכשלה", "Routine run started": "הרצת השגרה החלה", "Skill created": "הכישור נוצר", "Skill saved": "הכישור נשמר", "Skill updated": "הכישור עודכן", "Plugin installed successfully": "התוסף הותקן בהצלחה", "Plugin uninstalled successfully": "התוסף הוסר בהצלחה", "Plugin enabled": "התוסף הופעל", "Plugin disabled": "התוסף הושבת", "Plugin error": "שגיאת תוסף", "Trigger added": "הטריגר נוסף", "Trigger deleted": "הטריגר נמחק", "Trigger saved": "הטריגר נשמר", "Run completed": "ההרצה הושלמה", "Run failed": "ההרצה נכשלה", "Command failed": "הפקודה נכשלה", "Invite not available": "ההזמנה לא זמינה", "Invite not found": "ההזמנה לא נמצאה", "Interrupt requested": "התבקשה הפסקה", "Interrupt failed": "ההפסקה נכשלה", // --- Error Messages --- "An error was thrown.": "אירעה שגיאה.", "Authentication failed": "ההתחברות נכשלה", "Unknown error": "שגיאה לא ידועה", "Invalid JSON.": "JSON לא תקין.", "Failed to create issue. Try again.": "יצירת המשימה נכשלה. נסה שוב.", "Failed to create company": "יצירת החברה נכשלה", "Failed to create agent": "יצירת הסוכן נכשלה", "Failed to save": "השמירה נכשלה", "Failed to approve": "האישור נכשל", "Failed to reject": "הדחייה נכשלה", "Instance setup required": "נדרשת הגדרת מופע", // --- Dialog & Confirmation --- "Delete this company and all its data? This cannot be undone.": "למחוק חברה זו וכל הנתונים שלה? לא ניתן לבטל פעולה זו.", "Delete this document? This cannot be undone.": "למחוק מסמך זה? לא ניתן לבטל פעולה זו.", "Mark all as read?": "לסמן הכל כנקרא?", "Already have an account?": "כבר יש לך חשבון?", // --- Section Headings --- "Actions": "פעולות", "Advanced": "מתקדם", "Alerts": "התראות", "Appearance": "מראה", "Attachments": "קבצים מצורפים", "Automation": "אוטומציה", "Categories": "קטגוריות", "Cleanup": "ניקוי", "Codebase": "בסיס קוד", "Comments": "תגובות", "Company skills": "כישורי חברה", "Config": "הגדרות", "Context": "הקשר", "Controls": "בקרה", "Credits": "זיכויים", "Debits": "חיובים", "Details": "פרטים", "Documents": "מסמכים", "Environment": "סביבה", "Error Details": "פרטי שגיאה", "Files": "קבצים", "Filters": "מסננים", "Git status": "סטטוס Git", "Hiring": "גיוס", "Identity": "זהות", "Invites": "הזמנות", "Invocation": "הפעלה", "Join requests": "בקשות הצטרפות", "Lifecycle": "מחזור חיים", "Linked Issues": "משימות מקושרות", "Linked issues": "משימות מקושרות", "Options": "אפשרויות", "Output": "פלט", "Owner": "בעלים", "Permissions": "הרשאות", "Properties": "מאפיינים", "Providers": "ספקים", "Quick filters": "מסננים מהירים", "Recent financial events": "אירועי כספים אחרונים", "Recent operations": "פעולות אחרונות", "Remaining": "נותר", "Result": "תוצאה", "Revoked Keys": "מפתחות שבוטלו", "Runtime services": "שירותי ריצה", "Selected skills": "כישורים נבחרים", "Summary": "סיכום", "Tokens": "אסימונים", "Unsaved changes": "שינויים שלא נשמרו", "Warnings": "אזהרות", "Workspace context": "הקשר סביבת עבודה", "Worktree": "עץ עבודה", // --- Table/List Headers --- "Action": "פעולה", "Agent": "סוכן", "Branch": "ענף", "Cost": "עלות", "Created by": "נוצר על ידי", "Current": "נוכחי", "Current state": "מצב נוכחי", "Date": "תאריך", "Input tokens": "אסימוני קלט", "Output tokens": "אסימוני פלט", "Cached tokens": "אסימונים ממטמון", "Last Crash": "קריסה אחרונה", "Last run": "הרצה אחרונה", "Overall": "כולל", "Requested by": "התבקש על ידי", "Task": "משימה", "Total": "סך הכל", "Total cost": "עלות כוללת", "Used by": "בשימוש על ידי", // --- Misc UI Labels --- "About": "אודות", "Adapter": "מתאם", "After": "אחרי", "Before": "לפני", "Board view": "תצוגת לוח", "Coming soon": "בקרוב", "Documentation": "תיעוד", "Earlier": "מוקדם יותר", "Estimated": "משוער", "External": "חיצוני", "Human": "אנושי", "My recent issues": "המשימות האחרונות שלי", "Optional": "אופציונלי", "Per issue": "למשימה", "Per run": "להרצה", "Secret": "סוד", "See All \u2192": "ראה הכל \u2192", "Small": "קטן", "Large": "גדול", "User": "משתמש", "View details \u2192": "צפה בפרטים \u2192", "All approval statuses": "כל סטטוסי האישור", "All categories": "כל הקטגוריות", "All providers": "כל הספקים", "All types": "כל הסוגים", "All Time": "כל הזמנים", "Last 14 days": "14 ימים אחרונים", "Automation enabled.": "אוטומציה מופעלת.", "Automation paused.": "אוטומציה מושהית.", "Mobile navigation": "ניווט נייד", // --- Command Palette --- "Pages": "דפים", // --- Onboarding --- "Bootstrap your Paperclip instance": "הקם את מופע ה-Paperclip שלך", "Name your company": "תן שם לחברה שלך", "This is the organization your agents will work for.": "זהו הארגון שעבורו הסוכנים שלך יעבדו.", "This will be the CEO": "זה יהיה המנכ\"ל", "Give it something to do": "תן לו משהו לעשות", "Ready to launch": "מוכן להפעלה", "Welcome to Paperclip. Set up your first company and agent to get started.": "ברוכים הבאים ל-Paperclip. הקם את החברה והסוכן הראשונים שלך כדי להתחיל.", "I want advanced configuration myself": "אני רוצה להגדיר בעצמי הגדרות מתקדמות", "Get started by creating a company.": "התחל ביצירת חברה.", // --- Descriptions --- "Choose how this agent will run tasks.": "בחר כיצד סוכן זה יריץ משימות.", "Choose your adapter type for advanced setup.": "בחר את סוג המתאם להגדרה מתקדמת.", "Plugins are alpha.": "התוספים בשלב אלפא.", "Read our terms of service": "קרא את תנאי השירות שלנו", "Select a company first.": "בחר חברה תחילה.", "Sharing is currently disabled.": "השיתוף מושבת כרגע.", "Don't allow": "אל תאפשר", "Always allow": "אפשר תמיד", "What could have been better?": "מה יכול היה להיות טוב יותר?", "Drop image to upload": "גרור תמונה להעלאה", // --- Aria Labels --- "breadcrumb": "ניווט", "toggle menu": "החלפת תפריט", "Instance settings": "הגדרות מופע", "Scroll to bottom": "גלול למטה", "Change project color": "שנה צבע פרויקט", "Zoom in": "הגדל", "Zoom out": "הקטן", "Fit chart to screen": "התאם תרשים למסך" }; // ========================================================================= // TRANSLATION ENGINE // ========================================================================= // Build a reverse lookup for performance: lowercase -> original key const lowerMap = {}; for (const key in T) { lowerMap[key.toLowerCase()] = key; } /** * Translate a text string if a translation exists. * Uses exact match first, then case-insensitive. */ function translate(text) { const trimmed = text.trim(); if (!trimmed) return null; // Exact match if (T[trimmed] !== undefined) return T[trimmed]; // Case-insensitive match const lk = trimmed.toLowerCase(); if (lowerMap[lk]) return T[lowerMap[lk]]; return null; } /** * Check if a node is likely user-generated content (should NOT be translated). * This includes agent names, issue titles in dynamic lists, etc. */ function isUserContent(node) { let el = node.parentElement; while (el) { // Skip elements with contenteditable (editors) if (el.contentEditable === "true") return true; // Skip code blocks const tag = el.tagName; if (tag === "CODE" || tag === "PRE") return true; // Skip markdown rendered content body (but not headings/labels) if (el.classList && el.classList.contains("paperclip-markdown")) return true; // Skip elements explicitly marked as user content if (el.dataset && el.dataset.noTranslate === "true") return true; el = el.parentElement; } return false; } /** * Walk all text nodes under a root and translate them. */ function translateTextNodes(root) { const walker = document.createTreeWalker( root, NodeFilter.SHOW_TEXT, null ); let node; while ((node = walker.nextNode())) { if (isUserContent(node)) continue; const original = node.nodeValue; const translated = translate(original); if (translated !== null && translated !== original) { node.nodeValue = translated; } } } /** * Translate placeholder and aria-label attributes. */ function translateAttributes(root) { // Placeholders const inputs = root.querySelectorAll("input[placeholder], textarea[placeholder]"); inputs.forEach(function (el) { const t = translate(el.placeholder); if (t) el.placeholder = t; }); // aria-labels const ariaEls = root.querySelectorAll("[aria-label]"); ariaEls.forEach(function (el) { const t = translate(el.getAttribute("aria-label")); if (t) el.setAttribute("aria-label", t); }); // title attributes const titleEls = root.querySelectorAll("[title]"); titleEls.forEach(function (el) { const t = translate(el.getAttribute("title")); if (t) el.setAttribute("title", t); }); } /** * Full translation pass on the entire document. */ function translateAll() { translateTextNodes(document.body); translateAttributes(document.body); // Translate page title if (document.title) { const t = translate(document.title); if (t) document.title = t; } } // ========================================================================= // MUTATION OBSERVER - catch route changes and dynamic content // ========================================================================= let translateTimer = null; function scheduleTranslation() { if (translateTimer) return; translateTimer = setTimeout(function () { translateTimer = null; translateAll(); }, 50); } // Observe #root for changes (React renders here) function startObserver() { const root = document.getElementById("root"); if (!root) return; const observer = new MutationObserver(function (mutations) { let hasTextChange = false; for (let i = 0; i < mutations.length; i++) { const m = mutations[i]; if (m.type === "childList" && m.addedNodes.length > 0) { hasTextChange = true; break; } if (m.type === "characterData") { hasTextChange = true; break; } } if (hasTextChange) { scheduleTranslation(); } }); observer.observe(root, { childList: true, subtree: true, characterData: true }); // Also observe body for Radix portals (dialogs, tooltips, dropdowns) const bodyObserver = new MutationObserver(function (mutations) { for (let i = 0; i < mutations.length; i++) { const m = mutations[i]; if (m.type === "childList") { for (let j = 0; j < m.addedNodes.length; j++) { const node = m.addedNodes[j]; if (node.nodeType === 1 && node !== root) { translateTextNodes(node); translateAttributes(node); } } } } }); bodyObserver.observe(document.body, { childList: true, subtree: false }); } // ========================================================================= // INIT // ========================================================================= function init() { // Wait for React to render setTimeout(function () { translateAll(); startObserver(); }, 300); // Additional pass after longer delay for lazy-loaded content setTimeout(translateAll, 1500); setTimeout(translateAll, 4000); } // Start when DOM is ready if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", init); } else { init(); } })();