Files
paperclip-docker/assets/translate-he.js
Chaim 5160741248 Add Hebrew translation and RTL support via Docker injection
Injects custom CSS and JS into the Paperclip UI during Docker build:
- RTL layout overrides for Tailwind, Radix UI, and MDXEditor
- Hebrew translation script with MutationObserver for dynamic content
- Patch script to modify index.html with dir="rtl" and lang="he"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 20:42:19 +00:00

919 lines
35 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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();
}
})();