commit
14ee927785
@ -62,7 +62,7 @@
|
|||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@plasmohq/prettier-plugin-sort-imports": "4.0.1",
|
"@plasmohq/prettier-plugin-sort-imports": "4.0.1",
|
||||||
"@types/chrome": "0.0.259",
|
"@types/chrome": "^0.0.280",
|
||||||
"@types/d3-dsv": "^3.0.7",
|
"@types/d3-dsv": "^3.0.7",
|
||||||
"@types/html-to-text": "^9.0.4",
|
"@types/html-to-text": "^9.0.4",
|
||||||
"@types/node": "20.11.9",
|
"@types/node": "20.11.9",
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Send besked efter færdigbehandling af vidensbasen"
|
"label": "Send besked efter færdigbehandling af vidensbasen"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Generer titel med AI"
|
"label": "Generer titel med AI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -67,7 +67,6 @@
|
|||||||
"label": "Slet Chathistorik",
|
"label": "Slet Chathistorik",
|
||||||
"button": "Slet",
|
"button": "Slet",
|
||||||
"confirm": "Er du sikker på, at du vil slette din chathistorik? Denne handling kan ikke fortrydes."
|
"confirm": "Er du sikker på, at du vil slette din chathistorik? Denne handling kan ikke fortrydes."
|
||||||
|
|
||||||
},
|
},
|
||||||
"export": {
|
"export": {
|
||||||
"label": "Eksporter chathistorik, vidensbase og prompts",
|
"label": "Eksporter chathistorik, vidensbase og prompts",
|
||||||
@ -162,7 +161,8 @@
|
|||||||
"edit": "Ændre Prompt"
|
"edit": "Ændre Prompt"
|
||||||
},
|
},
|
||||||
"confirm": {
|
"confirm": {
|
||||||
"delete": "Er du sikker på, at du vil slette denne prompt? Denne handling kan ikke fortrydes." },
|
"delete": "Er du sikker på, at du vil slette denne prompt? Denne handling kan ikke fortrydes."
|
||||||
|
},
|
||||||
"modal": {
|
"modal": {
|
||||||
"addTitle": "Tilføj ny Prompt",
|
"addTitle": "Tilføj ny Prompt",
|
||||||
"editTitle": "Ændre Prompt"
|
"editTitle": "Ændre Prompt"
|
||||||
@ -211,7 +211,8 @@
|
|||||||
"label": "Page Deling URL",
|
"label": "Page Deling URL",
|
||||||
"placeholder": "Indtast websted deling URL",
|
"placeholder": "Indtast websted deling URL",
|
||||||
"required": "Venligst indstast din Page deling URL!",
|
"required": "Venligst indstast din Page deling URL!",
|
||||||
"help": "Af hensyn til privatliv kan du selv hoste side delingen og angive URL'en her. <anchor>Lær Mere</anchor>." }
|
"help": "Af hensyn til privatliv kan du selv hoste side delingen og angive URL'en her. <anchor>Lær Mere</anchor>."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"webshare": {
|
"webshare": {
|
||||||
"heading": "Web Deling",
|
"heading": "Web Deling",
|
||||||
@ -264,7 +265,8 @@
|
|||||||
"placeholder": "Bearer token"
|
"placeholder": "Bearer token"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"help": "Hvis du har forbindelsesproblemer med Ollama på Page Assist, kan du konfigurere en brugerdefineret oprindelses-URL. For mere information om konfigurationen, <anchor>klik her</anchor>." }
|
"help": "Hvis du har forbindelsesproblemer med Ollama på Page Assist, kan du konfigurere en brugerdefineret oprindelses-URL. For mere information om konfigurationen, <anchor>klik her</anchor>."
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"manageSearch": {
|
"manageSearch": {
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Benachrichtigung nach Abschluss der Wissensbasis-Verarbeitung senden"
|
"label": "Benachrichtigung nach Abschluss der Wissensbasis-Verarbeitung senden"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Titel mit KI generieren"
|
"label": "Titel mit KI generieren"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Send Notification After Finishing Processing the Knowledge Base"
|
"label": "Send Notification After Finishing Processing the Knowledge Base"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Generate Title using AI"
|
"label": "Generate Title using AI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
"sendNotificationAfterIndexing": {
|
"sendNotificationAfterIndexing": {
|
||||||
"label": "Send varsel etter ferdigbehandling av kunnskapsbasen"
|
"label": "Send varsel etter ferdigbehandling av kunnskapsbasen"
|
||||||
},
|
},
|
||||||
"generateTitle" :{
|
"generateTitle": {
|
||||||
"label": "Generer tittel med AI"
|
"label": "Generer tittel med AI"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
13
src/assets/locale/sv/chrome.json
Normal file
13
src/assets/locale/sv/chrome.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"heading": "Konfigurera Chrome AI",
|
||||||
|
"status": {
|
||||||
|
"label": "Aktivera eller inaktivera Chrome AI-stöd på Page Assist"
|
||||||
|
},
|
||||||
|
"error": {
|
||||||
|
"browser_not_supported": "Denna version av Chrome stöds inte av Gemini Nano-modellen. Uppdatera till version 127 eller senare",
|
||||||
|
"ai_not_supported": "Inställningen chrome://flags/#prompt-api-for-gemini-nano är inte aktiverad. Var vänlig och aktivera den.",
|
||||||
|
"ai_not_ready": "Gemini Nano är inte redo än; du måste dubbelkolla Chrome-inställningarna.",
|
||||||
|
"internal_error": "Ett internt fel uppstod. Försök igen senare."
|
||||||
|
},
|
||||||
|
"errorDescription": "För att använda Chrome AI, behöver du en webbläsarversion högre än 127, som för närvarande finns i Dev- och Canary-kanalerna. Efter att ha laddat ner den stödda versionen, följ dessa steg:\n\n1. Gå till `chrome://flags/#prompt-api-for-gemini-nano` och välj \"Enable\".\n2. Gå till `chrome://flags/#optimization-guide-on-device-model` och välj \"EnabledBypassPrefRequirement\".\n3. Gå till `chrome://components`, sök efter \"Optimization Guide On Device Model\" och klicka på \"Check for Update\". Detta kommer att ladda ner modellen. Om du inte ser inställningarna, upprepa steg 1 och 2 och starta om webbläsaren."
|
||||||
|
}
|
120
src/assets/locale/sv/common.json
Normal file
120
src/assets/locale/sv/common.json
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
{
|
||||||
|
"pageAssist": "Page Assist",
|
||||||
|
"selectAModel": "Välj en modell",
|
||||||
|
"save": "Spara",
|
||||||
|
"saved": "Sparad",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"retry": "Försök igen",
|
||||||
|
"share": {
|
||||||
|
"tooltip": {
|
||||||
|
"share": "Dela"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"title": "Dela länk till chatt"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"defaultValue": {
|
||||||
|
"name": "Anonym",
|
||||||
|
"title": "Chatt utan titel"
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"label": "Chattitel",
|
||||||
|
"placeholder": "Ange chattitel",
|
||||||
|
"required": "Chattitel krävs"
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"label": "Ditt namn",
|
||||||
|
"placeholder": "Ange ditt namn",
|
||||||
|
"required": "Ditt namn krävs"
|
||||||
|
},
|
||||||
|
"btn": {
|
||||||
|
"save": "Generera länk",
|
||||||
|
"saving": "Genererar länk..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification": {
|
||||||
|
"successGenerate": "Länk kopierad till urklipp",
|
||||||
|
"failGenerate": "Misslyckades med att generera länk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"copyToClipboard": "Kopiera till urklipp",
|
||||||
|
"webSearch": "Söker på webben",
|
||||||
|
"regenerate": "Återskapa",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"delete": "Radera",
|
||||||
|
"saveAndSubmit": "Spara & Skicka",
|
||||||
|
"editMessage": {
|
||||||
|
"placeholder": "Skriv ett meddelande..."
|
||||||
|
},
|
||||||
|
"submit": "Skicka",
|
||||||
|
"noData": "Inga data",
|
||||||
|
"noHistory": "Ingen chattlogg",
|
||||||
|
"chatWithCurrentPage": "Chatta med nuvarande sidan",
|
||||||
|
"beta": "Beta",
|
||||||
|
"tts": "Läs högt",
|
||||||
|
"currentChatModelSettings": "Nuvarande chattmodellinställningar",
|
||||||
|
"modelSettings": {
|
||||||
|
"label": "Modellinställningar",
|
||||||
|
"description": "Ställ in modellalternativen globalt för alla chatter",
|
||||||
|
"form": {
|
||||||
|
"keepAlive": {
|
||||||
|
"label": "Keep Alive",
|
||||||
|
"help": "kontrollerar hur länge modellen kommer att vara laddad i minnet efter förfrågan (standard: 5 min)",
|
||||||
|
"placeholder": "Ange Keep Alive varaktighet (t.ex. 5m, 10m, 1h)"
|
||||||
|
},
|
||||||
|
"temperature": {
|
||||||
|
"label": "Temperatur",
|
||||||
|
"placeholder": "Ange temperaturvärde (t.ex. 0.7, 1.0)"
|
||||||
|
},
|
||||||
|
"numCtx": {
|
||||||
|
"label": "Antal kontexter",
|
||||||
|
"placeholder": "Ange antal kontextvärden (standard: 2048)"
|
||||||
|
},
|
||||||
|
"seed": {
|
||||||
|
"label": "Frö",
|
||||||
|
"placeholder": "Ange frövärde (t.ex. 1234)",
|
||||||
|
"help": "Reproducerbarhet av modellens utskrift"
|
||||||
|
},
|
||||||
|
"topK": {
|
||||||
|
"label": "Topp K",
|
||||||
|
"placeholder": "Ange Topp K värde (t.ex. 40, 100)"
|
||||||
|
},
|
||||||
|
"topP": {
|
||||||
|
"label": "Topp P",
|
||||||
|
"placeholder": "Ange Topp P värde (t.ex. 0.9, 0.95)"
|
||||||
|
},
|
||||||
|
"numGpu": {
|
||||||
|
"label": "Antal GPU",
|
||||||
|
"placeholder": "Ange antal lager att skicka till GPU(s)"
|
||||||
|
},
|
||||||
|
"systemPrompt": {
|
||||||
|
"label": "Tillfällig systempromt",
|
||||||
|
"placeholder": "Ange systemprompt",
|
||||||
|
"help": "Detta är ett snabbt sätt att ställa in systemprompten i den nuvarande chatten, vilket kommer att åsidosätta den valda systemprompten om den finns."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"advanced": "Fler modellinställningar"
|
||||||
|
},
|
||||||
|
"copilot": {
|
||||||
|
"summary": "Sammanfatta",
|
||||||
|
"explain": "Förklara",
|
||||||
|
"rephrase": "Formulera om",
|
||||||
|
"translate": "Översätt",
|
||||||
|
"custom": "Custom"
|
||||||
|
},
|
||||||
|
"citations": "Citat",
|
||||||
|
"segmented": {
|
||||||
|
"ollama": "Ollama-modeller",
|
||||||
|
"custom": "Custom modeller"
|
||||||
|
},
|
||||||
|
"downloadCode": "Ladda ner kod",
|
||||||
|
"date": {
|
||||||
|
"pinned": "Fäst",
|
||||||
|
"today": "Idag",
|
||||||
|
"yesterday": "Igår",
|
||||||
|
"last7Days": "Senaste 7 dagarna",
|
||||||
|
"older": "Äldre"
|
||||||
|
},
|
||||||
|
"pin": "Fäst",
|
||||||
|
"unpin": "Ta bort fäst"
|
||||||
|
}
|
40
src/assets/locale/sv/knowledge.json
Normal file
40
src/assets/locale/sv/knowledge.json
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
"addBtn": "Lägg till ny kunskap",
|
||||||
|
"columns": {
|
||||||
|
"title": "Titel",
|
||||||
|
"status": "Status",
|
||||||
|
"embeddings": "Inbäddningsmodell",
|
||||||
|
"createdAt": "Skapad den",
|
||||||
|
"action": "Åtgärder"
|
||||||
|
},
|
||||||
|
"expandedColumns": {
|
||||||
|
"name": "Namn"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"delete": "Är du säker på att du vill ta bort denna kunskap?"
|
||||||
|
},
|
||||||
|
"deleteSuccess": "Kunskap raderades framgångsrikt",
|
||||||
|
"status": {
|
||||||
|
"pending": "Väntar",
|
||||||
|
"finished": "Klar",
|
||||||
|
"processing": "Bearbetar",
|
||||||
|
"failed": "Misslyckades"
|
||||||
|
},
|
||||||
|
"addKnowledge": "Lägg till kunskap",
|
||||||
|
"form": {
|
||||||
|
"title": {
|
||||||
|
"label": "Kunskapstitel",
|
||||||
|
"placeholder": "Ange kunskapstitel",
|
||||||
|
"required": "Kunskapstitel är obligatorisk"
|
||||||
|
},
|
||||||
|
"uploadFile": {
|
||||||
|
"label": "Ladda upp fil",
|
||||||
|
"uploadText": "Dra och släpp en fil här eller klicka för att ladda upp",
|
||||||
|
"uploadHint": "Stödda filtyper: .pdf, .csv, .txt, .md, .docx",
|
||||||
|
"required": "Fil är obligatorisk"
|
||||||
|
},
|
||||||
|
"submit": "Skicka in",
|
||||||
|
"success": "Kunskap tillagd framgångsrikt"
|
||||||
|
},
|
||||||
|
"noEmbeddingModel": "Vänligen lägg till en inbäddningsmodell från sidan för RAG-inställningar först"
|
||||||
|
}
|
90
src/assets/locale/sv/openai.json
Normal file
90
src/assets/locale/sv/openai.json
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
{
|
||||||
|
"settings": "OpenAI-kompatibel API",
|
||||||
|
"heading": "OpenAI-kompatibel API",
|
||||||
|
"subheading": "Hantera och konfigurera dina OpenAI API-kompatibla leverantörer här.",
|
||||||
|
"addBtn": "Lägg till leverantör",
|
||||||
|
"table": {
|
||||||
|
"name": "Leverantörsnamn",
|
||||||
|
"baseUrl": "Bas-URL",
|
||||||
|
"actions": "Åtgärd"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"titleAdd": "Lägg till ny leverantör",
|
||||||
|
"name": {
|
||||||
|
"label": "Leverantörsnamn",
|
||||||
|
"required": "Leverantörsnamn krävs.",
|
||||||
|
"placeholder": "Ange leverantörsnamn"
|
||||||
|
},
|
||||||
|
"baseUrl": {
|
||||||
|
"label": "Bas-URL",
|
||||||
|
"help": "Bas-URL för OpenAI API-leverantören. t.ex. (http://localhost:1234/v1)",
|
||||||
|
"required": "Bas-URL krävs.",
|
||||||
|
"placeholder": "Ange bas-URL"
|
||||||
|
},
|
||||||
|
"apiKey": {
|
||||||
|
"label": "API-nyckel",
|
||||||
|
"required": "API-nyckel krävs.",
|
||||||
|
"placeholder": "Ange API-nyckel"
|
||||||
|
},
|
||||||
|
"submit": "Spara",
|
||||||
|
"update": "Uppdatera",
|
||||||
|
"deleteConfirm": "Är du säker på att du vill radera denna leverantör?",
|
||||||
|
"model": {
|
||||||
|
"title": "Modellista",
|
||||||
|
"subheading": "Vänligen välj chattmodellerna du vill använda med denna leverantör.",
|
||||||
|
"success": "Nya modeller har lagts till framgångsrikt."
|
||||||
|
},
|
||||||
|
"tipLMStudio": "Page Assist hämtar automatiskt modellerna du laddat i LM Studio. Ingen manuell tilläggning behövs."
|
||||||
|
},
|
||||||
|
"addSuccess": "Leverantör tillagd framgångsrikt.",
|
||||||
|
"deleteSuccess": "Leverantör raderad framgångsrikt.",
|
||||||
|
"updateSuccess": "Leverantör uppdaterad framgångsrikt.",
|
||||||
|
"delete": "Radera",
|
||||||
|
"edit": "Redigera",
|
||||||
|
"newModel": "Lägg till modeller till leverantör",
|
||||||
|
"noNewModel": "För LMStudio hämtar vi dynamiskt. Ingen manuell tilläggning behövs.",
|
||||||
|
"searchModel": "Sök modell",
|
||||||
|
"selectAll": "Välj alla",
|
||||||
|
"save": "Spara",
|
||||||
|
"saving": "Sparar...",
|
||||||
|
"manageModels": {
|
||||||
|
"columns": {
|
||||||
|
"name": "Modellnamn",
|
||||||
|
"model_type": "Modelltyp",
|
||||||
|
"model_id": "Modell-ID",
|
||||||
|
"provider": "Leverantörsnamn",
|
||||||
|
"actions": "Åtgärd"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"delete": "Radera"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"delete": "Är du säker på att du vill radera denna modell?"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"title": "Lägg till Custom-modell",
|
||||||
|
"form": {
|
||||||
|
"name": {
|
||||||
|
"label": "Modell-ID",
|
||||||
|
"placeholder": "llama3.2",
|
||||||
|
"required": "Modell-ID krävs."
|
||||||
|
},
|
||||||
|
"provider": {
|
||||||
|
"label": "Leverantör",
|
||||||
|
"placeholder": "Välj leverantör",
|
||||||
|
"required": "Leverantör krävs."
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"label": "Modelltyp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"noModelFound": "Ingen modell hittades. Se till att du har lagt till korrekt leverantör med bas-URL och API-nyckel.",
|
||||||
|
"radio": {
|
||||||
|
"chat": "Chattmodell",
|
||||||
|
"embedding": "Inbäddningsmodell",
|
||||||
|
"chatInfo": "används för chattkompletion och konversationsgenerering",
|
||||||
|
"embeddingInfo": "används för RAG och andra semantiska sökrelaterade uppgifter."
|
||||||
|
}
|
||||||
|
}
|
12
src/assets/locale/sv/option.json
Normal file
12
src/assets/locale/sv/option.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"newChat": "Ny chatt",
|
||||||
|
"selectAPrompt": "Välj en fråga",
|
||||||
|
"githubRepository": "GitHu repository",
|
||||||
|
"settings": "Inställningar",
|
||||||
|
"sidebarTitle": "Chatthistorik",
|
||||||
|
"error": "Fel",
|
||||||
|
"somethingWentWrong": "Något gick fel",
|
||||||
|
"validationSelectModel": "Vänligen välj en modell för att fortsätta",
|
||||||
|
"deleteHistoryConfirmation": "Är du säker på att du vill radera denna historik?",
|
||||||
|
"editHistoryTitle": "Ange en ny titel"
|
||||||
|
}
|
29
src/assets/locale/sv/playground.json
Normal file
29
src/assets/locale/sv/playground.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"ollamaState": {
|
||||||
|
"searching": "Söker efter din Ollama 🦙",
|
||||||
|
"running": "Ollama körs 🦙",
|
||||||
|
"notRunning": "Kan inte ansluta till Ollama 🦙",
|
||||||
|
"connectionError": "Det verkar som att du har ett anslutningsfel. Vänligen se denna <anchor>dokumentation</anchor> för felsökning."
|
||||||
|
},
|
||||||
|
"formError": {
|
||||||
|
"noModel": "Vänligen välj en modell",
|
||||||
|
"noEmbeddingModel": "Vänligen ställ in en inbäddningsmodell på sidan Inställningar > RAG"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"textarea": {
|
||||||
|
"placeholder": "Skriv ett meddelande..."
|
||||||
|
},
|
||||||
|
"webSearch": {
|
||||||
|
"on": "På",
|
||||||
|
"off": "Av"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"searchInternet": "Sök på Internet",
|
||||||
|
"speechToText": "Tal till text",
|
||||||
|
"uploadImage": "Ladda upp bild",
|
||||||
|
"stopStreaming": "Stoppa strömning",
|
||||||
|
"knowledge": "Kunskap"
|
||||||
|
},
|
||||||
|
"sendWhenEnter": "Skicka när Enter trycks"
|
||||||
|
}
|
341
src/assets/locale/sv/settings.json
Normal file
341
src/assets/locale/sv/settings.json
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
{
|
||||||
|
"generalSettings": {
|
||||||
|
"title": "Allmänna Inställningar",
|
||||||
|
"settings": {
|
||||||
|
"heading": "Webbgränssnitt Inställningar",
|
||||||
|
"speechRecognitionLang": {
|
||||||
|
"label": "Taligenkänningsspråk",
|
||||||
|
"placeholder": "Välj ett språk"
|
||||||
|
},
|
||||||
|
"language": {
|
||||||
|
"label": "Språk",
|
||||||
|
"placeholder": "Välj ett språk"
|
||||||
|
},
|
||||||
|
"darkMode": {
|
||||||
|
"label": "Byt Tema",
|
||||||
|
"options": {
|
||||||
|
"light": "Ljust",
|
||||||
|
"dark": "Mörkt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"copilotResumeLastChat": {
|
||||||
|
"label": "Återuppta den senaste chatten när du öppnar sidopanelen (Copilot)"
|
||||||
|
},
|
||||||
|
"hideCurrentChatModelSettings": {
|
||||||
|
"label": "Göm de nuvarande chattmodellinställningarna"
|
||||||
|
},
|
||||||
|
"restoreLastChatModel": {
|
||||||
|
"label": "Återställ den senast använda modellen för tidigare chatter"
|
||||||
|
},
|
||||||
|
"sendNotificationAfterIndexing": {
|
||||||
|
"label": "Skicka meddelande efter att ha avslutat bearbetning av kunskapsbasen"
|
||||||
|
},
|
||||||
|
"generateTitle": {
|
||||||
|
"label": "Generera titel med AI"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sidepanelRag": {
|
||||||
|
"heading": "Copilot Chatt med Webbplats Inställningar",
|
||||||
|
"ragEnabled": {
|
||||||
|
"label": "Chatta med webbplatsen med vektorinbäddningar"
|
||||||
|
},
|
||||||
|
"maxWebsiteContext": {
|
||||||
|
"label": "Vanligt läge webbplatsinnehållsstorlek",
|
||||||
|
"placeholder": "Innehållsstorlek (standard 4028)"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"webSearch": {
|
||||||
|
"heading": "Hantera Webb Sök",
|
||||||
|
"searchMode": {
|
||||||
|
"label": "Utför Enkel InternetSökning"
|
||||||
|
},
|
||||||
|
"provider": {
|
||||||
|
"label": "Sökmotor",
|
||||||
|
"placeholder": "Välj en sökmotor"
|
||||||
|
},
|
||||||
|
"totalSearchResults": {
|
||||||
|
"label": "Totalt Sökresultat",
|
||||||
|
"placeholder": "Ange Totalt Sökresultat"
|
||||||
|
},
|
||||||
|
"visitSpecificWebsite": {
|
||||||
|
"label": "Besök webbplatsen som nämns i meddelandet"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"system": {
|
||||||
|
"heading": "Systeminställningar",
|
||||||
|
"deleteChatHistory": {
|
||||||
|
"label": "Radera Chatt Historik",
|
||||||
|
"button": "Radera",
|
||||||
|
"confirm": "Är du säker på att du vill radera din chatthistorik? Denna åtgärd kan inte ångras."
|
||||||
|
},
|
||||||
|
"export": {
|
||||||
|
"label": "Exportera chatthistorik, kunskapsbas och instruktioner",
|
||||||
|
"button": "Exportera Data",
|
||||||
|
"success": "Exportering Lyckades"
|
||||||
|
},
|
||||||
|
"import": {
|
||||||
|
"label": "Importera chatthistorik, kunskapsbas och instruktioner",
|
||||||
|
"button": "Importera Data",
|
||||||
|
"success": "Importering Lyckades",
|
||||||
|
"error": "Importeringsfel"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tts": {
|
||||||
|
"heading": "Text till Tal Inställningar",
|
||||||
|
"ttsEnabled": {
|
||||||
|
"label": "Aktivera Text till Tal"
|
||||||
|
},
|
||||||
|
"ttsProvider": {
|
||||||
|
"label": "Text till Tal Leverantör",
|
||||||
|
"placeholder": "Välj en leverantör"
|
||||||
|
},
|
||||||
|
"ttsVoice": {
|
||||||
|
"label": "Text till Tal Röst",
|
||||||
|
"placeholder": "Välj en röst"
|
||||||
|
},
|
||||||
|
"ssmlEnabled": {
|
||||||
|
"label": "Aktivera SSML (Speech Synthesis Markup Language)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"manageModels": {
|
||||||
|
"title": "Hantera Modeller",
|
||||||
|
"addBtn": "Lägg till Ny Modell",
|
||||||
|
"columns": {
|
||||||
|
"name": "Namn",
|
||||||
|
"digest": "Sammanfattning",
|
||||||
|
"modifiedAt": "Modifierad Den",
|
||||||
|
"size": "Storlek",
|
||||||
|
"actions": "Åtgärder"
|
||||||
|
},
|
||||||
|
"expandedColumns": {
|
||||||
|
"parentModel": "Föräldramodell",
|
||||||
|
"format": "Format",
|
||||||
|
"family": "Familj",
|
||||||
|
"parameterSize": "Parameterstorlek",
|
||||||
|
"quantizationLevel": "Kvantifieringsnivå"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"delete": "Radera Modell",
|
||||||
|
"repull": "Hämta Modell Igen"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"delete": "Är du säker på att du vill radera denna modell?",
|
||||||
|
"repull": "Är du säker på att du vill hämta modellen igen?"
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"title": "Lägg till Ny Modell",
|
||||||
|
"placeholder": "Ange Modellnamn",
|
||||||
|
"pull": "Hämta Modell"
|
||||||
|
},
|
||||||
|
"notification": {
|
||||||
|
"pullModel": "Hämtar Modell",
|
||||||
|
"pullModelDescription": "Hämtar {{modelName}} modell. För mer information, kontrollera ikonen för tillägget.",
|
||||||
|
"success": "Lyckades",
|
||||||
|
"error": "Fel",
|
||||||
|
"successDescription": "Modellen hämtades framgångsrikt",
|
||||||
|
"successDeleteDescription": "Modellen raderades framgångsrikt",
|
||||||
|
"someError": "Något gick fel. Försök igen senare"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"managePrompts": {
|
||||||
|
"title": "Hantera instruktioner",
|
||||||
|
"addBtn": "Lägg till ny instruktion",
|
||||||
|
"option1": "Normal",
|
||||||
|
"option2": "RAG",
|
||||||
|
"questionPrompt": "Frågeinstruktion",
|
||||||
|
"segmented": {
|
||||||
|
"custom": "Custom instruktion",
|
||||||
|
"copilot": "Copilot instruktion"
|
||||||
|
},
|
||||||
|
"columns": {
|
||||||
|
"title": "Titel",
|
||||||
|
"prompt": "instruktion",
|
||||||
|
"type": "Instruktionstyp",
|
||||||
|
"actions": "Åtgärder"
|
||||||
|
},
|
||||||
|
"systemPrompt": "Systeminstruktion",
|
||||||
|
"quickPrompt": "Snabb instruktion",
|
||||||
|
"tooltip": {
|
||||||
|
"delete": "Radera instruktion",
|
||||||
|
"edit": "Redigera instruktion"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"delete": "Är du säker på att du vill radera denna instruktion? Denna åtgärd kan inte ångras."
|
||||||
|
},
|
||||||
|
"modal": {
|
||||||
|
"addTitle": "Lägg till ny instruktion",
|
||||||
|
"editTitle": "Redigera instruktion"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"title": {
|
||||||
|
"label": "Titel",
|
||||||
|
"placeholder": "Min fantastiska instruktion",
|
||||||
|
"required": "Vänligen ange en titel"
|
||||||
|
},
|
||||||
|
"prompt": {
|
||||||
|
"label": "Instruktion",
|
||||||
|
"placeholder": "Ange instruktion",
|
||||||
|
"required": "Vänligen ange en instruktion",
|
||||||
|
"help": "Du kan använda {key} som variabel i din instruktion.",
|
||||||
|
"missingTextPlaceholder": "Variabeln {text} saknas i instruktionen. Lägg till den."
|
||||||
|
},
|
||||||
|
"isSystem": {
|
||||||
|
"label": "Är Systeminstruktion"
|
||||||
|
},
|
||||||
|
"btnSave": {
|
||||||
|
"saving": "Lägger till instruktion...",
|
||||||
|
"save": "Lägg till instruktion"
|
||||||
|
},
|
||||||
|
"btnEdit": {
|
||||||
|
"saving": "Uppdaterar instruktion...",
|
||||||
|
"save": "Uppdatera instruktion"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification": {
|
||||||
|
"addSuccess": "Instruktion Tillagd",
|
||||||
|
"addSuccessDesc": "Instruktionen har lagts till framgångsrikt",
|
||||||
|
"error": "Fel",
|
||||||
|
"someError": "Något gick fel. Försök igen senare",
|
||||||
|
"updatedSuccess": "Instruktion Uppdaterad",
|
||||||
|
"updatedSuccessDesc": "Instruktionen har uppdaterats framgångsrikt",
|
||||||
|
"deletedSuccess": "Instruktion Raderad",
|
||||||
|
"deletedSuccessDesc": "Instruktionen har raderats framgångsrikt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"manageShare": {
|
||||||
|
"title": "Hantera Delningar",
|
||||||
|
"heading": "Konfigurera Sidans Delnings-URL",
|
||||||
|
"form": {
|
||||||
|
"url": {
|
||||||
|
"label": "Sidans Delnings-URL",
|
||||||
|
"placeholder": "Ange Sidans Delnings-URL",
|
||||||
|
"required": "Vänligen ange din Sidans Delnings-URL!",
|
||||||
|
"help": "För integritetsskäl, kan du använda egen värd för sidans delning och ange URL här. <anchor>Läs Mer</anchor>."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"webshare": {
|
||||||
|
"heading": "Webbdelning",
|
||||||
|
"columns": {
|
||||||
|
"title": "Titel",
|
||||||
|
"url": "URL",
|
||||||
|
"actions": "Åtgärder"
|
||||||
|
},
|
||||||
|
"tooltip": {
|
||||||
|
"delete": "Radera Delning"
|
||||||
|
},
|
||||||
|
"confirm": {
|
||||||
|
"delete": "Är du säker på att du vill radera denna delning? Denna åtgärd kan inte ångras."
|
||||||
|
},
|
||||||
|
"label": "Hantera Sidans Delning",
|
||||||
|
"description": "Aktivera eller inaktivera funktionen för sidans delning"
|
||||||
|
},
|
||||||
|
"notification": {
|
||||||
|
"pageShareSuccess": "Sidans Delnings-URL uppdaterad framgångsrikt",
|
||||||
|
"someError": "Något gick fel. Försök igen senare",
|
||||||
|
"webShareDeleteSuccess": "Webbdelning raderades framgångsrikt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ollamaSettings": {
|
||||||
|
"title": "Ollamainställningar",
|
||||||
|
"heading": "Konfigurera Ollama",
|
||||||
|
"settings": {
|
||||||
|
"ollamaUrl": {
|
||||||
|
"label": "Ollama URL",
|
||||||
|
"placeholder": "Ange Ollama URL"
|
||||||
|
},
|
||||||
|
"advanced": {
|
||||||
|
"label": "Avancerad Ollama URL-konfiguration",
|
||||||
|
"urlRewriteEnabled": {
|
||||||
|
"label": "Aktivera eller inaktivera custom ursprungs-URL"
|
||||||
|
},
|
||||||
|
"rewriteUrl": {
|
||||||
|
"label": "Custom ursprungs-URL",
|
||||||
|
"placeholder": "Ange Custom ursprungs-URL"
|
||||||
|
},
|
||||||
|
"headers": {
|
||||||
|
"label": "Custom Headers",
|
||||||
|
"add": "Lägg till Header",
|
||||||
|
"key": {
|
||||||
|
"label": "Headernyckel",
|
||||||
|
"placeholder": "Auktorisering"
|
||||||
|
},
|
||||||
|
"value": {
|
||||||
|
"label": "Headervärde",
|
||||||
|
"placeholder": "Bärare token"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"help": "Om du har anslutningsproblem med Ollama på Page Assist, kan du konfigurera en custom ursprungs-URL. För att veta mer om konfigurationen, <anchor>klicka här</anchor>."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"manageSearch": {
|
||||||
|
"title": "Hantera Webbsök",
|
||||||
|
"heading": "Konfigurera Webbsök"
|
||||||
|
},
|
||||||
|
"about": {
|
||||||
|
"title": "Om",
|
||||||
|
"heading": "Om",
|
||||||
|
"chromeVersion": "Page Assist Version",
|
||||||
|
"ollamaVersion": "Ollamaversion",
|
||||||
|
"support": "Du kan stödja Page Assist-projektet genom att donera eller sponsra genom följande plattformar:",
|
||||||
|
"koFi": "Stöd på Ko-fi",
|
||||||
|
"githubSponsor": "Sponsra på GitHub",
|
||||||
|
"githubRepo": "GitHub repository"
|
||||||
|
},
|
||||||
|
"manageKnowledge": {
|
||||||
|
"title": "Hantera kunskap",
|
||||||
|
"heading": "Konfigurera kunskapsbas"
|
||||||
|
},
|
||||||
|
"rag": {
|
||||||
|
"title": "RAG-inställningar",
|
||||||
|
"ragSettings": {
|
||||||
|
"label": "RAG-inställningar",
|
||||||
|
"model": {
|
||||||
|
"label": "Inbäddningsmodell",
|
||||||
|
"required": "Vänligen välj en modell",
|
||||||
|
"help": "Det rekommenderas starkt att använda inbäddningsmodeller som 'nomic-embed-text'.",
|
||||||
|
"placeholder": "Välj en modell"
|
||||||
|
},
|
||||||
|
"chunkSize": {
|
||||||
|
"label": "Chunkstorlek",
|
||||||
|
"placeholder": "Ange chunkstorlek",
|
||||||
|
"required": "Vänligen ange en chunkstorlek"
|
||||||
|
},
|
||||||
|
"chunkOverlap": {
|
||||||
|
"label": "Chunköverlapp",
|
||||||
|
"placeholder": "Ange chunköverlapp",
|
||||||
|
"required": "Vänligen ange en chunköverlapp"
|
||||||
|
},
|
||||||
|
"totalFilePerKB": {
|
||||||
|
"label": "Standardgräns för kunskapsbas filuppladdning",
|
||||||
|
"placeholder": "Ange standardgräns för filuppladdning (t.ex. 10)",
|
||||||
|
"required": "Vänligen ange standardgräns för filuppladdning"
|
||||||
|
},
|
||||||
|
"noOfRetrievedDocs": {
|
||||||
|
"label": "Antal hämtade dokument",
|
||||||
|
"placeholder": "Ange antal hämtade dokument",
|
||||||
|
"required": "Vänligen ange antal hämtade dokument"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prompt": {
|
||||||
|
"label": "Konfigurera RAG-instruktion",
|
||||||
|
"option1": "Normal",
|
||||||
|
"option2": "Webb",
|
||||||
|
"alert": "Att konfigurera systeminstruktionen här är föråldrat. Använd Hantera instruktioner-sektionen för att lägga till eller redigera instruktionar. Denna sektion kommer att tas bort i en framtida version",
|
||||||
|
"systemPrompt": "Systeminstruktion",
|
||||||
|
"systemPromptPlaceholder": "Ange systeminstruktion",
|
||||||
|
"webSearchPrompt": "Webbsökinstruktion",
|
||||||
|
"webSearchPromptHelp": "Ta inte bort '{search_results}' från instruktionen.",
|
||||||
|
"webSearchPromptError": "Vänligen ange en instruktion för webbsökning",
|
||||||
|
"webSearchPromptPlaceholder": "Ange instruktion för webbsök",
|
||||||
|
"webSearchFollowUpPrompt": "Uppföljningsinstruktion för webbsök",
|
||||||
|
"webSearchFollowUpPromptHelp": "Ta inte bort '{chat_history}' och '{question}' från instruktionen.",
|
||||||
|
"webSearchFollowUpPromptError": "Vänligen ange din uppföljningsinstruktion för webbsök!",
|
||||||
|
"webSearchFollowUpPromptPlaceholder": "Din uppföljningsinstruktion för webbsök"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"chromeAiSettings": {
|
||||||
|
"title": "Chrome AI-inställningar"
|
||||||
|
}
|
||||||
|
}
|
7
src/assets/locale/sv/sidepanel.json
Normal file
7
src/assets/locale/sv/sidepanel.json
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"tooltip": {
|
||||||
|
"embed": "Det kan ta några minuter att bädda in sidan. Vänta...",
|
||||||
|
"clear": "Radera chatthistorik",
|
||||||
|
"history": "Chatthistorik"
|
||||||
|
}
|
||||||
|
}
|
@ -8,20 +8,8 @@ import rehypeKatex from "rehype-katex"
|
|||||||
import "property-information"
|
import "property-information"
|
||||||
import React from "react"
|
import React from "react"
|
||||||
import { CodeBlock } from "./CodeBlock"
|
import { CodeBlock } from "./CodeBlock"
|
||||||
export const preprocessLaTeX = (content: string) => {
|
import { preprocessLaTeX } from "@/utils/latex"
|
||||||
// Replace block-level LaTeX delimiters \[ \] with $$ $$
|
|
||||||
|
|
||||||
const blockProcessedContent = content.replace(
|
|
||||||
/\\\[(.*?)\\\]/gs,
|
|
||||||
(_, equation) => `$$${equation}$$`
|
|
||||||
)
|
|
||||||
// Replace inline LaTeX delimiters \( \) with $ $
|
|
||||||
const inlineProcessedContent = blockProcessedContent.replace(
|
|
||||||
/\\\((.*?)\\\)/gs,
|
|
||||||
(_, equation) => `$${equation}$`
|
|
||||||
)
|
|
||||||
return inlineProcessedContent
|
|
||||||
}
|
|
||||||
function Markdown({
|
function Markdown({
|
||||||
message,
|
message,
|
||||||
className = "prose break-words dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 dark:prose-dark"
|
className = "prose break-words dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 dark:prose-dark"
|
||||||
|
@ -5,7 +5,7 @@ import useDynamicTextareaSize from "~/hooks/useDynamicTextareaSize"
|
|||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
value: string
|
value: string
|
||||||
onSumbit: (value: string) => void
|
onSumbit: (value: string, isSend: boolean) => void
|
||||||
onClose: () => void
|
onClose: () => void
|
||||||
isBot: boolean
|
isBot: boolean
|
||||||
}
|
}
|
||||||
@ -31,7 +31,7 @@ export const EditMessageForm = (props: Props) => {
|
|||||||
onSubmit={form.onSubmit((data) => {
|
onSubmit={form.onSubmit((data) => {
|
||||||
if (isComposing) return
|
if (isComposing) return
|
||||||
props.onClose()
|
props.onClose()
|
||||||
props.onSumbit(data.message)
|
props.onSumbit(data.message, true)
|
||||||
})}
|
})}
|
||||||
className="flex flex-col gap-2">
|
className="flex flex-col gap-2">
|
||||||
<textarea
|
<textarea
|
||||||
@ -46,19 +46,39 @@ export const EditMessageForm = (props: Props) => {
|
|||||||
ref={textareaRef}
|
ref={textareaRef}
|
||||||
className="w-full bg-transparent focus-within:outline-none focus:ring-0 focus-visible:ring-0 ring-0 dark:ring-0 border-0 dark:text-gray-100"
|
className="w-full bg-transparent focus-within:outline-none focus:ring-0 focus-visible:ring-0 ring-0 dark:ring-0 border-0 dark:text-gray-100"
|
||||||
/>
|
/>
|
||||||
<div className="flex justify-center space-x-2 mt-2">
|
<div className="flex flex-wrap gap-2 mt-2">
|
||||||
<button
|
<div
|
||||||
aria-label={t("save")}
|
className={`w-full flex ${
|
||||||
className="bg-black px-2.5 py-2 rounded-lg text-white focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-gray-500 hover:bg-gray-900">
|
!props.isBot ? "justify-between" : "justify-end"
|
||||||
{props.isBot ? t("save") : t("saveAndSubmit")}
|
}`}>
|
||||||
</button>
|
{!props.isBot && (
|
||||||
<button
|
<button
|
||||||
onClick={props.onClose}
|
type="button"
|
||||||
aria-label={t("cancel")}
|
onClick={() => {
|
||||||
className="border dark:border-gray-600 px-2.5 py-2 rounded-lg text-gray-700 dark:text-gray-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-gray-500 hover:bg-gray-100 dark:hover:bg-gray-900">
|
props.onSumbit(form.values.message, false)
|
||||||
{t("cancel")}
|
props.onClose()
|
||||||
</button>
|
}}
|
||||||
</div>
|
aria-label={t("save")}
|
||||||
|
className="border border-gray-600 px-2 py-1.5 rounded-lg text-gray-700 dark:text-gray-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-gray-500 hover:bg-gray-100 dark:hover:bg-gray-900 text-sm">
|
||||||
|
{t("save")}
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
<div className="flex space-x-2">
|
||||||
|
<button
|
||||||
|
aria-label={t("save")}
|
||||||
|
className="bg-black px-2 py-1.5 rounded-lg text-white focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-gray-500 hover:bg-gray-900 text-sm">
|
||||||
|
{props.isBot ? t("save") : t("saveAndSubmit")}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
onClick={props.onClose}
|
||||||
|
aria-label={t("cancel")}
|
||||||
|
className="border dark:border-gray-600 px-2 py-1.5 rounded-lg text-gray-700 dark:text-gray-300 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-gray-500 hover:bg-gray-100 dark:hover:bg-gray-900 text-sm">
|
||||||
|
{t("cancel")}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>{" "}
|
||||||
</form>
|
</form>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ type Props = {
|
|||||||
currentMessageIndex: number
|
currentMessageIndex: number
|
||||||
totalMessages: number
|
totalMessages: number
|
||||||
onRengerate: () => void
|
onRengerate: () => void
|
||||||
onEditFormSubmit: (value: string) => void
|
onEditFormSubmit: (value: string, isSend: boolean) => void
|
||||||
isProcessing: boolean
|
isProcessing: boolean
|
||||||
webSearch?: {}
|
webSearch?: {}
|
||||||
isSearchingInternet?: boolean
|
isSearchingInternet?: boolean
|
||||||
|
@ -46,8 +46,8 @@ export const PlaygroundChat = () => {
|
|||||||
isProcessing={streaming}
|
isProcessing={streaming}
|
||||||
isSearchingInternet={isSearchingInternet}
|
isSearchingInternet={isSearchingInternet}
|
||||||
sources={message.sources}
|
sources={message.sources}
|
||||||
onEditFormSubmit={(value) => {
|
onEditFormSubmit={(value, isSend) => {
|
||||||
editMessage(index, value, !message.isBot)
|
editMessage(index, value, !message.isBot, isSend)
|
||||||
}}
|
}}
|
||||||
onSourceClick={(data) => {
|
onSourceClick={(data) => {
|
||||||
setSource(data)
|
setSource(data)
|
||||||
|
@ -86,11 +86,10 @@ export const TTSModeSettings = ({ hideBorder }: { hideBorder?: boolean }) => {
|
|||||||
placeholder={t("generalSettings.tts.ttsVoice.placeholder")}
|
placeholder={t("generalSettings.tts.ttsVoice.placeholder")}
|
||||||
className="w-full mt-4 sm:mt-0 sm:w-[200px]"
|
className="w-full mt-4 sm:mt-0 sm:w-[200px]"
|
||||||
options={data?.browserTTSVoices?.map(
|
options={data?.browserTTSVoices?.map(
|
||||||
(voice) =>
|
(voice) => ({
|
||||||
({
|
label: `${voice.voiceName} - ${voice.lang}`.trim(),
|
||||||
label: `${voice.voiceName} - ${voice.lang}`.trim(),
|
value: voice.voiceName
|
||||||
value: voice.voiceName
|
})
|
||||||
}) || []
|
|
||||||
)}
|
)}
|
||||||
{...form.getInputProps("voice")}
|
{...form.getInputProps("voice")}
|
||||||
/>
|
/>
|
||||||
|
@ -66,10 +66,12 @@ export default defineContentScript({
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
copyButton.parentElement!.insertBefore(
|
const buttonContainer = document.createElement('div')
|
||||||
downloadButton,
|
buttonContainer.classList.add("mb-3")
|
||||||
copyButton.nextSibling
|
buttonContainer.style.display = 'flex'
|
||||||
)
|
buttonContainer.style.justifyContent = 'flex-end'
|
||||||
|
buttonContainer.appendChild(downloadButton)
|
||||||
|
modal.querySelector("pre")!.insertAdjacentElement("afterend", buttonContainer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -910,12 +910,14 @@ export const useMessageOption = () => {
|
|||||||
const editMessage = async (
|
const editMessage = async (
|
||||||
index: number,
|
index: number,
|
||||||
message: string,
|
message: string,
|
||||||
isHuman: boolean
|
isHuman: boolean,
|
||||||
|
isSend: boolean
|
||||||
) => {
|
) => {
|
||||||
let newMessages = messages
|
let newMessages = messages
|
||||||
let newHistory = history
|
let newHistory = history
|
||||||
|
|
||||||
if (isHuman) {
|
// if human message and send then only trigger the submit
|
||||||
|
if (isHuman && isSend) {
|
||||||
const isOk = validateBeforeSubmit()
|
const isOk = validateBeforeSubmit()
|
||||||
|
|
||||||
if (!isOk) {
|
if (!isOk) {
|
||||||
@ -939,13 +941,13 @@ export const useMessageOption = () => {
|
|||||||
memory: previousHistory,
|
memory: previousHistory,
|
||||||
controller: abortController
|
controller: abortController
|
||||||
})
|
})
|
||||||
} else {
|
return
|
||||||
newMessages[index].message = message
|
|
||||||
setMessages(newMessages)
|
|
||||||
newHistory[index].content = message
|
|
||||||
setHistory(newHistory)
|
|
||||||
await updateMessageByIndex(historyId, index, message)
|
|
||||||
}
|
}
|
||||||
|
newMessages[index].message = message
|
||||||
|
setMessages(newMessages)
|
||||||
|
newHistory[index].content = message
|
||||||
|
setHistory(newHistory)
|
||||||
|
await updateMessageByIndex(historyId, index, message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -13,6 +13,7 @@ import { fa } from "./lang/fa";
|
|||||||
import { de } from "./lang/de";
|
import { de } from "./lang/de";
|
||||||
import { da } from "./lang/da";
|
import { da } from "./lang/da";
|
||||||
import { no } from "./lang/no";
|
import { no } from "./lang/no";
|
||||||
|
import { sv } from "./lang/sv";
|
||||||
|
|
||||||
|
|
||||||
i18n
|
i18n
|
||||||
@ -35,7 +36,8 @@ i18n
|
|||||||
"fa-IR": fa,
|
"fa-IR": fa,
|
||||||
da: da,
|
da: da,
|
||||||
no: no,
|
no: no,
|
||||||
de: de
|
de: de,
|
||||||
|
sv: sv
|
||||||
},
|
},
|
||||||
fallbackLng: "en",
|
fallbackLng: "en",
|
||||||
lng: localStorage.getItem("i18nextLng") || "en",
|
lng: localStorage.getItem("i18nextLng") || "en",
|
||||||
|
19
src/i18n/lang/sv.ts
Normal file
19
src/i18n/lang/sv.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import option from "@/assets/locale/sv/option.json";
|
||||||
|
import playground from "@/assets/locale/sv/playground.json";
|
||||||
|
import common from "@/assets/locale/sv/common.json";
|
||||||
|
import sidepanel from "@/assets/locale/sv/sidepanel.json";
|
||||||
|
import settings from "@/assets/locale/sv/settings.json";
|
||||||
|
import knowledge from "@/assets/locale/sv/knowledge.json";
|
||||||
|
import chrome from "@/assets/locale/sv/chrome.json";
|
||||||
|
import openai from "@/assets/locale/sv/openai.json";
|
||||||
|
|
||||||
|
export const sv = {
|
||||||
|
option,
|
||||||
|
playground,
|
||||||
|
common,
|
||||||
|
sidepanel,
|
||||||
|
settings,
|
||||||
|
knowledge,
|
||||||
|
chrome,
|
||||||
|
openai
|
||||||
|
}
|
@ -51,5 +51,9 @@ export const supportLanguage = [
|
|||||||
{
|
{
|
||||||
label: "Norsk",
|
label: "Norsk",
|
||||||
value: "no"
|
value: "no"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: "sv",
|
||||||
|
label: "Svenska"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -42,14 +42,30 @@ export const getDataFromCurrentTab = async () => {
|
|||||||
.query({ active: true, currentWindow: true })
|
.query({ active: true, currentWindow: true })
|
||||||
.then(async (tabs) => {
|
.then(async (tabs) => {
|
||||||
const tab = tabs[0]
|
const tab = tabs[0]
|
||||||
|
try {
|
||||||
|
const data = await browser.scripting.executeScript({
|
||||||
|
target: { tabId: tab.id },
|
||||||
|
func: _getHtml
|
||||||
|
})
|
||||||
|
|
||||||
const data = await browser.scripting.executeScript({
|
if (data.length > 0) {
|
||||||
target: { tabId: tab.id },
|
resolve(data[0].result)
|
||||||
func: _getHtml
|
}
|
||||||
})
|
} catch (e) {
|
||||||
|
console.log("error", e)
|
||||||
if (data.length > 0) {
|
// this is a weird method but it works
|
||||||
resolve(data[0].result)
|
if (import.meta.env.BROWSER === "firefox") {
|
||||||
|
// all I need is to get the pdf url but somehow
|
||||||
|
// firefox won't allow extensions to run content scripts on pdf https://bugzilla.mozilla.org/show_bug.cgi?id=1454760
|
||||||
|
// so I set up a weird method to fix this issue by asking tab to give the url
|
||||||
|
// and then I can get the pdf url
|
||||||
|
const result = {
|
||||||
|
url: tab.url,
|
||||||
|
content: "",
|
||||||
|
type: "pdf"
|
||||||
|
}
|
||||||
|
resolve(result)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Omskriv"
|
"message": "Omskriv"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Oversæt"
|
"message": "Oversæt"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Umformulieren"
|
"message": "Umformulieren"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Übersetzen"
|
"message": "Übersetzen"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Rephrase"
|
"message": "Rephrase"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Translate"
|
"message": "Translate"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "بازنویسی"
|
"message": "بازنویسی"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "ترجمه کردن"
|
"message": "ترجمه کردن"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Reformuler"
|
"message": "Reformuler"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Traduire"
|
"message": "Traduire"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Riformula"
|
"message": "Riformula"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Traduci"
|
"message": "Traduci"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -9,18 +9,18 @@
|
|||||||
"message": "チャットするためにCopilotを開く"
|
"message": "チャットするためにCopilotを開く"
|
||||||
},
|
},
|
||||||
"contextSummarize": {
|
"contextSummarize": {
|
||||||
"message": "要約"
|
"message": "要約"
|
||||||
},
|
},
|
||||||
"contextExplain": {
|
"contextExplain": {
|
||||||
"message": "説明"
|
"message": "説明"
|
||||||
},
|
},
|
||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "言い換え"
|
"message": "言い換え"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "翻訳"
|
"message": "翻訳"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
"message": "カスタム"
|
"message": "カスタム"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -17,7 +17,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "പുനഃരൂപീകരിക്കുക"
|
"message": "പുനഃരൂപീകരിക്കുക"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "വിവർത്തനം ചെയ്യുക"
|
"message": "വിവർത്തനം ചെയ്യുക"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Omskrive"
|
"message": "Omskrive"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Oversett"
|
"message": "Oversett"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "Перефразировать"
|
"message": "Перефразировать"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "Перевести"
|
"message": "Перевести"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
29
src/public/_locales/sv/messages.json
Normal file
29
src/public/_locales/sv/messages.json
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
{
|
||||||
|
"extName": {
|
||||||
|
"message": "Page Assist - Ett webbaserat användargränssnitt för lokala AI-modeller"
|
||||||
|
},
|
||||||
|
"extDescription": {
|
||||||
|
"message": "Använd dina lokalt körande AI-modeller för att hjälpa dig i din webbsurfning."
|
||||||
|
},
|
||||||
|
"openSidePanelToChat": {
|
||||||
|
"message": "Öppna Copilot för att chatta"
|
||||||
|
},
|
||||||
|
"openOptionToChat": {
|
||||||
|
"message": "Öppna Web UI för att chatta"
|
||||||
|
},
|
||||||
|
"contextSummarize": {
|
||||||
|
"message": "Sammanfatta"
|
||||||
|
},
|
||||||
|
"contextExplain": {
|
||||||
|
"message": "Förklara"
|
||||||
|
},
|
||||||
|
"contextRephrase": {
|
||||||
|
"message": "Skriv om"
|
||||||
|
},
|
||||||
|
"contextTranslate": {
|
||||||
|
"message": "Översätt"
|
||||||
|
},
|
||||||
|
"contextCustom": {
|
||||||
|
"message": "Custom"
|
||||||
|
}
|
||||||
|
}
|
@ -17,7 +17,7 @@
|
|||||||
"contextRephrase": {
|
"contextRephrase": {
|
||||||
"message": "改述"
|
"message": "改述"
|
||||||
},
|
},
|
||||||
"contextTranslate" :{
|
"contextTranslate": {
|
||||||
"message": "翻译"
|
"message": "翻译"
|
||||||
},
|
},
|
||||||
"contextCustom": {
|
"contextCustom": {
|
||||||
|
19
src/utils/latex.ts
Normal file
19
src/utils/latex.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
export const preprocessLaTeX = (content: string) => {
|
||||||
|
let processedContent = content.replace(
|
||||||
|
/\\\[([\s\S]*?)\\\]/g,
|
||||||
|
(_, equation) => `$$${equation}$$`
|
||||||
|
);
|
||||||
|
processedContent = processedContent.replace(
|
||||||
|
/\\\(([\s\S]*?)\\\)/g,
|
||||||
|
(_, equation) => `$${equation}$`
|
||||||
|
);
|
||||||
|
processedContent = processedContent.replace(
|
||||||
|
/\\begin\{equation\}([\s\S]*?)\\end\{equation\}/g,
|
||||||
|
(_, equation) => `$$${equation}$$`
|
||||||
|
);
|
||||||
|
processedContent = processedContent.replace(
|
||||||
|
/\\begin\{align\}([\s\S]*?)\\end\{align\}/g,
|
||||||
|
(_, equation) => `$$\\begin{aligned}${equation}\\end{aligned}$$`
|
||||||
|
);
|
||||||
|
return processedContent;
|
||||||
|
}
|
@ -50,7 +50,7 @@ export default defineConfig({
|
|||||||
outDir: "build",
|
outDir: "build",
|
||||||
|
|
||||||
manifest: {
|
manifest: {
|
||||||
version: "1.3.1",
|
version: "1.3.2",
|
||||||
name:
|
name:
|
||||||
process.env.TARGET === "firefox"
|
process.env.TARGET === "firefox"
|
||||||
? "Page Assist - A Web UI for Local AI Models"
|
? "Page Assist - A Web UI for Local AI Models"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user