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>
This commit is contained in:
918
assets/translate-he.js
Normal file
918
assets/translate-he.js
Normal file
@@ -0,0 +1,918 @@
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user