import json

# Load files
with open('/working/aisbf/static/i18n/en.json', 'r', encoding='utf-8') as f:
    en = json.load(f)

with open('/working/aisbf/static/i18n/he.json', 'r', encoding='utf-8') as f:
    he = json.load(f)

# Hebrew translations for all missing keys - using proper Hebrew text
he_translations = {
    'providers.provider_key_label': 'מפתח ספק (מזהה ייחודי, למשל "gemini", "openai", "kiro")',
    'providers.provider_count_singular': 'ספק {n}',
    'providers.provider_count_plural': '{n} ספקים',
    'providers.search_models_title': 'חפש מודלים — {provider}',
    'providers.result_count': '{n} תוצאה.',
    'providers.kiro_auth_title': 'אימות Kiro',
    'providers.kiro_opt1': 'אפשרות 1: אישורי Kiro IDE',
    'providers.kiro_opt2': 'אפשרות 2: מסד נתונים kiro-cli',
    'providers.kiro_opt3': 'אפשרות 3: אישורים ישירים',
    'providers.kiro_opt4': 'אפשרות 4: העלאת קבצים',
    'providers.kiro_aws_region': 'אזור AWS',
    'providers.kiro_sqlite_path': 'נתיב מסד נתונים SQLite',
    'providers.kiro_refresh_token': 'אסימון רענון',
    'providers.kiro_profile_arn': 'ARN פרופיל',
    'providers.kiro_client_id': 'מזהה לקוח (לפי OIDC של AWS SSO)',
    'providers.kiro_client_secret': 'סוד לקוח (לפי OIDC של AWS SSO)',
    'providers.kiro_upload_creds': 'העלה קובץ אישורים',
    'providers.kiro_upload_sqlite': 'העלה מסד נתונים SQLite',
    'providers.kilo_opt1': 'אפשרות 1: מפתח API (מומלץ)',
    'providers.kilo_opt2': 'אפשרות 2: אימות OAuth2',
    'providers.qwen_opt2_discontinued': 'אפשרות 2: אימות OAuth2 (מושבת - לא פועלת)',
    'providers.kiro_auth_section': 'אימות Kiro',
    'providers.kilo_auth_section': 'אימות Kilocode',
    'providers.workspace_id': 'מזהה Workspace',
    'providers.oauth2_issuer_url': 'כתובת OAuth2 Issuer',
    'providers.pricing_section': 'הגדרות תמחור',
    'providers.subscription_based': 'ספק מבוסס מנוי (חינם)',
    'providers.price_prompt': 'מחיר למיליון טוקנים בהזנה (USD)',
    'providers.price_completion': 'מחיר למיליון טוקנים בסיום (USD)',
    'providers.default_rate_limit_tpm': 'הגבלת קצב ברירת מחדל TPM (טוקנים לדקה)',
    'providers.default_rate_limit_tph': 'הגבלת קצב ברירת מחדל TPH (טוקנים לשעה)',
    'providers.default_rate_limit_tpd': 'הגבלת קצב ברירת מחדל TPD (טוקנים ליום)',
    'providers.default_condense_context': 'דחיסת הקשר ברירת מחדל (%)',
    'providers.default_condense_method': 'שיטת דחיסת הקשר ברירת מחדל (conversational, semantic, hierarchical, algorithmic)',
    'providers.nsfw': 'NSFW',
    'providers.privacy': 'פרטיות',
    'providers.native_caching_section': 'אטימה מקורית',
    'providers.enable_native_caching': 'אפשר אטימה מקורית',
    'providers.cache_ttl': 'TTL מטמון (שניות)',
    'providers.min_cacheable_tokens': 'מינימום טוקנים לאטימה',
    'providers.prompt_cache_key': 'מפתח אטימת הנחיה (OpenAI/Kilo)',
    'providers.model_filter': 'מסנן מודלים (למודלים שנטענות אוטומטית)',
    'providers.model_rate_limit_tpm': 'הגבלת קצב מודל TPM',
    'providers.model_rate_limit_tph': 'הגבלת קצב מודל TPH',
    'providers.model_rate_limit_tpd': 'הגבלת קצב מודל TPD',
    'providers.model_condense_method': 'שיטת דחיסת הקשר (conversational, semantic, hierarchical, algorithmic)',
    'providers.remove_provider_title': 'הסר ספק',
    'providers.remove_model_title': 'הסר מודל',
    'providers.missing_key': 'נא להזין מפתח ספק',
    'providers.missing_key_title': 'מפתח חסר',
    'providers.duplicate_key': 'מפתח ספק כבר קיים',
    'providers.duplicate_key_title': 'מפתח כפול',
    'providers.models_found': '✅ נמצאו {n} מודלים',
    'providers.not_authenticated': 'לא מחובר',
    'providers.uploading_file': 'מעלה קובץ: {pct}%',
    'providers.uploading_cli': 'מעלה אישורי CLI: {pct}%',
    'providers.cli_creds_saved': 'אישורי CLI נשמרו: {name}',
    'providers.upload_failed': 'העלאה נכשלה: {error}',
    'providers.fetching_models': 'מושך מודלים...',
    'providers.checking_auth': 'בודק סטטוס אימות של {provider}...',
    'providers.auth_valid': '✅ אימות {provider} בתוקף. פג ב: {expiry}',
    'providers.auth_failed': '❌ אימות {provider} נכשל: {error}',
    'providers.auth_error': '❌ שגיאה בבדיקת אימות {provider}: {error}',
    'providers.auth_success': '✓ אימות {provider} הצליח! אישורים נשמרו.',
    'providers.auth_timeout': '✗ זמן אימות פג. נסה שוב.',
    'providers.auth_denied': '✗ הרשאה נדחתה על ידי המשתמש.',
    'providers.auth_expired': '✗ קוד הרשאה פג. נסה שוב.',
    'providers.auth_start_failed': '✗ התחלת אימות נכשלה: {error}',
    'providers.auth_error_completing': '✗ שגיאה בהשלמת אימות: {error}',
    'providers.auth_generic_error': '✗ שגיאה: {error}',
    'providers.remove_provider_confirm': 'הסר את הספק "{key}"?',
    'providers.remove_model_confirm': 'הסר מודל זה?',
    'providers.error_saving': 'שגיאה בשמירת תצורה',
    'providers.models_fetch_error': '❌ שגיאה: {error}',
    'providers.standard_config': 'תצורת ספק סטנדרטית.',
    'providers.rate_limit_hint': 'זמן המתנה בין בקשות לספק זה',
    'providers.models_section_hint': 'הגדר מודלים ספציפיים לספק זה, או השאר ריק כדי למשוך אוטומטית את כל המודלים הזמינים מה-API של הספק.',
    'providers.model_filter_hint': 'כאשר לא הוגדרו מודלים ידנית, רק מודלים שמזהה (ID) שלהם מכיל את מילת המסנן יוצגו (התאמת wildcard强奸-insensitive).',
    'providers.kiro_auth_hint': 'בחר שיטת אימות אחת: אישורי Kiro IDE (קובץ אישורים), מסד נתונים kiro-cli (sqlite), או אישורים ישירים (refresh_token + client_id/secret).',
    'providers.kilo_auth_hint': 'בחר שיטת אימות: מפתח API (מומלץ לש simplicity) או OAuth2 Device Authorization Grant.',
    'providers.workspace_id_hint': 'מזהה Workspace לאזור גרמניה (ברירת מחדל: "Default Workspace")',
    'providers.kiro_aws_region_hint': 'אזור AWS ל-API של Kiro (ברירת מחדל: us-east-1)',
    'providers.kiro_sqlite_hint': 'נתיב למסד נתונים kiro-cli SQLite',
    'providers.kiro_refresh_hint': 'אסימון רענון Kiro לאימות ישיר',
    'providers.kiro_profile_arn_hint': 'ARN פרופיל CodeWhisperer של AWS (אופציונלי)',
    'providers.kiro_client_id_hint': 'מזהה לקוח לאימות OIDC של AWS SSO',
    'providers.kiro_client_secret_hint': 'סוד לקוח לאימות OIDC של AWS SSO',
    'providers.kiro_upload_creds_hint': 'העלה קובץ JSON עם אישורי Kiro IDE',
    'providers.kiro_upload_sqlite_hint': 'העלה קובץ מסד נתונים kiro-cli SQLite',
    'providers.provider_key_hint': 'ייעשה כ�-Marie Marathon/API ובנקודת קצה.',
    'providers.subscription_based_hint': 'אם מסומן, ספק זה מבוסס מנוי והעלות תGab 0$. שימושי עדיין נצבר לניתוח.',
    'providers.price_prompt_hint': 'השאר ריק לשימוש במחיר ברירת המחדל. דוגמה: OpenAI周转率$10, Anthropic Claude: $15, Google Gemini: $1.25',
    'providers.price_completion_hint': 'השאר ריק לשימוש במחיר ברירת מחדל. דוגמה: OpenAI周转率$30, Anthropic Claude: $75, Google Gemini: $5.00',
    'providers.default_rate_limit_tpm_hint': 'מגבלת טוקנים לדקה ברירת מחדל למודלים בספק זה',
    'providers.default_rate_limit_tph_hint': 'מגבלת טוקנים לשעה ברירת מחדל למודלים בספק זה',
    'providers.default_rate_limit_tpd_hint': 'מגבלת טוקנים ליום ברירת מחדל למודלים בספק זה',
    'providers.native_caching_hint': 'תכונות אטימה מקורית של ספק (Anthropic cache_control, Google Context Caching, OpenAI וכו') voor הפחתת העלות.',
    'providers.enable_native_caching_hint': 'אפשר אטימת ספק מקורית להפחתת העלות (חסכון 50-70% לספקים נתמכים)',
    'providers.cache_ttl_hint': 'זמן חיים למטמון בשניות (Google Context Caching בלבד)',
    'providers.min_cacheable_tokens_hint': 'מספר מינימום של טוקנים לתוכן שניתן לאטום (ברירת מחדל: 1000)',
    'providers.prompt_cache_key_hint': 'מפתח אטימה אופציונלי לאופטימיזציה של ניתוב של OpenAI/Kilo',
    'rotations.search_models_title': 'חפש מודלים — {provider}',
    'rotations.result_count': '{n} תוצאה.',
    'rotations.copy_title': 'העתק רוטציה',
    'rotations.add_title': 'הוסף רוטציה',
    'rotations.key_exists': 'מפתח רוטציה כבר קיים.',
    'rotations.key_exists_title': 'מפתח כפול',
    'rotations.invalid_key_title': 'מפתח לא חוקי',
    'rotations.remove_title': 'הסר רוטציה',
    'rotations.remove_provider_title': 'הסר ספק',
    'rotations.remove_model_title': 'הסר מודל',
    'rotations.copy_prompt': 'העתק "{key}" — הזן מפתח רוטציה חדש:',
    'rotations.add_prompt': 'הזן מפתח רוטציהלמשל "coding", "general"):',
    'rotations.key_different': 'המפתח החדש חייב שונה מהמקור.',
    'rotations.remove_confirm': 'הסר את הרוטציה "{key}"?',
    'rotations.remove_provider_confirm': 'הסר ספק זה?',
    'rotations.remove_model_confirm': 'הסר מודל זה?',
    'rotations.error_saving': 'שגיאה בשמירת תצורה',
    'autoselect.copy_title': 'העתק בחירה אוטומטית',
    'autoselect.add_title': 'הוסף בחירה אוטומטית',
    'autoselect.key_exists': 'מפתח בחירה אוטומטית כבר קיים.',
    'autoselect.key_exists_title': 'מפתח כפול',
    'autoselect.invalid_key_title': 'מפתח לא חוקי',
    'autoselect.remove_title': 'הסר בחירה אוטומטית',
    'autoselect.remove_model_title': 'הסר מודל',
    'autoselect.result_count': '{n} תוצאה.',
    'autoselect.models_found': 'נמצאו {n} מודרים',
    'autoselect.copy_prompt': 'העתק "{key}" — הזן מפתח חדש לבחירה אוטומטית:',
    'autoselect.add_prompt': 'הזן מפתח לבחירה אוטומטיתלמשל "autoselect", "smart-select"):',
    'autoselect.key_different': 'המפתח החדש חייב שונה מהמקור.',
    'autoselect.remove_confirm': 'הסר את הבחירה האוטומטית "{key}"?',
    'autoselect.remove_model_confirm': 'הסר מודל זה?',
    'autoselect.error_saving': 'שגיאה בשמירת תצורה',
    'wallet_page.currency': 'מטבע',
    'wallet_page.wallet_id': 'מזהה ארנק',
    'wallet_page.charged_to_card': 'חויב לכרטיס האשראי ברירת המחדל שלך:',
    'wallet_page.invalid_amount': 'נא לבחור או להזין סכום בין {min} ל-{max}.',
    'wallet_page.invalid_amount_title': 'סכום לא חוקי',
    'rate_limits_page.refresh': 'רענן',
    'rate_limits_page.provider_label': 'ספק:',
    'rate_limits_page.enabled': 'פעיל:',
    'rate_limits_page.current_rate_limit': 'הגבלת קצב נוכחית:',
    'rate_limits_page.base_rate_limit': 'הגבלת קצב בסיסית:',
    'rate_limits_page.total_429': 'ספירת תגובות 429:',
    'rate_limits_page.total_requests': 'ספירת בקשות:',
    'rate_limits_page.consecutive_429': 'מספר 429 ברצף:',
    'rate_limits_page.recent_429': 'מספר 429 אחרונים:',
    'rate_limits_page.last_429': 'זמן 429 אחרון:',
    'rate_limits_page.never': 'אף פעם',
    'rate_limits_page.seconds': '{n} שניות',
    'rate_limits_page.yes': 'כן',
    'rate_limits_page.no': 'לא',
    'rate_limits_page.reset_all_title': 'אפס הכל',
    'rate_limits_page.analytics': 'ניתוח',
    'rate_limits_page.response_cache': 'מטמון תגובות',
    'rate_limits_page.rate_limits': 'מגבלות קצב',
    'rate_limits_page.reset_confirm': 'אפס מגביל קצב עבור {provider}?',
    'rate_limits_page.reset_confirm_title': 'אפס מגביל קצב',
    'rate_limits_page.reset_all_confirm': 'אפס כל מגבילי הקצב? פעולה זו תמחק את כל מגבילי הקצב שנגזרו.',
    'rate_limits_page.reset_all_success': 'כל מגבילי הקצב אופסו בהצלחה',
    'login_page.remember_me': 'זכור אותי',
    'signup_page.username_hint': '3-50 תווים, אותיות, מספרים, קווים תחתונים, מקפים ונקודות בלבד',
    'signup_page.email_hint': 'ת קבל אימייל אימות בכתובת זו',
    'signup_page.password_hint': 'לפחות 8 תווים עם אותיות גדולות, קטנות ומספרים',
    'forgot_page.intro': 'הזן את כתובת הדוא"ל ונד没见过 לך קישור לאיפוס הסיסמה.',
    'forgot_page.sent': 'אם קיים חשבון בכתובת זו, נשלח קישור לאיפוס סיסמה. הקישור יפוג תוך 24 שעות. בדוק בתיבת דואר הנכנס ו-spam.',
    'reset_page.intro': 'הזן את הסיסמה החדשה שלך למטה.',
    'reset_page.password_hint': 'חייב להיות לפחות 8 תווים',
    'reset_page.success': 'הסיסמה שלך נאפסהת בהצלחה. אתה יכול להתחבר עם הסיסמה החדשה.',
    'reset_page.go_to_login': 'עבור להתחברות',
    'reset_page.invalid_token': 'קישור איפוס הסיסמה זה לא חוקי או פג. נא לבקש קישור חדש לאיפוס.',
    'reset_page.request_new': 'בקש קישור איפוס חדש',
    'profile_page.display_name_hint': 'ככה השם שלך יוצג בכל היישום',
    'profile_page.no_email': 'לא הוגדרה כתובת דוא"ל.',
    'profile_page.add_email': 'הוסף דוא"ל',
    'profile_page.change_email': 'שנה דוא"ל',
    'profile_page.email_requires_verify': '(דורש אימות)',
    'profile_page.upload_image': 'העלה תמונה',
    'profile_page.upload_hint': 'מקסימום 5 מגה-בייט. JPG, PNG, GIF, WebP.',
    'profile_page.danger_zone': 'אזור מסוכן',
    'profile_page.danger_zone_desc': 'מחק לצמיתות את החשבון וכל הנתונים המשויכים.',
    'profile_page.delete_account': 'מחוק חשבון',
    'profile_page.uploading': 'מעלה…',
    'profile_page.upload_pct': 'מעלה… {pct}%',
    'profile_page.upload_success': 'תמונת פרופיל עודכפה!',
    'profile_page.upload_too_large': 'התמונה גדולה מדי. הגודל המקסימלי הוא 5 מגה-בייט.',
    'profile_page.upload_invalid_type': 'סוג קובץ לא חוקי. fus העלאה JPG, PNG, GIF או WebP.',
    'profile_page.upload_failed': 'העלאה נכשלה: {error}',
    'email_page.password_hint': 'אשר את הסיסמה שלך להמשך',
    'delete_page.danger_zone': 'אזור מסוכן',
    'delete_page.danger_zone_desc': 'מחק לצמיתות את החשבון וכל הנתונים המשויכים.',
    'delete_page.will_delete': '⚠️ פעולה זו תמחק לצמיתות:',
    'delete_page.item_account': 'החשבון ופרטי הפרופיל שלך',
    'delete_page.item_providers': 'כל ספקי והגדרות ה-API שלך',
    'delete_page.item_rotations': 'כל הגדרות הרוטציות והבחירה האוטומטית שלך',
    'delete_page.item_history': 'כל היסטוריית השימוש והניתוח שלך',
    'delete_page.item_tokens': 'כל אסימוני ה-API שלך',
    'delete_page.sub_warning_title': '⚠️ אזהרה: זוהה מנוי פעיל',
    'delete_page.sub_warning_desc': 'יש לך מנוי משלם פעיל ({tier}). מחיקת החשבון תוביל:',
    'delete_page.sub_item_cancel': 'לביטול המנוי באופן מיידי',
    'delete_page.sub_item_access': 'תאבד גישת לכל התכונות הפרימיום',
    'delete_page.sub_item_refund': 'לא יינתן החזר עבור זמן המנוי שנשאר',
    'delete_page.sub_consider': 'שקול לבטל את המנוי קודם אם אתה רוצה להשתמש בו עד סוף תקופת החיוב.',
    'delete_page.type_delete_confirm': 'נא להזין "מחק" בדיוק לאישור מחיקת החשבון.',
    'delete_page.final_confirm': 'האם אתה בטוח לחלוטין? זה לא הפיכה וכל הנתונים שלך יימחקו לצמיתות.',
    'tokens_page.new_token': 'אסימון חדש',
    'tokens_page.your_tokens': 'האסימונים שלך',
    'tokens_page.description_optional': 'תיאור (אופציונלי)',
    'tokens_page.description_placeholder': 'למשל: אפליקציה שלי, שרת בית…',
    'tokens_page.scope_api': 'API בלבד',
    'tokens_page.scope_api_hint': '(בקשות Proxy)',
    'tokens_page.scope_mcp': 'MCP בלבד',
    'tokens_page.scope_mcp_hint': '(כלים של agents)',
    'tokens_page.scope_both': 'שניהם',
    'tokens_page.create_btn': 'צור',
    'tokens_page.token_created': 'אסימון נוצר בהצלחה',
    'tokens_page.copy_now_warn': 'העתק את האסימון הזה עכשיו — הוא לא יוצג שוב.',
    'tokens_page.done': 'סיום',
    'tokens_page.how_to_use': 'איך להשתמש באסימון',
    'tokens_page.auth_header_desc': 'הוסף את האסימון לכל בקשה בכותרת {header}:',
    'tokens_page.token_scopes': 'טווחי אסימון:',
    'tokens_page.scope_api_access': 'גישה ל-API בלבד ({path})',
    'tokens_page.scope_mcp_access': 'גישה לנקודות קצה של MCP בלבד ({path})',
    'tokens_page.scope_both_access': 'גישה ל-API ול-MCP',
    'tokens_page.available_endpoints': 'נקודות קצה זמינות:',
    'tokens_page.col_method': 'שיטה',
    'tokens_page.col_endpoint': 'נקודת קצה',
    'tokens_page.col_scope': 'טווח',
    'tokens_page.ep_list_models': 'הצג את כל המודלים שלך',
    'tokens_page.ep_list_providers': 'הצג את הספקים המוגדרים שלך',
    'tokens_page.ep_list_rotations': 'הצג את הרוטציות שלך',
    'tokens_page.ep_list_autoselects': 'הצג את הבחירות האוטומטיות שלך',
    'tokens_page.ep_chat': 'צ\'אט עם התצורות שלך',
    'tokens_page.ep_mcp_list': 'הצג כלי MCP',
    'tokens_page.ep_mcp_call': 'קריאה לכלי MCP',
    'tokens_page.example_commands': 'פקודות curl לדוגמה:',
    'tokens_page.active': 'פעיל',
    'tokens_page.inactive': 'לא פעיל',
    'tokens_page.created': 'נוצר',
    'tokens_page.last_used': 'שימוש אחרון',
    'tokens_page.unnamed_token': 'אסימון ללא שם',
    'tokens_page.delete_confirm': 'מחוק אסימון API זה? פעולה זו תבטל את הגישה באופן מיידי ולא ניתן לבטלה.',
    'tokens_page.delete_token': 'מחק אסימון',
    'billing_page.wallet_balance': 'יתרת ארנק',
    'billing_page.wallet_desc': 'כל חידושי מנוי ותשלומים נגבים מהארנק שלך באופן אוטומטי.',
    'billing_page.manage_wallet': 'נהל ארנק',
    'billing_page.no_payment_methods': 'לא הוגדרו שיטות תשלום',
    'billing_page.no_payment_methods_desc': 'הוסף כרטיס אשראי כדי לאפשר חידושי מנוי אוטומטיים.',
    'billing_page.add_credit_card': 'הוסף כרטיס אשראי',
    'billing_page.top_up_wallet': 'טען ארנק',
    'billing_page.set_default': 'קבע כברירת מחדל',
    'billing_page.billing_history': 'היסטorianת חיוב',
    'billing_page.no_history': 'אין היסטורית חיוב עדיין',
    'billing_page.no_history_desc': 'אין לך עסקאות תשלום בחשבון.',
    'billing_page.no_history_upgrade': 'שדר את התוכנית להתחלה!',
    'billing_page.view_plans': 'צפה בתכניות ומחירים',
    'billing_page.plan_payment': 'תשלום תוכנית',
    'billing_page.col_date': 'תאריך',
    'billing_page.col_amount': 'סכום',
    'billing_page.col_method': 'שיטה',
    'billing_page.col_status': 'סטטוס',
    'billing_page.status_completed': '✓ הושלם',
    'billing_page.status_pending': '⏳ ממתין',
    'billing_page.status_failed': '✗ נכשל',
    'billing_page.status_refunded': '↩ החזר',
    'billing_page.invoice': 'חשבונית',
    'billing_page.prev': 'הקודם',
    'billing_page.next': 'הבא',
    'user_overview.stat_total_tokens': 'סה"כ טוקנים',
    'user_overview.stat_requests_today': 'בקשות היום',
    'user_overview.stat_active_providers': 'ספקים פעילים',
    'user_overview.stat_active_rotations': 'רוטציות פעילות',
    'user_overview.quick_actions': 'פעולות מהירות',
    'user_overview.subscription': 'מנוי',
    'user_overview.manage': 'נהל',
    'user_overview.add_payment_method': 'הוסף שיטת תשלום',
    'user_overview.unlock_more_power': 'פתח כוח נוסף',
    'user_overview.upgrade_plan': 'שדר תוכנית',
    'user_overview.higher_plans': '{n} תוכניות גבוהות זמינות — בקשות נוספות, ספקים נוספים',
    'user_overview.upgrade_to': 'שדר ל-{name} ב-{price}/חודש',
    'user_overview.api_endpoints': 'נקודות קצה API',
    'user_overview.show_hide': 'הצג / הסתר',
    'user_overview.auth_header_desc': 'כלול אסימון API בכותרת {header}:',
    'user_overview.ep_models': 'מודלים',
    'user_overview.ep_list_models': 'הצג את כל המודלים שלך',
    'user_overview.ep_providers': 'ספקים',
    'user_overview.ep_list_providers': 'הצג את הספקים המוגדרים שלך',
    'user_overview.ep_rotations_autoselect': 'רוטציות ובחירה אוטומטית',
    'user_overview.ep_list_rotations': 'הצג את הרוטציות שלך',
    'user_overview.ep_list_autoselects': 'הצג את הבחירות האוטומטיות שלך',
    'user_overview.ep_chat': 'צ\'אט',
    'user_overview.ep_chat_desc': 'שלח בקשות צ\'אט עם התצורות שלך',
    'user_overview.ep_mcp': 'כלי MCP',
    'user_overview.ep_mcp_list': 'הצג כלי MCP',
    'user_overview.ep_mcp_call': 'קריאה לכלי MCP',
    'user_overview.ep_model_formats': 'דוגמאות פורמט מודל',
    'user_overview.admin_access': 'גישת מנהל',
    'user_overview.admin_access_desc': 'כמנהל יש לך גם גישה לתצורות כלליות עם קיצורי מזהה מודלים:',
    'user_overview.token_required': 'אסימון API נדרש לכל הנקודות הקצה.',
    'user_overview.manage_tokens': 'נהל אסימונים →',
    'usage_page.manage_subscription': 'נהל מנוי',
    'usage_page.current_plan': 'תוכנית נוכחית',
    'usage_page.activity_quotas': 'מגבלות פעילות',
    'usage_page.activity_quotas_desc': 'מגבלות מבוססות זמן שמתאפסות אוטומטית',
    'usage_page.config_limits': 'מגבלות תצורה',
    'usage_page.config_limits_desc': 'הקצאות משאבים קבועות לחשבונך',
    'usage_page.requests_today': 'בקשות היום',
    'usage_page.resets_midnight': 'מתאפס בחצות UTC',
    'usage_page.resets_in': 'מתאפס בעוד {h}ש {m}ד',
    'usage_page.requests_month': 'בקשות החודש',
    'usage_page.resets_on_1st': 'מתאפס ב-1',
    'usage_page.resets_in_days': 'מתאפס בעוד {n} יום',
    'usage_page.resets_in_days_plural': 'מתאפס בעוד {n} ימים',
    'usage_page.tokens_24h': 'טוקנים (24 שעות אחרונות)',
    'usage_page.tokens_combined': 'קלט + פלט משולב',
    'usage_page.tokens_used': 'טוקנים בשימוש',
    'usage_page.unlimited': 'ללא הגבלה',
    'usage_page.quota_reached': 'מגבלה הושגה',
    'usage_page.remaining': 'נותרו {n}',
    'usage_page.ai_providers': 'ספקי AI',
    'usage_page.ai_providers_desc': 'שילוב ספקים מוגדרים',
    'usage_page.rotations_desc': 'תצורות 내灾 balancing',
    'usage_page.autoselections': 'בחירות אוטומטיות',
    'usage_page.autoselections_desc': 'תצורי ניתוב חכם',
    'usage_page.unlimited_slots': 'פריטים זמינים ללא הגבלה',
    'usage_page.pct_used_slots_free': '{pct}% בשימוש · {n} slot פנוי',
    'usage_page.pct_used_slots_free_plural': '{pct}% בשימוש · {n} slots פנויים',
    'usage_page.need_higher_limits': 'צריכים מגבלות גבוהות יותר?',
    'usage_page.upgrade_desc': 'שדר את התוכנית שלך לקבל בקשות נוספות, ספקים, ובחירות אוטומטיות.',
    'usage_page.view_plans': 'צפה בתכניות',
    'prompts_page.select_file': 'בחר קובץ הנחיה:',
    'prompts_page.content_hint': 'ערוך תבנית ההנחיה. ניתן להשתמש בפורמט markdown',
    'prompts_page.reset_confirm': 'האם אתה בטוח שברצונך לאפס הנחיה זו לתצורת מנהל ברירת המחדל?',
    'prompts_page.reset_confirm_title': 'אפס הנחיה',
    'subscription_page.title': 'ניהול מנוי',
    'subscription_page.current_plan': 'תוכנית נוכחית',
    'subscription_page.free_tier': 'רמה חינמית',
    'subscription_page.no_description': 'אין תיאור זמין',
    'subscription_page.per_month': '/חודש',
    'subscription_page.per_year': '/שנה',
    'subscription_page.or_yearly': 'או {price}/שנה',
    'subscription_page.change_plan': 'שנה תוכנית',
    'subscription_page.requests_per_day': 'בקשות ליום',
    'subscription_page.requests_per_month': 'בקשות לחודש',
    'subscription_page.providers': 'ספקים',
    'subscription_page.rotations': 'רוטציות',
    'subscription_page.subscription_status': 'סטטוס מנוי',
    'subscription_page.renews': 'מתחדש:',
    'subscription_page.cancel_subscription': 'בטל מנוי',
    'subscription_page.quick_actions': 'פעולות מהירות',
    'subscription_page.billing_payments': 'חיוב ותשלומים',
    'subscription_page.billing_payments_desc': 'נהל שיטות תשלום וצפה בהיסטוריה',
    'subscription_page.upgrade_plan': 'שדר תוכנית',
    'subscription_page.upgrade_plan_desc': 'צפה בכל התוכניות הזמינות',
    'subscription_page.edit_profile': 'ערוך פרופיל',
    'subscription_page.edit_profile_desc': 'עדכן הגדרות חשבון',
    'subscription_page.change_password': 'שנה סיסמה',
    'subscription_page.change_password_desc': 'עדכן הגדרות אבטחה',
    'subscription_page.no_payment_methods': 'אין שיטות תשלום',
    'subscription_page.no_payment_methods_desc': 'הוסף שיטת תשלום לשדרוג התוכנית ולניהול מנויים',
    'subscription_page.go_to_billing': 'עבור לחיוב ושיטות תשלום',
    'user_providers_page.title': 'הספקים שלי',
    'user_providers_page.add_new': 'הוסף ספק חדש',
    'user_rotations_page.title': 'תצורת הרוטציות שלי',
    'user_rotations_page.add_rotation': 'הוסף רוטציה',
    'user_rotations_page.save_config': 'שמור תצורה',
    'user_rotations_page.cancel': 'בטל',
    'user_autoselects_page.title': 'תצורת הבחירה האוטומטית שלי',
    'user_autoselects_page.add_autoselect': 'הוסף בחירה אוטומטית',
    'user_autoselects_page.save_config': 'שמור תצורה',
    'user_autoselects_page.cancel': 'בטל',
}


def set_nested(d, key, value):
    parts = key.split('.')
    c = d
    for p in parts[:-1]:
        c = c.setdefault(p, {})
    c[parts[-1]] = value

# Apply translations
for key, value in he_translations.items():
    set_nested(he, key, value)

# Write back
with open('/working/aisbf/static/i18n/he.json', 'w', encoding='utf-8') as f:
    json.dump(he, f, ensure_ascii=False, indent=2)

print(f"Applied {len(he_translations)} Hebrew translations")

# Verify: check if any keys still equal English
remaining = 0
for key in keys_to_translate:
    en_val = en
    he_val = he
    parts = key.split('.')
    for part in parts:
        if part in en_val:
            en_val = en_val[part]
        else:
            en_val = None
            break
    for part in parts:
        if part in he_val:
            he_val = he_val[part]
        else:
            he_val = None
            break
    if he_val is not None and en_val is not None and he_val == en_val:
        remaining += 1

print(f"Keys still equal to English after translation: {remaining}")

# Validate JSON
with open('/working/aisbf/static/i18n/he.json', 'r', encoding='utf-8') as f:
    json.load(f)
print("JSON is valid ✓")
