# SPDX-License-Identifier: BUSL-1.1 # Copyright (c) 2024-2026 Ali Sadeghi Aghili """Lightweight EN/FA localization for the web app. Language is stored in the Flask session (``session["lang"]``); the UI strings below are keyed by their English text, which also serves as the English translation. ``translate()`` falls back to the key itself for any language without an entry, so missing keys never render empty. """ from __future__ import annotations from flask import session LANGS: tuple[str, str] = ("en", "fa") DEFAULT_LANG = "en" # Keyed by English string; values are the Persian translations. _FA: dict[str, str] = { # base.html "Add user": "افزودن کاربر", "Logout": "خروج", # index.html "Ask your question": "سؤال خود را بپرسید", "English or Persian — the agent will answer against the database.": ( "انگلیسی یا فارسی — عامل بر اساس پایگاه داده به سؤال شما پاسخ می‌دهد." ), "Show plain-language summary": "نمایش خلاصه به زبان ساده", "Ask": "ارسال", "Report": "گزارش", "Running your question…": "در حال پردازش سؤال شما…", "Results": "نتایج", "SUCCESS": "موفق", "ERROR": "خطا", "model": "مدل", "s": "ثانیه", "Question:": "سؤال:", "Generated SQL": "SQL تولیدشده", "Copy": "کپی", "Copied": "کپی شد", "No rows returned for this question.": "برای این سؤال هیچ ردیفی بازنگشت.", "Previous": "قبلی", "Next": "بعدی", "Page %(page)s of %(pages)s": "صفحه %(page)s از %(pages)s", "Ask · Local SQL Agent": "پرسش · Local SQL Agent", # login.html "Welcome": "خوش آمدید", "Sign in to ask your database a question in Persian or English.": ( "برای پرسیدن سؤال از پایگاه داده به زبان فارسی یا انگلیسی وارد شوید." ), "Username": "نام کاربری", "Password": "رمز عبور", "Sign in": "ورود", "Login · Local SQL Agent": "ورود · Local SQL Agent", # register.html "Create an account for a new user of the Local SQL Agent.": ( "برای کاربر جدید Local SQL Agent یک حساب بسازید." ), "Confirm password": "تأیید رمز عبور", "Create account": "ایجاد حساب", "Register · Local SQL Agent": "ثبت‌نام · Local SQL Agent", # flash messages (app.py) "Invalid username or password.": "نام کاربری یا رمز عبور نامعتبر است.", "Only an administrator can create accounts.": "فقط مدیر می‌تواند حساب ایجاد کند.", "Username and password are required.": "نام کاربری و رمز عبور الزامی است.", "Passwords do not match.": "رمزهای عبور یکسان نیستند.", "Username '%(name)s' is already taken.": "نام کاربری «%(name)s» قبلاً گرفته شده است.", "Account '%(name)s' created.": "حساب «%(name)s» ایجاد شد.", "Please enter a question.": "لطفاً یک سؤال وارد کنید.", # sample questions panel "Sample Questions": "نمونه سوالات", "Click a question to ask it instantly.": "برای پرسیدن، روی یک سؤال کلیک کنید.", "Top 5 customers by purchase value in 1402": "۵ مشتری برتر از نظر ارزش خرید در سال ۱۴۰۲", "Trade volume in the cement ring in Mordad 1405": "حجم معاملات تالار سیمان در مرداد ۱۴۰۵", "Which ring had the highest sales in 1404?": "کدام تالار بیشترین فروش را در سال ۱۴۰۴ داشته است؟", "Total purchase value by month in 1405": "ارزش کل خرید به تفکیک ماه در سال ۱۴۰۵", "How many active customers exist?": "چند مشتری فعال وجود دارد؟", "Sales on Thursdays in the petrochemical ring": "فروش روزهای پنجشنبه در تالار پتروشیمی و فرآورده های نفتی", "Top 5 brokers by purchase value in 1403": "۵ کارگزار برتر از نظر ارزش خرید در سال ۱۴۰۳", "Sales in the Kish export ring in 1402": "فروش تالار کالای صادراتی کیش در سال ۱۴۰۲", } def get_lang() -> str: """Return the session's language, falling back to English.""" lang = session.get("lang") return lang if lang in LANGS else DEFAULT_LANG def translate(text: str, lang: str, **kwargs) -> str: """Translate ``text`` into ``lang``; unknown keys render as the English text. Named ``%(name)s`` placeholders may be filled via keyword arguments. """ if lang == "fa": text = _FA.get(text, text) if kwargs: text = text % kwargs return text