diff --git a/README.md b/README.md index 11d3848..750271b 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,11 @@ This will start a development server and watch for changes in the source files. ## Local AI Provider -- [Ollama](https://github.com/ollama/ollama) (Currently the only supported provider. More providers will be added in the future.) +- [Ollama](https://github.com/ollama/ollama) + +- Chrome AI (Gemini Nano) + +More providers will be added in the future. ## Roadmap diff --git a/src/assets/locale/en/chrome.json b/src/assets/locale/en/chrome.json new file mode 100644 index 0000000..88b0754 --- /dev/null +++ b/src/assets/locale/en/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Configure Chrome AI", + "status": { + "label": "Enable or Disable Chrome AI Support on Page Assist" + }, + "error": { + "browser_not_supported": "This version of Chrome is not supported by the Gemini Nano model. Please update to version 127 or later", + "ai_not_supported": "The setting chrome://flags/#prompt-api-for-gemini-nano is not enabled. Please enable it.", + "ai_not_ready": "Gemini Nano is not ready yet; you need to double-check Chrome settings.", + "internal_error": "An internal error occurred. Please try again later." + }, + "errorDescription": "In order to use Chrome AI, you need a browser version greater than 127, which is currently in the Dev and Canary channels. After downloading the supported version, follow these steps:\n\n1. Go to `chrome://flags/#prompt-api-for-gemini-nano` and select \"Enable\".\n2. Go to `chrome://flags/#optimization-guide-on-device-model` and select \"EnabledBypassPrefRequirement\".\n3. Go to `chrome://components`, search for \"Optimization Guide On Device Model\", and click \"Check for Update\". This will download the model. If you don't see the settings, repeat steps 1 and 2 and relaunch your browser." +} \ No newline at end of file diff --git a/src/assets/locale/en/settings.json b/src/assets/locale/en/settings.json index 7107a00..fb798d2 100644 --- a/src/assets/locale/en/settings.json +++ b/src/assets/locale/en/settings.json @@ -229,6 +229,18 @@ "label": "Custom Origin URL", "placeholder": "Enter Custom Origin URL" }, + "headers": { + "label": "Custom Headers", + "add": "Add Header", + "key": { + "label": "Header Key", + "placeholder": "Authorization" + }, + "value": { + "label": "Header Value", + "placeholder": "Bearer token" + } + }, "help": "If you have connection issues with Ollama on Page Assist, you can configure a custom origin URL. To learn more about the configuration, click here." } } @@ -288,5 +300,8 @@ "webSearchFollowUpPromptError": "Please input your Web Search Follow Up Prompt!", "webSearchFollowUpPromptPlaceholder": "Your Web Search Follow Up Prompt" } + }, + "chromeAiSettings": { + "title": "Chrome AI Settings" } } \ No newline at end of file diff --git a/src/assets/locale/es/chrome.json b/src/assets/locale/es/chrome.json new file mode 100644 index 0000000..76238cb --- /dev/null +++ b/src/assets/locale/es/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Configurar Chrome AI", + "status": { + "label": "Habilitar o deshabilitar el soporte de Chrome AI en Page Assist" + }, + "error": { + "browser_not_supported": "Esta versión de Chrome no es compatible con el modelo Gemini Nano. Por favor, actualice a la versión 127 o posterior.", + "ai_not_supported": "La configuración chrome://flags/#prompt-api-for-gemini-nano no está habilitada. Por favor, habilítela.", + "ai_not_ready": "Gemini Nano aún no está listo; necesita verificar la configuración de Chrome.", + "internal_error": "Ocurrió un error interno. Por favor, inténtelo de nuevo más tarde." + }, + "errorDescription": "Para usar Chrome AI, necesita una versión del navegador mayor a la 127, que actualmente está en los canales Dev y Canary. Después de descargar la versión compatible, siga estos pasos:\n\n1. Vaya a `chrome://flags/#prompt-api-for-gemini-nano` y seleccione \"Habilitar\".\n2. Vaya a `chrome://flags/#optimization-guide-on-device-model` y seleccione \"EnabledBypassPrefRequirement\".\n3. Vaya a `chrome://components`, busque \"Optimization Guide On Device Model\" y haga clic en \"Buscar actualización\". Esto descargará el modelo. Si no ve la configuración, repita los pasos 1 y 2 y reinicie su navegador." +} diff --git a/src/assets/locale/es/settings.json b/src/assets/locale/es/settings.json index d1f1785..f169e88 100644 --- a/src/assets/locale/es/settings.json +++ b/src/assets/locale/es/settings.json @@ -229,6 +229,18 @@ "label": "URL Personalizada", "placeholder": "Ingresar URL Personalizada" }, + "headers": { + "label": "Encabezados Personalizados", + "add": "Agregar Encabezado", + "key": { + "label": "Clave del Encabezado", + "placeholder": "Autorización" + }, + "value": { + "label": "Valor del Encabezado", + "placeholder": "Token Bearer" + } + }, "help": "Si tenes problemas de conexión con Ollama en Page Assist, podes configurar una URL de personalizada. Para saber más sobre la configuración, click aqui." } } @@ -288,5 +300,8 @@ "webSearchFollowUpPromptError": "Por favor, ingrese el prompt de seguimiento de la busqueda web", "webSearchFollowUpPromptPlaceholder": "Su prompt de seguimiento de busqueda web" } + }, + "chromeAiSettings": { + "title": "Configuración de IA de Chrome" } } \ No newline at end of file diff --git a/src/assets/locale/fr/chrome.json b/src/assets/locale/fr/chrome.json new file mode 100644 index 0000000..cb2d974 --- /dev/null +++ b/src/assets/locale/fr/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Configurer Chrome AI", + "status": { + "label": "Activer ou désactiver la prise en charge de Chrome AI sur Page Assist" + }, + "error": { + "browser_not_supported": "Cette version de Chrome n'est pas supportée par le modèle Gemini Nano. Veuillez mettre à jour vers la version 127 ou ultérieure.", + "ai_not_supported": "Le paramètre chrome://flags/#prompt-api-for-gemini-nano n'est pas activé. Veuillez l'activer.", + "ai_not_ready": "Gemini Nano n'est pas encore prêt; vous devez vérifier les paramètres de Chrome.", + "internal_error": "Une erreur interne est survenue. Veuillez réessayer plus tard." + }, + "errorDescription": "Pour utiliser Chrome AI, vous avez besoin d'une version du navigateur supérieure à 127, actuellement disponible dans les canaux Dev et Canary. Après avoir téléchargé la version prise en charge, suivez ces étapes:\n\n1. Allez à `chrome://flags/#prompt-api-for-gemini-nano` et sélectionnez \"Activer\".\n2. Allez à `chrome://flags/#optimization-guide-on-device-model` et sélectionnez \"EnabledBypassPrefRequirement\".\n3. Allez à `chrome://components`, recherchez \"Optimization Guide On Device Model\" et cliquez sur \"Vérifier la mise à jour\". Cela téléchargera le modèle. Si vous ne voyez pas les paramètres, répétez les étapes 1 et 2 et relancez votre navigateur." +} diff --git a/src/assets/locale/fr/settings.json b/src/assets/locale/fr/settings.json index 634358f..97cf952 100644 --- a/src/assets/locale/fr/settings.json +++ b/src/assets/locale/fr/settings.json @@ -229,6 +229,18 @@ "label": "URL d'origine personnalisée", "placeholder": "Entrez l'URL d'origine personnalisée" }, + "headers": { + "label": "En-têtes Personnalisés", + "add": "Ajouter En-tête", + "key": { + "label": "Clé de l'En-tête", + "placeholder": "Autorisation" + }, + "value": { + "label": "Valeur de l'En-tête", + "placeholder": "Jeton Bearer" + } + }, "help": "Si vous avez des problèmes de connexion avec OLLAMA sur Page Assist, vous pouvez configurer une URL d'origine personnalisée. Pour en savoir plus sur la configuration, cliquez ici." } } @@ -288,5 +300,8 @@ "webSearchFollowUpPromptError": "Veuillez saisir votre prompt de suivi de recherche Web!", "webSearchFollowUpPromptPlaceholder": "Votre prompt de suivi de recherche Web" } + }, + "chromeAiSettings": { + "title": "Paramètres IA de Chrome" } } \ No newline at end of file diff --git a/src/assets/locale/it/chrome.json b/src/assets/locale/it/chrome.json new file mode 100644 index 0000000..86d6c68 --- /dev/null +++ b/src/assets/locale/it/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Configura Chrome AI", + "status": { + "label": "Abilita o disabilita il supporto di Chrome AI su Page Assist" + }, + "error": { + "browser_not_supported": "Questa versione di Chrome non è supportata dal modello Gemini Nano. Si prega di aggiornare alla versione 127 o successiva.", + "ai_not_supported": "L'impostazione chrome://flags/#prompt-api-for-gemini-nano non è abilitata. Si prega di abilitarla.", + "ai_not_ready": "Gemini Nano non è ancora pronto; è necessario verificare le impostazioni di Chrome.", + "internal_error": "Si è verificato un errore interno. Si prega di riprovare più tardi." + }, + "errorDescription": "Per utilizzare Chrome AI, è necessaria una versione del browser superiore alla 127, attualmente disponibile nei canali Dev e Canary. Dopo aver scaricato la versione supportata, segui questi passaggi:\n\n1. Vai a `chrome://flags/#prompt-api-for-gemini-nano` e seleziona \"Abilita\".\n2. Vai a `chrome://flags/#optimization-guide-on-device-model` e seleziona \"EnabledBypassPrefRequirement\".\n3. Vai a `chrome://components`, cerca \"Optimization Guide On Device Model\" e clicca su \"Controlla aggiornamenti\". Questo scaricherà il modello. Se non vedi le impostazioni, ripeti i passaggi 1 e 2 e riavvia il browser." +} diff --git a/src/assets/locale/it/settings.json b/src/assets/locale/it/settings.json index 41bef3d..3af9bae 100644 --- a/src/assets/locale/it/settings.json +++ b/src/assets/locale/it/settings.json @@ -1,292 +1,307 @@ { - "generalSettings": { - "title": "Impostazioni Generali", - "settings": { - "heading": "Impostazioni Web UI", - "speechRecognitionLang": { - "label": "Lingua per il riconoscimento vocale", - "placeholder": "Scegli una lingua" - }, - "language": { - "label": "Lingua", - "placeholder": "Scegli una lingua" - }, - "darkMode": { - "label": "Cambia il Tema", - "options": { - "light": "Chiaro", - "dark": "Scuro" - } - }, - "copilotResumeLastChat": { - "label": "Riprendi l'ultima chat quando apri il Pannello Laterale (Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "Nascondi le impostazioni correnti del modello Chat" - } - }, - "webSearch": { - "heading": "Gestione ricerca Web", - "searchMode": { - "label": "Effettua ricerca web Internet semplice" - }, - "provider": { - "label": "Motori di ricerca", - "placeholder": "Scegli un motore di ricerca" - }, - "totalSearchResults": { - "label": "Risultati della ricerca", - "placeholder": "Inserisci il totale delle ricerche" - }, - "visitSpecificWebsite": { - "label": "Visita il sito web menzionato nel messaggio" - } - }, - "system": { - "heading": "Impostazioni di Sistema", - "deleteChatHistory": { - "label": "Elimina cronologia Chat", - "button": "Elimina", - "confirm": "Sei sicuro che vuoi eliminare la tua cronologia delle chat? Questa azione non può essere annullata." - }, - "export": { - "label": "Esporta la cronologia Chat, Base di Conoscenza, e Prompts", - "button": "Esporta Dati", - "success": "Esportato con Successo" - }, - "import": { - "label": "Imposta la cronologia Chat, Base di Conoscenza, e Prompts", - "button": "Importa Dati", - "success": "Importato con Successo", - "error": "Errore Importazione" - } - }, - "tts": { - "heading": "Impostazioni Text-to-Speech", - "ttsEnabled": { - "label": "Abilita Text-to-Speech" - }, - "ttsProvider": { - "label": "Text-to-Speech Provider", - "placeholder": "Seleziona un provider" - }, - "ttsVoice": { - "label": "Text-to-Speech Voce", - "placeholder": "Seleziona una voce" - }, - "ssmlEnabled": { - "label": "Abilita SSML (Speech Synthesis Markup Language)" - } + "generalSettings": { + "title": "Impostazioni Generali", + "settings": { + "heading": "Impostazioni Web UI", + "speechRecognitionLang": { + "label": "Lingua per il riconoscimento vocale", + "placeholder": "Scegli una lingua" + }, + "language": { + "label": "Lingua", + "placeholder": "Scegli una lingua" + }, + "darkMode": { + "label": "Cambia il Tema", + "options": { + "light": "Chiaro", + "dark": "Scuro" } + }, + "copilotResumeLastChat": { + "label": "Riprendi l'ultima chat quando apri il Pannello Laterale (Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "Nascondi le impostazioni correnti del modello Chat" + } }, - "manageModels": { - "title": "Gestione Modelli", - "addBtn": "Aggiungi un nuovo Modello", - "columns": { - "name": "Nome", - "digest": "Digest", - "modifiedAt": "Modificato il", - "size": "Dimensioni", - "actions": "Azioni" - }, - "expandedColumns": { - "parentModel": "Modello Padre", - "format": "Formato", - "family": "Famiglia", - "parameterSize": "Numero di Parametri", - "quantizationLevel": "Livello di Quantizzazione" - }, - "tooltip": { - "delete": "Elimina Modello", - "repull": "Ri-Scarica Modello" - }, - "confirm": { - "delete": "Sei sicuro di voler eliminare questo modello?", - "repull": "Se sicuro che vuoi ri-scaricare questo modello?" - }, - "modal": { - "title": "Aggiungi Nuovo Modello", - "placeholder": "Inserisci il Nome Modello", - "pull": "Scarico del Modello" - }, - "notification": { - "pullModel": "Scarico del Modello", - "pullModelDescription": "Scaricando il modello {{modelName}}. Per ulteriori dettagli visualizza l'icona dell'estensione.", - "success": "Completato", - "error": "Errore", - "successDescription": "Scarico del modello completato", - "successDeleteDescription": "Eliminazione del modello completato", - "someError": "Qualcosa è andato storto. Riprova più tardi" - } + "webSearch": { + "heading": "Gestione ricerca Web", + "searchMode": { + "label": "Effettua ricerca web Internet semplice" + }, + "provider": { + "label": "Motori di ricerca", + "placeholder": "Scegli un motore di ricerca" + }, + "totalSearchResults": { + "label": "Risultati della ricerca", + "placeholder": "Inserisci il totale delle ricerche" + }, + "visitSpecificWebsite": { + "label": "Visita il sito web menzionato nel messaggio" + } }, - "managePrompts": { - "title": "Gestisci Prompts", - "addBtn": "Aggiungi nuovo Prompt", - "option1": "Normale", - "option2": "RAG", - "questionPrompt": "Question Prompt", - "columns": { - "title": "Titolo", - "prompt": "Prompt", - "type": "Tipo di Prompt", - "actions": "Azioni" - }, - "systemPrompt": "Prompt di Sistema", - "quickPrompt": "Prompt Veloce", - "tooltip": { - "delete": "Elimina Prompt", - "edit": "Modifica Prompt" - }, - "confirm": { - "delete": "Sei sicuro di voler eliminare questo prompt? L'azione non può essere annullata." - }, - "modal": { - "addTitle": "Aggiungi Nuovo Prompt", - "editTitle": "Modifica Prompt" - }, - "form": { - "title": { - "label": "Titolo", - "placeholder": "I Miei Prompt", - "required": "Inserisci il Titolo" - }, - "prompt": { - "label": "Prompt", - "placeholder": "Inserisci Prompt", - "required": "Scrivi il prompt", - "help": "Puoi usare {key} come variabile nel tuo prompt." - }, - "isSystem": { - "label": "Prompt di Sistema" - }, - "btnSave": { - "saving": "Aggiungendo Prompt...", - "save": "Aggiungi Prompt" - }, - "btnEdit": { - "saving": "Aggiornando Prompt...", - "save": "Aggiorna Prompt" - } - }, - "notification": { - "addSuccess": "Prompt Aggiunto", - "addSuccessDesc": "Il Prompt è stato aggiunto correttamente", - "error": "Errore", - "someError": "Qualcosa è andato storto. Riprova più tardi", - "updatedSuccess": "Prompt Aggiornato", - "updatedSuccessDesc": "Il Prompt è stato aggiornato correttmante", - "deletedSuccess": "Prompt Eliminato", - "deletedSuccessDesc": "Il Prompt è stato eliminato correttamente" - } + "system": { + "heading": "Impostazioni di Sistema", + "deleteChatHistory": { + "label": "Elimina cronologia Chat", + "button": "Elimina", + "confirm": "Sei sicuro che vuoi eliminare la tua cronologia delle chat? Questa azione non può essere annullata." + }, + "export": { + "label": "Esporta la cronologia Chat, Base di Conoscenza, e Prompts", + "button": "Esporta Dati", + "success": "Esportato con Successo" + }, + "import": { + "label": "Imposta la cronologia Chat, Base di Conoscenza, e Prompts", + "button": "Importa Dati", + "success": "Importato con Successo", + "error": "Errore Importazione" + } }, - "manageShare": { - "title": "Gestione Condivisioni", - "heading": "Configura l'URL della Pagina di Condivisione", - "form": { - "url": { - "label": "URL Pagina di Condivisione", - "placeholder": "Inserisci URL Pagina di Condivisione", - "required": "Inserisci l'url della pagina di condivisione!", - "help": "Per ragioni di privacy, tu puoi ospitare in self-host la paginacon il seguente URL. Leggi altro." - } - }, - "webshare": { - "heading": "Condivisioni Web", - "columns": { - "title": "Titolo", - "url": "URL", - "actions": "Azioni" - }, - "tooltip": { - "delete": "Elimina Condivisione" - }, - "confirm": { - "delete": "Sei sicuro che vuoi eliminare questa condivisione? L'azione non può essere annullata." - }, - "label": "Gestione Condivisioni", - "description": "Abilita o Disattiva la funzionalità di condivisione" - }, - "notification": { - "pageShareSuccess": " URL di condivisione aggiornato correttamente", - "someError": "Qualcosa è andato storto. Riprova più tardi", - "webShareDeleteSuccess": "Condivisione eliminata correttamente" - } - }, - "ollamaSettings": { - "title": "Impostazioni Ollama", - "heading": "Configura Ollama", - "settings": { - "ollamaUrl": { - "label": "Ollama URL", - "placeholder": "Inserici l'URL di Ollama" - }, - "advanced": { - "label": "Configurazione Avanzata Ollama URL", - "urlRewriteEnabled": { - "label": "Abilita o Disabilita l'URL di Origine Personalizzato" - }, - "rewriteUrl": { - "label": "URL di Origine Personalizzato", - "placeholder": "Inserisci URL di Origine Personalizzato" - }, - "help": "Se hai problemi di connessione con Ollama su Page Assist, puoi configurare un URL di origine personalizzato. Per saperne di più sulla configurazione, clicca qui." - } - } - }, - "manageSearch": { - "title": "Gestisci Ricerca Web", - "heading": "Configura Ricerca Web" - }, - "about": { - "title": "Informazioni", - "heading": "Informazioni", - "chromeVersion": "Versione di Page Assist", - "ollamaVersion": "Versione di Ollama", - "support": "Puoi supportare il progetto Page Assist donando o sponsorizzando attraverso le seguenti piattaforme:", - "koFi": "Supporta su Ko-fi", - "githubSponsor": "Sponsorizza su GitHub", - "githubRepo": "Repository GitHub" - }, - "manageKnowledge": { - "title": "Gestisci Conoscenza", - "heading": "Configura Base di Conoscenza" - }, - "rag": { - "title": "Impostazioni RAG", - "ragSettings": { - "label": "Impostazioni RAG", - "model": { - "label": "Modello di Embedding", - "required": "Scegliere il modello", - "help": "E' raccomandato l'uso di modelli come `nomic-embed-text`.", - "placeholder": "Seleziona un modello" - }, - "chunkSize": { - "label": "Dimensione del Blocco (Chunk Size)", - "placeholder": "Inserisci la Dimensione del Blocco (Chunk Size)", - "required": "Inserisci la Dimensione del Blocco (chunk size)" - }, - "chunkOverlap": { - "label": "Sovrapposizione del Blocco (Chunk Overlap)", - "placeholder": "Inserisci la Sovrapposizione del Blocco (Chunk Overlap)", - "required": "Inserisci la Sovrapposizione del Blocco" - } - }, - "prompt": { - "label": "Configura il Prompt RAG", - "option1": "Normale", - "option2": "Web", - "alert": "La configurazione del prompt di sistema qui è deprecato. Usa la sezione Gestione Prompt per aggiungere o modificare i prompts.Questa sezione sarà eliminata nelle prossime release", - "systemPrompt": "Prompt di Sistema", - "systemPromptPlaceholder": "Inserisci il Prompt di Sistema", - "webSearchPrompt": "Prompt per la Ricerca Web", - "webSearchPromptHelp": "Non rimuovere `{search_results}` dal prompt.", - "webSearchPromptError": "Inserisci il prompt per la ricerca web", - "webSearchPromptPlaceholder": "Imserosco il Prompt per la Ricerca Web", - "webSearchFollowUpPrompt": "Prompt di Follow Up sulla Ricerca Web", - "webSearchFollowUpPromptHelp": "Non rimuovere `{chat_history}` e `{question}` dal prompt.", - "webSearchFollowUpPromptError": "Inserisci il Prompt di Follow Up della Ricerca Web!", - "webSearchFollowUpPromptPlaceholder": "I tuoi Prompt di Follow Up delle Ricerche Web" - } + "tts": { + "heading": "Impostazioni Text-to-Speech", + "ttsEnabled": { + "label": "Abilita Text-to-Speech" + }, + "ttsProvider": { + "label": "Text-to-Speech Provider", + "placeholder": "Seleziona un provider" + }, + "ttsVoice": { + "label": "Text-to-Speech Voce", + "placeholder": "Seleziona una voce" + }, + "ssmlEnabled": { + "label": "Abilita SSML (Speech Synthesis Markup Language)" + } } -} \ No newline at end of file + }, + "manageModels": { + "title": "Gestione Modelli", + "addBtn": "Aggiungi un nuovo Modello", + "columns": { + "name": "Nome", + "digest": "Digest", + "modifiedAt": "Modificato il", + "size": "Dimensioni", + "actions": "Azioni" + }, + "expandedColumns": { + "parentModel": "Modello Padre", + "format": "Formato", + "family": "Famiglia", + "parameterSize": "Numero di Parametri", + "quantizationLevel": "Livello di Quantizzazione" + }, + "tooltip": { + "delete": "Elimina Modello", + "repull": "Ri-Scarica Modello" + }, + "confirm": { + "delete": "Sei sicuro di voler eliminare questo modello?", + "repull": "Se sicuro che vuoi ri-scaricare questo modello?" + }, + "modal": { + "title": "Aggiungi Nuovo Modello", + "placeholder": "Inserisci il Nome Modello", + "pull": "Scarico del Modello" + }, + "notification": { + "pullModel": "Scarico del Modello", + "pullModelDescription": "Scaricando il modello {{modelName}}. Per ulteriori dettagli visualizza l'icona dell'estensione.", + "success": "Completato", + "error": "Errore", + "successDescription": "Scarico del modello completato", + "successDeleteDescription": "Eliminazione del modello completato", + "someError": "Qualcosa è andato storto. Riprova più tardi" + } + }, + "managePrompts": { + "title": "Gestisci Prompts", + "addBtn": "Aggiungi nuovo Prompt", + "option1": "Normale", + "option2": "RAG", + "questionPrompt": "Question Prompt", + "columns": { + "title": "Titolo", + "prompt": "Prompt", + "type": "Tipo di Prompt", + "actions": "Azioni" + }, + "systemPrompt": "Prompt di Sistema", + "quickPrompt": "Prompt Veloce", + "tooltip": { + "delete": "Elimina Prompt", + "edit": "Modifica Prompt" + }, + "confirm": { + "delete": "Sei sicuro di voler eliminare questo prompt? L'azione non può essere annullata." + }, + "modal": { + "addTitle": "Aggiungi Nuovo Prompt", + "editTitle": "Modifica Prompt" + }, + "form": { + "title": { + "label": "Titolo", + "placeholder": "I Miei Prompt", + "required": "Inserisci il Titolo" + }, + "prompt": { + "label": "Prompt", + "placeholder": "Inserisci Prompt", + "required": "Scrivi il prompt", + "help": "Puoi usare {key} come variabile nel tuo prompt." + }, + "isSystem": { + "label": "Prompt di Sistema" + }, + "btnSave": { + "saving": "Aggiungendo Prompt...", + "save": "Aggiungi Prompt" + }, + "btnEdit": { + "saving": "Aggiornando Prompt...", + "save": "Aggiorna Prompt" + } + }, + "notification": { + "addSuccess": "Prompt Aggiunto", + "addSuccessDesc": "Il Prompt è stato aggiunto correttamente", + "error": "Errore", + "someError": "Qualcosa è andato storto. Riprova più tardi", + "updatedSuccess": "Prompt Aggiornato", + "updatedSuccessDesc": "Il Prompt è stato aggiornato correttmante", + "deletedSuccess": "Prompt Eliminato", + "deletedSuccessDesc": "Il Prompt è stato eliminato correttamente" + } + }, + "manageShare": { + "title": "Gestione Condivisioni", + "heading": "Configura l'URL della Pagina di Condivisione", + "form": { + "url": { + "label": "URL Pagina di Condivisione", + "placeholder": "Inserisci URL Pagina di Condivisione", + "required": "Inserisci l'url della pagina di condivisione!", + "help": "Per ragioni di privacy, tu puoi ospitare in self-host la paginacon il seguente URL. Leggi altro." + } + }, + "webshare": { + "heading": "Condivisioni Web", + "columns": { + "title": "Titolo", + "url": "URL", + "actions": "Azioni" + }, + "tooltip": { + "delete": "Elimina Condivisione" + }, + "confirm": { + "delete": "Sei sicuro che vuoi eliminare questa condivisione? L'azione non può essere annullata." + }, + "label": "Gestione Condivisioni", + "description": "Abilita o Disattiva la funzionalità di condivisione" + }, + "notification": { + "pageShareSuccess": " URL di condivisione aggiornato correttamente", + "someError": "Qualcosa è andato storto. Riprova più tardi", + "webShareDeleteSuccess": "Condivisione eliminata correttamente" + } + }, + "ollamaSettings": { + "title": "Impostazioni Ollama", + "heading": "Configura Ollama", + "settings": { + "ollamaUrl": { + "label": "Ollama URL", + "placeholder": "Inserici l'URL di Ollama" + }, + "advanced": { + "label": "Configurazione Avanzata Ollama URL", + "urlRewriteEnabled": { + "label": "Abilita o Disabilita l'URL di Origine Personalizzato" + }, + "rewriteUrl": { + "label": "URL di Origine Personalizzato", + "placeholder": "Inserisci URL di Origine Personalizzato" + }, + "headers": { + "label": "Intestazioni Personalizzate", + "add": "Aggiungi Intestazione", + "key": { + "label": "Chiave dell'Intestazione", + "placeholder": "Autorizzazione" + }, + "value": { + "label": "Valore dell'Intestazione", + "placeholder": "Token Bearer" + } + }, + "help": "Se hai problemi di connessione con Ollama su Page Assist, puoi configurare un URL di origine personalizzato. Per saperne di più sulla configurazione, clicca qui." + } + } + }, + "manageSearch": { + "title": "Gestisci Ricerca Web", + "heading": "Configura Ricerca Web" + }, + "about": { + "title": "Informazioni", + "heading": "Informazioni", + "chromeVersion": "Versione di Page Assist", + "ollamaVersion": "Versione di Ollama", + "support": "Puoi supportare il progetto Page Assist donando o sponsorizzando attraverso le seguenti piattaforme:", + "koFi": "Supporta su Ko-fi", + "githubSponsor": "Sponsorizza su GitHub", + "githubRepo": "Repository GitHub" + }, + "manageKnowledge": { + "title": "Gestisci Conoscenza", + "heading": "Configura Base di Conoscenza" + }, + "rag": { + "title": "Impostazioni RAG", + "ragSettings": { + "label": "Impostazioni RAG", + "model": { + "label": "Modello di Embedding", + "required": "Scegliere il modello", + "help": "E' raccomandato l'uso di modelli come `nomic-embed-text`.", + "placeholder": "Seleziona un modello" + }, + "chunkSize": { + "label": "Dimensione del Blocco (Chunk Size)", + "placeholder": "Inserisci la Dimensione del Blocco (Chunk Size)", + "required": "Inserisci la Dimensione del Blocco (chunk size)" + }, + "chunkOverlap": { + "label": "Sovrapposizione del Blocco (Chunk Overlap)", + "placeholder": "Inserisci la Sovrapposizione del Blocco (Chunk Overlap)", + "required": "Inserisci la Sovrapposizione del Blocco" + } + }, + "prompt": { + "label": "Configura il Prompt RAG", + "option1": "Normale", + "option2": "Web", + "alert": "La configurazione del prompt di sistema qui è deprecato. Usa la sezione Gestione Prompt per aggiungere o modificare i prompts.Questa sezione sarà eliminata nelle prossime release", + "systemPrompt": "Prompt di Sistema", + "systemPromptPlaceholder": "Inserisci il Prompt di Sistema", + "webSearchPrompt": "Prompt per la Ricerca Web", + "webSearchPromptHelp": "Non rimuovere `{search_results}` dal prompt.", + "webSearchPromptError": "Inserisci il prompt per la ricerca web", + "webSearchPromptPlaceholder": "Imserosco il Prompt per la Ricerca Web", + "webSearchFollowUpPrompt": "Prompt di Follow Up sulla Ricerca Web", + "webSearchFollowUpPromptHelp": "Non rimuovere `{chat_history}` e `{question}` dal prompt.", + "webSearchFollowUpPromptError": "Inserisci il Prompt di Follow Up della Ricerca Web!", + "webSearchFollowUpPromptPlaceholder": "I tuoi Prompt di Follow Up delle Ricerche Web" + } + }, + "chromeAiSettings": { + "title": "Impostazioni IA di Chrome" + } +} diff --git a/src/assets/locale/ja-JP/chrome.json b/src/assets/locale/ja-JP/chrome.json new file mode 100644 index 0000000..f6205bd --- /dev/null +++ b/src/assets/locale/ja-JP/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Chrome AIの設定", + "status": { + "label": "Page AssistでChrome AIサポートを有効または無効にする" + }, + "error": { + "browser_not_supported": "このバージョンのChromeはGemini Nanoモデルに対応していません。バージョン127以降に更新してください。", + "ai_not_supported": "設定chrome://flags/#prompt-api-for-gemini-nanoが有効になっていません。有効にしてください。", + "ai_not_ready": "Gemini Nanoはまだ準備ができていません。Chromeの設定を再確認する必要があります。", + "internal_error": "内部エラーが発生しました。後でもう一度お試しください。" + }, + "errorDescription": "Chrome AIを使用するには、現在DevおよびCanaryチャンネルにあるバージョン127以上のブラウザが必要です。サポートされているバージョンをダウンロードした後、次の手順に従ってください:\n\n1. `chrome://flags/#prompt-api-for-gemini-nano`にアクセスし、「有効」を選択します。\n2. `chrome://flags/#optimization-guide-on-device-model`にアクセスし、「EnabledBypassPrefRequirement」を選択します。\n3. `chrome://components`にアクセスし、「Optimization Guide On Device Model」を検索して、「アップデートを確認」をクリックします。これにより、モデルがダウンロードされます。設定が表示されない場合は、手順1および2を繰り返し、ブラウザを再起動してください。" +} diff --git a/src/assets/locale/ja-JP/settings.json b/src/assets/locale/ja-JP/settings.json index 74c9567..de5e20b 100644 --- a/src/assets/locale/ja-JP/settings.json +++ b/src/assets/locale/ja-JP/settings.json @@ -1,295 +1,310 @@ { - "generalSettings": { - "title": "一般設定", - "settings": { - "heading": "Web UIの設定", - "speechRecognitionLang": { - "label": "音声認識の言語", - "placeholder": "言語を選択" - }, - "language": { - "label": "言語", - "placeholder": "言語を選択" - }, - "darkMode": { - "label": "テーマを変更", - "options": { - "light": "ライト", - "dark": "ダーク" - } - }, - "searchMode": { - "label": "簡易インターネット検索を実行" - }, - "copilotResumeLastChat": { - "label": "サイドパネルを開いたときに最後のチャットを再開 (Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "現在のチャットモデル設定を非表示" - } - }, - "webSearch": { - "heading": "ウェブ検索を管理する", - "searchMode": { - "label": "簡単なインターネット検索を実行する" - }, - "provider": { - "label": "検索エンジン", - "placeholder": "検索エンジンを選択する" - }, - "totalSearchResults": { - "label": "合計検索結果", - "placeholder": "合計検索結果を入力する" - }, - "visitSpecificWebsite": { - "label": "メッセージに記載されたウェブサイトを訪問してください" - } - }, - "system": { - "heading": "システム設定", - "deleteChatHistory": { - "label": "チャット履歴を削除する", - "button": "削除", - "confirm": "チャット履歴を削除してもよろしいですか?この操作は元に戻せません。" - }, - "export": { - "label": "チャット履歴、知識ベース、プロンプトをエクスポート", - "button": "データをエクスポート", - "success": "エクスポート成功" - }, - "import": { - "label": "チャット履歴、知識ベース、プロンプトをインポート", - "button": "データをインポート", - "success": "インポート成功", - "error": "インポートエラー" - } - }, - "tts": { - "heading": "テキスト読み上げ設定", - "ttsEnabled": { - "label": "テキスト読み上げを有効にする" - }, - "ttsProvider": { - "label": "テキスト読み上げプロバイダー", - "placeholder": "プロバイダーを選択" - }, - "ttsVoice": { - "label": "テキスト読み上げの音声", - "placeholder": "音声を選択" - }, - "ssmlEnabled": { - "label": "SSML (Speech Synthesis Markup Language) を有効にする" - } + "generalSettings": { + "title": "一般設定", + "settings": { + "heading": "Web UIの設定", + "speechRecognitionLang": { + "label": "音声認識の言語", + "placeholder": "言語を選択" + }, + "language": { + "label": "言語", + "placeholder": "言語を選択" + }, + "darkMode": { + "label": "テーマを変更", + "options": { + "light": "ライト", + "dark": "ダーク" } + }, + "searchMode": { + "label": "簡易インターネット検索を実行" + }, + "copilotResumeLastChat": { + "label": "サイドパネルを開いたときに最後のチャットを再開 (Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "現在のチャットモデル設定を非表示" + } }, - "manageModels": { - "title": "モデルを管理", - "addBtn": "新しいモデルを追加", - "columns": { - "name": "名前", - "digest": "ダイジェスト", - "modifiedAt": "修正日時", - "size": "サイズ", - "actions": "アクション" - }, - "expandedColumns": { - "parentModel": "親モデル", - "format": "フォーマット", - "family": "ファミリー", - "parameterSize": "パラメータサイズ", - "quantizationLevel": "量子化レベル" - }, - "tooltip": { - "delete": "モデルを削除", - "repull": "モデルを再取得" - }, - "confirm": { - "delete": "本当にこのモデルを削除しますか?", - "repull": "本当にこのモデルを再取得しますか?" - }, - "modal": { - "title": "新しいモデルを追加", - "placeholder": "モデル名を入力", - "pull": "モデルを取得" - }, - "notification": { - "pullModel": "モデルを取得中", - "pullModelDescription": "{{modelName}}モデルを取得中。詳細は拡張機能のアイコンをご確認ください。", - "success": "成功", - "error": "エラー", - "successDescription": "モデルの取得が完了しました", - "successDeleteDescription": "モデルの削除が完了しました", - "someError": "問題が発生しました。後ほど再度お試しください。" - } + "webSearch": { + "heading": "ウェブ検索を管理する", + "searchMode": { + "label": "簡単なインターネット検索を実行する" + }, + "provider": { + "label": "検索エンジン", + "placeholder": "検索エンジンを選択する" + }, + "totalSearchResults": { + "label": "合計検索結果", + "placeholder": "合計検索結果を入力する" + }, + "visitSpecificWebsite": { + "label": "メッセージに記載されたウェブサイトを訪問してください" + } }, - "managePrompts": { - "title": "プロンプトを管理", - "addBtn": "新しいプロンプトを追加", - "option1": "通常", - "option2": "RAG", - "questionPrompt": "質問プロンプト", - "columns": { - "title": "タイトル", - "prompt": "プロンプト", - "type": "プロンプトタイプ", - "actions": "アクション" - }, - "systemPrompt": "システムプロンプト", - "quickPrompt": "クイックプロンプト", - "tooltip": { - "delete": "プロンプトを削除", - "edit": "プロンプトを編集" - }, - "confirm": { - "delete": "本当にこのプロンプトを削除しますか?この操作は元に戻せません。" - }, - "modal": { - "addTitle": "新しいプロンプトを追加", - "editTitle": "プロンプトを編集" - }, - "form": { - "title": { - "label": "タイトル", - "placeholder": "素晴らしいプロンプト", - "required": "タイトルを入力してください" - }, - "prompt": { - "label": "プロンプト", - "placeholder": "プロンプトを入力", - "required": "プロンプトを入力してください", - "help": "プロンプト内で{key}を変数として使用できます。" - }, - "isSystem": { - "label": "システムプロンプト" - }, - "btnSave": { - "saving": "プロンプトを追加中...", - "save": "プロンプトを追加" - }, - "btnEdit": { - "saving": "プロンプトを更新中...", - "save": "プロンプトを更新" - } - }, - "notification": { - "addSuccess": "プロンプトが追加されました", - "addSuccessDesc": "プロンプトが正常に追加されました", - "error": "エラー", - "someError": "問題が発生しました。後ほど再度お試しください。", - "updatedSuccess": "プロンプトが更新されました", - "updatedSuccessDesc": "プロンプトが正常に更新されました", - "deletedSuccess": "プロンプトが削除されました", - "deletedSuccessDesc": "プロンプトが正常に削除されました" - } + "system": { + "heading": "システム設定", + "deleteChatHistory": { + "label": "チャット履歴を削除する", + "button": "削除", + "confirm": "チャット履歴を削除してもよろしいですか?この操作は元に戻せません。" + }, + "export": { + "label": "チャット履歴、知識ベース、プロンプトをエクスポート", + "button": "データをエクスポート", + "success": "エクスポート成功" + }, + "import": { + "label": "チャット履歴、知識ベース、プロンプトをインポート", + "button": "データをインポート", + "success": "インポート成功", + "error": "インポートエラー" + } }, - "manageShare": { - "title": "共有を管理", - "heading": "ページ共有URLを設定", - "form": { - "url": { - "label": "ページ共有URL", - "placeholder": "ページ共有URLを入力", - "required": "ページ共有URLを入力してください!", - "help": "プライバシー保護のため、ページ共有を自身でホストし、そのURLをここに入力することができます。詳細" - } - }, - "webshare": { - "heading": "ウェブ共有", - "columns": { - "title": "タイトル", - "url": "URL", - "actions": "アクション" - }, - "tooltip": { - "delete": "共有を削除" - }, - "confirm": { - "delete": "本当にこの共有を削除しますか?この操作は元に戻せません。" - }, - "label": "ページ共有を管理する", - "description": "ページ共有機能を有効または無効にする" - }, - "notification": { - "pageShareSuccess": "ページ共有URLが正常に更新されました", - "someError": "問題が発生しました。後ほど再度お試しください。", - "webShareDeleteSuccess": "ウェブ共有が正常に削除されました" - } - }, - "ollamaSettings": { - "title": "Ollamaの設定", - "heading": "Ollamaを設定", - "settings": { - "ollamaUrl": { - "label": "OllamaのURL", - "placeholder": "OllamaのURLを入力" - }, - "advanced": { - "label": "Ollama URL の高度な設定", - "urlRewriteEnabled": { - "label": "カスタムOriginのURLを有効化または無効化する" - }, - "rewriteUrl": { - "label": "カスタムOriginのURL", - "placeholder": "カスタムOriginのURLを入力" - }, - "help": "PageAssistでOllamaに接続の問題がある場合は、カスタムOriginのURLを設定できます。設定の詳細については、ここをクリックしてください。" - } - } - }, - "manageSearch": { - "title": "Web検索の管理", - "heading": "Web検索を設定する" - }, - "about": { - "title": "About", - "heading": "About", - "chromeVersion": "Page Assistのバージョン", - "ollamaVersion": "Ollamaのバージョン", - "support": "Page Assistプロジェクトは、以下のプラットフォームで寄付やスポンサーシップをすることで支援できます:", - "koFi": "Ko-fiで支援する", - "githubSponsor": "GitHubでスポンサーする", - "githubRepo": "GitHubリポジトリ" - }, - "manageKnowledge": { - "title": "知識を管理する", - "heading": "知識ベースを構成する" - }, - "rag": { - "title": "RAGの設定", - "ragSettings": { - "label": "RAGの設定", - "model": { - "label": "エンベディングモデル", - "required": "モデルを選択してください", - "help": "`nomic-embed-text`などのエンベディングモデルの使用を強くおすすめします。", - "placeholder": "モデルを選択" - }, - "chunkSize": { - "label": "チャンクサイズ", - "placeholder": "チャンクサイズを入力", - "required": "チャンクサイズを入力してください" - }, - "chunkOverlap": { - "label": "チャンクオーバーラップ", - "placeholder": "チャンクオーバーラップを入力", - "required": "チャンクオーバーラップを入力してください" - } - }, - "prompt": { - "label": "RAGプロンプトを設定", - "option1": "通常", - "option2": "Web", - "alert": "ここでシステムプロンプトを設定することは非推奨となりました。プロンプトの追加や編集には「プロンプトを管理」セクションをご利用ください。このセクションは今後のリリースで削除される予定です。", - "systemPrompt": "システムプロンプト", - "systemPromptPlaceholder": "システムプロンプトを入力", - "webSearchPrompt": "Web検索プロンプト", - "webSearchPromptHelp": "プロンプトから`{search_results}`を削除しないでください。", - "webSearchPromptError": "Web検索プロンプトを入力してください", - "webSearchPromptPlaceholder": "Web検索プロンプトを入力", - "webSearchFollowUpPrompt": "Web検索フォローアッププロンプト", - "webSearchFollowUpPromptHelp": "プロンプトから`{chat_history}`と`{question}`を削除しないでください。", - "webSearchFollowUpPromptError": "Web検索フォローアッププロンプトを入力してください!", - "webSearchFollowUpPromptPlaceholder": "Web検索フォローアッププロンプト" - } + "tts": { + "heading": "テキスト読み上げ設定", + "ttsEnabled": { + "label": "テキスト読み上げを有効にする" + }, + "ttsProvider": { + "label": "テキスト読み上げプロバイダー", + "placeholder": "プロバイダーを選択" + }, + "ttsVoice": { + "label": "テキスト読み上げの音声", + "placeholder": "音声を選択" + }, + "ssmlEnabled": { + "label": "SSML (Speech Synthesis Markup Language) を有効にする" + } } -} \ No newline at end of file + }, + "manageModels": { + "title": "モデルを管理", + "addBtn": "新しいモデルを追加", + "columns": { + "name": "名前", + "digest": "ダイジェスト", + "modifiedAt": "修正日時", + "size": "サイズ", + "actions": "アクション" + }, + "expandedColumns": { + "parentModel": "親モデル", + "format": "フォーマット", + "family": "ファミリー", + "parameterSize": "パラメータサイズ", + "quantizationLevel": "量子化レベル" + }, + "tooltip": { + "delete": "モデルを削除", + "repull": "モデルを再取得" + }, + "confirm": { + "delete": "本当にこのモデルを削除しますか?", + "repull": "本当にこのモデルを再取得しますか?" + }, + "modal": { + "title": "新しいモデルを追加", + "placeholder": "モデル名を入力", + "pull": "モデルを取得" + }, + "notification": { + "pullModel": "モデルを取得中", + "pullModelDescription": "{{modelName}}モデルを取得中。詳細は拡張機能のアイコンをご確認ください。", + "success": "成功", + "error": "エラー", + "successDescription": "モデルの取得が完了しました", + "successDeleteDescription": "モデルの削除が完了しました", + "someError": "問題が発生しました。後ほど再度お試しください。" + } + }, + "managePrompts": { + "title": "プロンプトを管理", + "addBtn": "新しいプロンプトを追加", + "option1": "通常", + "option2": "RAG", + "questionPrompt": "質問プロンプト", + "columns": { + "title": "タイトル", + "prompt": "プロンプト", + "type": "プロンプトタイプ", + "actions": "アクション" + }, + "systemPrompt": "システムプロンプト", + "quickPrompt": "クイックプロンプト", + "tooltip": { + "delete": "プロンプトを削除", + "edit": "プロンプトを編集" + }, + "confirm": { + "delete": "本当にこのプロンプトを削除しますか?この操作は元に戻せません。" + }, + "modal": { + "addTitle": "新しいプロンプトを追加", + "editTitle": "プロンプトを編集" + }, + "form": { + "title": { + "label": "タイトル", + "placeholder": "素晴らしいプロンプト", + "required": "タイトルを入力してください" + }, + "prompt": { + "label": "プロンプト", + "placeholder": "プロンプトを入力", + "required": "プロンプトを入力してください", + "help": "プロンプト内で{key}を変数として使用できます。" + }, + "isSystem": { + "label": "システムプロンプト" + }, + "btnSave": { + "saving": "プロンプトを追加中...", + "save": "プロンプトを追加" + }, + "btnEdit": { + "saving": "プロンプトを更新中...", + "save": "プロンプトを更新" + } + }, + "notification": { + "addSuccess": "プロンプトが追加されました", + "addSuccessDesc": "プロンプトが正常に追加されました", + "error": "エラー", + "someError": "問題が発生しました。後ほど再度お試しください。", + "updatedSuccess": "プロンプトが更新されました", + "updatedSuccessDesc": "プロンプトが正常に更新されました", + "deletedSuccess": "プロンプトが削除されました", + "deletedSuccessDesc": "プロンプトが正常に削除されました" + } + }, + "manageShare": { + "title": "共有を管理", + "heading": "ページ共有URLを設定", + "form": { + "url": { + "label": "ページ共有URL", + "placeholder": "ページ共有URLを入力", + "required": "ページ共有URLを入力してください!", + "help": "プライバシー保護のため、ページ共有を自身でホストし、そのURLをここに入力することができます。詳細" + } + }, + "webshare": { + "heading": "ウェブ共有", + "columns": { + "title": "タイトル", + "url": "URL", + "actions": "アクション" + }, + "tooltip": { + "delete": "共有を削除" + }, + "confirm": { + "delete": "本当にこの共有を削除しますか?この操作は元に戻せません。" + }, + "label": "ページ共有を管理する", + "description": "ページ共有機能を有効または無効にする" + }, + "notification": { + "pageShareSuccess": "ページ共有URLが正常に更新されました", + "someError": "問題が発生しました。後ほど再度お試しください。", + "webShareDeleteSuccess": "ウェブ共有が正常に削除されました" + } + }, + "ollamaSettings": { + "title": "Ollamaの設定", + "heading": "Ollamaを設定", + "settings": { + "ollamaUrl": { + "label": "OllamaのURL", + "placeholder": "OllamaのURLを入力" + }, + "advanced": { + "label": "Ollama URL の高度な設定", + "urlRewriteEnabled": { + "label": "カスタムOriginのURLを有効化または無効化する" + }, + "rewriteUrl": { + "label": "カスタムOriginのURL", + "placeholder": "カスタムOriginのURLを入力" + }, + "headers": { + "label": "カスタムヘッダー", + "add": "ヘッダーを追加", + "key": { + "label": "ヘッダーキー", + "placeholder": "認証" + }, + "value": { + "label": "ヘッダー値", + "placeholder": "ベアラートークン" + } + }, + "help": "PageAssistでOllamaに接続の問題がある場合は、カスタムOriginのURLを設定できます。設定の詳細については、ここをクリックしてください。" + } + } + }, + "manageSearch": { + "title": "Web検索の管理", + "heading": "Web検索を設定する" + }, + "about": { + "title": "About", + "heading": "About", + "chromeVersion": "Page Assistのバージョン", + "ollamaVersion": "Ollamaのバージョン", + "support": "Page Assistプロジェクトは、以下のプラットフォームで寄付やスポンサーシップをすることで支援できます:", + "koFi": "Ko-fiで支援する", + "githubSponsor": "GitHubでスポンサーする", + "githubRepo": "GitHubリポジトリ" + }, + "manageKnowledge": { + "title": "知識を管理する", + "heading": "知識ベースを構成する" + }, + "rag": { + "title": "RAGの設定", + "ragSettings": { + "label": "RAGの設定", + "model": { + "label": "エンベディングモデル", + "required": "モデルを選択してください", + "help": "`nomic-embed-text`などのエンベディングモデルの使用を強くおすすめします。", + "placeholder": "モデルを選択" + }, + "chunkSize": { + "label": "チャンクサイズ", + "placeholder": "チャンクサイズを入力", + "required": "チャンクサイズを入力してください" + }, + "chunkOverlap": { + "label": "チャンクオーバーラップ", + "placeholder": "チャンクオーバーラップを入力", + "required": "チャンクオーバーラップを入力してください" + } + }, + "prompt": { + "label": "RAGプロンプトを設定", + "option1": "通常", + "option2": "Web", + "alert": "ここでシステムプロンプトを設定することは非推奨となりました。プロンプトの追加や編集には「プロンプトを管理」セクションをご利用ください。このセクションは今後のリリースで削除される予定です。", + "systemPrompt": "システムプロンプト", + "systemPromptPlaceholder": "システムプロンプトを入力", + "webSearchPrompt": "Web検索プロンプト", + "webSearchPromptHelp": "プロンプトから`{search_results}`を削除しないでください。", + "webSearchPromptError": "Web検索プロンプトを入力してください", + "webSearchPromptPlaceholder": "Web検索プロンプトを入力", + "webSearchFollowUpPrompt": "Web検索フォローアッププロンプト", + "webSearchFollowUpPromptHelp": "プロンプトから`{chat_history}`と`{question}`を削除しないでください。", + "webSearchFollowUpPromptError": "Web検索フォローアッププロンプトを入力してください!", + "webSearchFollowUpPromptPlaceholder": "Web検索フォローアッププロンプト" + } + }, + "chromeAiSettings": { + "title": "Chrome AI設定" +} +} diff --git a/src/assets/locale/ml/chrome.json b/src/assets/locale/ml/chrome.json new file mode 100644 index 0000000..0b829f1 --- /dev/null +++ b/src/assets/locale/ml/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "ക്രോം എഐ കോൺഫിഗർ ചെയ്യുക", + "status": { + "label": "പേജ് അസിസ്റ്റിൽ ക്രോം എഐ പിന്തുണ സജ്ജമാക്കുക അല്ലെങ്കിൽ ഡിസബിൾ ചെയ്യുക" + }, + "error": { + "browser_not_supported": "ക്രോത്തിന്റെ ഈ പതിപ്പ് ജെമിനി നാനോ മോഡലിനെ പിന്തുണയ്ക്കുന്നില്ല. പതിപ്പ് 127 അല്ലെങ്കിൽ അതിനുശേഷം അപ്ഡേറ്റ് ചെയ്യുക.", + "ai_not_supported": "ക്രമീകരണം chrome://flags/#prompt-api-for-gemini-nano സജ്ജമാക്കപ്പെട്ടിട്ടില്ല. ദയവായി അതിനെ സജ്ജമാക്കുക.", + "ai_not_ready": "ജെമിനി നാനോ ഇപ്പോഴും സജ്ജമല്ല; നിങ്ങൾ ക്രോം ക്രമീകരണങ്ങൾ രണ്ടുതവണ പരിശോധിക്കണം.", + "internal_error": "ഒരു ആന്തരിക പിശക് സംഭവിച്ചു. ദയവായി കുറച്ചുദിവസം ശേഷം വീണ്ടും ശ്രമിക്കുക." + }, + "errorDescription": "ക്രോം എഐ ഉപയോഗിക്കുന്നതിന്, നിലവിൽ ഡെവ്, കാനറി ചാനലുകളിൽ ലഭ്യമായ 127-നെക്കാൾ ഉയർന്ന ബ്രൗസർ പതിപ്പ് ആവശ്യമാണ്. പിന്തുണയ്ക്കുന്ന പതിപ്പ് ഡൗൺലോഡ് ചെയ്ത ശേഷം, ഈ ചുവടുപടികൾ പിന്തുടരുക:\n\n1. `chrome://flags/#prompt-api-for-gemini-nano`-ലേക്ക് പോയി \"എനേബിൾ\" തിരഞ്ഞെടുക്കുക.\n2. `chrome://flags/#optimization-guide-on-device-model`-ലേക്ക് പോയി \"EnabledBypassPrefRequirement\" തിരഞ്ഞെടുക്കുക.\n3. `chrome://components`-ലേക്ക് പോയി, \"Optimization Guide On Device Model\" തിരയുക, \"അപ്ഡേറ്റ് പരിശോധിക്കുക\" ക്ലിക്ക് ചെയ്യുക. ഇത് മോഡൽ ഡൗൺലോഡ് ചെയ്യും. ക്രമീകരണങ്ങൾ കാണുന്നില്ലെങ്കിൽ, ചുവടുപടികൾ 1, 2 ആവർത്തിച്ച് ബ്രൗസർ വീണ്ടും തുറക്കുക." +} diff --git a/src/assets/locale/ml/settings.json b/src/assets/locale/ml/settings.json index 46780df..5e6c1a6 100644 --- a/src/assets/locale/ml/settings.json +++ b/src/assets/locale/ml/settings.json @@ -1,295 +1,310 @@ { - "generalSettings": { - "title": "പൊതുവായ സെറ്റിംഗുകൾ", - "settings": { - "heading": "വെബ് UI സെറ്റിംഗുകൾ", - "speechRecognitionLang": { - "label": "സംഭാഷണ തിരിച്ചറിയല്‍ ഭാഷ", - "placeholder": "ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക" - }, - "language": { - "label": "ഭാഷ", - "placeholder": "ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക" - }, - "darkMode": { - "label": "തീം മാറ്റുക", - "options": { - "light": "ലൈറ്റ്", - "dark": "ഡാര്‍ക്ക്" - } - }, - "searchMode": { - "label": "സാധാരണ ഇന്റർനെറ്റ് അന്വേഷണം നടത്തുക" - }, - "copilotResumeLastChat": { - "label": "സൈഡ്പാനൽ തുറക്കുമ്പോൾ അവസാനത്തെ ചാറ്റ് പുനരാരംഭിക്കുക (Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "നിലവിലുള്ള ചാറ്റ് മോഡൽ ക്രമീകരണങ്ങൾ മറയ്ക്കുക" - } - }, - "webSearch": { - "heading": "വെബ്ബ് തിരച്ചിൽ നിയന്ത്രിക്കുക", - "searchMode": { - "label": "സരളമായ ഇന്റർനെറ്റ് തിരച്ചിൽ നടത്തുക" - }, - "provider": { - "label": "തിരച്ചിൽ എഞ്ചിൻ", - "placeholder": "തിരച്ചിൽ എഞ്ചിൻ തിരഞ്ഞെടുക്കുക" - }, - "totalSearchResults": { - "label": "ആകെ തിരച്ചിൽ ഫലങ്ങൾ", - "placeholder": "ആകെ തിരച്ചിൽ ഫലങ്ങളുടെ എണ്ണം നൽകുക" - }, - "visitSpecificWebsite": { - "label": "സന്ദേശത്തിൽ പറയുന്ന വെബ്സൈറ്റ് സന്ദർശിക്കുക." - } - }, - "system": { - "heading": "സിസ്റ്റം ക്രമീകരണങ്ങൾ", - "deleteChatHistory": { - "label": "ചാറ്റ് ചരിത്രം ഇല്ലാതാക്കുക", - "button": "ഇല്ലാതാക്കുക", - "confirm": "നിങ്ങളുടെ ചാറ്റ് ചരിത്രം ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിന്വലിക്കാനാവില്ല." - }, - "export": { - "label": "ചാറ്റ് ചരിത്രം, അറിവ് അടിസ്ഥാനം, പ്രോംപ്റ്റുകൾ എക്സ്പോർട്ട് ചെയ്യുക", - "button": "ഡാറ്റ എക്സ്പോർട്ട് ചെയ്യുക", - "success": "എക്സ്പോർട്ട് വിജയകരമായി" - }, - "import": { - "label": "ചാറ്റ് ചരിത്രം, അറിവ് അടിസ്ഥാനം, പ്രോംപ്റ്റുകൾ ഇമ്പോർട്ട് ചെയ്യുക", - "button": "ഡാറ്റ ഇമ്പോർട്ട് ചെയ്യുക", - "success": "ഇമ്പോർട്ട് വിജയകരമായി", - "error": "ഇമ്പോർട്ട് പിശക്" - } - }, - "tts": { - "heading": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ക്രമീകരണങ്ങൾ", - "ttsEnabled": { - "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് പ്രവർത്തനക്ഷമമാക്കുക" - }, - "ttsProvider": { - "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് പ്രോവൈഡർ", - "placeholder": "ഒരു പ്രോവൈഡർ തിരഞ്ഞെടുക്കുക" - }, - "ttsVoice": { - "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് വോയ്സ്", - "placeholder": "ഒരു വോയ്സ് തിരഞ്ഞെടുക്കുക" - }, - "ssmlEnabled": { - "label": "SSML (സ്പീച്ച് സിന്തസിസ് മാർക്കപ്പ് ലാംഗ്വേജ്) പ്രവർത്തനക്ഷമമാക്കുക" - } + "generalSettings": { + "title": "പൊതുവായ സെറ്റിംഗുകൾ", + "settings": { + "heading": "വെബ് UI സെറ്റിംഗുകൾ", + "speechRecognitionLang": { + "label": "സംഭാഷണ തിരിച്ചറിയല്‍ ഭാഷ", + "placeholder": "ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക" + }, + "language": { + "label": "ഭാഷ", + "placeholder": "ഒരു ഭാഷ തിരഞ്ഞെടുക്കുക" + }, + "darkMode": { + "label": "തീം മാറ്റുക", + "options": { + "light": "ലൈറ്റ്", + "dark": "ഡാര്‍ക്ക്" } + }, + "searchMode": { + "label": "സാധാരണ ഇന്റർനെറ്റ് അന്വേഷണം നടത്തുക" + }, + "copilotResumeLastChat": { + "label": "സൈഡ്പാനൽ തുറക്കുമ്പോൾ അവസാനത്തെ ചാറ്റ് പുനരാരംഭിക്കുക (Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "നിലവിലുള്ള ചാറ്റ് മോഡൽ ക്രമീകരണങ്ങൾ മറയ്ക്കുക" + } }, - "manageModels": { - "title": "മോഡലുകള്‍ കൈകാര്യം ചെയ്യുക", - "addBtn": "പുതിയ മോഡല്‍ ചേര്‍ക്കുക", - "columns": { - "name": "പേര്", - "digest": "ഡൈജസ്റ്റ്", - "modifiedAt": "അവസാനമായി പരിഷ്‌കരിച്ചത്", - "size": "വലുപ്പം", - "actions": "പ്രവർത്തനങ്ങൾ" - }, - "expandedColumns": { - "parentModel": "പാരന്റ് മോഡല്‍", - "format": "ഫോര്‍മാറ്റ്", - "family": "കുടുംബം", - "parameterSize": "പാരാമീറ്റര്‍ വലുപ്പം", - "quantizationLevel": "ക്വാണ്ടൈസേഷന്‍ ലെവല്‍" - }, - "tooltip": { - "delete": "മോഡല്‍ ഇല്ലാതാക്കുക", - "repull": "മോഡല്‍ വീണ്ടും ലഭ്യമാക്കുക" - }, - "confirm": { - "delete": "ഈ മോഡല്‍ ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", - "repull": "ഈ മോഡല്‍ വീണ്ടും ലഭ്യമാക്കണമെന്ന് തീർച്ചയാണോ?" - }, - "modal": { - "title": "പുതിയ മോഡല്‍ ചേര്‍ക്കുക", - "placeholder": "മോഡല്‍ പേര് നല്‍കുക", - "pull": "മോഡല്‍ ലഭ്യമാക്കുക" - }, - "notification": { - "pullModel": "മോഡല്‍ ലഭ്യമാക്കുന്നു", - "pullModelDescription": "{{modelName}} മോഡല്‍ ലഭ്യമാക്കുന്നു. കൂടുതല്‍ വിവരങ്ങള്‍ക്കായി എക്‌സ്റ്റെന്‍ഷന്‍ ഐക്കണ്‍ പരിശോധിക്കുക.", - "success": "വിജയം", - "error": "പിശക്", - "successDescription": "മോഡല്‍ വിജയകരമായി ലഭ്യമാക്കി", - "successDeleteDescription": "മോഡല്‍ വിജയകരമായി ഇല്ലാതാക്കി", - "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" - } + "webSearch": { + "heading": "വെബ്ബ് തിരച്ചിൽ നിയന്ത്രിക്കുക", + "searchMode": { + "label": "സരളമായ ഇന്റർനെറ്റ് തിരച്ചിൽ നടത്തുക" + }, + "provider": { + "label": "തിരച്ചിൽ എഞ്ചിൻ", + "placeholder": "തിരച്ചിൽ എഞ്ചിൻ തിരഞ്ഞെടുക്കുക" + }, + "totalSearchResults": { + "label": "ആകെ തിരച്ചിൽ ഫലങ്ങൾ", + "placeholder": "ആകെ തിരച്ചിൽ ഫലങ്ങളുടെ എണ്ണം നൽകുക" + }, + "visitSpecificWebsite": { + "label": "സന്ദേശത്തിൽ പറയുന്ന വെബ്സൈറ്റ് സന്ദർശിക്കുക." + } }, - "managePrompts": { - "title": "പ്രോംപ്റ്റുകള്‍ കൈകാര്യം ചെയ്യുക", - "addBtn": "പുതിയ പ്രോംപ്റ്റ് ചേര്‍ക്കുക", - "columns": { - "title": "തലക്കെട്ട്", - "prompt": "പ്രോംപ്റ്റ്", - "type": "പ്രോംപ്റ്റ് തരം", - "actions": "പ്രവർത്തനങ്ങൾ" - }, - "option1": "സാധാരണ", - "option2": "RAG", - "questionPrompt": "ചോദ്യ പ്രോംപ്റ്റ്", - "systemPrompt": "സിസ്റ്റം പ്രോംപ്റ്റ്", - "quickPrompt": "വേഗത്തിലുള്ള പ്രോംപ്റ്റ്", - "tooltip": { - "delete": "പ്രോംപ്റ്റ് ഇല്ലാതാക്കുക", - "edit": "പ്രോംപ്റ്റ് എഡിറ്റുചെയ്യുക" - }, - "confirm": { - "delete": "ഈ പ്രോംപ്റ്റ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിൻവലിക്കാനാകില്ല." - }, - "modal": { - "addTitle": "പുതിയ പ്രോംപ്റ്റ് ചേര്‍ക്കുക", - "editTitle": "പ്രോംപ്റ്റ് എഡിറ്റുചെയ്യുക" - }, - "form": { - "title": { - "label": "തലക്കെട്ട്", - "placeholder": "എന്‍റെ അതുല്യമായ പ്രോംപ്റ്റ്", - "required": "ദയവായി ഒരു തലക്കെട്ട് നല്കുക" - }, - "prompt": { - "label": "പ്രോംപ്റ്റ്", - "placeholder": "പ്രോംപ്റ്റ് നല്കുക", - "required": "ദയവായി ഒരു പ്രോംപ്റ്റ് നല്കുക", - "help": "നിങ്ങള്‍ക്ക് {key} എന്ന രീതിയില്‍ പ്രോംപ്റ്റില്‍ വേരിയബിളുകള്‍ ഉപയോഗിക്കാവുന്നതാണ്." - }, - "isSystem": { - "label": "സിസ്റ്റം പ്രോംപ്റ്റ് ആണോ" - }, - "btnSave": { - "saving": "പ്രോംപ്റ്റ് ചേര്‍ക്കുന്നു...", - "save": "പ്രോംപ്റ്റ് ചേര്‍ക്കുക" - }, - "btnEdit": { - "saving": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്യുന്നു...", - "save": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്യുക" - } - }, - "notification": { - "addSuccess": "പ്രോംപ്റ്റ് ചേർത്തു", - "addSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി ചേർത്തു", - "error": "പിശക്", - "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക", - "updatedSuccess": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്‌തു", - "updatedSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "deletedSuccess": "പ്രോംപ്റ്റ് ഇല്ലാതാക്കി", - "deletedSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി ഇല്ലാതാക്കി" - } + "system": { + "heading": "സിസ്റ്റം ക്രമീകരണങ്ങൾ", + "deleteChatHistory": { + "label": "ചാറ്റ് ചരിത്രം ഇല്ലാതാക്കുക", + "button": "ഇല്ലാതാക്കുക", + "confirm": "നിങ്ങളുടെ ചാറ്റ് ചരിത്രം ഇല്ലാതാക്കണമെന്ന് ഉറപ്പാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിന്വലിക്കാനാവില്ല." + }, + "export": { + "label": "ചാറ്റ് ചരിത്രം, അറിവ് അടിസ്ഥാനം, പ്രോംപ്റ്റുകൾ എക്സ്പോർട്ട് ചെയ്യുക", + "button": "ഡാറ്റ എക്സ്പോർട്ട് ചെയ്യുക", + "success": "എക്സ്പോർട്ട് വിജയകരമായി" + }, + "import": { + "label": "ചാറ്റ് ചരിത്രം, അറിവ് അടിസ്ഥാനം, പ്രോംപ്റ്റുകൾ ഇമ്പോർട്ട് ചെയ്യുക", + "button": "ഡാറ്റ ഇമ്പോർട്ട് ചെയ്യുക", + "success": "ഇമ്പോർട്ട് വിജയകരമായി", + "error": "ഇമ്പോർട്ട് പിശക്" + } }, - "manageShare": { - "title": "പങ്കിടുന്നത് കൈകാര്യം ചെയ്യുക", - "heading": "പേജ് പങ്കിടാനുള്ള URL കോൺഫിഗർ ചെയ്യുക", - "form": { - "url": { - "label": "പേജ് പങ്കിടാനുള്ള URL", - "placeholder": "പേജ് പങ്കിടാനുള്ള URL നല്കുക", - "required": "ദയവായി നിങ്ങളുടെ പേജ് പങ്കിടാനുള്ള URL നല്കുക!", - "help": "സ്വകാര്യതക്കായി, നിങ്ങള്‍ക്ക് സ്വന്തമായി പേജ് പങ്കിടുന്ന സൗകര്യം ഹോസ്റ്റ് ചെയ്യാനും അവിടെയുള്ള URL ഇവിടെ നല്കാനും കഴിയും. കൂടുതല്‍ അറിയുക." - } - }, - "webshare": { - "heading": "വെബ് പങ്കിടല്‍", - "columns": { - "title": "തലക്കെട്ട്", - "url": "URL", - "actions": "പ്രവർത്തനങ്ങൾ" - }, - "tooltip": { - "delete": "പങ്കിടല്‍ ഇല്ലാതാക്കുക" - }, - "confirm": { - "delete": "ഈ പങ്കിടല്‍ ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിൻവലിക്കാനാകില്ല." - }, - "label": "പേജ് ഷെയർ നിയന്ത്രിക്കുക", - "description": "പേജ് ഷെയർ സാങ്കേതികത സജ്ജീകരിക്കുക അല്ലെങ്കിൽ നിലവിളിക്കുക ." - }, - "notification": { - "pageShareSuccess": "പേജ് പങ്കിടാനുള്ള URL വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", - "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക", - "webShareDeleteSuccess": "വെബ് പങ്കിടല്‍ വിജയകരമായി ഇല്ലാതാക്കി" - } - }, - "ollamaSettings": { - "title": "Ollama സെറ്റിംഗുകൾ", - "heading": "Ollama കോൺഫിഗർ ചെയ്യുക", - "settings": { - "ollamaUrl": { - "label": "Ollama URL", - "placeholder": "Ollama URL നല്കുക" - }, - "advanced": { - "label": "Advance Ollama URL Configuration", - "urlRewriteEnabled": { - "label": "Enable or Disable Custom Origin URL" - }, - "rewriteUrl": { - "label": "Custom Origin URL", - "placeholder": "Enter Custom Origin URL" - }, - "help": "ഏജ് അസിസ്റ്റന്റിൽ Ollama-യുമായി ബന്ധപ്പെടുമ്പോൾ ബന്ധതടസ്സം ഉണ്ടെങ്കിൽ, നിങ്ങൾക്ക് ഒരു വ്യക്തിഗത അസ്ഥിരത്വം URL കോൺഫിഗർ ചെയ്യാം. കോൺഫിഗറേഷനെക്കുറിച്ച് കൂടുതലറിയാൻ, ഇവിടെ ക്ലിക്കുചെയ്യുക." - } - } - }, - "manageSearch": { - "heading": "Web തിരയൽ സജ്ജമാക്കുക", - "title": "Web തിരയൽ നിയന്ത്രിക്കുക" - }, - "about": { - "title": "വിവരങ്ങൾ", - "heading": "വിവരങ്ങൾ", - "chromeVersion": "പേജ് അസിസ്റ്റ് വേർഷൻ", - "ollamaVersion": "ഓളാമ വേർഷൻ", - "support": "താഴെ പറയുന്ന പ്ലാറ്റ്ഫോമുകളിലൂടെ ദാനം ചെയ്യുകയോ സ്പോൺസർ ചെയ്യുകയോ ചെയ്ത് പേജ് അസിസ്റ്റ് പ്രോജക്റ്റിനെ പിന്തുണയ്ക്കാവുന്നതാണ്:", - "koFi": "കോഫിയിൽ പിന്തുണയ്ക്കുക", - "githubSponsor": "ഗിറ്റ്ഹബ്ബിൽ സ്പോൺസർ ചെയ്യുക", - "githubRepo": "ഗിറ്റ്ഹബ്ബ് റെപ്പോസിറ്ററി" - }, - "manageKnowledge": { - "title": "വിജ്ഞാനം നിര്‍വ്വഹിക്കുക", - "heading": "വിജ്ഞാനാധാരം കോണ്‍ഫിഗര്‍ ചെയ്യുക" - }, - "rag": { - "title": "RAG സെറ്റിംഗുകൾ", - "ragSettings": { - "label": "RAG സെറ്റിംഗുകൾ", - "model": { - "label": "എംബെഡിംഗ് മോഡല്‍", - "required": "ദയവായി ഒരു മോഡല്‍ തിരഞ്ഞെടുക്കുക", - "help": "`nomic-embed-text` പോലുള്ള എംബെഡിംഗ് മോഡലുകള്‍ ഉപയോഗിക്കുന്നത് വളരെ നന്നായിരിക്കും.", - "placeholder": "ഒരു മോഡല്‍ തിരഞ്ഞെടുക്കുക" - }, - "chunkSize": { - "label": "ചങ്ക് വലുപ്പം", - "placeholder": "ചങ്ക് വലുപ്പം നല്കുക", - "required": "ദയവായി ചങ്ക് വലുപ്പം നല്കുക" - }, - "chunkOverlap": { - "label": "ചങ്ക് ഓവര്‍ലാപ്പ്", - "placeholder": "ചങ്ക് ഓവര്‍ലാപ്പ് നല്കുക", - "required": "ദയവായി ചങ്ക് ഓവര്‍ലാപ്പ് നല്കുക" - } - }, - "prompt": { - "label": "RAG പ്രോംപ്റ്റ് കോൺഫിഗർ ചെയ്യുക", - "option1": "സാധാരണ", - "option2": "വെബ്", - "alert": "സിസ്റ്റം പ്രോംപ്റ്റ് ഇവിടെ കോൺഫിഗർ ചെയ്യുന്നത് പഴയൗഖികമായി. ദയവായി പ്രോംപ്റ്റുകള്‍ ചേര്‍ക്കാനോ എഡിറ്റുചെയ്യാനോ മാനേജ് പ്രോംപ്റ്റ്‌സ് സെക്ഷന്‍ ഉപയോഗിക്കുക. ഈ സെക്ഷന്‍ ഭാവിയില്‍ നീക്കം ചെയ്യപ്പെടും.", - "systemPrompt": "സിസ്റ്റം പ്രോംപ്റ്റ്", - "systemPromptPlaceholder": "സിസ്റ്റം പ്രോംപ്റ്റ് നല്കുക", - "webSearchPrompt": "വെബ് തിരയല്‍ പ്രോംപ്റ്റ്", - "webSearchPromptHelp": "പ്രോംപ്റ്റില്‍ നിന്ന് `{search_results}` നീക്കം ചെയ്യരുത്.", - "webSearchPromptError": "ദയവായി ഒരു വെബ് തിരയല്‍ പ്രോംപ്റ്റ് നല്കുക", - "webSearchPromptPlaceholder": "വെബ് തിരയല്‍ പ്രോംപ്റ്റ് നല്കുക", - "webSearchFollowUpPrompt": "വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ്", - "webSearchFollowUpPromptHelp": "പ്രോംപ്റ്റില്‍ നിന്ന് `{chat_history}` യും `{question}` യും നീക്കം ചെയ്യരുത്.", - "webSearchFollowUpPromptError": "ദയവായി നിങ്ങളുടെ വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ് നല്കുക!", - "webSearchFollowUpPromptPlaceholder": "നിങ്ങളുടെ വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ്" - } + "tts": { + "heading": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് ക്രമീകരണങ്ങൾ", + "ttsEnabled": { + "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് പ്രവർത്തനക്ഷമമാക്കുക" + }, + "ttsProvider": { + "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് പ്രോവൈഡർ", + "placeholder": "ഒരു പ്രോവൈഡർ തിരഞ്ഞെടുക്കുക" + }, + "ttsVoice": { + "label": "ടെക്സ്റ്റ്-ടു-സ്പീച്ച് വോയ്സ്", + "placeholder": "ഒരു വോയ്സ് തിരഞ്ഞെടുക്കുക" + }, + "ssmlEnabled": { + "label": "SSML (സ്പീച്ച് സിന്തസിസ് മാർക്കപ്പ് ലാംഗ്വേജ്) പ്രവർത്തനക്ഷമമാക്കുക" + } } -} \ No newline at end of file + }, + "manageModels": { + "title": "മോഡലുകള്‍ കൈകാര്യം ചെയ്യുക", + "addBtn": "പുതിയ മോഡല്‍ ചേര്‍ക്കുക", + "columns": { + "name": "പേര്", + "digest": "ഡൈജസ്റ്റ്", + "modifiedAt": "അവസാനമായി പരിഷ്‌കരിച്ചത്", + "size": "വലുപ്പം", + "actions": "പ്രവർത്തനങ്ങൾ" + }, + "expandedColumns": { + "parentModel": "പാരന്റ് മോഡല്‍", + "format": "ഫോര്‍മാറ്റ്", + "family": "കുടുംബം", + "parameterSize": "പാരാമീറ്റര്‍ വലുപ്പം", + "quantizationLevel": "ക്വാണ്ടൈസേഷന്‍ ലെവല്‍" + }, + "tooltip": { + "delete": "മോഡല്‍ ഇല്ലാതാക്കുക", + "repull": "മോഡല്‍ വീണ്ടും ലഭ്യമാക്കുക" + }, + "confirm": { + "delete": "ഈ മോഡല്‍ ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ?", + "repull": "ഈ മോഡല്‍ വീണ്ടും ലഭ്യമാക്കണമെന്ന് തീർച്ചയാണോ?" + }, + "modal": { + "title": "പുതിയ മോഡല്‍ ചേര്‍ക്കുക", + "placeholder": "മോഡല്‍ പേര് നല്‍കുക", + "pull": "മോഡല്‍ ലഭ്യമാക്കുക" + }, + "notification": { + "pullModel": "മോഡല്‍ ലഭ്യമാക്കുന്നു", + "pullModelDescription": "{{modelName}} മോഡല്‍ ലഭ്യമാക്കുന്നു. കൂടുതല്‍ വിവരങ്ങള്‍ക്കായി എക്‌സ്റ്റെന്‍ഷന്‍ ഐക്കണ്‍ പരിശോധിക്കുക.", + "success": "വിജയം", + "error": "പിശക്", + "successDescription": "മോഡല്‍ വിജയകരമായി ലഭ്യമാക്കി", + "successDeleteDescription": "മോഡല്‍ വിജയകരമായി ഇല്ലാതാക്കി", + "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക" + } + }, + "managePrompts": { + "title": "പ്രോംപ്റ്റുകള്‍ കൈകാര്യം ചെയ്യുക", + "addBtn": "പുതിയ പ്രോംപ്റ്റ് ചേര്‍ക്കുക", + "columns": { + "title": "തലക്കെട്ട്", + "prompt": "പ്രോംപ്റ്റ്", + "type": "പ്രോംപ്റ്റ് തരം", + "actions": "പ്രവർത്തനങ്ങൾ" + }, + "option1": "സാധാരണ", + "option2": "RAG", + "questionPrompt": "ചോദ്യ പ്രോംപ്റ്റ്", + "systemPrompt": "സിസ്റ്റം പ്രോംപ്റ്റ്", + "quickPrompt": "വേഗത്തിലുള്ള പ്രോംപ്റ്റ്", + "tooltip": { + "delete": "പ്രോംപ്റ്റ് ഇല്ലാതാക്കുക", + "edit": "പ്രോംപ്റ്റ് എഡിറ്റുചെയ്യുക" + }, + "confirm": { + "delete": "ഈ പ്രോംപ്റ്റ് ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിൻവലിക്കാനാകില്ല." + }, + "modal": { + "addTitle": "പുതിയ പ്രോംപ്റ്റ് ചേര്‍ക്കുക", + "editTitle": "പ്രോംപ്റ്റ് എഡിറ്റുചെയ്യുക" + }, + "form": { + "title": { + "label": "തലക്കെട്ട്", + "placeholder": "എന്‍റെ അതുല്യമായ പ്രോംപ്റ്റ്", + "required": "ദയവായി ഒരു തലക്കെട്ട് നല്കുക" + }, + "prompt": { + "label": "പ്രോംപ്റ്റ്", + "placeholder": "പ്രോംപ്റ്റ് നല്കുക", + "required": "ദയവായി ഒരു പ്രോംപ്റ്റ് നല്കുക", + "help": "നിങ്ങള്‍ക്ക് {key} എന്ന രീതിയില്‍ പ്രോംപ്റ്റില്‍ വേരിയബിളുകള്‍ ഉപയോഗിക്കാവുന്നതാണ്." + }, + "isSystem": { + "label": "സിസ്റ്റം പ്രോംപ്റ്റ് ആണോ" + }, + "btnSave": { + "saving": "പ്രോംപ്റ്റ് ചേര്‍ക്കുന്നു...", + "save": "പ്രോംപ്റ്റ് ചേര്‍ക്കുക" + }, + "btnEdit": { + "saving": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്യുന്നു...", + "save": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്യുക" + } + }, + "notification": { + "addSuccess": "പ്രോംപ്റ്റ് ചേർത്തു", + "addSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി ചേർത്തു", + "error": "പിശക്", + "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക", + "updatedSuccess": "പ്രോംപ്റ്റ് അപ്ഡേറ്റ് ചെയ്‌തു", + "updatedSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "deletedSuccess": "പ്രോംപ്റ്റ് ഇല്ലാതാക്കി", + "deletedSuccessDesc": "പ്രോംപ്റ്റ് വിജയകരമായി ഇല്ലാതാക്കി" + } + }, + "manageShare": { + "title": "പങ്കിടുന്നത് കൈകാര്യം ചെയ്യുക", + "heading": "പേജ് പങ്കിടാനുള്ള URL കോൺഫിഗർ ചെയ്യുക", + "form": { + "url": { + "label": "പേജ് പങ്കിടാനുള്ള URL", + "placeholder": "പേജ് പങ്കിടാനുള്ള URL നല്കുക", + "required": "ദയവായി നിങ്ങളുടെ പേജ് പങ്കിടാനുള്ള URL നല്കുക!", + "help": "സ്വകാര്യതക്കായി, നിങ്ങള്‍ക്ക് സ്വന്തമായി പേജ് പങ്കിടുന്ന സൗകര്യം ഹോസ്റ്റ് ചെയ്യാനും അവിടെയുള്ള URL ഇവിടെ നല്കാനും കഴിയും. കൂടുതല്‍ അറിയുക." + } + }, + "webshare": { + "heading": "വെബ് പങ്കിടല്‍", + "columns": { + "title": "തലക്കെട്ട്", + "url": "URL", + "actions": "പ്രവർത്തനങ്ങൾ" + }, + "tooltip": { + "delete": "പങ്കിടല്‍ ഇല്ലാതാക്കുക" + }, + "confirm": { + "delete": "ഈ പങ്കിടല്‍ ഇല്ലാതാക്കണമെന്ന് തീർച്ചയാണോ? ഈ പ്രവർത്തനം പിന്നീട് പിൻവലിക്കാനാകില്ല." + }, + "label": "പേജ് ഷെയർ നിയന്ത്രിക്കുക", + "description": "പേജ് ഷെയർ സാങ്കേതികത സജ്ജീകരിക്കുക അല്ലെങ്കിൽ നിലവിളിക്കുക ." + }, + "notification": { + "pageShareSuccess": "പേജ് പങ്കിടാനുള്ള URL വിജയകരമായി അപ്ഡേറ്റ് ചെയ്തു", + "someError": "എന്തോ തെറ്റായി. ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക", + "webShareDeleteSuccess": "വെബ് പങ്കിടല്‍ വിജയകരമായി ഇല്ലാതാക്കി" + } + }, + "ollamaSettings": { + "title": "Ollama സെറ്റിംഗുകൾ", + "heading": "Ollama കോൺഫിഗർ ചെയ്യുക", + "settings": { + "ollamaUrl": { + "label": "Ollama URL", + "placeholder": "Ollama URL നല്കുക" + }, + "advanced": { + "label": "Advance Ollama URL Configuration", + "urlRewriteEnabled": { + "label": "Enable or Disable Custom Origin URL" + }, + "rewriteUrl": { + "label": "Custom Origin URL", + "placeholder": "Enter Custom Origin URL" + }, + "headers": { + "label": "കസ്റ്റം തലക്കെട്ടുകൾ", + "add": "തലക്കെട്ട് ചേർക്കുക", + "key": { + "label": "തലക്കെട്ട് കീ", + "placeholder": "അധികൃതപെടുത്തൽ" + }, + "value": { + "label": "തലക്കെട്ട് മൂല്യം", + "placeholder": "ബെയറർ ടോക്കൺ" + } + }, + "help": "ഏജ് അസിസ്റ്റന്റിൽ Ollama-യുമായി ബന്ധപ്പെടുമ്പോൾ ബന്ധതടസ്സം ഉണ്ടെങ്കിൽ, നിങ്ങൾക്ക് ഒരു വ്യക്തിഗത അസ്ഥിരത്വം URL കോൺഫിഗർ ചെയ്യാം. കോൺഫിഗറേഷനെക്കുറിച്ച് കൂടുതലറിയാൻ, ഇവിടെ ക്ലിക്കുചെയ്യുക." + } + } + }, + "manageSearch": { + "heading": "Web തിരയൽ സജ്ജമാക്കുക", + "title": "Web തിരയൽ നിയന്ത്രിക്കുക" + }, + "about": { + "title": "വിവരങ്ങൾ", + "heading": "വിവരങ്ങൾ", + "chromeVersion": "പേജ് അസിസ്റ്റ് വേർഷൻ", + "ollamaVersion": "ഓളാമ വേർഷൻ", + "support": "താഴെ പറയുന്ന പ്ലാറ്റ്ഫോമുകളിലൂടെ ദാനം ചെയ്യുകയോ സ്പോൺസർ ചെയ്യുകയോ ചെയ്ത് പേജ് അസിസ്റ്റ് പ്രോജക്റ്റിനെ പിന്തുണയ്ക്കാവുന്നതാണ്:", + "koFi": "കോഫിയിൽ പിന്തുണയ്ക്കുക", + "githubSponsor": "ഗിറ്റ്ഹബ്ബിൽ സ്പോൺസർ ചെയ്യുക", + "githubRepo": "ഗിറ്റ്ഹബ്ബ് റെപ്പോസിറ്ററി" + }, + "manageKnowledge": { + "title": "വിജ്ഞാനം നിര്‍വ്വഹിക്കുക", + "heading": "വിജ്ഞാനാധാരം കോണ്‍ഫിഗര്‍ ചെയ്യുക" + }, + "rag": { + "title": "RAG സെറ്റിംഗുകൾ", + "ragSettings": { + "label": "RAG സെറ്റിംഗുകൾ", + "model": { + "label": "എംബെഡിംഗ് മോഡല്‍", + "required": "ദയവായി ഒരു മോഡല്‍ തിരഞ്ഞെടുക്കുക", + "help": "`nomic-embed-text` പോലുള്ള എംബെഡിംഗ് മോഡലുകള്‍ ഉപയോഗിക്കുന്നത് വളരെ നന്നായിരിക്കും.", + "placeholder": "ഒരു മോഡല്‍ തിരഞ്ഞെടുക്കുക" + }, + "chunkSize": { + "label": "ചങ്ക് വലുപ്പം", + "placeholder": "ചങ്ക് വലുപ്പം നല്കുക", + "required": "ദയവായി ചങ്ക് വലുപ്പം നല്കുക" + }, + "chunkOverlap": { + "label": "ചങ്ക് ഓവര്‍ലാപ്പ്", + "placeholder": "ചങ്ക് ഓവര്‍ലാപ്പ് നല്കുക", + "required": "ദയവായി ചങ്ക് ഓവര്‍ലാപ്പ് നല്കുക" + } + }, + "prompt": { + "label": "RAG പ്രോംപ്റ്റ് കോൺഫിഗർ ചെയ്യുക", + "option1": "സാധാരണ", + "option2": "വെബ്", + "alert": "സിസ്റ്റം പ്രോംപ്റ്റ് ഇവിടെ കോൺഫിഗർ ചെയ്യുന്നത് പഴയൗഖികമായി. ദയവായി പ്രോംപ്റ്റുകള്‍ ചേര്‍ക്കാനോ എഡിറ്റുചെയ്യാനോ മാനേജ് പ്രോംപ്റ്റ്‌സ് സെക്ഷന്‍ ഉപയോഗിക്കുക. ഈ സെക്ഷന്‍ ഭാവിയില്‍ നീക്കം ചെയ്യപ്പെടും.", + "systemPrompt": "സിസ്റ്റം പ്രോംപ്റ്റ്", + "systemPromptPlaceholder": "സിസ്റ്റം പ്രോംപ്റ്റ് നല്കുക", + "webSearchPrompt": "വെബ് തിരയല്‍ പ്രോംപ്റ്റ്", + "webSearchPromptHelp": "പ്രോംപ്റ്റില്‍ നിന്ന് `{search_results}` നീക്കം ചെയ്യരുത്.", + "webSearchPromptError": "ദയവായി ഒരു വെബ് തിരയല്‍ പ്രോംപ്റ്റ് നല്കുക", + "webSearchPromptPlaceholder": "വെബ് തിരയല്‍ പ്രോംപ്റ്റ് നല്കുക", + "webSearchFollowUpPrompt": "വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ്", + "webSearchFollowUpPromptHelp": "പ്രോംപ്റ്റില്‍ നിന്ന് `{chat_history}` യും `{question}` യും നീക്കം ചെയ്യരുത്.", + "webSearchFollowUpPromptError": "ദയവായി നിങ്ങളുടെ വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ് നല്കുക!", + "webSearchFollowUpPromptPlaceholder": "നിങ്ങളുടെ വെബ് തിരയല്‍ തുടര്‍പ്രോംപ്റ്റ്" + } + }, + "chromeAiSettings": { + "title": "ക്രോം AI ക്രമീകരണങ്ങൾ" + } +} diff --git a/src/assets/locale/pt-BR/chrome.json b/src/assets/locale/pt-BR/chrome.json new file mode 100644 index 0000000..c589dfd --- /dev/null +++ b/src/assets/locale/pt-BR/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Configurar IA do Chrome", + "status": { + "label": "Ativar ou Desativar o Suporte de IA do Chrome no Assistente de Página" + }, + "error": { + "browser_not_supported": "Esta versão do Chrome não é suportada pelo modelo Gemini Nano. Por favor, atualize para a versão 127 ou posterior", + "ai_not_supported": "A configuração chrome://flags/#prompt-api-for-gemini-nano não está ativada. Por favor, ative-a.", + "ai_not_ready": "O Gemini Nano ainda não está pronto; você precisa verificar novamente as configurações do Chrome.", + "internal_error": "Ocorreu um erro interno. Por favor, tente novamente mais tarde." + }, + "errorDescription": "Para usar a IA do Chrome, você precisa de uma versão do navegador superior a 127, que atualmente está nos canais Dev e Canary. Após baixar a versão suportada, siga estes passos:\n\n1. Vá para `chrome://flags/#prompt-api-for-gemini-nano` e selecione \"Ativar\".\n2. Vá para `chrome://flags/#optimization-guide-on-device-model` e selecione \"EnabledBypassPrefRequirement\".\n3. Vá para `chrome://components`, procure por \"Optimization Guide On Device Model\" e clique em \"Verificar atualizações\". Isso baixará o modelo. Se você não vir as configurações, repita os passos 1 e 2 e reinicie seu navegador." +} \ No newline at end of file diff --git a/src/assets/locale/pt-BR/settings.json b/src/assets/locale/pt-BR/settings.json index 21bcee4..730b4fc 100644 --- a/src/assets/locale/pt-BR/settings.json +++ b/src/assets/locale/pt-BR/settings.json @@ -1,292 +1,308 @@ { - "generalSettings": { - "title": "Configurações Gerais", - "settings": { - "heading": "Configurações da Interface Web", - "speechRecognitionLang": { - "label": "Linguagem de Reconhecimento de Fala", - "placeholder": "Selecione uma linguagem" - }, - "language": { - "label": "Linguagem", - "placeholder": "Selecione uma linguagem" - }, - "darkMode": { - "label": "Alterar Tema", - "options": { - "light": "Claro", - "dark": "Escuro" - } - }, - "copilotResumeLastChat": { - "label": "Retomar o último chat ao abrir o Painel Lateral (Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "Ocultar Configurações do Modelo de Chat Atual" - } - }, - "webSearch": { - "heading": "Gerenciar Pesquisa na Web", - "searchMode": { - "label": "Realizar Pesquisa Simples na Internet" - }, - "provider": { - "label": "Motor de Busca", - "placeholder": "Selecione um motor de busca" - }, - "totalSearchResults": { - "label": "Resultados de Pesquisa Totais", - "placeholder": "Insira Resultados de Pesquisa Totais" - }, - "visitSpecificWebsite": { - "label": "Visite o site mencionado na mensagem." - } - }, - "system": { - "heading": "Configurações do Sistema", - "deleteChatHistory": { - "label": "Excluir Histórico de Chat", - "button": "Excluir", - "confirm": "Você tem certeza de que deseja excluir seu histórico de chat? Esta ação não pode ser desfeita." - }, - "export": { - "label": "Exportar Histórico de Chat, Base de Conhecimento e Prompts", - "button": "Exportar Dados", - "success": "Exportação Bem-Sucedida" - }, - "import": { - "label": "Importar Histórico de Chat, Base de Conhecimento e Prompts", - "button": "Importar Dados", - "success": "Importação Bem-Sucedida", - "error": "Erro de Importação" - } - }, - "tts": { - "heading": "Configurações de Fala", - "ttsEnabled": { - "label": "Habilitar Fala" - }, - "ttsProvider": { - "label": "Fornecedor de Fala", - "placeholder": "Selecione um fornecedor" - }, - "ttsVoice": { - "label": "Voz de Fala", - "placeholder": "Selecione uma voz" - }, - "ssmlEnabled": { - "label": "Habilitar SSML (Linguagem de Marcação de Sintese de Fala)" - } + "generalSettings": { + "title": "Configurações Gerais", + "settings": { + "heading": "Configurações da Interface Web", + "speechRecognitionLang": { + "label": "Linguagem de Reconhecimento de Fala", + "placeholder": "Selecione uma linguagem" + }, + "language": { + "label": "Linguagem", + "placeholder": "Selecione uma linguagem" + }, + "darkMode": { + "label": "Alterar Tema", + "options": { + "light": "Claro", + "dark": "Escuro" } + }, + "copilotResumeLastChat": { + "label": "Retomar o último chat ao abrir o Painel Lateral (Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "Ocultar Configurações do Modelo de Chat Atual" + } }, - "manageModels": { - "title": "Gerenciar Modelos", - "addBtn": "Adicionar Novo Modelo", - "columns": { - "name": "Nome", - "digest": "Resumo", - "modifiedAt": "Modificado Em", - "size": "Tamanho", - "actions": "Ações" - }, - "expandedColumns": { - "parentModel": "Modelo Pai", - "format": "Formato", - "family": "Família", - "parameterSize": "Tamanho de Parâmetro", - "quantizationLevel": "Nível de Quantização" - }, - "tooltip": { - "delete": "Excluir Modelo", - "repull": "Re-Puxar Modelo" - }, - "confirm": { - "delete": "Você tem certeza de que deseja excluir este modelo?", - "repull": "Você tem certeza de que deseja re-puxar este modelo?" - }, - "modal": { - "title": "Adicionar Novo Modelo", - "placeholder": "Insira o nome do modelo", - "pull": "Puxar Modelo" - }, - "notification": { - "pullModel": "Puxando Modelo", - "pullModelDescription": "Puxando modelo {{modelName}}. Para mais detalhes, verifique o ícone da extensão.", - "success": "Sucesso", - "error": "Erro", - "successDescription": "Modelo puxado com sucesso", - "successDeleteDescription": "Modelo excluído com sucesso", - "someError": "Algo deu errado. Tente novamente mais tarde" - } + "webSearch": { + "heading": "Gerenciar Pesquisa na Web", + "searchMode": { + "label": "Realizar Pesquisa Simples na Internet" + }, + "provider": { + "label": "Motor de Busca", + "placeholder": "Selecione um motor de busca" + }, + "totalSearchResults": { + "label": "Resultados de Pesquisa Totais", + "placeholder": "Insira Resultados de Pesquisa Totais" + }, + "visitSpecificWebsite": { + "label": "Visite o site mencionado na mensagem." + } }, - "managePrompts": { - "title": "Gerenciar Prompts", - "addBtn": "Adicionar Novo Prompt", - "option1": "Normal", - "option2": "RAG", - "questionPrompt": "Prompt de Pergunta", - "columns": { - "title": "Título", - "prompt": "Prompt", - "type": "Tipo de Prompt", - "actions": "Ações" - }, - "systemPrompt": "Prompt do Sistema", - "quickPrompt": "Prompt Rápido", - "tooltip": { - "delete": "Excluir Prompt", - "edit": "Editar Prompt" - }, - "confirm": { - "delete": "Você tem certeza de que deseja excluir este prompt? Esta ação não pode ser desfeita." - }, - "modal": { - "addTitle": "Adicionar Novo Prompt", - "editTitle": "Editar Prompt" - }, - "form": { - "title": { - "label": "Título", - "placeholder": "Meu Prompt Incrível", - "required": "Por favor, insira um título" - }, - "prompt": { - "label": "Prompt", - "placeholder": "Insira o prompt", - "required": "Por favor, insira um prompt", - "help": "Você pode usar {key} como variável em seu prompt." - }, - "isSystem": { - "label": "É um Prompt do Sistema" - }, - "btnSave": { - "saving": "Adicionando Prompt...", - "save": "Adicionar Prompt" - }, - "btnEdit": { - "saving": "Atualizando Prompt...", - "save": "Atualizar Prompt" - } - }, - "notification": { - "addSuccess": "Prompt Adicionado", - "addSuccessDesc": "Prompt adicionado com sucesso", - "error": "Erro", - "someError": "Algo deu errado. Tente novamente mais tarde", - "updatedSuccess": "Prompt Atualizado", - "updatedSuccessDesc": "Prompt atualizado com sucesso", - "deletedSuccess": "Prompt Excluído", - "deletedSuccessDesc": "Prompt excluído com sucesso" - } + "system": { + "heading": "Configurações do Sistema", + "deleteChatHistory": { + "label": "Excluir Histórico de Chat", + "button": "Excluir", + "confirm": "Você tem certeza de que deseja excluir seu histórico de chat? Esta ação não pode ser desfeita." + }, + "export": { + "label": "Exportar Histórico de Chat, Base de Conhecimento e Prompts", + "button": "Exportar Dados", + "success": "Exportação Bem-Sucedida" + }, + "import": { + "label": "Importar Histórico de Chat, Base de Conhecimento e Prompts", + "button": "Importar Dados", + "success": "Importação Bem-Sucedida", + "error": "Erro de Importação" + } }, - "manageShare": { - "title": "Gerenciar Compartilhamento", - "heading": "Configurar URL de Compartilhamento de Página", - "form": { - "url": { - "label": "URL de Compartilhamento de Página", - "placeholder": "Insira a URL de Compartilhamento de Página", - "required": "Por favor, insira a URL de Compartilhamento de Página!", - "help": "Por motivos de privacidade, você pode hospedar a página de compartilhamento e fornecer a URL aqui. Saiba mais." - } - }, - "webshare": { - "heading": "Compartilhamento na Web", - "columns": { - "title": "Título", - "url": "URL", - "actions": "Ações" - }, - "tooltip": { - "delete": "Excluir Compartilhamento" - }, - "confirm": { - "delete": "Você tem certeza de que deseja excluir este compartilhamento? Esta ação não pode ser desfeita." - }, - "label": "Gerenciar Compartilhamento de Página", - "description": "Habilitar ou desabilitar o recurso de compartilhamento de página" - }, - "notification": { - "pageShareSuccess": "URL de Compartilhamento de Página atualizada com sucesso", - "someError": "Algo deu errado. Tente novamente mais tarde", - "webShareDeleteSuccess": "Compartilhamento na Web excluído com sucesso" - } - }, - "ollamaSettings": { - "title": "Configurações do Ollama", - "heading": "Configurar Ollama", - "settings": { - "ollamaUrl": { - "label": "URL do Ollama", - "placeholder": "Insira a URL do Ollama" - }, - "advanced": { - "label": "Configuração Avançada da URL do Ollama", - "urlRewriteEnabled": { - "label": "Habilitar ou Desabilitar URL de Origem Personalizada" - }, - "rewriteUrl": { - "label": "URL de Origem Personalizada", - "placeholder": "Insira a URL de Origem Personalizada" - }, - "help": "Se você tiver problemas de conexão com o Ollama no Page Assist, você pode configurar uma URL de origem personalizada. Para saber mais sobre a configuração, clique aqui." - } - } - }, - "manageSearch": { - "title": "Gerenciar Pesquisa na Web", - "heading": "Configurar Pesquisa na Web" - }, - "about": { - "title": "Sobre", - "heading": "Sobre", - "chromeVersion": "Versão do Page Assist", - "ollamaVersion": "Versão do Ollama", - "support": "Você pode apoiar o projeto Page Assist fazendo doações ou patrocínios através das seguintes plataformas:", - "koFi": "Apoiador no Ko-fi", - "githubSponsor": "Patrocinador no GitHub", - "githubRepo": "Repositório do GitHub" - }, - "manageKnowledge": { - "title": "Gerenciar Conhecimento", - "heading": "Configurar Base de Conhecimento" - }, - "rag": { - "title": "Configurações do RAG", - "ragSettings": { - "label": "Configurações do RAG", - "model": { - "label": "Modelo de Incorporação", - "required": "Por favor, selecione um modelo", - "help": "É altamente recomendável usar modelos de incorporação como `nomic-embed-text`.", - "placeholder": "Selecione um modelo" - }, - "chunkSize": { - "label": "Tamanho do Chunk", - "placeholder": "Insira o tamanho do chunk", - "required": "Por favor, insira o tamanho do chunk" - }, - "chunkOverlap": { - "label": "Sobreposição do Chunk", - "placeholder": "Insira a sobreposição do chunk", - "required": "Por favor, insira a sobreposição do chunk" - } - }, - "prompt": { - "label": "Configurar Prompt do RAG", - "option1": "Normal", - "option2": "Web", - "alert": "Configurar o prompt do sistema aqui está depreciado. Por favor, use a seção Gerenciar Prompts para adicionar ou editar prompts. Esta seção será removida em uma versão futura", - "systemPrompt": "Prompt do Sistema", - "systemPromptPlaceholder": "Insira o prompt do sistema", - "webSearchPrompt": "Prompt de Pesquisa na Web", - "webSearchPromptHelp": "Não remova `{search_results}` do prompt.", - "webSearchPromptError": "Por favor, insira um prompt de pesquisa na web", - "webSearchPromptPlaceholder": "Insira o prompt de pesquisa na web", - "webSearchFollowUpPrompt": "Prompt de Seguimento de Pesquisa na Web", - "webSearchFollowUpPromptHelp": "Não remova `{chat_history}` e `{question}` do prompt.", - "webSearchFollowUpPromptError": "Por favor, insira o prompt de seguimento de pesquisa na web", - "webSearchFollowUpPromptPlaceholder": "Seu prompt de seguimento de pesquisa na web" - } + "tts": { + "heading": "Configurações de Fala", + "ttsEnabled": { + "label": "Habilitar Fala" + }, + "ttsProvider": { + "label": "Fornecedor de Fala", + "placeholder": "Selecione um fornecedor" + }, + "ttsVoice": { + "label": "Voz de Fala", + "placeholder": "Selecione uma voz" + }, + "ssmlEnabled": { + "label": "Habilitar SSML (Linguagem de Marcação de Sintese de Fala)" + } } -} \ No newline at end of file + }, + "manageModels": { + "title": "Gerenciar Modelos", + "addBtn": "Adicionar Novo Modelo", + "columns": { + "name": "Nome", + "digest": "Resumo", + "modifiedAt": "Modificado Em", + "size": "Tamanho", + "actions": "Ações" + }, + "expandedColumns": { + "parentModel": "Modelo Pai", + "format": "Formato", + "family": "Família", + "parameterSize": "Tamanho de Parâmetro", + "quantizationLevel": "Nível de Quantização" + }, + "tooltip": { + "delete": "Excluir Modelo", + "repull": "Re-Puxar Modelo" + }, + "confirm": { + "delete": "Você tem certeza de que deseja excluir este modelo?", + "repull": "Você tem certeza de que deseja re-puxar este modelo?" + }, + "modal": { + "title": "Adicionar Novo Modelo", + "placeholder": "Insira o nome do modelo", + "pull": "Puxar Modelo" + }, + "notification": { + "pullModel": "Puxando Modelo", + "pullModelDescription": "Puxando modelo {{modelName}}. Para mais detalhes, verifique o ícone da extensão.", + "success": "Sucesso", + "error": "Erro", + "successDescription": "Modelo puxado com sucesso", + "successDeleteDescription": "Modelo excluído com sucesso", + "someError": "Algo deu errado. Tente novamente mais tarde" + } + }, + "managePrompts": { + "title": "Gerenciar Prompts", + "addBtn": "Adicionar Novo Prompt", + "option1": "Normal", + "option2": "RAG", + "questionPrompt": "Prompt de Pergunta", + "columns": { + "title": "Título", + "prompt": "Prompt", + "type": "Tipo de Prompt", + "actions": "Ações" + }, + "systemPrompt": "Prompt do Sistema", + "quickPrompt": "Prompt Rápido", + "tooltip": { + "delete": "Excluir Prompt", + "edit": "Editar Prompt" + }, + "confirm": { + "delete": "Você tem certeza de que deseja excluir este prompt? Esta ação não pode ser desfeita." + }, + "modal": { + "addTitle": "Adicionar Novo Prompt", + "editTitle": "Editar Prompt" + }, + "form": { + "title": { + "label": "Título", + "placeholder": "Meu Prompt Incrível", + "required": "Por favor, insira um título" + }, + "prompt": { + "label": "Prompt", + "placeholder": "Insira o prompt", + "required": "Por favor, insira um prompt", + "help": "Você pode usar {key} como variável em seu prompt." + }, + "isSystem": { + "label": "É um Prompt do Sistema" + }, + "btnSave": { + "saving": "Adicionando Prompt...", + "save": "Adicionar Prompt" + }, + "btnEdit": { + "saving": "Atualizando Prompt...", + "save": "Atualizar Prompt" + } + }, + "notification": { + "addSuccess": "Prompt Adicionado", + "addSuccessDesc": "Prompt adicionado com sucesso", + "error": "Erro", + "someError": "Algo deu errado. Tente novamente mais tarde", + "updatedSuccess": "Prompt Atualizado", + "updatedSuccessDesc": "Prompt atualizado com sucesso", + "deletedSuccess": "Prompt Excluído", + "deletedSuccessDesc": "Prompt excluído com sucesso" + } + }, + "manageShare": { + "title": "Gerenciar Compartilhamento", + "heading": "Configurar URL de Compartilhamento de Página", + "form": { + "url": { + "label": "URL de Compartilhamento de Página", + "placeholder": "Insira a URL de Compartilhamento de Página", + "required": "Por favor, insira a URL de Compartilhamento de Página!", + "help": "Por motivos de privacidade, você pode hospedar a página de compartilhamento e fornecer a URL aqui. Saiba mais." + } + }, + "webshare": { + "heading": "Compartilhamento na Web", + "columns": { + "title": "Título", + "url": "URL", + "actions": "Ações" + }, + "tooltip": { + "delete": "Excluir Compartilhamento" + }, + "confirm": { + "delete": "Você tem certeza de que deseja excluir este compartilhamento? Esta ação não pode ser desfeita." + }, + "label": "Gerenciar Compartilhamento de Página", + "description": "Habilitar ou desabilitar o recurso de compartilhamento de página" + }, + "notification": { + "pageShareSuccess": "URL de Compartilhamento de Página atualizada com sucesso", + "someError": "Algo deu errado. Tente novamente mais tarde", + "webShareDeleteSuccess": "Compartilhamento na Web excluído com sucesso" + } + }, + "ollamaSettings": { + "title": "Configurações do Ollama", + "heading": "Configurar Ollama", + "settings": { + "ollamaUrl": { + "label": "URL do Ollama", + "placeholder": "Insira a URL do Ollama" + }, + "advanced": { + "label": "Configuração Avançada da URL do Ollama", + "urlRewriteEnabled": { + "label": "Habilitar ou Desabilitar URL de Origem Personalizada" + }, + "rewriteUrl": { + "label": "URL de Origem Personalizada", + "placeholder": "Insira a URL de Origem Personalizada" + }, + "headers": { + "label": "Cabeçalhos Personalizados", + "add": "Adicionar Cabeçalho", + "key": { + "label": "Chave do Cabeçalho", + "placeholder": "Autorização" + }, + "value": { + "label": "Valor do Cabeçalho", + "placeholder": "Token Bearer" + } + }, + "help": "Se você tiver problemas de conexão com o Ollama no Page Assist, você pode configurar uma URL de origem personalizada. Para saber mais sobre a configuração, clique aqui." + } + } + }, + "manageSearch": { + "title": "Gerenciar Pesquisa na Web", + "heading": "Configurar Pesquisa na Web" + }, + "about": { + "title": "Sobre", + "heading": "Sobre", + "chromeVersion": "Versão do Page Assist", + "ollamaVersion": "Versão do Ollama", + "support": "Você pode apoiar o projeto Page Assist fazendo doações ou patrocínios através das seguintes plataformas:", + "koFi": "Apoiador no Ko-fi", + "githubSponsor": "Patrocinador no GitHub", + "githubRepo": "Repositório do GitHub" + }, + "manageKnowledge": { + "title": "Gerenciar Conhecimento", + "heading": "Configurar Base de Conhecimento" + }, + "rag": { + "title": "Configurações do RAG", + "ragSettings": { + "label": "Configurações do RAG", + "model": { + "label": "Modelo de Incorporação", + "required": "Por favor, selecione um modelo", + "help": "É altamente recomendável usar modelos de incorporação como `nomic-embed-text`.", + "placeholder": "Selecione um modelo" + }, + "chunkSize": { + "label": "Tamanho do Chunk", + "placeholder": "Insira o tamanho do chunk", + "required": "Por favor, insira o tamanho do chunk" + }, + "chunkOverlap": { + "label": "Sobreposição do Chunk", + "placeholder": "Insira a sobreposição do chunk", + "required": "Por favor, insira a sobreposição do chunk" + } + }, + "prompt": { + "label": "Configurar Prompt do RAG", + "option1": "Normal", + "option2": "Web", + "alert": "Configurar o prompt do sistema aqui está depreciado. Por favor, use a seção Gerenciar Prompts para adicionar ou editar prompts. Esta seção será removida em uma versão futura", + "systemPrompt": "Prompt do Sistema", + "systemPromptPlaceholder": "Insira o prompt do sistema", + "webSearchPrompt": "Prompt de Pesquisa na Web", + "webSearchPromptHelp": "Não remova `{search_results}` do prompt.", + "webSearchPromptError": "Por favor, insira um prompt de pesquisa na web", + "webSearchPromptPlaceholder": "Insira o prompt de pesquisa na web", + "webSearchFollowUpPrompt": "Prompt de Seguimento de Pesquisa na Web", + "webSearchFollowUpPromptHelp": "Não remova `{chat_history}` e `{question}` do prompt.", + "webSearchFollowUpPromptError": "Por favor, insira o prompt de seguimento de pesquisa na web", + "webSearchFollowUpPromptPlaceholder": "Seu prompt de seguimento de pesquisa na web" + } + }, + + "chromeAiSettings": { + "title": "Configurações de IA do Chrome" +} +} diff --git a/src/assets/locale/ru/chrome.json b/src/assets/locale/ru/chrome.json new file mode 100644 index 0000000..187257c --- /dev/null +++ b/src/assets/locale/ru/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "Настройка Chrome AI", + "status": { + "label": "Включить или отключить поддержку Chrome AI в помощнике страницы" + }, + "error": { + "browser_not_supported": "Эта версия Chrome не поддерживается моделью Gemini Nano. Пожалуйста, обновите до версии 127 или выше", + "ai_not_supported": "Настройка chrome://flags/#prompt-api-for-gemini-nano не включена. Пожалуйста, включите её.", + "ai_not_ready": "Gemini Nano ещё не готов; вам нужно перепроверить настройки Chrome.", + "internal_error": "Произошла внутренняя ошибка. Пожалуйста, повторите попытку позже." + }, + "errorDescription": "Чтобы использовать Chrome AI, вам нужна версия браузера выше 127, которая в настоящее время доступна в каналах Dev и Canary. После загрузки поддерживаемой версии выполните следующие шаги:\n\n1. Перейдите на `chrome://flags/#prompt-api-for-gemini-nano` и выберите \"Включить\".\n2. Перейдите на `chrome://flags/#optimization-guide-on-device-model` и выберите \"EnabledBypassPrefRequirement\".\n3. Перейдите на `chrome://components`, найдите \"Optimization Guide On Device Model\" и нажмите \"Проверить наличие обновлений\". Это загрузит модель. Если вы не видите настройки, повторите шаги 1 и 2 и перезапустите браузер." +} \ No newline at end of file diff --git a/src/assets/locale/ru/settings.json b/src/assets/locale/ru/settings.json index 6099b2a..48ee2e5 100644 --- a/src/assets/locale/ru/settings.json +++ b/src/assets/locale/ru/settings.json @@ -1,293 +1,308 @@ { - "generalSettings": { - "title": "Общие настройки", - "settings": { - "heading": "Настройки веб-интерфейса", - "speechRecognitionLang": { - "label": "Язык распознавания речи", - "placeholder": "Выберите язык" - }, - "language": { - "label": "Язык", - "placeholder": "Выберите язык" - }, - "darkMode": { - "label": "Сменить тему", - "options": { - "light": "Светлая", - "dark": "Темная" - } - }, - "copilotResumeLastChat": { - "label": "Возобновить последний чат при открытии боковой панели (Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "Скрыть текущие настройки модели чата" - } - }, - "webSearch": { - "heading": "Управление веб-поиском", - "searchMode": { - "label": "Выполнить простой интернет-поиск" - }, - "provider": { - "label": "Поисковый движок", - "placeholder": "Выберите поисковый движок" - }, - "totalSearchResults": { - "label": "Общее количество результатов поиска", - "placeholder": "Введите общее количество результатов поиска" - }, - "visitSpecificWebsite": { - "label": "Посетите веб-сайт, указанный в сообщении." - } - }, - "system": { - "heading": "Настройки системы", - "deleteChatHistory": { - "label": "Удалить историю чата", - "button": "Удалить", - "confirm": "Вы уверены, что хотите удалить историю чата? Это действие нельзя отменить." - }, - "export": { - "label": "Экспорт истории чата, базы знаний и подсказок", - "button": "Экспортировать данные", - "success": "Экспорт успешен" - }, - "import": { - "label": "Импорт истории чата, базы знаний и подсказок", - "button": "Импортировать данные", - "success": "Импорт успешен", - "error": "Ошибка импорта" - } - }, - "tts": { - "heading": "Настройки текст в речь", - "ttsEnabled": { - "label": "Включить текст в речь" - }, - "ttsProvider": { - "label": "Поставщик текста в речь", - "placeholder": "Выберите поставщика" - }, - "ttsVoice": { - "label": "Голос текста в речь", - "placeholder": "Выберите голос" - }, - "ssmlEnabled": { - "label": "Включить SSML (язык разметки синтеза речи)" - } + "generalSettings": { + "title": "Общие настройки", + "settings": { + "heading": "Настройки веб-интерфейса", + "speechRecognitionLang": { + "label": "Язык распознавания речи", + "placeholder": "Выберите язык" + }, + "language": { + "label": "Язык", + "placeholder": "Выберите язык" + }, + "darkMode": { + "label": "Сменить тему", + "options": { + "light": "Светлая", + "dark": "Темная" } + }, + "copilotResumeLastChat": { + "label": "Возобновить последний чат при открытии боковой панели (Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "Скрыть текущие настройки модели чата" + } }, - "manageModels": { - "title": "Управление моделями", - "addBtn": "Добавить новую модель", - "columns": { - "name": "Название", - "digest": "Дайджест", - "modifiedAt": "Изменено", - "size": "Размер", - "actions": "Действия" - }, - "expandedColumns": { - "parentModel": "Родительская модель", - "format": "Формат", - "family": "Семейство", - "parameterSize": "Размер параметров", - "quantizationLevel": "Уровень квантования" - }, - "tooltip": { - "delete": "Удалить модель", - "repull": "Переполучить модель" - }, - "confirm": { - "delete": "Вы уверены, что хотите удалить эту модель?", - "repull": "Вы уверены, что хотите переполучить эту модель?" - }, - "modal": { - "title": "Добавить новую модель", - "placeholder": "Введите название модели", - "pull": "Получить модель" - }, - "notification": { - "pullModel": "Получение модели", - "pullModelDescription": "Получение модели {{modelName}}. Для получения дополнительной информации проверьте значок расширения.", - "success": "Успех", - "error": "Ошибка", - "successDescription": "Модель успешно получена", - "successDeleteDescription": "Модель успешно удалена", - "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже" - } + "webSearch": { + "heading": "Управление веб-поиском", + "searchMode": { + "label": "Выполнить простой интернет-поиск" + }, + "provider": { + "label": "Поисковый движок", + "placeholder": "Выберите поисковый движок" + }, + "totalSearchResults": { + "label": "Общее количество результатов поиска", + "placeholder": "Введите общее количество результатов поиска" + }, + "visitSpecificWebsite": { + "label": "Посетите веб-сайт, указанный в сообщении." + } }, - "managePrompts": { - "title": "Управление подсказками", - "addBtn": "Добавить новую подсказку", - "option1": "Обычная", - "option2": "RAG", - "questionPrompt": "Вопросная подсказка", - "columns": { - "title": "Название", - "prompt": "Подсказка", - "type": "Тип подсказки", - "actions": "Действия" - }, - "systemPrompt": "Системная подсказка", - "quickPrompt": "Быстрая подсказка", - "tooltip": { - "delete": "Удалить подсказку", - "edit": "Редактировать подсказку" - }, - "confirm": { - "delete": "Вы уверены, что хотите удалить эту подсказку? Это действие нельзя отменить." - }, - "modal": { - "addTitle": "Добавить новую подсказку", - "editTitle": "Редактировать подсказку" - }, - "form": { - "title": { - "label": "Название", - "placeholder": "Моя замечательная подсказка", - "required": "Пожалуйста, введите название" - }, - "prompt": { - "label": "Подсказка", - "placeholder": "Введите подсказку", - "required": "Пожалуйста, введите подсказку", - "help": "Вы можете использовать {key} в качестве переменной в своей подсказке." - }, - "isSystem": { - "label": "Это системная подсказка" - }, - "btnSave": { - "saving": "Добавление подсказки...", - "save": "Добавить подсказку" - }, - "btnEdit": { - "saving": "Обновление подсказки...", - "save": "Обновить подсказку" - } - }, - "notification": { - "addSuccess": "Подсказка добавлена", - "addSuccessDesc": "Подсказка успешно добавлена", - "error": "Ошибка", - "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже", - "updatedSuccess": "Подсказка обновлена", - "updatedSuccessDesc": "Подсказка успешно обновлена", - "deletedSuccess": "Подсказка удалена", - "deletedSuccessDesc": "Подсказка успешно удалена" - } + "system": { + "heading": "Настройки системы", + "deleteChatHistory": { + "label": "Удалить историю чата", + "button": "Удалить", + "confirm": "Вы уверены, что хотите удалить историю чата? Это действие нельзя отменить." + }, + "export": { + "label": "Экспорт истории чата, базы знаний и подсказок", + "button": "Экспортировать данные", + "success": "Экспорт успешен" + }, + "import": { + "label": "Импорт истории чата, базы знаний и подсказок", + "button": "Импортировать данные", + "success": "Импорт успешен", + "error": "Ошибка импорта" + } }, - "manageShare": { - "title": "Управление обменом", - "heading": "Настройка URL обмена страницей", - "form": { - "url": { - "label": "URL обмена страницей", - "placeholder": "Введите URL обмена страницей", - "required": "Пожалуйста, введите ваш URL обмена страницей!", - "help": "По соображениям конфиденциальности вы можете самостоятельно разместить страницу обмена и указать здесь URL. Узнать больше." - } - }, - "webshare": { - "heading": "Веб-обмен", - "columns": { - "title": "Название", - "url": "URL", - "actions": "Действия" - }, - "tooltip": { - "delete": "Удалить обмен" - }, - "confirm": { - "delete": "Вы уверены, что хотите удалить этот обмен? Это действие нельзя отменить." - }, - "label": "Управление общим доступом к странице", - "description": "Включить или отключить функцию обмена страницей" - }, - "notification": { - "pageShareSuccess": "URL обмена страницей успешно обновлен", - "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже", - "webShareDeleteSuccess": "Веб-обмен успешно удален" - } - }, - "ollamaSettings": { - "title": "Настройки Ollama", - "heading": "Настройка Ollama", - "settings": { - "ollamaUrl": { - "label": "URL Ollama", - "placeholder": "Введите URL Ollama" - }, - - "advanced": { - "label": "Расширенная конфигурация URL Ollama", - "urlRewriteEnabled": { - "label": "Включить или отключить пользовательский исходный URL" - }, - "rewriteUrl": { - "label": "Пользовательский исходный URL", - "placeholder": "Введите пользовательский исходный URL" - }, - "help": "Если у вас возникают проблемы с подключением к Ollama на странице помощника, вы можете настроить пользовательский исходный URL. Чтобы узнать больше о конфигурации, нажмите здесь." - } - } - }, - "manageSearch": { - "title": "Управление веб-поиском", - "heading": "Настройка веб-поиска" - }, - "about": { - "title": "О программе", - "heading": "О программе", - "chromeVersion": "Версия Page Assist", - "ollamaVersion": "Версия Ollama", - "support": "Вы можете поддержать проект Page Assist, сделав пожертвование или спонсорирование через следующие платформы:", - "koFi": "Поддержать на Ko-fi", - "githubSponsor": "Стать спонсором на GitHub", - "githubRepo": "Репозиторий GitHub" - }, - "manageKnowledge": { - "title": "Управление знаниями", - "heading": "Настройка базы знаний" - }, - "rag": { - "title": "Настройки RAG", - "ragSettings": { - "label": "Настройки RAG", - "model": { - "label": "Модель вложения", - "required": "Пожалуйста, выберите модель", - "help": "Настоятельно рекомендуется использовать модели вложения, например, `nomic-embed-text`.", - "placeholder": "Выберите модель" - }, - "chunkSize": { - "label": "Размер фрагмента", - "placeholder": "Введите размер фрагмента", - "required": "Пожалуйста, введите размер фрагмента" - }, - "chunkOverlap": { - "label": "Перекрытие фрагментов", - "placeholder": "Введите перекрытие фрагментов", - "required": "Пожалуйста, введите перекрытие фрагментов" - } - }, - "prompt": { - "label": "Настройка системной подсказки RAG", - "option1": "Обычная", - "option2": "Веб", - "alert": "Настройка системной подсказки здесь устарела. Используйте раздел Управление подсказками для добавления или редактирования подсказок. Этот раздел будет удален в будущем выпуске", - "systemPrompt": "Системная подсказка", - "systemPromptPlaceholder": "Введите системную подсказку", - "webSearchPrompt": "Подсказка для веб-поиска", - "webSearchPromptHelp": "Не удаляйте `{search_results}` из подсказки.", - "webSearchPromptError": "Пожалуйста, введите подсказку для веб-поиска", - "webSearchPromptPlaceholder": "Введите подсказку для веб-поиска", - "webSearchFollowUpPrompt": "Последующая подсказка для веб-поиска", - "webSearchFollowUpPromptHelp": "Не удаляйте `{chat_history}` и `{question}` из подсказки.", - "webSearchFollowUpPromptError": "Введите подсказку для последующего веб-поиска!", - "webSearchFollowUpPromptPlaceholder": "Ваша подсказка для последующего веб-поиска" - } + "tts": { + "heading": "Настройки текст в речь", + "ttsEnabled": { + "label": "Включить текст в речь" + }, + "ttsProvider": { + "label": "Поставщик текста в речь", + "placeholder": "Выберите поставщика" + }, + "ttsVoice": { + "label": "Голос текста в речь", + "placeholder": "Выберите голос" + }, + "ssmlEnabled": { + "label": "Включить SSML (язык разметки синтеза речи)" + } } -} \ No newline at end of file + }, + "manageModels": { + "title": "Управление моделями", + "addBtn": "Добавить новую модель", + "columns": { + "name": "Название", + "digest": "Дайджест", + "modifiedAt": "Изменено", + "size": "Размер", + "actions": "Действия" + }, + "expandedColumns": { + "parentModel": "Родительская модель", + "format": "Формат", + "family": "Семейство", + "parameterSize": "Размер параметров", + "quantizationLevel": "Уровень квантования" + }, + "tooltip": { + "delete": "Удалить модель", + "repull": "Переполучить модель" + }, + "confirm": { + "delete": "Вы уверены, что хотите удалить эту модель?", + "repull": "Вы уверены, что хотите переполучить эту модель?" + }, + "modal": { + "title": "Добавить новую модель", + "placeholder": "Введите название модели", + "pull": "Получить модель" + }, + "notification": { + "pullModel": "Получение модели", + "pullModelDescription": "Получение модели {{modelName}}. Для получения дополнительной информации проверьте значок расширения.", + "success": "Успех", + "error": "Ошибка", + "successDescription": "Модель успешно получена", + "successDeleteDescription": "Модель успешно удалена", + "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже" + } + }, + "managePrompts": { + "title": "Управление подсказками", + "addBtn": "Добавить новую подсказку", + "option1": "Обычная", + "option2": "RAG", + "questionPrompt": "Вопросная подсказка", + "columns": { + "title": "Название", + "prompt": "Подсказка", + "type": "Тип подсказки", + "actions": "Действия" + }, + "systemPrompt": "Системная подсказка", + "quickPrompt": "Быстрая подсказка", + "tooltip": { + "delete": "Удалить подсказку", + "edit": "Редактировать подсказку" + }, + "confirm": { + "delete": "Вы уверены, что хотите удалить эту подсказку? Это действие нельзя отменить." + }, + "modal": { + "addTitle": "Добавить новую подсказку", + "editTitle": "Редактировать подсказку" + }, + "form": { + "title": { + "label": "Название", + "placeholder": "Моя замечательная подсказка", + "required": "Пожалуйста, введите название" + }, + "prompt": { + "label": "Подсказка", + "placeholder": "Введите подсказку", + "required": "Пожалуйста, введите подсказку", + "help": "Вы можете использовать {key} в качестве переменной в своей подсказке." + }, + "isSystem": { + "label": "Это системная подсказка" + }, + "btnSave": { + "saving": "Добавление подсказки...", + "save": "Добавить подсказку" + }, + "btnEdit": { + "saving": "Обновление подсказки...", + "save": "Обновить подсказку" + } + }, + "notification": { + "addSuccess": "Подсказка добавлена", + "addSuccessDesc": "Подсказка успешно добавлена", + "error": "Ошибка", + "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже", + "updatedSuccess": "Подсказка обновлена", + "updatedSuccessDesc": "Подсказка успешно обновлена", + "deletedSuccess": "Подсказка удалена", + "deletedSuccessDesc": "Подсказка успешно удалена" + } + }, + "manageShare": { + "title": "Управление обменом", + "heading": "Настройка URL обмена страницей", + "form": { + "url": { + "label": "URL обмена страницей", + "placeholder": "Введите URL обмена страницей", + "required": "Пожалуйста, введите ваш URL обмена страницей!", + "help": "По соображениям конфиденциальности вы можете самостоятельно разместить страницу обмена и указать здесь URL. Узнать больше." + } + }, + "webshare": { + "heading": "Веб-обмен", + "columns": { + "title": "Название", + "url": "URL", + "actions": "Действия" + }, + "tooltip": { + "delete": "Удалить обмен" + }, + "confirm": { + "delete": "Вы уверены, что хотите удалить этот обмен? Это действие нельзя отменить." + }, + "label": "Управление общим доступом к странице", + "description": "Включить или отключить функцию обмена страницей" + }, + "notification": { + "pageShareSuccess": "URL обмена страницей успешно обновлен", + "someError": "Что-то пошло не так. Пожалуйста, попробуйте позже", + "webShareDeleteSuccess": "Веб-обмен успешно удален" + } + }, + "ollamaSettings": { + "title": "Настройки Ollama", + "heading": "Настройка Ollama", + "settings": { + "ollamaUrl": { + "label": "URL Ollama", + "placeholder": "Введите URL Ollama" + }, + + "advanced": { + "label": "Расширенная конфигурация URL Ollama", + "urlRewriteEnabled": { + "label": "Включить или отключить пользовательский исходный URL" + }, + "rewriteUrl": { + "label": "Пользовательский исходный URL", + "placeholder": "Введите пользовательский исходный URL" + }, + "headers": { + "label": "Пользовательские Заголовки", + "add": "Добавить Заголовок", + "key": { + "label": "Ключ Заголовка", + "placeholder": "Авторизация" + }, + "value": { + "label": "Значение Заголовка", + "placeholder": "Токен Bearer" + } + }, + "help": "Если у вас возникают проблемы с подключением к Ollama на странице помощника, вы можете настроить пользовательский исходный URL. Чтобы узнать больше о конфигурации, нажмите здесь." + } + } + }, + "manageSearch": { + "title": "Управление веб-поиском", + "heading": "Настройка веб-поиска" + }, + "about": { + "title": "О программе", + "heading": "О программе", + "chromeVersion": "Версия Page Assist", + "ollamaVersion": "Версия Ollama", + "support": "Вы можете поддержать проект Page Assist, сделав пожертвование или спонсорирование через следующие платформы:", + "koFi": "Поддержать на Ko-fi", + "githubSponsor": "Стать спонсором на GitHub", + "githubRepo": "Репозиторий GitHub" + }, + "manageKnowledge": { + "title": "Управление знаниями", + "heading": "Настройка базы знаний" + }, + "rag": { + "title": "Настройки RAG", + "ragSettings": { + "label": "Настройки RAG", + "model": { + "label": "Модель вложения", + "required": "Пожалуйста, выберите модель", + "help": "Настоятельно рекомендуется использовать модели вложения, например, `nomic-embed-text`.", + "placeholder": "Выберите модель" + }, + "chunkSize": { + "label": "Размер фрагмента", + "placeholder": "Введите размер фрагмента", + "required": "Пожалуйста, введите размер фрагмента" + }, + "chunkOverlap": { + "label": "Перекрытие фрагментов", + "placeholder": "Введите перекрытие фрагментов", + "required": "Пожалуйста, введите перекрытие фрагментов" + } + }, + "prompt": { + "label": "Настройка системной подсказки RAG", + "option1": "Обычная", + "option2": "Веб", + "alert": "Настройка системной подсказки здесь устарела. Используйте раздел Управление подсказками для добавления или редактирования подсказок. Этот раздел будет удален в будущем выпуске", + "systemPrompt": "Системная подсказка", + "systemPromptPlaceholder": "Введите системную подсказку", + "webSearchPrompt": "Подсказка для веб-поиска", + "webSearchPromptHelp": "Не удаляйте `{search_results}` из подсказки.", + "webSearchPromptError": "Пожалуйста, введите подсказку для веб-поиска", + "webSearchPromptPlaceholder": "Введите подсказку для веб-поиска", + "webSearchFollowUpPrompt": "Последующая подсказка для веб-поиска", + "webSearchFollowUpPromptHelp": "Не удаляйте `{chat_history}` и `{question}` из подсказки.", + "webSearchFollowUpPromptError": "Введите подсказку для последующего веб-поиска!", + "webSearchFollowUpPromptPlaceholder": "Ваша подсказка для последующего веб-поиска" + } + }, + "chromeAiSettings": { + "title": "Настройки ИИ Chrome" +} +} diff --git a/src/assets/locale/zh/chrome.json b/src/assets/locale/zh/chrome.json new file mode 100644 index 0000000..b41a3ac --- /dev/null +++ b/src/assets/locale/zh/chrome.json @@ -0,0 +1,13 @@ +{ + "heading": "配置Chrome人工智能", + "status": { + "label": "在页面辅助功能中启用或禁用Chrome人工智能支持" + }, + "error": { + "browser_not_supported": "此版本的Chrome不受Gemini Nano模型支持。请更新到127版本或更高版本", + "ai_not_supported": "设置chrome://flags/#prompt-api-for-gemini-nano未启用。请启用它。", + "ai_not_ready": "Gemini Nano尚未准备就绪;您需要再次检查Chrome设置。", + "internal_error": "发生内部错误。请稍后重试。" + }, + "errorDescription": "为了使用Chrome人工智能,您需要127版本以上的浏览器,目前该版本在Dev和Canary渠道中。下载支持的版本后,请按照以下步骤操作:\n\n1. 前往`chrome://flags/#prompt-api-for-gemini-nano`并选择\"启用\",\n2. 前往`chrome://flags/#optimization-guide-on-device-model`并选择\"EnabledBypassPrefRequirement\",\n3. 前往`chrome://components`,搜索\"Optimization Guide On Device Model\",然后点击\"检查更新\"。这将下载模型。如果您没有看到这些设置,请重复步骤1和2,然后重新启动浏览器。" +} \ No newline at end of file diff --git a/src/assets/locale/zh/settings.json b/src/assets/locale/zh/settings.json index 44213eb..52e3408 100644 --- a/src/assets/locale/zh/settings.json +++ b/src/assets/locale/zh/settings.json @@ -1,297 +1,312 @@ { - "generalSettings": { - "title": "一般设置", - "settings": { - "heading": "Web UI 设置", - "speechRecognitionLang": { - "label": "语音识别语言", - "placeholder": "选择一种语言" - }, - "language": { - "label": "语言", - "placeholder": "选择一种语言" - }, - "darkMode": { - "label": "更改主题", - "options": { - "light": "亮色", - "dark": "暗色" - } - }, - "searchMode": { - "label": "使用简化的互联网搜索" - }, - "copilotResumeLastChat": { - "label": "打开侧边栏时恢复上次聊天(Copilot)" - }, - "hideCurrentChatModelSettings": { - "label": "隐藏当前聊天模型设置" - } - }, - "webSearch": { - "heading": "管理网络搜索", - "searchMode": { - "label": "执行简单的网际网路搜索" - }, - "provider": { - "label": "搜索引擎", - "placeholder": "选择一个搜索引擎" - }, - "totalSearchResults": { - "label": "总搜索结果", - "placeholder": "输入总搜索结果" - }, - "visitSpecificWebsite": { + "generalSettings": { + "title": "一般设置", + "settings": { + "heading": "Web UI 设置", + "speechRecognitionLang": { + "label": "语音识别语言", + "placeholder": "选择一种语言" + }, + "language": { + "label": "语言", + "placeholder": "选择一种语言" + }, + "darkMode": { + "label": "更改主题", + "options": { + "light": "亮色", + "dark": "暗色" + } + }, + "searchMode": { + "label": "使用简化的互联网搜索" + }, + "copilotResumeLastChat": { + "label": "打开侧边栏时恢复上次聊天(Copilot)" + }, + "hideCurrentChatModelSettings": { + "label": "隐藏当前聊天模型设置" + } + }, + "webSearch": { + "heading": "管理网络搜索", + "searchMode": { + "label": "执行简单的网际网路搜索" + }, + "provider": { + "label": "搜索引擎", + "placeholder": "选择一个搜索引擎" + }, + "totalSearchResults": { + "label": "总搜索结果", + "placeholder": "输入总搜索结果" + }, + "visitSpecificWebsite": { "label": "访问消息中提到的网站。" + } + }, + "system": { + "heading": "系统设置", + "deleteChatHistory": { + "label": "删除聊天记录", + "button": "删除", + "confirm": "您确定要删除聊天记录吗?此操作无法撤销。" + }, + "export": { + "label": "导出聊天记录、知识库和提示", + "button": "导出数据", + "success": "导出成功" + }, + "import": { + "label": "导入聊天记录、知识库和提示", + "button": "导入数据", + "success": "导入成功", + "error": "导入错误" + } + }, + "tts": { + "heading": "文本转语音设置", + "ttsEnabled": { + "label": "启用文本转语音" + }, + "ttsProvider": { + "label": "文本转语音提供商", + "placeholder": "选择一个提供商" + }, + "ttsVoice": { + "label": "文本转语音语音", + "placeholder": "选择一种语音" + }, + "ssmlEnabled": { + "label": "启用SSML(语音合成标记语言)" + } } - }, - "system": { - "heading": "系统设置", - "deleteChatHistory": { - "label": "删除聊天记录", - "button": "删除", - "confirm": "您确定要删除聊天记录吗?此操作无法撤销。" - }, - "export": { - "label": "导出聊天记录、知识库和提示", - "button": "导出数据", - "success": "导出成功" - }, - "import": { - "label": "导入聊天记录、知识库和提示", - "button": "导入数据", - "success": "导入成功", - "error": "导入错误" - } - }, - "tts": { - "heading": "文本转语音设置", - "ttsEnabled": { - "label": "启用文本转语音" - }, - "ttsProvider": { - "label": "文本转语音提供商", - "placeholder": "选择一个提供商" - }, - "ttsVoice": { - "label": "文本转语音语音", - "placeholder": "选择一种语音" - }, - "ssmlEnabled": { - "label": "启用SSML(语音合成标记语言)" - } - } + }, + "manageModels": { + "title": "管理模型", + "addBtn": "添加新模型", + "columns": { + "name": "名称", + "digest": "摘要", + "modifiedAt": "修改时间", + "size": "大小", + "actions": "操作" }, - "manageModels": { - "title": "管理模型", - "addBtn": "添加新模型", - "columns": { - "name": "名称", - "digest": "摘要", - "modifiedAt": "修改时间", - "size": "大小", - "actions": "操作" - }, - "expandedColumns": { - "parentModel": "父模型", - "format": "格式", - "family": "家族", - "parameterSize": "参数大小", - "quantizationLevel": "量化级别" - }, - "tooltip": { - "delete": "删除模型", - "repull": "重新拉取模型" - }, - "confirm": { - "delete": "您确定要删除此模型吗?", - "repull": "您确定要重新拉取此模型吗?" - }, - "modal": { - "title": "添加新模型", - "placeholder": "输入模型名称", - "pull": "拉取模型" - }, - "notification": { - "pullModel": "正在拉取模型", - "pullModelDescription": "正在拉取 {{modelName}} ,请查看扩展图标。", - "success": "成功", - "error": "错误", - "successDescription": "成功拉取了模型", - "successDeleteDescription": "成功删除了模型", - "someError": "出现了问题。请稍后再试。" - } + "expandedColumns": { + "parentModel": "父模型", + "format": "格式", + "family": "家族", + "parameterSize": "参数大小", + "quantizationLevel": "量化级别" }, - "managePrompts": { - "title": "管理提示词", - "addBtn": "添加新提示词", - "option1": "普通", - "option2": "RAG", - "questionPrompt": "问题提示词", - "columns": { - "title": "标题", - "prompt": "提示词", - "type": "提示词类型", - "actions": "操作" - }, - "systemPrompt": "系统提示词", - "quickPrompt": "快速提示词", - "tooltip": { - "delete": "删除提示词", - "edit": "编辑提示词" - }, - "confirm": { - "delete": "您确定要删除此提示词吗?这个操作不能撤销。" - }, - "modal": { - "addTitle": "添加新提示词", - "editTitle": "编辑提示词" - }, - "form": { - "title": { - "label": "标题", - "placeholder": "我厉害的提示词", - "required": "请输入标题", - "help": "您可以在提示词中使用 {key} 作为变量。" - }, - "prompt": { - "label": "提示词", - "placeholder": "输入提示词", - "required": "请输入提示词", - "help": "您可以在提示词中使用 {key} 作为变量。" - }, - "isSystem": { - "label": "是否为系统提示词" - }, - "btnSave": { - "saving": "添加提示词中...", - "save": "添加提示词" - }, - "btnEdit": { - "saving": "更新提示词中...", - "save": "更新提示词" - } - }, - "notification": { - "addSuccess": "提示词已添加", - "addSuccessDesc": "提示词已成功添加", - "error": "错误", - "someError": "出现了问题。请稍后再试。", - "updatedSuccess": "提示词已更新", - "updatedSuccessDesc": "提示词已成功更新", - "deletedSuccess": "提示词已删除", - "deletedSuccessDesc": "提示词已成功删除" - } + "tooltip": { + "delete": "删除模型", + "repull": "重新拉取模型" }, - "manageShare": { - "title": "管理共享", - "heading": "配置对话共享服务 URL", - "form": { - "url": { - "label": "对话共享服务 URL", - "placeholder": "输入对话共享服务 URL", - "required": "请输入您的对话共享服务 URL!", - "help": "出于隐私原因,您可以自行托管对话共享服务并在此处提供 URL,了解更多。" - } - }, - "webshare": { - "heading": "对话共享", - "columns": { - "title": "标题", - "url": "URL", - "actions": "操作" - }, - "tooltip": { - "delete": "删除对话共享" - }, - "confirm": { - "delete": "您确定要删除此对话共享吗?这个操作不能撤销。" - }, - "label": "管理页面分享", - "description": "启用或禁用页面分享功能 " - }, - "notification": { - "pageShareSuccess": "对话共享服务 URL 已成功更新", - "someError": "出现了问题。请稍后再试。", - "webShareDeleteSuccess": "对话共享已成功删除" - } + "confirm": { + "delete": "您确定要删除此模型吗?", + "repull": "您确定要重新拉取此模型吗?" }, - "ollamaSettings": { - "title": "Ollama 设置", - "heading": "配置 Ollama", - "settings": { - "ollamaUrl": { - "label": "Ollama URL", - "placeholder": "输入 Ollama URL" - }, - - "advanced": { - "label": "Ollama URL 高级配置", - "urlRewriteEnabled": { - "label": "启用或禁用自定义来源 URL" - }, - "rewriteUrl": { - "label": "自定义来源 URL", - "placeholder": "输入自定义来源 URL" - }, - "help": "如果您在 Page Assist 上与 Ollama 有连接问题,您可以配置自定义来源 URL。要了解更多关于配置的信息,点击此处。" - } - } + "modal": { + "title": "添加新模型", + "placeholder": "输入模型名称", + "pull": "拉取模型" }, - "manageSearch": { - "heading": "配置网络搜索", - "title": "管理网络搜索" - }, - "about": { - "title": "关于", - "heading": "关于", - "chromeVersion": "Page Assist版本", - "ollamaVersion": "Ollama版本", - "support": "您可以通过以下平台捐赠或赞助Page Assist项目:", - "koFi": "在Ko-fi上支持", - "githubSponsor": "在GitHub上赞助", - "githubRepo": "GitHub仓库" - }, - "manageKnowledge": { - "title": "管理知识", - "heading": "配置知识库" - }, - "rag": { - "title": "RAG 设置", - "ragSettings": { - "label": "RAG 设置", - "model": { - "label": "文本嵌入模型", - "required": "请选择一个模型", - "help": "建议使用文本嵌入模型,如 `nomic-embed-text`。", - "placeholder": "选择一个模型" - }, - "chunkSize": { - "label": "嵌入大小", - "placeholder": "1024-∞", - "required": "请输入块大小" - }, - "chunkOverlap": { - "label": "嵌入重叠", - "placeholder": "256-∞", - "required": "请输入嵌入重叠" - } - }, - "prompt": { - "label": "配置 RAG 提示词", - "option1": "普通", - "option2": "搜索", - "alert": "在此配置系统提示词已过时。请使用管理提示词部分添加或编辑提示词。此部分将在未来版本中删除", - "systemPrompt": "系统提示词", - "systemPromptPlaceholder": "输入系统提示词", - "webSearchPrompt": "网页搜索提示词", - "webSearchPromptHelp": "请勿从提示词中删除 `{search_results}`。", - "webSearchPromptError": "请输入一个网页搜索提示词", - "webSearchPromptPlaceholder": "输入网页搜索提示词", - "webSearchFollowUpPrompt": "网页搜索追问提示词", - "webSearchFollowUpPromptHelp": "请勿从提示词中删除 `{chat_history}` 和 `{question}`。", - "webSearchFollowUpPromptError": "请输入您的网页搜索追问提示词!", - "webSearchFollowUpPromptPlaceholder": "您的网页搜索追问提示词" - } + "notification": { + "pullModel": "正在拉取模型", + "pullModelDescription": "正在拉取 {{modelName}} ,请查看扩展图标。", + "success": "成功", + "error": "错误", + "successDescription": "成功拉取了模型", + "successDeleteDescription": "成功删除了模型", + "someError": "出现了问题。请稍后再试。" } -} \ No newline at end of file + }, + "managePrompts": { + "title": "管理提示词", + "addBtn": "添加新提示词", + "option1": "普通", + "option2": "RAG", + "questionPrompt": "问题提示词", + "columns": { + "title": "标题", + "prompt": "提示词", + "type": "提示词类型", + "actions": "操作" + }, + "systemPrompt": "系统提示词", + "quickPrompt": "快速提示词", + "tooltip": { + "delete": "删除提示词", + "edit": "编辑提示词" + }, + "confirm": { + "delete": "您确定要删除此提示词吗?这个操作不能撤销。" + }, + "modal": { + "addTitle": "添加新提示词", + "editTitle": "编辑提示词" + }, + "form": { + "title": { + "label": "标题", + "placeholder": "我厉害的提示词", + "required": "请输入标题", + "help": "您可以在提示词中使用 {key} 作为变量。" + }, + "prompt": { + "label": "提示词", + "placeholder": "输入提示词", + "required": "请输入提示词", + "help": "您可以在提示词中使用 {key} 作为变量。" + }, + "isSystem": { + "label": "是否为系统提示词" + }, + "btnSave": { + "saving": "添加提示词中...", + "save": "添加提示词" + }, + "btnEdit": { + "saving": "更新提示词中...", + "save": "更新提示词" + } + }, + "notification": { + "addSuccess": "提示词已添加", + "addSuccessDesc": "提示词已成功添加", + "error": "错误", + "someError": "出现了问题。请稍后再试。", + "updatedSuccess": "提示词已更新", + "updatedSuccessDesc": "提示词已成功更新", + "deletedSuccess": "提示词已删除", + "deletedSuccessDesc": "提示词已成功删除" + } + }, + "manageShare": { + "title": "管理共享", + "heading": "配置对话共享服务 URL", + "form": { + "url": { + "label": "对话共享服务 URL", + "placeholder": "输入对话共享服务 URL", + "required": "请输入您的对话共享服务 URL!", + "help": "出于隐私原因,您可以自行托管对话共享服务并在此处提供 URL,了解更多。" + } + }, + "webshare": { + "heading": "对话共享", + "columns": { + "title": "标题", + "url": "URL", + "actions": "操作" + }, + "tooltip": { + "delete": "删除对话共享" + }, + "confirm": { + "delete": "您确定要删除此对话共享吗?这个操作不能撤销。" + }, + "label": "管理页面分享", + "description": "启用或禁用页面分享功能 " + }, + "notification": { + "pageShareSuccess": "对话共享服务 URL 已成功更新", + "someError": "出现了问题。请稍后再试。", + "webShareDeleteSuccess": "对话共享已成功删除" + } + }, + "ollamaSettings": { + "title": "Ollama 设置", + "heading": "配置 Ollama", + "settings": { + "ollamaUrl": { + "label": "Ollama URL", + "placeholder": "输入 Ollama URL" + }, + + "advanced": { + "label": "Ollama URL 高级配置", + "urlRewriteEnabled": { + "label": "启用或禁用自定义来源 URL" + }, + "rewriteUrl": { + "label": "自定义来源 URL", + "placeholder": "输入自定义来源 URL" + }, + "headers": { + "label": "自定义头部", + "add": "添加头部", + "key": { + "label": "头部键", + "placeholder": "授权" + }, + "value": { + "label": "头部值", + "placeholder": "承载令牌" + } + }, + "help": "如果您在 Page Assist 上与 Ollama 有连接问题,您可以配置自定义来源 URL。要了解更多关于配置的信息,点击此处。" + } + } + }, + "manageSearch": { + "heading": "配置网络搜索", + "title": "管理网络搜索" + }, + "about": { + "title": "关于", + "heading": "关于", + "chromeVersion": "Page Assist版本", + "ollamaVersion": "Ollama版本", + "support": "您可以通过以下平台捐赠或赞助Page Assist项目:", + "koFi": "在Ko-fi上支持", + "githubSponsor": "在GitHub上赞助", + "githubRepo": "GitHub仓库" + }, + "manageKnowledge": { + "title": "管理知识", + "heading": "配置知识库" + }, + "rag": { + "title": "RAG 设置", + "ragSettings": { + "label": "RAG 设置", + "model": { + "label": "文本嵌入模型", + "required": "请选择一个模型", + "help": "建议使用文本嵌入模型,如 `nomic-embed-text`。", + "placeholder": "选择一个模型" + }, + "chunkSize": { + "label": "嵌入大小", + "placeholder": "1024-∞", + "required": "请输入块大小" + }, + "chunkOverlap": { + "label": "嵌入重叠", + "placeholder": "256-∞", + "required": "请输入嵌入重叠" + } + }, + "prompt": { + "label": "配置 RAG 提示词", + "option1": "普通", + "option2": "搜索", + "alert": "在此配置系统提示词已过时。请使用管理提示词部分添加或编辑提示词。此部分将在未来版本中删除", + "systemPrompt": "系统提示词", + "systemPromptPlaceholder": "输入系统提示词", + "webSearchPrompt": "网页搜索提示词", + "webSearchPromptHelp": "请勿从提示词中删除 `{search_results}`。", + "webSearchPromptError": "请输入一个网页搜索提示词", + "webSearchPromptPlaceholder": "输入网页搜索提示词", + "webSearchFollowUpPrompt": "网页搜索追问提示词", + "webSearchFollowUpPromptHelp": "请勿从提示词中删除 `{chat_history}` 和 `{question}`。", + "webSearchFollowUpPromptError": "请输入您的网页搜索追问提示词!", + "webSearchFollowUpPromptPlaceholder": "您的网页搜索追问提示词" + } + }, + "chromeAiSettings": { + "title": "Chrome AI 设置" + } +} diff --git a/src/components/Common/Markdown.tsx b/src/components/Common/Markdown.tsx index c736c59..149716a 100644 --- a/src/components/Common/Markdown.tsx +++ b/src/components/Common/Markdown.tsx @@ -6,11 +6,17 @@ import "property-information" import React from "react" import { CodeBlock } from "./CodeBlock" -export default function Markdown({ message }: { message: string }) { +export default function Markdown({ + message, + className = "prose break-words dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 dark:prose-dark" +}: { + message: string + className?: string +}) { return ( { const { t } = useTranslation("common") @@ -29,7 +29,10 @@ export const ModelSelect: React.FC = () => { label: (
- +
{d.name}
@@ -53,7 +56,7 @@ export const ModelSelect: React.FC = () => { trigger={["click"]}> diff --git a/src/components/Common/Playground/Message.tsx b/src/components/Common/Playground/Message.tsx index de18540..c23c90e 100644 --- a/src/components/Common/Playground/Message.tsx +++ b/src/components/Common/Playground/Message.tsx @@ -64,7 +64,11 @@ export const PlaygroundMessage = (props: Props) => {
- {props.isBot ? props.name : "You"} + {props.isBot + ? props.name === "chrome::gemini-nano::page-assist" + ? "Gemini Nano" + : props.name + : "You"} {props.isBot && diff --git a/src/components/Common/ProviderIcon.tsx b/src/components/Common/ProviderIcon.tsx new file mode 100644 index 0000000..a97776f --- /dev/null +++ b/src/components/Common/ProviderIcon.tsx @@ -0,0 +1,17 @@ +import { ChromeIcon } from "lucide-react" +import { OllamaIcon } from "../Icons/Ollama" + +export const ProviderIcons = ({ + provider, + className +}: { + provider: string + className?: string +}) => { + switch (provider) { + case "chrome": + return + default: + return + } +} diff --git a/src/components/Common/Settings/AdvanceOllamaSettings.tsx b/src/components/Common/Settings/AdvanceOllamaSettings.tsx index 258b491..d277fe9 100644 --- a/src/components/Common/Settings/AdvanceOllamaSettings.tsx +++ b/src/components/Common/Settings/AdvanceOllamaSettings.tsx @@ -1,49 +1,132 @@ -import { useStorage } from "@plasmohq/storage/hook" -import { Input, Switch } from "antd" +import { Divider, Input, Switch } from "antd" import { useTranslation } from "react-i18next" +import { Form } from "antd" +import React from "react" +import { + customOllamaHeaders, + getRewriteUrl, + isUrlRewriteEnabled, + setCustomOllamaHeaders, + setRewriteUrl, + setUrlRewriteEnabled +} from "@/services/app" +import { Trash2Icon } from "lucide-react" +import { SaveButton } from "../SaveButton" export const AdvanceOllamaSettings = () => { - const [urlRewriteEnabled, setUrlRewriteEnabled] = useStorage( - "urlRewriteEnabled", - false - ) + const [form] = Form.useForm() + const watchUrlRewriteEnabled = Form.useWatch("urlRewriteEnabled", form) + + const fetchAdvancedData = async () => { + const [urlRewriteEnabled, rewriteUrl, headers] = await Promise.all([ + isUrlRewriteEnabled(), + getRewriteUrl(), + customOllamaHeaders() + ]) + form.setFieldsValue({ urlRewriteEnabled, rewriteUrl, headers }) + } + + React.useEffect(() => { + fetchAdvancedData() + }, []) - const [rewriteUrl, setRewriteUrl] = useStorage( - "rewriteUrl", - "http://127.0.0.1:11434" - ) const { t } = useTranslation("settings") return ( -
-
- - {t("ollamaSettings.settings.advanced.urlRewriteEnabled.label")} - -
- setUrlRewriteEnabled(checked)} - /> -
-
-
- - {t("ollamaSettings.settings.advanced.rewriteUrl.label")} - -
- setRewriteUrl(e.target.value)} - /> -
-
-
+
{ + const headers = e?.headers?.filter( + (header: { key: string; value: string }) => header.key && header.value + ) + setUrlRewriteEnabled(e.urlRewriteEnabled) + setRewriteUrl(e.rewriteUrl) + setCustomOllamaHeaders(headers) + }} + form={form} + layout="vertical" + className="space-y-4"> + + + + + + + + + {(fields, { add, remove }) => ( +
+
+

+ {t("ollamaSettings.settings.advanced.headers.label")} +

+ +
+ {fields.map((field, index) => ( +
+
+ + + + + + +
+ +
+ ))} +
+ )} +
+ + + + + + ) } diff --git a/src/components/Layouts/Header.tsx b/src/components/Layouts/Header.tsx index 1d6099a..f7251b1 100644 --- a/src/components/Layouts/Header.tsx +++ b/src/components/Layouts/Header.tsx @@ -21,6 +21,7 @@ import { useMessageOption } from "~/hooks/useMessageOption" import { Select, Tooltip } from "antd" import { getAllPrompts } from "@/db" import { ShareBtn } from "~/components/Common/ShareBtn" +import { ProviderIcons } from "../Common/ProviderIcon" type Props = { setSidebarOpen: (open: boolean) => void setOpenModelSettings: (open: boolean) => void @@ -132,7 +133,10 @@ export const Header: React.FC = ({ - + {model.name} ), diff --git a/src/components/Layouts/SettingsOptionLayout.tsx b/src/components/Layouts/SettingsOptionLayout.tsx index 9a76c34..ce96a52 100644 --- a/src/components/Layouts/SettingsOptionLayout.tsx +++ b/src/components/Layouts/SettingsOptionLayout.tsx @@ -6,11 +6,13 @@ import { BlocksIcon, InfoIcon, CombineIcon, + ChromeIcon } from "lucide-react" import { useTranslation } from "react-i18next" import { Link, useLocation } from "react-router-dom" import { OllamaIcon } from "../Icons/Ollama" import { Tag } from "antd" +import { BetaTag } from "../Common/Beta" function classNames(...classes: string[]) { return classes.filter(Boolean).join(" ") @@ -20,10 +22,12 @@ const LinkComponent = (item: { href: string name: string | JSX.Element icon: any - current: string + current: string, + beta?: boolean }) => { return ( -
  • +
  • + {item.name} + { + item.beta && + }
  • ) } @@ -65,7 +72,7 @@ export const SettingsLayout = ({ children }: { children: React.ReactNode }) => { icon={OrbitIcon} current={location.pathname} /> - { icon={OllamaIcon} current={location.pathname} /> + {import.meta.env.BROWSER === "chrome" && ( + + )} { + const { t } = useTranslation("chrome") + const [chromeAIStatus, setChromeAIStatus] = useStorage( + "chromeAIStatus", + false + ) + const [selectedModel, setSelectedModel] = useStorage("selectedModel") + + const { status, data } = useQuery({ + queryKey: ["fetchChromeAIInfo"], + queryFn: async () => { + const data = await getChromeAISupported() + return data + } + }) + return ( +
    + {status === "pending" && } + {status === "success" && ( +
    +
    +
    +

    + {t("heading")} +

    +
    +
    + +
    +
    + + {t("status.label")} + +
    + + { + setChromeAIStatus(value) + if ( + !value && + selectedModel === "chrome::gemini-nano::page-assist" + ) { + setSelectedModel(null) + } + }} + /> +
    + {data !== "success" && ( +
    + +
    + +
    +
    + )} +
    +
    + )} +
    + ) +} diff --git a/src/components/Option/Settings/general-settings.tsx b/src/components/Option/Settings/general-settings.tsx index d5d1c27..1b1e7cc 100644 --- a/src/components/Option/Settings/general-settings.tsx +++ b/src/components/Option/Settings/general-settings.tsx @@ -13,7 +13,6 @@ import { exportPageAssistData, importPageAssistData } from "@/libs/export-import" -import { BetaTag } from "@/components/Common/Beta" import { useStorage } from "@plasmohq/storage/hook" export const GeneralSettings = () => { @@ -87,7 +86,6 @@ export const GeneralSettings = () => {
    - {t("generalSettings.settings.copilotResumeLastChat.label")} @@ -99,7 +97,6 @@ export const GeneralSettings = () => {
    - {t("generalSettings.settings.hideCurrentChatModelSettings.label")} diff --git a/src/components/Option/Settings/ollama.tsx b/src/components/Option/Settings/ollama.tsx index e5fefce..3f9c6ba 100644 --- a/src/components/Option/Settings/ollama.tsx +++ b/src/components/Option/Settings/ollama.tsx @@ -50,6 +50,14 @@ export const SettingsOllama = () => { className="w-full p-2 border border-gray-300 rounded-md dark:bg-[#262626] dark:text-gray-100" />
    +
    + { + saveOllamaURL(ollamaURL) + }} + className="mt-2" + /> +
    { } ]} /> - -
    - { - saveOllamaURL(ollamaURL) - }} - className="mt-2" - /> -
    diff --git a/src/hooks/useMessage.tsx b/src/hooks/useMessage.tsx index 0b20edf..17a84a1 100644 --- a/src/hooks/useMessage.tsx +++ b/src/hooks/useMessage.tsx @@ -28,9 +28,9 @@ import { formatDocs } from "@/chain/chat-with-x" import { OllamaEmbeddingsPageAssist } from "@/models/OllamaEmbedding" import { useStorage } from "@plasmohq/storage/hook" import { useStoreChatModelSettings } from "@/store/model" -import { ChatOllama } from "@/models/ChatOllama" import { getAllDefaultModelSettings } from "@/services/model-settings" import { getSystemPromptForWeb } from "@/web/web" +import { pageAssistModel } from "@/models" export const useMessage = () => { const { @@ -98,7 +98,7 @@ export const useMessage = () => { const url = await getOllamaURL() const userDefaultModelSettings = await getAllDefaultModelSettings() - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -225,7 +225,7 @@ export const useMessage = () => { const promptForQuestion = questionPrompt .replaceAll("{chat_history}", chat_history) .replaceAll("{question}", message) - const questionOllama = new ChatOllama({ + const questionOllama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -388,7 +388,7 @@ export const useMessage = () => { image = `data:image/jpeg;base64,${image.split(",")[1]}` } - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -591,7 +591,7 @@ export const useMessage = () => { image = `data:image/jpeg;base64,${image.split(",")[1]}` } - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -661,7 +661,7 @@ export const useMessage = () => { const promptForQuestion = questionPrompt .replaceAll("{chat_history}", chat_history) .replaceAll("{question}", message) - const questionOllama = new ChatOllama({ + const questionOllama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index 40341ff..2b28aa7 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -31,7 +31,7 @@ import { useWebUI } from "@/store/webui" import { useStorage } from "@plasmohq/storage/hook" import { useStoreChatModelSettings } from "@/store/model" import { getAllDefaultModelSettings } from "@/services/model-settings" -import { ChatOllama } from "@/models/ChatOllama" +import { pageAssistModel } from "@/models" export const useMessageOption = () => { const { @@ -104,7 +104,7 @@ export const useMessageOption = () => { image = `data:image/jpeg;base64,${image.split(",")[1]}` } - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -174,7 +174,7 @@ export const useMessageOption = () => { const promptForQuestion = questionPrompt .replaceAll("{chat_history}", chat_history) .replaceAll("{question}", message) - const questionOllama = new ChatOllama({ + const questionOllama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -347,7 +347,7 @@ export const useMessageOption = () => { image = `data:image/jpeg;base64,${image.split(",")[1]}` } - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -463,6 +463,7 @@ export const useMessageOption = () => { signal: signal } ) + let count = 0 for await (const chunk of chunks) { contentToSave += chunk.content @@ -562,7 +563,7 @@ export const useMessageOption = () => { const url = await getOllamaURL() const userDefaultModelSettings = await getAllDefaultModelSettings() - const ollama = new ChatOllama({ + const ollama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: @@ -648,7 +649,7 @@ export const useMessageOption = () => { const promptForQuestion = questionPrompt .replaceAll("{chat_history}", chat_history) .replaceAll("{question}", message) - const questionOllama = new ChatOllama({ + const questionOllama = await pageAssistModel({ model: selectedModel!, baseUrl: cleanUrl(url), keepAlive: diff --git a/src/i18n/lang/en.ts b/src/i18n/lang/en.ts index 1522528..dcb0dc6 100644 --- a/src/i18n/lang/en.ts +++ b/src/i18n/lang/en.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/en/common.json"; import sidepanel from "@/assets/locale/en/sidepanel.json"; import settings from "@/assets/locale/en/settings.json"; import knowledge from "@/assets/locale/en/knowledge.json"; +import chrome from "@/assets/locale/en/chrome.json"; export const en = { option, @@ -11,5 +12,6 @@ export const en = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/es.ts b/src/i18n/lang/es.ts index c666286..0e04fa7 100644 --- a/src/i18n/lang/es.ts +++ b/src/i18n/lang/es.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/es/common.json"; import sidepanel from "@/assets/locale/es/sidepanel.json"; import settings from "@/assets/locale/es/settings.json"; import knowledge from "@/assets/locale/es/knowledge.json"; +import chrome from "@/assets/locale/es/chrome.json"; export const es = { option, @@ -11,5 +12,6 @@ export const es = { common, sidepanel, settings, - knowledge + knowledge, + chrome } diff --git a/src/i18n/lang/fr.ts b/src/i18n/lang/fr.ts index 9c741db..e6f49b7 100644 --- a/src/i18n/lang/fr.ts +++ b/src/i18n/lang/fr.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/fr/common.json"; import sidepanel from "@/assets/locale/fr/sidepanel.json"; import settings from "@/assets/locale/fr/settings.json"; import knowledge from "@/assets/locale/fr/knowledge.json"; +import chrome from "@/assets/locale/fr/chrome.json"; export const fr = { option, @@ -11,5 +12,6 @@ export const fr = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/it.ts b/src/i18n/lang/it.ts index 6be87df..b866c39 100644 --- a/src/i18n/lang/it.ts +++ b/src/i18n/lang/it.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/it/common.json"; import sidepanel from "@/assets/locale/it/sidepanel.json"; import settings from "@/assets/locale/it/settings.json"; import knowledge from "@/assets/locale/it/knowledge.json"; +import chrome from "@/assets/locale/it/chrome.json"; export const it = { option, @@ -11,5 +12,6 @@ export const it = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/ja.ts b/src/i18n/lang/ja.ts index 98f3a84..f4ff10e 100644 --- a/src/i18n/lang/ja.ts +++ b/src/i18n/lang/ja.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/ja-JP/common.json"; import sidepanel from "@/assets/locale/ja-JP/sidepanel.json"; import settings from "@/assets/locale/ja-JP/settings.json"; import knowledge from "@/assets/locale/ja-JP/knowledge.json"; +import chrome from "@/assets/locale/ja-JP/chrome.json"; export const ja = { @@ -12,5 +13,6 @@ export const ja = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/ml.ts b/src/i18n/lang/ml.ts index 70afc19..1b2bb45 100644 --- a/src/i18n/lang/ml.ts +++ b/src/i18n/lang/ml.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/ml/common.json"; import sidepanel from "@/assets/locale/ml/sidepanel.json"; import settings from "@/assets/locale/ml/settings.json"; import knowledge from "@/assets/locale/ml/knowledge.json"; +import chrome from "@/assets/locale/ml/chrome.json"; export const ml = { option, @@ -11,5 +12,6 @@ export const ml = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/pt.ts b/src/i18n/lang/pt.ts index c29f8f9..256568d 100644 --- a/src/i18n/lang/pt.ts +++ b/src/i18n/lang/pt.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/pt-BR/common.json"; import sidepanel from "@/assets/locale/pt-BR/sidepanel.json"; import settings from "@/assets/locale/pt-BR/settings.json"; import knowledge from "@/assets/locale/pt-BR/knowledge.json"; +import chrome from "@/assets/locale/pt-BR/chrome.json"; export const pt = { option, @@ -11,5 +12,6 @@ export const pt = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/ru.ts b/src/i18n/lang/ru.ts index 3887fa7..4dcb0f3 100644 --- a/src/i18n/lang/ru.ts +++ b/src/i18n/lang/ru.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/ru/common.json"; import sidepanel from "@/assets/locale/ru/sidepanel.json"; import settings from "@/assets/locale/ru/settings.json"; import knowledge from "@/assets/locale/ru/knowledge.json"; +import chrome from "@/assets/locale/ru/chrome.json"; export const ru = { option, @@ -11,5 +12,6 @@ export const ru = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/i18n/lang/zh.ts b/src/i18n/lang/zh.ts index 7381288..ad2249e 100644 --- a/src/i18n/lang/zh.ts +++ b/src/i18n/lang/zh.ts @@ -4,6 +4,7 @@ import common from "@/assets/locale/zh/common.json"; import sidepanel from "@/assets/locale/zh/sidepanel.json"; import settings from "@/assets/locale/zh/settings.json"; import knowledge from "@/assets/locale/zh/knowledge.json"; +import chrome from "@/assets/locale/zh/chrome.json"; export const zh = { @@ -12,5 +13,6 @@ export const zh = { common, sidepanel, settings, - knowledge + knowledge, + chrome } \ No newline at end of file diff --git a/src/models/ChatChromeAi.ts b/src/models/ChatChromeAi.ts new file mode 100644 index 0000000..de911d2 --- /dev/null +++ b/src/models/ChatChromeAi.ts @@ -0,0 +1,193 @@ +import { + SimpleChatModel, + type BaseChatModelParams +} from "@langchain/core/language_models/chat_models" +import type { BaseLanguageModelCallOptions } from "@langchain/core/language_models/base" +import { + CallbackManagerForLLMRun, + Callbacks +} from "@langchain/core/callbacks/manager" +import { BaseMessage, AIMessageChunk } from "@langchain/core/messages" +import { ChatGenerationChunk } from "@langchain/core/outputs" +import { IterableReadableStream } from "@langchain/core/utils/stream" + +export interface AI { + canCreateTextSession(): Promise + createTextSession(options?: AITextSessionOptions): Promise + defaultTextSessionOptions(): Promise +} + +export interface AITextSession { + prompt(input: string): Promise + promptStreaming(input: string): ReadableStream + destroy(): void + clone(): AITextSession +} + +export interface AITextSessionOptions { + topK: number + temperature: number +} + +export const enum AIModelAvailability { + Readily = "readily", + AfterDownload = "after-download", + No = "no" +} + +export interface ChromeAIInputs extends BaseChatModelParams { + topK?: number + temperature?: number + /** + * An optional function to format the prompt before sending it to the model. + */ + promptFormatter?: (messages: BaseMessage[]) => string +} + +export interface ChromeAICallOptions extends BaseLanguageModelCallOptions {} + +function formatPrompt(messages: BaseMessage[]): string { + return messages + .map((message) => { + if (typeof message.content !== "string") { + // console.log(message.content) + // throw new Error( + // "ChatChromeAI does not support non-string message content." + // ) + if (message.content.length > 0) { + //@ts-ignore + return message.content[0]?.text || "" + } + + return "" + } + return `${message._getType()}: ${message.content}` + }) + .join("\n") +} + +/** + * To use this model you need to have the `Built-in AI Early Preview Program` + * for Chrome. You can find more information about the program here: + * @link https://developer.chrome.com/docs/ai/built-in + * + * @example + * ```typescript + * // Initialize the ChatChromeAI model. + * const model = new ChatChromeAI({ + * temperature: 0.5, // Optional. Default is 0.5. + * topK: 40, // Optional. Default is 40. + * }); + * + * // Call the model with a message and await the response. + * const response = await model.invoke([ + * new HumanMessage({ content: "My name is John." }), + * ]); + * ``` + */ +export class ChatChromeAI extends SimpleChatModel { + session?: AITextSession + + temperature = 0.5 + + topK = 40 + + promptFormatter: (messages: BaseMessage[]) => string + + static lc_name() { + return "ChatChromeAI" + } + + constructor(inputs?: ChromeAIInputs) { + super({ + callbacks: {} as Callbacks, + ...inputs + }) + this.temperature = inputs?.temperature ?? this.temperature + this.topK = inputs?.topK ?? this.topK + this.promptFormatter = inputs?.promptFormatter ?? formatPrompt + } + + _llmType() { + return "chrome-ai" + } + + /** + * Initialize the model. This method must be called before calling `.invoke()`. + */ + async initialize() { + if (typeof window === "undefined") { + throw new Error("ChatChromeAI can only be used in the browser.") + } + + const { ai } = window as any + const canCreateTextSession = await ai.canCreateTextSession() + if (canCreateTextSession === AIModelAvailability.No) { + throw new Error("The AI model is not available.") + } else if (canCreateTextSession === AIModelAvailability.AfterDownload) { + throw new Error("The AI model is not yet downloaded.") + } + + this.session = await ai.createTextSession({ + topK: this.topK, + temperature: this.temperature + }) + } + + /** + * Call `.destroy()` to free resources if you no longer need a session. + * When a session is destroyed, it can no longer be used, and any ongoing + * execution will be aborted. You may want to keep the session around if + * you intend to prompt the model often since creating a session can take + * some time. + */ + destroy() { + if (!this.session) { + return console.log("No session found. Returning.") + } + this.session.destroy() + } + + async *_streamResponseChunks( + messages: BaseMessage[], + _options: this["ParsedCallOptions"], + runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + if (!this.session) { + await this.initialize() + } + const textPrompt = this.promptFormatter(messages) + const stream = this.session.promptStreaming(textPrompt) + const iterableStream = IterableReadableStream.fromReadableStream(stream) + + let previousContent = "" + for await (const chunk of iterableStream) { + const newContent = chunk.slice(previousContent.length) + previousContent += newContent + yield new ChatGenerationChunk({ + text: newContent, + message: new AIMessageChunk({ + content: newContent, + additional_kwargs: {} + }) + }) + await runManager?.handleLLMNewToken(newContent) + } + } + + async _call( + messages: BaseMessage[], + options: this["ParsedCallOptions"], + runManager?: CallbackManagerForLLMRun + ): Promise { + const chunks = [] + for await (const chunk of this._streamResponseChunks( + messages, + options, + runManager + )) { + chunks.push(chunk.text) + } + return chunks.join("") + } +} diff --git a/src/models/OllamaEmbedding.ts b/src/models/OllamaEmbedding.ts index eadec2d..b0395c3 100644 --- a/src/models/OllamaEmbedding.ts +++ b/src/models/OllamaEmbedding.ts @@ -1,6 +1,7 @@ import { Embeddings, EmbeddingsParams } from "@langchain/core/embeddings" import type { StringWithAutocomplete } from "@langchain/core/utils/types" import { parseKeepAlive } from "./utils/ollama" +import { getCustomOllamaHeaders } from "@/services/app" export interface OllamaInput { embeddingOnly?: boolean @@ -213,12 +214,14 @@ export class OllamaEmbeddingsPageAssist extends Embeddings { "http://127.0.0.1:" ) } + const customHeaders = await getCustomOllamaHeaders() const response = await fetch(`${formattedBaseUrl}/api/embeddings`, { method: "POST", headers: { "Content-Type": "application/json", - ...this.headers + ...this.headers, + ...customHeaders }, body: JSON.stringify({ prompt, diff --git a/src/models/index.ts b/src/models/index.ts new file mode 100644 index 0000000..d627a5d --- /dev/null +++ b/src/models/index.ts @@ -0,0 +1,41 @@ +import { ChatChromeAI } from "./ChatChromeAi" +import { ChatOllama } from "./ChatOllama" + +export const pageAssistModel = async ({ + model, + baseUrl, + keepAlive, + temperature, + topK, + topP, + numCtx, + seed +}: { + model: string + baseUrl: string + keepAlive: string + temperature: number + topK: number + topP: number + numCtx: number + seed: number +}) => { + switch (model) { + case "chrome::gemini-nano::page-assist": + return new ChatChromeAI({ + temperature, + topK + }) + default: + return new ChatOllama({ + baseUrl, + keepAlive, + temperature, + topK, + topP, + numCtx, + seed, + model + }) + } +} diff --git a/src/models/utils/ollama.ts b/src/models/utils/ollama.ts index 55ce05e..57b98f0 100644 --- a/src/models/utils/ollama.ts +++ b/src/models/utils/ollama.ts @@ -1,184 +1,189 @@ -import { IterableReadableStream } from "@langchain/core/utils/stream"; -import type { StringWithAutocomplete } from "@langchain/core/utils/types"; -import { BaseLanguageModelCallOptions } from "@langchain/core/language_models/base"; +import { IterableReadableStream } from "@langchain/core/utils/stream" +import type { StringWithAutocomplete } from "@langchain/core/utils/types" +import { BaseLanguageModelCallOptions } from "@langchain/core/language_models/base" +import { getCustomOllamaHeaders } from "@/services/app" export interface OllamaInput { - embeddingOnly?: boolean; - f16KV?: boolean; - frequencyPenalty?: number; - headers?: Record; - keepAlive?: any; - logitsAll?: boolean; - lowVram?: boolean; - mainGpu?: number; - model?: string; - baseUrl?: string; - mirostat?: number; - mirostatEta?: number; - mirostatTau?: number; - numBatch?: number; - numCtx?: number; - numGpu?: number; - numGqa?: number; - numKeep?: number; - numPredict?: number; - numThread?: number; - penalizeNewline?: boolean; - presencePenalty?: number; - repeatLastN?: number; - repeatPenalty?: number; - ropeFrequencyBase?: number; - ropeFrequencyScale?: number; - temperature?: number; - stop?: string[]; - tfsZ?: number; - topK?: number; - topP?: number; - typicalP?: number; - useMLock?: boolean; - useMMap?: boolean; - vocabOnly?: boolean; - seed?: number; - format?: StringWithAutocomplete<"json">; + embeddingOnly?: boolean + f16KV?: boolean + frequencyPenalty?: number + headers?: Record + keepAlive?: any + logitsAll?: boolean + lowVram?: boolean + mainGpu?: number + model?: string + baseUrl?: string + mirostat?: number + mirostatEta?: number + mirostatTau?: number + numBatch?: number + numCtx?: number + numGpu?: number + numGqa?: number + numKeep?: number + numPredict?: number + numThread?: number + penalizeNewline?: boolean + presencePenalty?: number + repeatLastN?: number + repeatPenalty?: number + ropeFrequencyBase?: number + ropeFrequencyScale?: number + temperature?: number + stop?: string[] + tfsZ?: number + topK?: number + topP?: number + typicalP?: number + useMLock?: boolean + useMMap?: boolean + vocabOnly?: boolean + seed?: number + format?: StringWithAutocomplete<"json"> } export interface OllamaRequestParams { - model: string; - format?: StringWithAutocomplete<"json">; - images?: string[]; + model: string + format?: StringWithAutocomplete<"json"> + images?: string[] options: { - embedding_only?: boolean; - f16_kv?: boolean; - frequency_penalty?: number; - logits_all?: boolean; - low_vram?: boolean; - main_gpu?: number; - mirostat?: number; - mirostat_eta?: number; - mirostat_tau?: number; - num_batch?: number; - num_ctx?: number; - num_gpu?: number; - num_gqa?: number; - num_keep?: number; - num_thread?: number; - num_predict?: number; - penalize_newline?: boolean; - presence_penalty?: number; - repeat_last_n?: number; - repeat_penalty?: number; - rope_frequency_base?: number; - rope_frequency_scale?: number; - temperature?: number; - stop?: string[]; - tfs_z?: number; - top_k?: number; - top_p?: number; - typical_p?: number; - use_mlock?: boolean; - use_mmap?: boolean; - vocab_only?: boolean; - }; + embedding_only?: boolean + f16_kv?: boolean + frequency_penalty?: number + logits_all?: boolean + low_vram?: boolean + main_gpu?: number + mirostat?: number + mirostat_eta?: number + mirostat_tau?: number + num_batch?: number + num_ctx?: number + num_gpu?: number + num_gqa?: number + num_keep?: number + num_thread?: number + num_predict?: number + penalize_newline?: boolean + presence_penalty?: number + repeat_last_n?: number + repeat_penalty?: number + rope_frequency_base?: number + rope_frequency_scale?: number + temperature?: number + stop?: string[] + tfs_z?: number + top_k?: number + top_p?: number + typical_p?: number + use_mlock?: boolean + use_mmap?: boolean + vocab_only?: boolean + } } export type OllamaMessage = { - role: StringWithAutocomplete<"user" | "assistant" | "system">; - content: string; - images?: string[]; -}; + role: StringWithAutocomplete<"user" | "assistant" | "system"> + content: string + images?: string[] +} export interface OllamaGenerateRequestParams extends OllamaRequestParams { - prompt: string; + prompt: string } export interface OllamaChatRequestParams extends OllamaRequestParams { - messages: OllamaMessage[]; + messages: OllamaMessage[] } export type BaseOllamaGenerationChunk = { - model: string; - created_at: string; - done: boolean; - total_duration?: number; - load_duration?: number; - prompt_eval_count?: number; - prompt_eval_duration?: number; - eval_count?: number; - eval_duration?: number; -}; + model: string + created_at: string + done: boolean + total_duration?: number + load_duration?: number + prompt_eval_count?: number + prompt_eval_duration?: number + eval_count?: number + eval_duration?: number +} export type OllamaGenerationChunk = BaseOllamaGenerationChunk & { - response: string; -}; + response: string +} export type OllamaChatGenerationChunk = BaseOllamaGenerationChunk & { - message: OllamaMessage; -}; + message: OllamaMessage +} export type OllamaCallOptions = BaseLanguageModelCallOptions & { - headers?: Record; -}; + headers?: Record +} async function* createOllamaStream( url: string, params: OllamaRequestParams, options: OllamaCallOptions ) { - let formattedUrl = url; + let formattedUrl = url if (formattedUrl.startsWith("http://localhost:")) { // Node 18 has issues with resolving "localhost" // See https://github.com/node-fetch/node-fetch/issues/1624 formattedUrl = formattedUrl.replace( "http://localhost:", "http://127.0.0.1:" - ); + ) } + + const customHeaders = await getCustomOllamaHeaders() + const response = await fetch(formattedUrl, { method: "POST", body: JSON.stringify(params), headers: { "Content-Type": "application/json", ...options.headers, + ...customHeaders }, - signal: options.signal, - }); + signal: options.signal + }) if (!response.ok) { - let error; - const responseText = await response.text(); + let error + const responseText = await response.text() try { - const json = JSON.parse(responseText); + const json = JSON.parse(responseText) error = new Error( `Ollama call failed with status code ${response.status}: ${json.error}` - ); + ) // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { error = new Error( `Ollama call failed with status code ${response.status}: ${responseText}` - ); + ) } // eslint-disable-next-line @typescript-eslint/no-explicit-any - (error as any).response = response; - throw error; + ;(error as any).response = response + throw error } if (!response.body) { throw new Error( "Could not begin Ollama stream. Please check the given URL and try again." - ); + ) } - const stream = IterableReadableStream.fromReadableStream(response.body); + const stream = IterableReadableStream.fromReadableStream(response.body) - const decoder = new TextDecoder(); - let extra = ""; + const decoder = new TextDecoder() + let extra = "" for await (const chunk of stream) { - const decoded = extra + decoder.decode(chunk); - const lines = decoded.split("\n"); - extra = lines.pop() || ""; + const decoded = extra + decoder.decode(chunk) + const lines = decoded.split("\n") + extra = lines.pop() || "" for (const line of lines) { try { - yield JSON.parse(line); + yield JSON.parse(line) } catch (e) { - console.warn(`Received a non-JSON parseable chunk: ${line}`); + console.warn(`Received a non-JSON parseable chunk: ${line}`) } } } @@ -189,7 +194,7 @@ export async function* createOllamaGenerateStream( params: OllamaGenerateRequestParams, options: OllamaCallOptions ): AsyncGenerator { - yield* createOllamaStream(`${baseUrl}/api/generate`, params, options); + yield* createOllamaStream(`${baseUrl}/api/generate`, params, options) } export async function* createOllamaChatStream( @@ -197,13 +202,12 @@ export async function* createOllamaChatStream( params: OllamaChatRequestParams, options: OllamaCallOptions ): AsyncGenerator { - yield* createOllamaStream(`${baseUrl}/api/chat`, params, options); + yield* createOllamaStream(`${baseUrl}/api/chat`, params, options) } - export const parseKeepAlive = (keepAlive: any) => { if (keepAlive === "-1") { return -1 } return keepAlive -} \ No newline at end of file +} diff --git a/src/routes/chrome.tsx b/src/routes/chrome.tsx index 19c1031..4e78ba0 100644 --- a/src/routes/chrome.tsx +++ b/src/routes/chrome.tsx @@ -10,6 +10,7 @@ import OptionAbout from "./option-settings-about" import SidepanelChat from "./sidepanel-chat" import SidepanelSettings from "./sidepanel-settings" import OptionRagSettings from "./option-rag" +import OptionChrome from "./option-settings-chrome" export const OptionRoutingChrome = () => { return ( @@ -19,6 +20,7 @@ export const OptionRoutingChrome = () => { } /> } /> } /> + } /> } /> } /> } /> diff --git a/src/routes/option-settings-chrome.tsx b/src/routes/option-settings-chrome.tsx new file mode 100644 index 0000000..bc7f16e --- /dev/null +++ b/src/routes/option-settings-chrome.tsx @@ -0,0 +1,15 @@ +import { SettingsLayout } from "~/components/Layouts/SettingsOptionLayout" +import OptionLayout from "~/components/Layouts/Layout" +import { ChromeApp } from "@/components/Option/Settings/chrome" + +const OptionChrome = () => { + return ( + + + + + + ) +} + +export default OptionChrome diff --git a/src/services/app.ts b/src/services/app.ts index 9fb2ccd..ca16437 100644 --- a/src/services/app.ts +++ b/src/services/app.ts @@ -5,10 +5,10 @@ const DEFAULT_URL_REWRITE_URL = "http://127.0.0.1:11434" export const isUrlRewriteEnabled = async () => { const enabled = await storage.get("urlRewriteEnabled") - return enabled + return enabled ?? false } export const setUrlRewriteEnabled = async (enabled: boolean) => { - await storage.set("urlRewriteEnabled", enabled ? "true" : "false") + await storage.set("urlRewriteEnabled", enabled) } export const getRewriteUrl = async () => { @@ -35,12 +35,10 @@ export const getAdvancedOllamaSettings = async () => { } } - export const copilotResumeLastChat = async () => { return await storage.get("copilotResumeLastChat") } - export const defaultSidebarOpen = async () => { const sidebarOpen = await storage.get("sidebarOpen") if (!sidebarOpen || sidebarOpen === "") { @@ -49,7 +47,36 @@ export const defaultSidebarOpen = async () => { return sidebarOpen } - export const setSidebarOpen = async (sidebarOpen: string) => { await storage.set("sidebarOpen", sidebarOpen) -} \ No newline at end of file +} + +export const customOllamaHeaders = async (): Promise< + { key: string; value: string }[] +> => { + const headers = await storage.get< + { key: string; value: string }[] | undefined + >("customOllamaHeaders") + if (!headers) { + return [] + } + return headers +} + +export const setCustomOllamaHeaders = async (headers: string[]) => { + await storage.set("customOllamaHeaders", headers) +} + +export const getCustomOllamaHeaders = async (): Promise< + Record +> => { + const headers = await customOllamaHeaders() + + const headerMap: Record = {} + + for (const header of headers) { + headerMap[header.key] = header.value + } + + return headerMap +} diff --git a/src/services/chrome.ts b/src/services/chrome.ts new file mode 100644 index 0000000..dc7729b --- /dev/null +++ b/src/services/chrome.ts @@ -0,0 +1,38 @@ +import { Storage } from "@plasmohq/storage" + +const storage = new Storage() + +const DEFAULT_CHROME_AI_MODEL = { + name: "Gemini Nano", + model: "chrome::gemini-nano::page-assist", + modified_at: "", + provider: "chrome", + size: 0, + digest: "", + details: { + parent_model: "", + format: "", + family: "", + families: [], + parameter_size: "", + quantization_level: "" + } +} + +export const getChromeAIStatus = async (): Promise => { + const aiStatus = await storage.get("chromeAIStatus") + return aiStatus ?? false +} + +export const setChromeAIStatus = async (status: boolean): Promise => { + await storage.set("chromeAIStatus", status) +} + +export const getChromeAIModel = async () => { + const isEnable = await getChromeAIStatus() + if (isEnable) { + return [DEFAULT_CHROME_AI_MODEL] + } else { + return [] + } +} diff --git a/src/services/ollama.ts b/src/services/ollama.ts index be1da4f..b27f2cd 100644 --- a/src/services/ollama.ts +++ b/src/services/ollama.ts @@ -1,6 +1,7 @@ import { Storage } from "@plasmohq/storage" import { cleanUrl } from "../libs/clean-url" import { urlRewriteRuntime } from "../libs/runtime" +import { getChromeAIModel } from "./chrome" const storage = new Storage() @@ -144,6 +145,7 @@ export const deleteModel = async (model: string) => { return response.json() } + export const fetchChatModels = async ({ returnEmpty = false }: { @@ -174,15 +176,39 @@ export const fetchChatModels = async ({ quantization_level: string } }[] - return models?.filter((model) => { - return ( - !model?.details?.families?.includes("bert") && - !model?.details?.families?.includes("nomic-bert") - ) - }) + const chatModels = models + ?.filter((model) => { + return ( + !model?.details?.families?.includes("bert") && + !model?.details?.families?.includes("nomic-bert") + ) + }) + .map((model) => { + return { + ...model, + provider: "ollama" + } + }) + const chromeModel = await getChromeAIModel() + return [ + ...chatModels, + ...chromeModel + ] } catch (e) { console.error(e) - return await getAllModels({ returnEmpty }) + const allModels = await getAllModels({ returnEmpty }) + const models = allModels.map((model) => { + return { + ...model, + provider: "ollama" + } + }) + const chromeModel = await getChromeAIModel() + + return [ + ...models, + ...chromeModel + ] } } @@ -345,4 +371,3 @@ export const getPageShareUrl = async () => { export const setPageShareUrl = async (pageShareUrl: string) => { await storage.set("pageShareUrl", pageShareUrl) } - diff --git a/src/utils/chrome.ts b/src/utils/chrome.ts new file mode 100644 index 0000000..d18db81 --- /dev/null +++ b/src/utils/chrome.ts @@ -0,0 +1,30 @@ +export const getChromeAISupported = async () => { + try { + let browserInfo = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./) + let version = browserInfo ? parseInt(browserInfo[2], 10) : 0 + + if (version < 127) { + return "browser_not_supported" + } + + if (!("ai" in globalThis)) { + return "ai_not_supported" + } + + //@ts-ignore + const createSession = await ai?.canCreateGenericSession() + if (createSession !== "readily") { + return "ai_not_ready" + } + + return "success" + } catch (e) { + console.error(e) + return "internal_error" + } +} + +export const isChromeAISupported = async () => { + const result = await getChromeAISupported() + return result === "success" +} diff --git a/wxt.config.ts b/wxt.config.ts index be6459d..910475e 100644 --- a/wxt.config.ts +++ b/wxt.config.ts @@ -48,7 +48,7 @@ export default defineConfig({ outDir: "build", manifest: { - version: "1.1.13", + version: "1.1.14", name: process.env.TARGET === "firefox" ? "Page Assist - A Web UI for Local AI Models"