From 0aaba4c7c083f9bf934add5032b44a81632cb505 Mon Sep 17 00:00:00 2001 From: Russell Ballestrini Date: Sat, 3 Jan 2026 13:42:40 -0500 Subject: [PATCH] Add UI translations for Italian, Dutch, Polish, Vietnamese, Thai, Ukrainian, Swedish --- public/src/languages/index.js | 14 +++++ public/src/languages/it.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/nl.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/pl.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/sv.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/th.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/uk.js | 114 ++++++++++++++++++++++++++++++++++ public/src/languages/vi.js | 114 ++++++++++++++++++++++++++++++++++ 8 files changed, 812 insertions(+) create mode 100644 public/src/languages/it.js create mode 100644 public/src/languages/nl.js create mode 100644 public/src/languages/pl.js create mode 100644 public/src/languages/sv.js create mode 100644 public/src/languages/th.js create mode 100644 public/src/languages/uk.js create mode 100644 public/src/languages/vi.js diff --git a/public/src/languages/index.js b/public/src/languages/index.js index 6ad2a3c..3d80b02 100644 --- a/public/src/languages/index.js +++ b/public/src/languages/index.js @@ -18,6 +18,13 @@ import { te } from "./te.js"; import { tr } from "./tr.js"; import { zhTw } from "./zh-tw.js"; import { ko } from "./ko.js"; +import { it } from "./it.js"; +import { nl } from "./nl.js"; +import { pl } from "./pl.js"; +import { vi } from "./vi.js"; +import { th } from "./th.js"; +import { uk } from "./uk.js"; +import { sv } from "./sv.js"; // Complete UI Translations for all supported languages export const UI_TRANSLATIONS = { @@ -40,4 +47,11 @@ export const UI_TRANSLATIONS = { tr, "zh-tw": zhTw, ko, + it, + nl, + pl, + vi, + th, + uk, + sv, }; \ No newline at end of file diff --git a/public/src/languages/it.js b/public/src/languages/it.js new file mode 100644 index 0000000..c4a6a18 --- /dev/null +++ b/public/src/languages/it.js @@ -0,0 +1,114 @@ +// Italian UI Translations +export const it = { + // Main buttons + readPage: "📖 Leggi Pagina", + ttsAnything: "🔊 Sintesi Vocale", + translate: "🌐 Traduci", + smartTranslate: "🤖 Traduzione Intelligente", + uploadFile: "📁 Carica File", + + // Actions + refreshModels: "🔄 Aggiorna Modelli", + clearChat: "🗑️ Cancella Chat", + fullChatRaw: "📋 Chat Completa Raw", + fullChatHTML: "📄 Chat Completa HTML", + fullPageRaw: "📝 Pagina Completa Raw", + downloadChat: "💾 Scarica Chat", + + // Chat UI + sendButton: "Invia", + typePlaceholder: "Scrivi il tuo messaggio...", + askPagePlaceholder: "Chiedi informazioni su questa pagina...", + askAnythingPlaceholder: "Chiedi qualsiasi cosa...", + enterTextToSpeakPlaceholder: "Inserisci il testo da pronunciare...", + clearChatConfirm: "Cancellare tutta la cronologia della conversazione?", + + // Modal headers + aiAssistantTitle: "Assistente IA", + ttsModalTitle: "Sintesi Vocale", + translateModalTitle: "Traduci", + + // System messages + pageContentPrefix: "Ecco il contenuto della pagina web:", + additionalContext: + "Sei incorporato in questa pagina. Quando rispondi alle domande, considera il contenuto e il contesto della pagina.", + + // Notifications and alerts + languageChanged: + "Lingua impostata su {lang}. Aggiorna la pagina per vedere tutti gli elementi dell'interfaccia nella tua lingua preferita.", + translationFailed: "Traduzione fallita: {error}", + ttsFailed: "Sintesi vocale fallita: {error}", + fullChatCopied: "Chat completa copiata come markdown grezzo!", + fullChatHTMLCopied: "Chat completa copiata come HTML!", + fullPageCopied: "Pagina completa copiata come markdown!", + failedToCopy: "Copia fallita: {error}", + failedToCopyPage: "Copia pagina fallita: {error}", + failedToCopyCode: "Copia codice fallita: {error}", + errorOpeningModal: "Errore nell'apertura del modal IA: {error}", + failedToReadPage: "Lettura pagina fallita: {error}", + languageDetectionFailed: "Rilevamento lingua fallito: {error}", + + // Dropdown labels + currentPage: "Pagina corrente: {lang}", + translatingTo: "Traduzione in corso...", + detectingLanguage: "🔍 Rilevamento...", + + // Intro/header text + hermesIntro: + 'presenta il modello linguistico hermes di nous research', + discussingPage: "Stai discutendo", + + // TTS placeholder + ttsPlaceholder: + "sintesi vocale: scrivi qualsiasi messaggio e fallo pronunciare dall'intelligenza artificiale!", + translatePlaceholder: "Inserisci qualsiasi testo da tradurre...", + + // Read page status messages + processingContent: "Elaborazione contenuto...", + readingPageClickToPause: "Lettura pagina... Clicca per mettere in pausa", + pausedClickToResume: "In pausa. Clicca per riprendere", + downloadPageAudio: "Scarica il file .mp3 della sintesi vocale per questa pagina.", + downloadChatAudio: "Scarica questo messaggio come file .mp3.", + deleteMessage: "Elimina messaggio", + copyRawMarkdown: "Copia grezzo (Markdown)", + copyHTML: "Copia HTML", + + // Translation modal tabs + translatePageTab: "📄 Traduci Pagina", + customTextTab: "✏️ Testo Personalizzato", + remoteUrlTab: "🌐 URL Remoto", + + // TTS modal components + speedLabel: "Velocità:", + playText: "Riproduci Testo", + + // Translation modal content + translatePageInfo: "Traduci il contenuto della pagina corrente nella lingua scelta:", + translateToLabel: "Traduci in:", + translateButton: "🌐 Traduci", + translatePageButton: "🌐 Traduci Pagina", + translateTextButton: "🌐 Traduci Testo", + remoteUrlInfo: "Inserisci un URL da recuperare e tradurre:", + remoteUrlPlaceholder: "https://esempio.com", + fetchAndTranslate: "🌐 Recupera e Traduci", + processingText: "Elaborazione...", + processingTokens: "🤖 Elaborazione {tokens} token...", + + // Button labels for UI + translationModal: "🌐 Modal Traduzione", + translationModalHeading: "Modal Traduzione", + + // System prompt components + systemPromptIntro: "Sei Hermes AI, alimentato da Nous Research, incorporato in una pagina web tramite uncloseai.com. Il tuo compito è generare un'introduzione intelligente di 3 paragrafi che dimostri una profonda comprensione del contenuto specifico della pagina, del suo scopo e del suo pubblico.", + systemPromptTask1: "1. Inizia naturalmente identificando di cosa tratta questa pagina - sii specifico: menziona il titolo della pagina, l'argomento principale, il nome dell'autore se presente, o lo scopo principale. Mostra una comprensione immediata del tipo di contenuto (articolo, documentazione, pagina prodotto, ecc.)", + systemPromptTask2: "2. Fai riferimento a 2-3 dettagli altamente specifici dalla pagina - cita frasi esatte, cita punti dati specifici, menziona sezioni o caratteristiche particolari che noti. Dimostra di aver analizzato il contenuto reale, non solo sfogliato.", + systemPromptTask3: "3. Offri assistenza contestualmente rilevante in base al tipo di pagina - per documentazione tecnica, offri di spiegare concetti; per articoli, offri di discutere idee; per prodotti, rispondi sulle caratteristiche. Sii specifico su COME puoi aiutare con QUESTO particolare contenuto.", + systemPromptInstructions: "Sii conversazionale ma competente. Basa la tua introduzione sul contenuto reale della pagina. Evita affermazioni generiche. Scrivi naturalmente in", + + // More alerts and messages + pleaseEnterText: "Per favore inserisci prima del testo!", + pleaseSelectFile: "Per favore seleziona prima un file!", + pleaseEnterTranslateText: "Per favore inserisci del testo da tradurre!", + aiModalNotAvailable: "Modal IA non disponibile in questo contesto", + useCustomAPI: "Usa un endpoint personalizzato compatibile con openai.", +}; diff --git a/public/src/languages/nl.js b/public/src/languages/nl.js new file mode 100644 index 0000000..7fe8d5a --- /dev/null +++ b/public/src/languages/nl.js @@ -0,0 +1,114 @@ +// Dutch UI Translations +export const nl = { + // Main buttons + readPage: "📖 Lees Pagina", + ttsAnything: "🔊 Tekst naar Spraak", + translate: "🌐 Vertalen", + smartTranslate: "🤖 Slim Vertalen", + uploadFile: "📁 Upload Bestand", + + // Actions + refreshModels: "🔄 Modellen Vernieuwen", + clearChat: "🗑️ Chat Wissen", + fullChatRaw: "📋 Volledige Chat Raw", + fullChatHTML: "📄 Volledige Chat HTML", + fullPageRaw: "📝 Volledige Pagina Raw", + downloadChat: "💾 Chat Downloaden", + + // Chat UI + sendButton: "Versturen", + typePlaceholder: "Typ je bericht...", + askPagePlaceholder: "Vraag over deze pagina...", + askAnythingPlaceholder: "Vraag wat je wilt...", + enterTextToSpeakPlaceholder: "Voer tekst in om uit te spreken...", + clearChatConfirm: "Alle gespreksgeschiedenis wissen?", + + // Modal headers + aiAssistantTitle: "AI Assistent", + ttsModalTitle: "Tekst naar Spraak", + translateModalTitle: "Vertalen", + + // System messages + pageContentPrefix: "Hier is de inhoud van de webpagina:", + additionalContext: + "Je bent ingebed op deze pagina. Houd bij het beantwoorden van vragen rekening met de pagina-inhoud en context.", + + // Notifications and alerts + languageChanged: + "Taal ingesteld op {lang}. Vernieuw de pagina om alle interface-elementen in je voorkeurstaal te zien.", + translationFailed: "Vertaling mislukt: {error}", + ttsFailed: "Tekst naar spraak mislukt: {error}", + fullChatCopied: "Volledige chat gekopieerd als ruwe markdown!", + fullChatHTMLCopied: "Volledige chat gekopieerd als HTML!", + fullPageCopied: "Volledige pagina gekopieerd als markdown!", + failedToCopy: "Kopiëren mislukt: {error}", + failedToCopyPage: "Pagina kopiëren mislukt: {error}", + failedToCopyCode: "Code kopiëren mislukt: {error}", + errorOpeningModal: "Fout bij openen AI modal: {error}", + failedToReadPage: "Pagina lezen mislukt: {error}", + languageDetectionFailed: "Taaldetectie mislukt: {error}", + + // Dropdown labels + currentPage: "Huidige pagina: {lang}", + translatingTo: "Vertalen...", + detectingLanguage: "🔍 Detecteren...", + + // Intro/header text + hermesIntro: + 'presenteert nous research\'s hermes groot taalmodel', + discussingPage: "Je bespreekt", + + // TTS placeholder + ttsPlaceholder: + "tekst naar spraak: schrijf een bericht en laat de kunstmatige intelligentie het uitspreken!", + translatePlaceholder: "Voer tekst in om te vertalen...", + + // Read page status messages + processingContent: "Inhoud verwerken...", + readingPageClickToPause: "Pagina lezen... Klik om te pauzeren", + pausedClickToResume: "Gepauzeerd. Klik om te hervatten", + downloadPageAudio: "Download het tekst naar spraak .mp3 bestand voor deze pagina.", + downloadChatAudio: "Download dit bericht als .mp3 bestand.", + deleteMessage: "Bericht verwijderen", + copyRawMarkdown: "Kopieer ruw (Markdown)", + copyHTML: "Kopieer HTML", + + // Translation modal tabs + translatePageTab: "📄 Vertaal Pagina", + customTextTab: "✏️ Aangepaste Tekst", + remoteUrlTab: "🌐 Externe URL", + + // TTS modal components + speedLabel: "Snelheid:", + playText: "Tekst Afspelen", + + // Translation modal content + translatePageInfo: "Vertaal de huidige pagina-inhoud naar je gekozen taal:", + translateToLabel: "Vertalen naar:", + translateButton: "🌐 Vertalen", + translatePageButton: "🌐 Vertaal Pagina", + translateTextButton: "🌐 Vertaal Tekst", + remoteUrlInfo: "Voer een URL in om op te halen en te vertalen:", + remoteUrlPlaceholder: "https://voorbeeld.nl", + fetchAndTranslate: "🌐 Ophalen en Vertalen", + processingText: "Verwerken...", + processingTokens: "🤖 Verwerken {tokens} tokens...", + + // Button labels for UI + translationModal: "🌐 Vertaal Modal", + translationModalHeading: "Vertaal Modal", + + // System prompt components + systemPromptIntro: "Je bent Hermes AI, aangedreven door Nous Research, ingebed op een webpagina via uncloseai.com. Je taak is om een contextueel intelligente introductie van 3 paragrafen te genereren die een diep begrip toont van de specifieke pagina-inhoud, het doel en het publiek.", + systemPromptTask1: "1. Begin natuurlijk door te identificeren waar deze pagina over gaat - wees specifiek: noem de paginatitel, het hoofdonderwerp, de auteursnaam indien aanwezig, of het belangrijkste doel. Toon direct begrip van het inhoudstype (artikel, documentatie, productpagina, enz.)", + systemPromptTask2: "2. Verwijs naar 2-3 zeer specifieke details van de pagina - citeer exacte zinnen, noem specifieke datapunten, vermeld bepaalde secties of functies die je opmerkt. Toon aan dat je de werkelijke inhoud hebt geanalyseerd, niet alleen doorgebladerd.", + systemPromptTask3: "3. Bied contextueel relevante hulp op basis van het paginatype - voor technische documentatie, bied aan om concepten uit te leggen; voor artikelen, bied aan om ideeën te bespreken; voor producten, beantwoord vragen over functies. Wees specifiek over HOE je kunt helpen met DEZE specifieke inhoud.", + systemPromptInstructions: "Wees conversationeel maar deskundig. Baseer je introductie op de werkelijke pagina-inhoud. Vermijd generieke uitspraken. Schrijf natuurlijk in", + + // More alerts and messages + pleaseEnterText: "Voer eerst tekst in!", + pleaseSelectFile: "Selecteer eerst een bestand!", + pleaseEnterTranslateText: "Voer tekst in om te vertalen!", + aiModalNotAvailable: "AI modal niet beschikbaar in deze context", + useCustomAPI: "Gebruik een aangepast openai-compatibel endpoint.", +}; diff --git a/public/src/languages/pl.js b/public/src/languages/pl.js new file mode 100644 index 0000000..9712ca1 --- /dev/null +++ b/public/src/languages/pl.js @@ -0,0 +1,114 @@ +// Polish UI Translations +export const pl = { + // Main buttons + readPage: "📖 Czytaj Stronę", + ttsAnything: "🔊 Tekst na Mowę", + translate: "🌐 Tłumacz", + smartTranslate: "🤖 Inteligentne Tłumaczenie", + uploadFile: "📁 Prześlij Plik", + + // Actions + refreshModels: "🔄 Odśwież Modele", + clearChat: "🗑️ Wyczyść Czat", + fullChatRaw: "📋 Pełny Czat Raw", + fullChatHTML: "📄 Pełny Czat HTML", + fullPageRaw: "📝 Pełna Strona Raw", + downloadChat: "💾 Pobierz Czat", + + // Chat UI + sendButton: "Wyślij", + typePlaceholder: "Wpisz swoją wiadomość...", + askPagePlaceholder: "Zapytaj o tę stronę...", + askAnythingPlaceholder: "Zapytaj o cokolwiek...", + enterTextToSpeakPlaceholder: "Wprowadź tekst do odczytania...", + clearChatConfirm: "Wyczyścić całą historię rozmowy?", + + // Modal headers + aiAssistantTitle: "Asystent AI", + ttsModalTitle: "Tekst na Mowę", + translateModalTitle: "Tłumacz", + + // System messages + pageContentPrefix: "Oto zawartość strony internetowej:", + additionalContext: + "Jesteś osadzony na tej stronie. Odpowiadając na pytania, weź pod uwagę zawartość i kontekst strony.", + + // Notifications and alerts + languageChanged: + "Język ustawiony na {lang}. Odśwież stronę, aby zobaczyć wszystkie elementy interfejsu w preferowanym języku.", + translationFailed: "Tłumaczenie nie powiodło się: {error}", + ttsFailed: "Synteza mowy nie powiodła się: {error}", + fullChatCopied: "Pełny czat skopiowany jako surowy markdown!", + fullChatHTMLCopied: "Pełny czat skopiowany jako HTML!", + fullPageCopied: "Pełna strona skopiowana jako markdown!", + failedToCopy: "Kopiowanie nie powiodło się: {error}", + failedToCopyPage: "Kopiowanie strony nie powiodło się: {error}", + failedToCopyCode: "Kopiowanie kodu nie powiodło się: {error}", + errorOpeningModal: "Błąd podczas otwierania modalu AI: {error}", + failedToReadPage: "Czytanie strony nie powiodło się: {error}", + languageDetectionFailed: "Wykrywanie języka nie powiodło się: {error}", + + // Dropdown labels + currentPage: "Bieżąca strona: {lang}", + translatingTo: "Tłumaczenie...", + detectingLanguage: "🔍 Wykrywanie...", + + // Intro/header text + hermesIntro: + 'prezentuje duży model językowy hermes od nous research', + discussingPage: "Omawiasz", + + // TTS placeholder + ttsPlaceholder: + "tekst na mowę: napisz dowolną wiadomość i pozwól sztucznej inteligencji ją odczytać!", + translatePlaceholder: "Wprowadź dowolny tekst do przetłumaczenia...", + + // Read page status messages + processingContent: "Przetwarzanie zawartości...", + readingPageClickToPause: "Czytanie strony... Kliknij, aby wstrzymać", + pausedClickToResume: "Wstrzymano. Kliknij, aby wznowić", + downloadPageAudio: "Pobierz plik .mp3 z syntezą mowy dla tej strony.", + downloadChatAudio: "Pobierz tę wiadomość jako plik .mp3.", + deleteMessage: "Usuń wiadomość", + copyRawMarkdown: "Kopiuj surowy (Markdown)", + copyHTML: "Kopiuj HTML", + + // Translation modal tabs + translatePageTab: "📄 Tłumacz Stronę", + customTextTab: "✏️ Własny Tekst", + remoteUrlTab: "🌐 Zdalny URL", + + // TTS modal components + speedLabel: "Prędkość:", + playText: "Odtwórz Tekst", + + // Translation modal content + translatePageInfo: "Przetłumacz zawartość bieżącej strony na wybrany język:", + translateToLabel: "Tłumacz na:", + translateButton: "🌐 Tłumacz", + translatePageButton: "🌐 Tłumacz Stronę", + translateTextButton: "🌐 Tłumacz Tekst", + remoteUrlInfo: "Wprowadź URL do pobrania i przetłumaczenia:", + remoteUrlPlaceholder: "https://przyklad.pl", + fetchAndTranslate: "🌐 Pobierz i Tłumacz", + processingText: "Przetwarzanie...", + processingTokens: "🤖 Przetwarzanie {tokens} tokenów...", + + // Button labels for UI + translationModal: "🌐 Modal Tłumaczenia", + translationModalHeading: "Modal Tłumaczenia", + + // System prompt components + systemPromptIntro: "Jesteś Hermes AI, zasilany przez Nous Research, osadzony na stronie internetowej przez uncloseai.com. Twoim zadaniem jest wygenerowanie kontekstowo inteligentnego 3-paragrafowego wprowadzenia, które wykaże głębokie zrozumienie konkretnej zawartości strony, jej celu i odbiorców.", + systemPromptTask1: "1. Zacznij naturalnie, identyfikując, o czym jest ta strona - bądź konkretny: wymień tytuł strony, główny temat, nazwę autora jeśli jest obecna, lub główny cel. Pokaż natychmiastowe zrozumienie typu treści (artykuł, dokumentacja, strona produktu, itp.)", + systemPromptTask2: "2. Odnieś się do 2-3 bardzo konkretnych szczegółów ze strony - cytuj dokładne frazy, podawaj konkretne punkty danych, wymień poszczególne sekcje lub funkcje, które zauważasz. Pokaż, że przeanalizowałeś rzeczywistą zawartość, a nie tylko ją przejrzałeś.", + systemPromptTask3: "3. Zaoferuj kontekstowo odpowiednią pomoc w zależności od typu strony - dla dokumentacji technicznej, zaoferuj wyjaśnienie koncepcji; dla artykułów, zaoferuj dyskusję o pomysłach; dla produktów, odpowiadaj o funkcjach. Bądź konkretny JAK możesz pomóc z TĄ konkretną zawartością.", + systemPromptInstructions: "Bądź konwersacyjny, ale kompetentny. Oprzyj swoje wprowadzenie na rzeczywistej zawartości strony. Unikaj ogólnych stwierdzeń. Pisz naturalnie w", + + // More alerts and messages + pleaseEnterText: "Najpierw wprowadź tekst!", + pleaseSelectFile: "Najpierw wybierz plik!", + pleaseEnterTranslateText: "Wprowadź tekst do przetłumaczenia!", + aiModalNotAvailable: "Modal AI niedostępny w tym kontekście", + useCustomAPI: "Użyj niestandardowego endpointu kompatybilnego z openai.", +}; diff --git a/public/src/languages/sv.js b/public/src/languages/sv.js new file mode 100644 index 0000000..7bd940a --- /dev/null +++ b/public/src/languages/sv.js @@ -0,0 +1,114 @@ +// Swedish UI Translations +export const sv = { + // Main buttons + readPage: "📖 Läs Sida", + ttsAnything: "🔊 Text till Tal", + translate: "🌐 Översätt", + smartTranslate: "🤖 Smart Översättning", + uploadFile: "📁 Ladda Upp Fil", + + // Actions + refreshModels: "🔄 Uppdatera Modeller", + clearChat: "🗑️ Rensa Chatt", + fullChatRaw: "📋 Hela Chatten Raw", + fullChatHTML: "📄 Hela Chatten HTML", + fullPageRaw: "📝 Hela Sidan Raw", + downloadChat: "💾 Ladda Ner Chatt", + + // Chat UI + sendButton: "Skicka", + typePlaceholder: "Skriv ditt meddelande...", + askPagePlaceholder: "Fråga om denna sida...", + askAnythingPlaceholder: "Fråga vad som helst...", + enterTextToSpeakPlaceholder: "Ange text att läsa upp...", + clearChatConfirm: "Rensa all konversationshistorik?", + + // Modal headers + aiAssistantTitle: "AI-Assistent", + ttsModalTitle: "Text till Tal", + translateModalTitle: "Översätt", + + // System messages + pageContentPrefix: "Här är innehållet på webbsidan:", + additionalContext: + "Du är inbäddad på denna sida. När du svarar på frågor, ta hänsyn till sidans innehåll och kontext.", + + // Notifications and alerts + languageChanged: + "Språk inställt på {lang}. Uppdatera sidan för att se alla gränssnittselement på ditt föredragna språk.", + translationFailed: "Översättning misslyckades: {error}", + ttsFailed: "Text till tal misslyckades: {error}", + fullChatCopied: "Hela chatten kopierad som rå markdown!", + fullChatHTMLCopied: "Hela chatten kopierad som HTML!", + fullPageCopied: "Hela sidan kopierad som markdown!", + failedToCopy: "Kopiering misslyckades: {error}", + failedToCopyPage: "Kunde inte kopiera sida: {error}", + failedToCopyCode: "Kunde inte kopiera kod: {error}", + errorOpeningModal: "Fel vid öppning av AI-modal: {error}", + failedToReadPage: "Kunde inte läsa sida: {error}", + languageDetectionFailed: "Språkdetektering misslyckades: {error}", + + // Dropdown labels + currentPage: "Nuvarande sida: {lang}", + translatingTo: "Översätter...", + detectingLanguage: "🔍 Detekterar...", + + // Intro/header text + hermesIntro: + 'presenterar nous researchs hermes stora språkmodell', + discussingPage: "Du diskuterar", + + // TTS placeholder + ttsPlaceholder: + "text till tal: skriv valfritt meddelande och låt den artificiella intelligensen läsa upp det!", + translatePlaceholder: "Ange valfri text att översätta...", + + // Read page status messages + processingContent: "Bearbetar innehåll...", + readingPageClickToPause: "Läser sida... Klicka för att pausa", + pausedClickToResume: "Pausad. Klicka för att fortsätta", + downloadPageAudio: "Ladda ner text till tal .mp3-fil för denna sida.", + downloadChatAudio: "Ladda ner detta meddelande som .mp3-fil.", + deleteMessage: "Radera meddelande", + copyRawMarkdown: "Kopiera rå (Markdown)", + copyHTML: "Kopiera HTML", + + // Translation modal tabs + translatePageTab: "📄 Översätt Sida", + customTextTab: "✏️ Anpassad Text", + remoteUrlTab: "🌐 Fjärr-URL", + + // TTS modal components + speedLabel: "Hastighet:", + playText: "Spela Text", + + // Translation modal content + translatePageInfo: "Översätt den nuvarande sidans innehåll till ditt valda språk:", + translateToLabel: "Översätt till:", + translateButton: "🌐 Översätt", + translatePageButton: "🌐 Översätt Sida", + translateTextButton: "🌐 Översätt Text", + remoteUrlInfo: "Ange en URL att hämta och översätta:", + remoteUrlPlaceholder: "https://exempel.se", + fetchAndTranslate: "🌐 Hämta och Översätt", + processingText: "Bearbetar...", + processingTokens: "🤖 Bearbetar {tokens} tokens...", + + // Button labels for UI + translationModal: "🌐 Översättningsmodal", + translationModalHeading: "Översättningsmodal", + + // System prompt components + systemPromptIntro: "Du är Hermes AI, driven av Nous Research, inbäddad på en webbsida via uncloseai.com. Din uppgift är att generera en kontextuellt intelligent introduktion på 3 stycken som visar djup förståelse för sidans specifika innehåll, dess syfte och målgrupp.", + systemPromptTask1: "1. Öppna naturligt genom att identifiera vad denna sida handlar om - var specifik: nämn sidtiteln, huvudämnet, författarnamnet om det finns, eller huvudsyftet. Visa omedelbar förståelse för innehållstypen (artikel, dokumentation, produktsida, etc.)", + systemPromptTask2: "2. Referera till 2-3 mycket specifika detaljer från sidan - citera exakta fraser, citera specifika datapunkter, nämn särskilda avsnitt eller funktioner du märker. Visa att du har analyserat det faktiska innehållet, inte bara skummat igenom det.", + systemPromptTask3: "3. Erbjud kontextuellt relevant hjälp baserat på sidtypen - för teknisk dokumentation, erbjud att förklara koncept; för artiklar, erbjud att diskutera idéer; för produkter, svara på frågor om funktioner. Var specifik om HUR du kan hjälpa med DETTA specifika innehåll.", + systemPromptInstructions: "Var konversationell men kunnig. Basera din introduktion på sidans faktiska innehåll. Undvik generiska uttalanden. Skriv naturligt på", + + // More alerts and messages + pleaseEnterText: "Vänligen ange text först!", + pleaseSelectFile: "Vänligen välj en fil först!", + pleaseEnterTranslateText: "Vänligen ange text att översätta!", + aiModalNotAvailable: "AI-modal inte tillgänglig i detta sammanhang", + useCustomAPI: "Använd en anpassad openai-kompatibel endpoint.", +}; diff --git a/public/src/languages/th.js b/public/src/languages/th.js new file mode 100644 index 0000000..78d13eb --- /dev/null +++ b/public/src/languages/th.js @@ -0,0 +1,114 @@ +// Thai UI Translations +export const th = { + // Main buttons + readPage: "📖 อ่านหน้า", + ttsAnything: "🔊 แปลงข้อความเป็นเสียง", + translate: "🌐 แปล", + smartTranslate: "🤖 แปลอัจฉริยะ", + uploadFile: "📁 อัปโหลดไฟล์", + + // Actions + refreshModels: "🔄 รีเฟรชโมเดล", + clearChat: "🗑️ ล้างแชท", + fullChatRaw: "📋 แชททั้งหมด Raw", + fullChatHTML: "📄 แชททั้งหมด HTML", + fullPageRaw: "📝 หน้าทั้งหมด Raw", + downloadChat: "💾 ดาวน์โหลดแชท", + + // Chat UI + sendButton: "ส่ง", + typePlaceholder: "พิมพ์ข้อความของคุณ...", + askPagePlaceholder: "ถามเกี่ยวกับหน้านี้...", + askAnythingPlaceholder: "ถามอะไรก็ได้...", + enterTextToSpeakPlaceholder: "ป้อนข้อความที่จะพูด...", + clearChatConfirm: "ล้างประวัติการสนทนาทั้งหมด?", + + // Modal headers + aiAssistantTitle: "ผู้ช่วย AI", + ttsModalTitle: "แปลงข้อความเป็นเสียง", + translateModalTitle: "แปล", + + // System messages + pageContentPrefix: "นี่คือเนื้อหาของหน้าเว็บ:", + additionalContext: + "คุณถูกฝังอยู่ในหน้านี้ เมื่อตอบคำถาม โปรดพิจารณาเนื้อหาและบริบทของหน้า", + + // Notifications and alerts + languageChanged: + "ตั้งค่าภาษาเป็น {lang} รีเฟรชหน้าเพื่อดูองค์ประกอบอินเทอร์เฟซทั้งหมดในภาษาที่คุณต้องการ", + translationFailed: "การแปลล้มเหลว: {error}", + ttsFailed: "การแปลงข้อความเป็นเสียงล้มเหลว: {error}", + fullChatCopied: "คัดลอกแชททั้งหมดเป็น markdown ดิบแล้ว!", + fullChatHTMLCopied: "คัดลอกแชททั้งหมดเป็น HTML แล้ว!", + fullPageCopied: "คัดลอกหน้าทั้งหมดเป็น markdown แล้ว!", + failedToCopy: "การคัดลอกล้มเหลว: {error}", + failedToCopyPage: "การคัดลอกหน้าล้มเหลว: {error}", + failedToCopyCode: "การคัดลอกโค้ดล้มเหลว: {error}", + errorOpeningModal: "เกิดข้อผิดพลาดในการเปิด modal AI: {error}", + failedToReadPage: "การอ่านหน้าล้มเหลว: {error}", + languageDetectionFailed: "การตรวจจับภาษาล้มเหลว: {error}", + + // Dropdown labels + currentPage: "หน้าปัจจุบัน: {lang}", + translatingTo: "กำลังแปล...", + detectingLanguage: "🔍 กำลังตรวจจับ...", + + // Intro/header text + hermesIntro: + 'นำเสนอโมเดลภาษาขนาดใหญ่ hermes จาก nous research', + discussingPage: "คุณกำลังพูดคุยเกี่ยวกับ", + + // TTS placeholder + ttsPlaceholder: + "แปลงข้อความเป็นเสียง: เขียนข้อความใดก็ได้และให้ปัญญาประดิษฐ์พูดมัน!", + translatePlaceholder: "ป้อนข้อความใดก็ได้เพื่อแปล...", + + // Read page status messages + processingContent: "กำลังประมวลผลเนื้อหา...", + readingPageClickToPause: "กำลังอ่านหน้า... คลิกเพื่อหยุดชั่วคราว", + pausedClickToResume: "หยุดชั่วคราว คลิกเพื่อดำเนินการต่อ", + downloadPageAudio: "ดาวน์โหลดไฟล์ .mp3 แปลงข้อความเป็นเสียงสำหรับหน้านี้", + downloadChatAudio: "ดาวน์โหลดข้อความนี้เป็นไฟล์ .mp3", + deleteMessage: "ลบข้อความ", + copyRawMarkdown: "คัดลอกดิบ (Markdown)", + copyHTML: "คัดลอก HTML", + + // Translation modal tabs + translatePageTab: "📄 แปลหน้า", + customTextTab: "✏️ ข้อความที่กำหนดเอง", + remoteUrlTab: "🌐 URL ระยะไกล", + + // TTS modal components + speedLabel: "ความเร็ว:", + playText: "เล่นข้อความ", + + // Translation modal content + translatePageInfo: "แปลเนื้อหาของหน้าปัจจุบันเป็นภาษาที่คุณเลือก:", + translateToLabel: "แปลเป็น:", + translateButton: "🌐 แปล", + translatePageButton: "🌐 แปลหน้า", + translateTextButton: "🌐 แปลข้อความ", + remoteUrlInfo: "ป้อน URL เพื่อดึงและแปล:", + remoteUrlPlaceholder: "https://ตัวอย่าง.th", + fetchAndTranslate: "🌐 ดึงและแปล", + processingText: "กำลังประมวลผล...", + processingTokens: "🤖 กำลังประมวลผล {tokens} โทเค็น...", + + // Button labels for UI + translationModal: "🌐 Modal การแปล", + translationModalHeading: "Modal การแปล", + + // System prompt components + systemPromptIntro: "คุณคือ Hermes AI ขับเคลื่อนโดย Nous Research ฝังอยู่บนหน้าเว็บผ่าน uncloseai.com งานของคุณคือสร้างบทนำที่ชาญฉลาดตามบริบท 3 ย่อหน้าที่แสดงความเข้าใจอย่างลึกซึ้งเกี่ยวกับเนื้อหาเฉพาะของหน้า วัตถุประสงค์ และผู้ชม", + systemPromptTask1: "1. เปิดตัวอย่างเป็นธรรมชาติโดยระบุว่าหน้านี้เกี่ยวกับอะไร - เจาะจง: กล่าวถึงชื่อหน้า หัวข้อหลัก ชื่อผู้เขียนถ้ามี หรือวัตถุประสงค์หลัก แสดงความเข้าใจทันทีเกี่ยวกับประเภทเนื้อหา (บทความ เอกสาร หน้าผลิตภัณฑ์ ฯลฯ)", + systemPromptTask2: "2. อ้างอิง 2-3 รายละเอียดที่เฉพาะเจาะจงจากหน้า - อ้างวลีที่แน่นอน อ้างจุดข้อมูลเฉพาะ กล่าวถึงส่วนหรือคุณสมบัติเฉพาะที่คุณสังเกตเห็น แสดงให้เห็นว่าคุณได้วิเคราะห์เนื้อหาจริง ไม่ใช่แค่ผ่านตา", + systemPromptTask3: "3. เสนอความช่วยเหลือที่เกี่ยวข้องตามบริบทตามประเภทหน้า - สำหรับเอกสารเทคนิค เสนออธิบายแนวคิด; สำหรับบทความ เสนอพูดคุยเกี่ยวกับแนวคิด; สำหรับผลิตภัณฑ์ ตอบเกี่ยวกับคุณสมบัติ เจาะจงว่าคุณสามารถช่วยอย่างไรกับเนื้อหาเฉพาะนี้", + systemPromptInstructions: "เป็นกันเองแต่มีความรู้ ยึดบทนำของคุณกับเนื้อหาจริงของหน้า หลีกเลี่ยงข้อความทั่วไป เขียนอย่างเป็นธรรมชาติใน", + + // More alerts and messages + pleaseEnterText: "กรุณาป้อนข้อความก่อน!", + pleaseSelectFile: "กรุณาเลือกไฟล์ก่อน!", + pleaseEnterTranslateText: "กรุณาป้อนข้อความเพื่อแปล!", + aiModalNotAvailable: "Modal AI ไม่พร้อมใช้งานในบริบทนี้", + useCustomAPI: "ใช้ endpoint ที่กำหนดเองที่เข้ากันได้กับ openai", +}; diff --git a/public/src/languages/uk.js b/public/src/languages/uk.js new file mode 100644 index 0000000..65d2df8 --- /dev/null +++ b/public/src/languages/uk.js @@ -0,0 +1,114 @@ +// Ukrainian UI Translations +export const uk = { + // Main buttons + readPage: "📖 Читати Сторінку", + ttsAnything: "🔊 Озвучити Текст", + translate: "🌐 Перекласти", + smartTranslate: "🤖 Розумний Переклад", + uploadFile: "📁 Завантажити Файл", + + // Actions + refreshModels: "🔄 Оновити Моделі", + clearChat: "🗑️ Очистити Чат", + fullChatRaw: "📋 Весь Чат Raw", + fullChatHTML: "📄 Весь Чат HTML", + fullPageRaw: "📝 Вся Сторінка Raw", + downloadChat: "💾 Завантажити Чат", + + // Chat UI + sendButton: "Надіслати", + typePlaceholder: "Введіть ваше повідомлення...", + askPagePlaceholder: "Запитайте про цю сторінку...", + askAnythingPlaceholder: "Запитайте що завгодно...", + enterTextToSpeakPlaceholder: "Введіть текст для озвучення...", + clearChatConfirm: "Очистити всю історію розмови?", + + // Modal headers + aiAssistantTitle: "Асистент ШІ", + ttsModalTitle: "Озвучення Тексту", + translateModalTitle: "Перекласти", + + // System messages + pageContentPrefix: "Ось вміст веб-сторінки:", + additionalContext: + "Ви вбудовані на цій сторінці. Відповідаючи на запитання, враховуйте вміст та контекст сторінки.", + + // Notifications and alerts + languageChanged: + "Мову встановлено на {lang}. Оновіть сторінку, щоб побачити всі елементи інтерфейсу вашою обраною мовою.", + translationFailed: "Переклад не вдався: {error}", + ttsFailed: "Озвучення не вдалося: {error}", + fullChatCopied: "Весь чат скопійовано як сирий markdown!", + fullChatHTMLCopied: "Весь чат скопійовано як HTML!", + fullPageCopied: "Всю сторінку скопійовано як markdown!", + failedToCopy: "Не вдалося скопіювати: {error}", + failedToCopyPage: "Не вдалося скопіювати сторінку: {error}", + failedToCopyCode: "Не вдалося скопіювати код: {error}", + errorOpeningModal: "Помилка відкриття модального вікна ШІ: {error}", + failedToReadPage: "Не вдалося прочитати сторінку: {error}", + languageDetectionFailed: "Не вдалося визначити мову: {error}", + + // Dropdown labels + currentPage: "Поточна сторінка: {lang}", + translatingTo: "Переклад...", + detectingLanguage: "🔍 Визначення...", + + // Intro/header text + hermesIntro: + 'представляє велику мовну модель hermes від nous research', + discussingPage: "Ви обговорюєте", + + // TTS placeholder + ttsPlaceholder: + "озвучення тексту: напишіть будь-яке повідомлення і нехай штучний інтелект озвучить його!", + translatePlaceholder: "Введіть будь-який текст для перекладу...", + + // Read page status messages + processingContent: "Обробка вмісту...", + readingPageClickToPause: "Читання сторінки... Натисніть, щоб призупинити", + pausedClickToResume: "Призупинено. Натисніть, щоб продовжити", + downloadPageAudio: "Завантажити файл .mp3 озвучення для цієї сторінки.", + downloadChatAudio: "Завантажити це повідомлення як файл .mp3.", + deleteMessage: "Видалити повідомлення", + copyRawMarkdown: "Копіювати сирий (Markdown)", + copyHTML: "Копіювати HTML", + + // Translation modal tabs + translatePageTab: "📄 Перекласти Сторінку", + customTextTab: "✏️ Власний Текст", + remoteUrlTab: "🌐 Віддалений URL", + + // TTS modal components + speedLabel: "Швидкість:", + playText: "Відтворити Текст", + + // Translation modal content + translatePageInfo: "Перекладіть вміст поточної сторінки на обрану мову:", + translateToLabel: "Перекласти на:", + translateButton: "🌐 Перекласти", + translatePageButton: "🌐 Перекласти Сторінку", + translateTextButton: "🌐 Перекласти Текст", + remoteUrlInfo: "Введіть URL для завантаження та перекладу:", + remoteUrlPlaceholder: "https://приклад.ua", + fetchAndTranslate: "🌐 Завантажити та Перекласти", + processingText: "Обробка...", + processingTokens: "🤖 Обробка {tokens} токенів...", + + // Button labels for UI + translationModal: "🌐 Модальне Вікно Перекладу", + translationModalHeading: "Модальне Вікно Перекладу", + + // System prompt components + systemPromptIntro: "Ви — Hermes AI, що працює на базі Nous Research, вбудований на веб-сторінку через uncloseai.com. Ваше завдання — створити контекстуально розумне вступне слово з 3 абзаців, що демонструє глибоке розуміння конкретного вмісту сторінки, її мети та аудиторії.", + systemPromptTask1: "1. Почніть природно, визначивши, про що ця сторінка — будьте конкретними: згадайте назву сторінки, основну тему, ім'я автора якщо є, або основну мету. Покажіть негайне розуміння типу контенту (стаття, документація, сторінка продукту тощо)", + systemPromptTask2: "2. Посилайтеся на 2-3 дуже конкретні деталі зі сторінки — цитуйте точні фрази, наводьте конкретні дані, згадуйте окремі розділи або функції, які ви помічаєте. Продемонструйте, що ви проаналізували фактичний вміст, а не просто переглянули його.", + systemPromptTask3: "3. Запропонуйте контекстуально релевантну допомогу залежно від типу сторінки — для технічної документації запропонуйте пояснити концепції; для статей запропонуйте обговорити ідеї; для продуктів відповідайте про функції. Будьте конкретними щодо того, ЯК ви можете допомогти з ЦИМ конкретним вмістом.", + systemPromptInstructions: "Будьте розмовними, але компетентними. Базуйте свій вступ на фактичному вмісті сторінки. Уникайте загальних тверджень. Пишіть природно", + + // More alerts and messages + pleaseEnterText: "Будь ласка, спочатку введіть текст!", + pleaseSelectFile: "Будь ласка, спочатку виберіть файл!", + pleaseEnterTranslateText: "Будь ласка, введіть текст для перекладу!", + aiModalNotAvailable: "Модальне вікно ШІ недоступне в цьому контексті", + useCustomAPI: "Використовувати власний openai-сумісний endpoint.", +}; diff --git a/public/src/languages/vi.js b/public/src/languages/vi.js new file mode 100644 index 0000000..6ca6e85 --- /dev/null +++ b/public/src/languages/vi.js @@ -0,0 +1,114 @@ +// Vietnamese UI Translations +export const vi = { + // Main buttons + readPage: "📖 Đọc Trang", + ttsAnything: "🔊 Chuyển Văn Bản Thành Giọng Nói", + translate: "🌐 Dịch", + smartTranslate: "🤖 Dịch Thông Minh", + uploadFile: "📁 Tải Lên Tệp", + + // Actions + refreshModels: "🔄 Làm Mới Mô Hình", + clearChat: "🗑️ Xóa Trò Chuyện", + fullChatRaw: "📋 Toàn Bộ Chat Raw", + fullChatHTML: "📄 Toàn Bộ Chat HTML", + fullPageRaw: "📝 Toàn Bộ Trang Raw", + downloadChat: "💾 Tải Xuống Chat", + + // Chat UI + sendButton: "Gửi", + typePlaceholder: "Nhập tin nhắn của bạn...", + askPagePlaceholder: "Hỏi về trang này...", + askAnythingPlaceholder: "Hỏi bất cứ điều gì...", + enterTextToSpeakPlaceholder: "Nhập văn bản để đọc...", + clearChatConfirm: "Xóa toàn bộ lịch sử trò chuyện?", + + // Modal headers + aiAssistantTitle: "Trợ Lý AI", + ttsModalTitle: "Chuyển Văn Bản Thành Giọng Nói", + translateModalTitle: "Dịch", + + // System messages + pageContentPrefix: "Đây là nội dung của trang web:", + additionalContext: + "Bạn được nhúng trên trang này. Khi trả lời câu hỏi, hãy xem xét nội dung và ngữ cảnh của trang.", + + // Notifications and alerts + languageChanged: + "Ngôn ngữ được đặt thành {lang}. Làm mới trang để xem tất cả các phần tử giao diện bằng ngôn ngữ ưa thích của bạn.", + translationFailed: "Dịch thất bại: {error}", + ttsFailed: "Chuyển văn bản thành giọng nói thất bại: {error}", + fullChatCopied: "Đã sao chép toàn bộ chat dưới dạng markdown thô!", + fullChatHTMLCopied: "Đã sao chép toàn bộ chat dưới dạng HTML!", + fullPageCopied: "Đã sao chép toàn bộ trang dưới dạng markdown!", + failedToCopy: "Sao chép thất bại: {error}", + failedToCopyPage: "Sao chép trang thất bại: {error}", + failedToCopyCode: "Sao chép mã thất bại: {error}", + errorOpeningModal: "Lỗi khi mở modal AI: {error}", + failedToReadPage: "Đọc trang thất bại: {error}", + languageDetectionFailed: "Phát hiện ngôn ngữ thất bại: {error}", + + // Dropdown labels + currentPage: "Trang hiện tại: {lang}", + translatingTo: "Đang dịch...", + detectingLanguage: "🔍 Đang phát hiện...", + + // Intro/header text + hermesIntro: + 'giới thiệu mô hình ngôn ngữ lớn hermes của nous research', + discussingPage: "Bạn đang thảo luận về", + + // TTS placeholder + ttsPlaceholder: + "chuyển văn bản thành giọng nói: viết bất kỳ tin nhắn nào và để trí tuệ nhân tạo đọc nó!", + translatePlaceholder: "Nhập văn bản bất kỳ để dịch...", + + // Read page status messages + processingContent: "Đang xử lý nội dung...", + readingPageClickToPause: "Đang đọc trang... Nhấp để tạm dừng", + pausedClickToResume: "Đã tạm dừng. Nhấp để tiếp tục", + downloadPageAudio: "Tải xuống tệp .mp3 chuyển văn bản thành giọng nói cho trang này.", + downloadChatAudio: "Tải xuống tin nhắn này dưới dạng tệp .mp3.", + deleteMessage: "Xóa tin nhắn", + copyRawMarkdown: "Sao chép thô (Markdown)", + copyHTML: "Sao chép HTML", + + // Translation modal tabs + translatePageTab: "📄 Dịch Trang", + customTextTab: "✏️ Văn Bản Tùy Chỉnh", + remoteUrlTab: "🌐 URL Từ Xa", + + // TTS modal components + speedLabel: "Tốc độ:", + playText: "Phát Văn Bản", + + // Translation modal content + translatePageInfo: "Dịch nội dung trang hiện tại sang ngôn ngữ bạn chọn:", + translateToLabel: "Dịch sang:", + translateButton: "🌐 Dịch", + translatePageButton: "🌐 Dịch Trang", + translateTextButton: "🌐 Dịch Văn Bản", + remoteUrlInfo: "Nhập URL để tải và dịch:", + remoteUrlPlaceholder: "https://vidu.vn", + fetchAndTranslate: "🌐 Tải và Dịch", + processingText: "Đang xử lý...", + processingTokens: "🤖 Đang xử lý {tokens} token...", + + // Button labels for UI + translationModal: "🌐 Modal Dịch", + translationModalHeading: "Modal Dịch", + + // System prompt components + systemPromptIntro: "Bạn là Hermes AI, được hỗ trợ bởi Nous Research, được nhúng trên một trang web thông qua uncloseai.com. Nhiệm vụ của bạn là tạo ra một giới thiệu thông minh theo ngữ cảnh gồm 3 đoạn văn thể hiện sự hiểu biết sâu sắc về nội dung cụ thể của trang, mục đích và đối tượng của nó.", + systemPromptTask1: "1. Bắt đầu tự nhiên bằng cách xác định trang này nói về điều gì - hãy cụ thể: đề cập đến tiêu đề trang, chủ đề chính, tên tác giả nếu có, hoặc mục đích chính. Thể hiện sự hiểu biết ngay lập tức về loại nội dung (bài viết, tài liệu, trang sản phẩm, v.v.)", + systemPromptTask2: "2. Tham chiếu 2-3 chi tiết rất cụ thể từ trang - trích dẫn các cụm từ chính xác, trích dẫn các điểm dữ liệu cụ thể, đề cập đến các phần hoặc tính năng cụ thể mà bạn nhận thấy. Chứng minh rằng bạn đã phân tích nội dung thực tế, không chỉ lướt qua.", + systemPromptTask3: "3. Cung cấp hỗ trợ phù hợp với ngữ cảnh dựa trên loại trang - đối với tài liệu kỹ thuật, đề nghị giải thích các khái niệm; đối với bài viết, đề nghị thảo luận ý tưởng; đối với sản phẩm, trả lời về tính năng. Hãy cụ thể về CÁCH bạn có thể giúp với nội dung CỤ THỂ này.", + systemPromptInstructions: "Hãy giao tiếp nhưng vẫn am hiểu. Dựa phần giới thiệu của bạn vào nội dung thực tế của trang. Tránh các phát biểu chung chung. Viết tự nhiên bằng", + + // More alerts and messages + pleaseEnterText: "Vui lòng nhập văn bản trước!", + pleaseSelectFile: "Vui lòng chọn tệp trước!", + pleaseEnterTranslateText: "Vui lòng nhập văn bản để dịch!", + aiModalNotAvailable: "Modal AI không khả dụng trong ngữ cảnh này", + useCustomAPI: "Sử dụng endpoint tùy chỉnh tương thích với openai.", +};