"""Gradio app: NLLB-200 translation with selectable source/target languages.""" import os import time import gradio as gr from translator import ( LANGUAGE_LABELS, LABEL_TO_TOKEN, TOKEN_TO_LABEL, TranslatorClient, ) AUTO_DETECT = "Auto-detect" translator = TranslatorClient() def run_translate(text: str, source_label: str, target_label: str): text = (text or "").strip() if not text: return "", "Enter some text to translate." target_token = LABEL_TO_TOKEN.get(target_label) if target_token is None: return "", "Pick a target language." if source_label == AUTO_DETECT: src_token = translator.detect_language(text) detected_label = TOKEN_TO_LABEL.get(src_token, "Unknown") source_info = f"Detected source: {detected_label}" else: src_token = LABEL_TO_TOKEN.get(source_label) if src_token is None: return "", "Pick a valid source language." source_info = f"Source: {source_label}" if src_token == target_token: return text, f"{source_info} (same as target — returned as-is)." start = time.time() translated = translator.translate(text, src_token, target_token) elapsed_ms = int((time.time() - start) * 1000) status = f"{source_info} → {target_label} ({elapsed_ms} ms)" return translated, status with gr.Blocks(title="Translation") as app: gr.Markdown("# Translation") gr.Markdown( "Translate text between supported languages with **NLLB-200-3.3B** " "(`facebook/nllb-200-3.3B`, CTranslate2 int8 — " "[`Napron/nllb-200-3.3B-ct2-int8`](https://huggingface.co/Napron/nllb-200-3.3B-ct2-int8)). " "Source language can be auto-detected, or you can pick it explicitly. " "**CPU-only** — first translation warms the model." ) with gr.Row(): with gr.Column(scale=1): source_dropdown = gr.Dropdown( choices=[AUTO_DETECT] + LANGUAGE_LABELS, value=AUTO_DETECT, label="Source language", ) input_text = gr.Textbox( label="Input text", placeholder="Type or paste text to translate…", lines=10, max_lines=20, ) run_btn = gr.Button("Translate", variant="primary") with gr.Column(scale=1): target_dropdown = gr.Dropdown( choices=LANGUAGE_LABELS, value="English", label="Target language", ) output_text = gr.Textbox( label="Translation", lines=10, max_lines=20, interactive=False, ) status_box = gr.Textbox( label="Status", lines=2, interactive=False, ) gr.Examples( examples=[ ["Salam, necəsən? Bu gün hava çox gözəldir.", AUTO_DETECT, "English"], ["Привет, как дела? Сегодня прекрасная погода.", "Russian", "English"], ["สวัสดีครับ วันนี้อากาศดีมาก", AUTO_DETECT, "English"], ["The quick brown fox jumps over the lazy dog.", "English", "French"], ["Hola, ¿cómo estás? Hace muy buen tiempo hoy.", "Spanish", "German"], ], inputs=[input_text, source_dropdown, target_dropdown], ) run_btn.click( fn=run_translate, inputs=[input_text, source_dropdown, target_dropdown], outputs=[output_text, status_box], concurrency_limit=1, ) app.launch( server_name=os.environ.get("GRADIO_SERVER_NAME", "0.0.0.0"), server_port=int( os.environ.get( "PORT", os.environ.get("GRADIO_SERVER_PORT", 7860), ) ), )