didi-website-erp-crm/erp_crm/scripts/setup/05-translations.py

244 lines
7.2 KiB
Python

"""
Set ERPNext to Romanian + add custom translations for DiDi labels.
Run: python setup-translations.py
"""
import requests
import json
import sys
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
URL = "http://localhost:8080"
s = requests.Session()
login = s.post(f"{URL}/api/method/login", data={"usr": "Administrator", "pwd": "admin"})
if login.status_code != 200:
print("Login failed"); exit(1)
print("Logged in as Administrator")
# ── 1. Set system language to Romanian ──
print("\n1. Setting system language to Romanian...")
r = s.put(f"{URL}/api/resource/System%20Settings/System%20Settings", json={
"language": "ro",
"date_format": "dd.mm.yyyy",
"time_format": "HH:mm:ss",
"number_format": "#.###,##",
"country": "Romania",
"first_day_of_the_week": "Monday",
})
print(f" System Settings: {r.status_code}")
# ── 2. Set Administrator language to RO ──
print("\n2. Setting Administrator language...")
r = s.put(f"{URL}/api/resource/User/Administrator", json={"language": "ro"})
print(f" Admin language: {r.status_code}")
# Also API user
r = s.put(f"{URL}/api/resource/User/website_api@didi-erp", json={"language": "ro"})
print(f" API user language: {r.status_code}")
# ── 3. Custom translations for DiDi labels ──
print("\n3. Adding custom translations...")
TRANSLATIONS = {
# DocType names
"Sales Invoice": "Factura de Vanzare",
"Customer": "Client",
"Lead": "Lead",
"Payment Log": "Jurnal Plati",
"Payment Entry": "Incasare",
"Service Agreement": "Acord Servicii",
"Website Content": "Continut Website",
"Analysis Report": "Raport Analiza",
"Subscription Plan": "Plan Abonament",
"Item": "Articol / Serviciu",
"Item Group": "Grup Articole",
"Supplier": "Furnizor",
"Company": "Companie",
"Account": "Cont Contabil",
"Purchase Invoice": "Factura de Achizitie",
"Email Template": "Sablon Email",
"Sales Taxes and Charges Template": "Sablon Taxe (TVA)",
"Lead Source": "Sursa Lead",
"Sales Stage": "Etapa Vanzare",
# Common fields
"Customer Name": "Nume Client",
"Customer Type": "Tip Client",
"Customer Group": "Grup Clienti",
"Territory": "Teritoriu",
"Grand Total": "Total General",
"Net Total": "Total Net",
"Outstanding Amount": "Suma Restanta",
"Posting Date": "Data Emiterii",
"Due Date": "Data Scadenta",
"Status": "Status",
"Currency": "Moneda",
"Paid": "Platita",
"Unpaid": "Neplatita",
"Overdue": "Restanta",
"Cancelled": "Anulata",
"Draft": "Ciorna",
"Submitted": "Confirmata",
"Amount": "Suma",
"Rate": "Pret Unitar",
"Quantity": "Cantitate",
"Qty": "Cant.",
"Description": "Descriere",
"Total": "Total",
"Tax": "Taxa",
"Taxes": "Taxe",
"Discount": "Reducere",
"Payment Type": "Tip Plata",
"Receive": "Incasare",
# DiDi custom fields
"Analysis Consumed": "Analiza Consumata",
"Analysis Session ID": "ID Sesiune Analiza",
"DiDi User ID": "ID Utilizator DiDi",
"IAM Role": "Rol IAM",
"Active Plan": "Plan Activ",
"Plan Activation Date": "Data Activare Plan",
"Source Form": "Formular Sursa",
"Page Origin": "Pagina Origine",
# Custom DocType fields
"Acceptance Date": "Data Acceptarii",
"Client IP": "IP Client",
"Terms Version": "Versiune Termeni",
"Agreement HTML": "Continut Acord",
"Stripe Payment Intent ID": "ID Plata Stripe",
"Stripe Session ID": "ID Sesiune Stripe",
"Raw Webhook Data": "Date Brute Webhook",
"Event Type": "Tip Eveniment",
"Page Slug": "Slug Pagina",
"Section Key": "Cheie Sectiune",
"Display Order": "Ordine Afisare",
"Is Active": "Activ",
"Content RO": "Continut RO",
"Content EN": "Continut EN",
"Extra Data": "Date Extra",
"Report Title": "Titlu Raport",
"Generated At": "Generat La",
"Result JSON": "Rezultat JSON",
"PDF File": "Fisier PDF",
"Media Type": "Tip Media",
"Component": "Componenta",
# Workspace & navigation
"Home": "Acasa",
"Settings": "Setari",
"Search": "Cauta",
"Help": "Ajutor",
"Logout": "Deconectare",
"Save": "Salveaza",
"Submit": "Confirma",
"Cancel": "Anuleaza",
"Delete": "Sterge",
"New": "Nou",
"Edit": "Editeaza",
"Print": "Tipareste",
"Download": "Descarca",
"Filter": "Filtreaza",
"Sort By": "Sorteaza dupa",
"Created By": "Creat de",
"Modified By": "Modificat de",
"Owner": "Proprietar",
"Creation": "Data Creare",
"Modified": "Data Modificare",
"Actions": "Actiuni",
"Add Row": "Adauga Rand",
"Select All": "Selecteaza Tot",
# Reports
"Balance Sheet": "Bilant",
"Profit and Loss Statement": "Cont Profit si Pierdere",
"General Ledger": "Registru General",
"Trial Balance": "Balanta de Verificare",
"Accounts Receivable": "Debitori",
"Accounts Payable": "Creditori",
# CRM
"Lead Name": "Nume Lead",
"Email Address": "Adresa Email",
"Phone": "Telefon",
"Source": "Sursa",
"Campaign": "Campanie",
"Converted": "Convertit",
"Do Not Contact": "Nu Contacta",
"Replied": "Raspuns",
"Interested": "Interesat",
"Quotation": "Oferta",
"Opportunity": "Oportunitate",
# Subscription
"Plan Name": "Nume Plan",
"Billing Interval": "Interval Facturare",
"Cost": "Cost",
"Month": "Lunar",
"Year": "Anual",
# Common actions/buttons
"Amend": "Modifica",
"Duplicate": "Duplica",
"Rename": "Redenumeste",
"Reload": "Reincarca",
"Close": "Inchide",
"Yes": "Da",
"No": "Nu",
"Confirm": "Confirma",
"Apply": "Aplica",
"Clear": "Curata",
"Refresh": "Actualizeaza",
"Export": "Exporta",
"Import": "Importa",
# Misc
"Romania": "Romania",
"Commercial": "Comercial",
"Individual": "Persoana Fizica",
"Company": "Companie",
"All Item Groups": "Toate Grupurile",
"DiDi Services": "Servicii DiDi",
"Succeeded": "Reusita",
"Failed": "Esuata",
"Refunded": "Rambursata",
"Pending": "In Asteptare",
"Completed": "Finalizat",
"Accepted": "Acceptat",
"Expired": "Expirat",
}
created = 0
skipped = 0
for source, translated in TRANSLATIONS.items():
# Check if translation exists
check = s.get(f"{URL}/api/resource/Translation", params={
"filters": json.dumps([["language", "=", "ro"], ["source_text", "=", source]]),
"fields": json.dumps(["name"]),
"limit_page_length": 1,
})
existing = check.json().get("data", [])
if existing:
skipped += 1
continue
r = s.post(f"{URL}/api/resource/Translation", json={
"language": "ro",
"source_text": source,
"translated_text": translated,
})
if r.status_code in (200, 201):
created += 1
else:
print(f" Error: {source} -> {r.status_code}")
print(f" Created: {created}, Skipped (existing): {skipped}")
# ── 4. Clear cache to apply translations ──
print("\n4. Clearing cache...")
r = s.post(f"{URL}/api/method/frappe.client.clear_cache")
print(f" Cache cleared: {r.status_code}")
print(f"\nDone! {created} traduceri noi adaugate.")
print("Refresh ERPNext (Ctrl+Shift+R) pentru a vedea traducerile.")