diff --git a/src/assets/locale/en/common.json b/src/assets/locale/en/common.json index 83bdabe..03f0000 100644 --- a/src/assets/locale/en/common.json +++ b/src/assets/locale/en/common.json @@ -2,6 +2,7 @@ "save": "Save", "saved": "Saved", "cancel": "Cancel", + "retry": "Retry", "share": { "tooltip": { "share": "Share" @@ -41,5 +42,8 @@ "saveAndSubmit": "Save & Submit", "editMessage": { "placeholder": "Type a message..." - } + }, + "submit": "Submit", + "noData": "No data", + "noHistory": "No chat history" } \ No newline at end of file diff --git a/src/assets/locale/en/option-playground.json b/src/assets/locale/en/option-playground.json deleted file mode 100644 index 9e26dfe..0000000 --- a/src/assets/locale/en/option-playground.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/assets/locale/en/option.json b/src/assets/locale/en/option.json index 55d3032..523318d 100644 --- a/src/assets/locale/en/option.json +++ b/src/assets/locale/en/option.json @@ -8,6 +8,8 @@ "error": "Error", "somethingWentWrong": "Something went wrong", "validationSelectModel": "Please select a model to continue", + "deleteHistoryConfirmation": "Are you sure you want to delete this history?", + "editHistoryTitle": "Enter a new title", "generalSettings": { "title": "General Settings", "heading": "Web UI Settings", @@ -16,6 +18,10 @@ "label": "Speech Recognition Language", "placeholder": "Select a language" }, + "language": { + "label": "Language", + "placeholder": "Select a language" + }, "darkMode": { "label": "Change Theme", "options": { diff --git a/src/assets/locale/en/playground.json b/src/assets/locale/en/playground.json new file mode 100644 index 0000000..6a91280 --- /dev/null +++ b/src/assets/locale/en/playground.json @@ -0,0 +1,27 @@ +{ + "ollamaState": { + "searching": "Searching for Your Ollama ๐ฆ", + "running": "Ollama is running ๐ฆ", + "notRunning": "Unable to connect to Ollama ๐ฆ" + }, + "formError": { + "noModel": "Please select a model", + "noEmbeddingModel": "Please set an embedding model on the Settings > Ollama page" + }, + "form": { + "textarea": { + "placeholder": "Type a message..." + }, + "webSearch": { + "on": "On", + "off": "Off" + } + }, + "tooltip": { + "searchInternet": "Search Internet", + "speechToText": "Speech to Text", + "uploadImage": "Upload Image", + "stopStreaming": "Stop Streaming" + }, + "sendWhenEnter": "Send when Enter pressed" +} \ No newline at end of file diff --git a/src/assets/locale/ml/common.json b/src/assets/locale/ml/common.json new file mode 100644 index 0000000..0b96d83 --- /dev/null +++ b/src/assets/locale/ml/common.json @@ -0,0 +1,49 @@ +{ + "save": "เดธเตเดตเต เดเตเดฏเตเดฏเตเด", + "saved": "เดธเดเดฐเดเตเดทเดฟเดเตเดเต", + "cancel": "เดฑเดฆเตเดฆเดพเดเตเดเตเด", + "retry": "เดตเตเดฃเตเดเตเด เดถเตเดฐเดฎเดฟเดเตเดเตเด", + "share": { + "tooltip": { + "share": "เดชเดเตเดเดฟเดเตเด" + }, + "modal": { + "title": "เดเดพเดฑเตเดฑเต เดฒเดฟเดเตเดเต เดชเดเตเดเดฟเดเตเด" + }, + "form": { + "defaultValue": { + "name": "เด เดเตเดเดพเดคเดจเตโ", + "title": "เดชเตเดฐเดฟเดฒเตเดฒเดพเดคเตเดค เดเดพเดฑเตเดฑเต" + }, + "title": { + "label": "เดเดพเดฑเตเดฑเต เดคเดฒเดเตเดเตเดเตเดเต", + "placeholder": "เดเดพเดฑเตเดฑเต เดคเดฒเดเตเดเตเดเตเดเต เดจเดฒเตเดเตเด", + "required": "เดเดพเดฑเตเดฑเต เดคเดฒเดเตเดเตเดเตเดเต เดเดตเดถเตเดฏเดฎเดพเดฃเต" + }, + "name": { + "label": "เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเต", + "placeholder": "เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเต เดจเดฒเตเดเตเด", + "required": "เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเต เดเดตเดถเตเดฏเดฎเดพเดฃเต" + }, + "btn": { + "save": "เดฒเดฟเดเตเดเต เดเดจเดฑเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด", + "saving": "เดฒเดฟเดเตเดเต เดเดจเดฑเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเต..." + } + }, + "notification": { + "successGenerate": "เดฒเดฟเดเตเดเต เดเตเดฒเดฟเดชเตเดฌเตเดฐเตโเดกเดฟเดฒเตเดเตเดเต เดชเดเดฐเตโเดคเตเดคเดฟ", + "failGenerate": "เดฒเดฟเดเตเดเต เดเดจเดฑเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดฒเตโ เดชเดฐเดพเดเดฏเดชเตเดชเตเดเตเดเต" + } + }, + "copyToClipboard": "เดเตเดฒเดฟเดชเตเดฌเตเดฐเตโเดกเดฟเดฒเตเดเตเดเต เดชเดเดฐเตโเดคเตเดคเตเด", + "webSearch": "เดตเตเดฌเต เดคเดฟเดฐเดฏเตเดจเตเดจเต", + "regenerate": "เดตเตเดฃเตเดเตเด เดเดจเดฑเตเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด", + "edit": "เดเดกเดฟเดฑเตเดฑเต เดเตเดฏเตเดฏเตเด", + "saveAndSubmit": "เดธเตเดตเต เดเตเดฏเตเดคเต เดธเดฎเดฐเตโเดชเตเดชเดฟเดเตเดเตเด", + "editMessage": { + "placeholder": "เดเดฐเต เดธเดจเตเดฆเตเดถเด เดเตเดชเตเดชเต เดเตเดฏเตเดฏเตเด..." + }, + "submit": "เดธเดฎเตผเดชเตเดชเดฟเดเตเดเตเด", + "noData": "เดกเดพเดฑเตเดฑ เดฒเดญเตเดฏเดฎเดฒเตเดฒ", + "noHistory": "เดเดพเดฑเตเดฑเต เดเดฐเดฟเดคเตเดฐเด เดฒเดญเตเดฏเดฎเดฒเตเดฒ" +} \ No newline at end of file diff --git a/src/assets/locale/ml/option.json b/src/assets/locale/ml/option.json new file mode 100644 index 0000000..7e17e77 --- /dev/null +++ b/src/assets/locale/ml/option.json @@ -0,0 +1,215 @@ +{ + "newChat": "เดชเตเดคเดฟเดฏ เดเดพเดฑเตเดฑเต", + "selectAModel": "เดเดฐเต เดฎเตเดกเดฒเตโ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด", + "selectAPrompt": "เดเดฐเต เดชเตเดฐเตเดเดชเตเดฑเตเดฑเต เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด", + "githubRepository": "เดเดฟเดฑเตเดฑเตเดนเดฌเต เดฑเตเดชเตเดชเตเดธเดฟเดฑเตเดฑเดฑเดฟ", + "settings": "เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเดณเตโ", + "sidebarTitle": "เดเดพเดฑเตเดฑเต เดเดฐเดฟเดคเตเดฐเด", + "error": "เดชเดฟเดถเดเต", + "somethingWentWrong": "เดเดจเตเดคเต เดคเตเดฑเตเดฑเดพเดฏเดฟ", + "deleteHistoryConfirmation": "เดจเดฟเดเตเดเดณเตเดเต เดเดพเดฑเตเดฑเต เดเดฐเดฟเดคเตเดฐเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเดฃเดฎเตเดจเตเดจเต เดคเตเตผเดเตเดเดฏเดพเดฃเต?", + "editHistoryTitle": "เดเดพเดฑเตเดฑเต title เดเดกเดฟเดฑเตเดฑเตเดเตเดฏเตเดฏเตเด", + "validationSelectModel": "เดคเตเดเดฐเตเดจเตเดจเดคเดฟเดจเต เดเดฐเต เดฎเตเดกเดฒเตโ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด", + "generalSettings": { + "title": "เดชเตเดคเตเดตเดพเดฏ เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเดณเตโ", + "heading": "เดตเตเดฌเต UI เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเดณเตโ", + "settings": { + "speechRecognitionLang": { + "label": "เดธเดเดญเดพเดทเดฃ เดคเดฟเดฐเดฟเดเตเดเดฑเดฟเดฏเดฒเตโ เดญเดพเดท", + "placeholder": "เดเดฐเต เดญเดพเดท เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด" + }, + "language": { + "label": "เดญเดพเดท", + "placeholder": "เดเดฐเต เดญเดพเดท เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด" + }, + "darkMode": { + "label": "เดคเตเด เดฎเดพเดฑเตเดฑเตเด", + "options": { + "light": "เดฒเตเดฑเตเดฑเต", + "dark": "เดกเดพเดฐเตโเดเตเดเต" + } + }, + "searchMode": { + "label": "เดธเดพเดงเดพเดฐเดฃ เดเดจเตเดฑเตผเดจเตเดฑเตเดฑเต เด เดจเตเดตเตเดทเดฃเด เดจเดเดคเตเดคเตเด" + }, + "deleteChatHistory": { + "label": "เดเดพเดฑเตเดฑเต เดเดฐเดฟเดคเตเดฐเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเด", + "button": "เดเดฒเตเดฒเดพเดคเดพเดเตเดเตเด", + "confirm": "เดจเดฟเดเตเดเดณเตเดเต เดเดพเดฑเตเดฑเต เดเดฐเดฟเดคเตเดฐเด เดเดฒเตเดฒเดพเดคเดพเดเตเดเดฃเดฎเตเดจเตเดจเต เดคเตเตผเดเตเดเดฏเดพเดฃเต? เด เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดชเดฟเดจเตเดจเตเดเต เดชเดฟเตปเดตเดฒเดฟเดเตเดเดพเดจเดพเดเดฟเดฒเตเดฒ." + } + } + }, + "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": "เดชเตเดฐเดตเตผเดคเตเดคเดจเดเตเดเตพ" + }, + "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": "เด เดชเดเตเดเดฟเดเดฒเตโ เดเดฒเตเดฒเดพเดคเดพเดเตเดเดฃเดฎเตเดจเตเดจเต เดคเตเตผเดเตเดเดฏเดพเดฃเต? เด เดชเตเดฐเดตเตผเดคเตเดคเดจเด เดชเดฟเดจเตเดจเตเดเต เดชเดฟเตปเดตเดฒเดฟเดเตเดเดพเดจเดพเดเดฟเดฒเตเดฒ." + } + }, + "notification": { + "pageShareSuccess": "เดชเตเดเต เดชเดเตเดเดฟเดเดพเดจเตเดณเตเดณ URL เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟ เด เดชเตเดกเตเดฑเตเดฑเต เดเตเดฏเตเดคเต", + "someError": "เดเดจเตเดคเต เดคเตเดฑเตเดฑเดพเดฏเดฟ. เดฆเดฏเดตเดพเดฏเดฟ เดชเดฟเดจเตเดจเตเดเต เดตเตเดฃเตเดเตเด เดถเตเดฐเดฎเดฟเดเตเดเตเด", + "webShareDeleteSuccess": "เดตเตเดฌเต เดชเดเตเดเดฟเดเดฒเตโ เดตเดฟเดเดฏเดเดฐเดฎเดพเดฏเดฟ เดเดฒเตเดฒเดพเดคเดพเดเตเดเดฟ" + } + }, + "ollamaSettings": { + "title": "เดเดฒเตเดฒเดพเดฎเดพ เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเดณเตโ", + "heading": "เดเดฒเตเดฒเดพเดฎเดพ เดเตเตบเดซเดฟเดเตผ เดเตเดฏเตเดฏเตเด", + "settings": { + "ollamaUrl": { + "label": "เดเดฒเตเดฒเดพเดฎเดพ URL", + "placeholder": "เดเดฒเตเดฒเดพเดฎเดพ URL เดจเดฒเตเดเตเด" + }, + "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": "เดจเดฟเดเตเดเดณเตเดเต เดตเตเดฌเต เดคเดฟเดฐเดฏเดฒเตโ เดคเตเดเดฐเตโเดชเตเดฐเตเดเดชเตเดฑเตเดฑเต" + } + } + } +} \ No newline at end of file diff --git a/src/assets/locale/ml/playground.json b/src/assets/locale/ml/playground.json new file mode 100644 index 0000000..691618b --- /dev/null +++ b/src/assets/locale/ml/playground.json @@ -0,0 +1,27 @@ +{ + "ollamaState": { + "searching": "เดจเดฟเดเตเดเดณเตเดเต เดเดฒเตเดฒเดพเดฎเดฏเตเดเตเดเดพเดฏเดฟ เดคเดฟเดฐเดฏเตเดจเตเดจเต ๐ฆ", + "running": "เดเดฒเตเดฒเดพเดฎ เดชเตเดฐเดตเดฐเตโเดคเตเดคเดฟเดเตเดเตเดจเตเดจเต ๐ฆ", + "notRunning": "เดเดฒเตเดฒเดพเดฎเดฏเตเดฎเดพเดฏเดฟ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเดเตเดเดพเดจเตโ เดเดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒ ๐ฆ" + }, + "formError": { + "noModel": "เดฆเดฏเดตเดพเดฏเดฟ เดเดฐเต เดฎเตเดกเดฒเตโ เดคเดฟเดฐเดเตเดเตเดเตเดเตเดเตเด", + "noEmbeddingModel": "เดเตเดฐเดฎเตเดเดฐเดฃเดเตเดเดณเตโ > เดเดฒเตเดฒเดพเดฎ เดชเตเดเดฟเดฒเตเดณเตเดณ เดเดเดฌเตเดกเดฟเดเดเต เดฎเตเดกเดฒเตโ เดธเดเตเดเตเดเดฐเดฟเดเตเดเตเด" + }, + "form": { + "textarea": { + "placeholder": "เดเดฐเต เดธเดจเตเดฆเตเดถเด เดเตเดชเตเดชเต เดเตเดฏเตเดฏเตเด..." + }, + "webSearch": { + "on": "เดเดฃเตโ", + "off": "เดเดซเต" + } + }, + "tooltip": { + "searchInternet": "เดเดจเตเดฑเดฐเตโเดจเตเดฑเตเดฑเต เดคเดฟเดฐเดฏเตเด", + "speechToText": "เดธเดเดญเดพเดทเดฃเด เดเตเดเตเดธเตเดฑเตเดฑเดพเดฏเดฟ", + "uploadImage": "เดเดฎเตเดเต เด เดชเตโเดฒเตเดกเต เดเตเดฏเตเดฏเตเด", + "stopStreaming": "เดธเตเดเตเดฐเตเดฎเดฟเดเดเต เดจเดฟเตผเดคเตเดคเตเด" + }, + "sendWhenEnter": "เดเดจเตเดฑเดฐเตโ เด เดฎเดฐเตโเดคเตเดคเตเดฎเตเดชเตเดณเตโ เด เดฏเดฏเตเดเตเดเตเด" +} \ No newline at end of file diff --git a/src/components/Layouts/SettingsOptionLayout.tsx b/src/components/Layouts/SettingsOptionLayout.tsx index 627e295..d984fbc 100644 --- a/src/components/Layouts/SettingsOptionLayout.tsx +++ b/src/components/Layouts/SettingsOptionLayout.tsx @@ -26,7 +26,7 @@ const LinkComponent = (item: { item.current === item.href ? "bg-gray-100 text-gray-600 dark:bg-[#262626] dark:text-white" : "text-gray-700 hover:text-gray-600 hover:bg-gray-100 dark:text-gray-200 dark:hover:text-white dark:hover:bg-[#262626]", - "group flex gap-x-3 rounded-md py-2 pl-2 pr-3 text-sm leading-6 font-semibold" + "group flex gap-x-3 rounded-md py-2 pl-2 pr-3 text-sm font-semibold" )}> { const queryClient = useQueryClient() const [open, setOpen] = useState(false) - const { t } = useTranslation("option") + const { t } = useTranslation(["option", "common"]) const form = useForm({ initialValues: { @@ -188,9 +188,13 @@ export const ModelsBody = () => { } ]} dataSource={[record.details]} + locale={{ + emptyText: t("common:noData") + }} /> ), - defaultExpandAllRows: false + defaultExpandAllRows: false, + }} bordered dataSource={data} diff --git a/src/components/Option/Playground/PlaygroundEmpty.tsx b/src/components/Option/Playground/PlaygroundEmpty.tsx index 07214dc..81771da 100644 --- a/src/components/Option/Playground/PlaygroundEmpty.tsx +++ b/src/components/Option/Playground/PlaygroundEmpty.tsx @@ -1,6 +1,7 @@ import { useQuery } from "@tanstack/react-query" import { RotateCcw } from "lucide-react" import { useEffect, useState } from "react" +import { useTranslation } from "react-i18next" import { getOllamaURL, isOllamaRunning, @@ -9,6 +10,7 @@ import { export const PlaygroundEmpty = () => { const [ollamaURL, setOllamaURL] = useState("") + const { t } = useTranslation(["playground", "common"]) const { data: ollamaInfo, status: ollamaStatus, @@ -40,7 +42,7 @@ export const PlaygroundEmpty = () => { - Searching for Your Ollama ๐ฆ + {t("ollamaState.searching")} )} @@ -49,7 +51,7 @@ export const PlaygroundEmpty = () => { - Ollama is running ๐ฆ + {t("ollamaState.running")} ) : ( @@ -57,7 +59,7 @@ export const PlaygroundEmpty = () => { - Unable to connect to Ollama ๐ฆ + {t("ollamaState.notRunning")} @@ -75,7 +77,7 @@ export const PlaygroundEmpty = () => { }} className="inline-flex mt-4 items-center rounded-md border border-transparent bg-black px-2 py-2 text-sm font-medium leading-4 text-white shadow-sm hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:bg-white dark:text-gray-800 dark:hover:bg-gray-100 dark:focus:ring-gray-500 dark:focus:ring-offset-gray-100 disabled:opacity-50 "> - Retry + {t("common:retry")} ) diff --git a/src/components/Option/Playground/PlaygroundForm.tsx b/src/components/Option/Playground/PlaygroundForm.tsx index 64b2af4..d9e0158 100644 --- a/src/components/Option/Playground/PlaygroundForm.tsx +++ b/src/components/Option/Playground/PlaygroundForm.tsx @@ -11,12 +11,14 @@ import { useWebUI } from "~/store/webui" import { defaultEmbeddingModelForRag } from "~/services/ollama" import { ImageIcon, MicIcon, StopCircleIcon, X } from "lucide-react" import { getVariable } from "~/utils/select-varaible" +import { useTranslation } from "react-i18next" type Props = { dropedFile: File | undefined } export const PlaygroundForm = ({ dropedFile }: Props) => { + const { t } = useTranslation(["playground", "common"]) const inputRef = React.useRef(null) const [typing, setTyping] = React.useState(false) const { @@ -117,13 +119,13 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { }) const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === "Process" || e.key === "229" ) return + if (e.key === "Process" || e.key === "229") return if ( !typing && e.key === "Enter" && !e.shiftKey && !isSending && - sendWhenEnter + sendWhenEnter ) { e.preventDefault() form.onSubmit(async (value) => { @@ -131,16 +133,13 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { return } if (!selectedModel || selectedModel.length === 0) { - form.setFieldError("message", "Please select a model") + form.setFieldError("message", t("formError.noModel")) return } if (webSearch) { const defaultEM = await defaultEmbeddingModelForRag() if (!defaultEM) { - form.setFieldError( - "message", - "Please set an embedding model on the Settings > Ollama page" - ) + form.setFieldError("message", t("formError.noEmbeddingModel")) return } } @@ -181,16 +180,13 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { { if (!selectedModel || selectedModel.length === 0) { - form.setFieldError("message", "Please select a model") + form.setFieldError("message", t("formError.noModel")) return } if (webSearch) { const defaultEM = await defaultEmbeddingModelForRag() if (!defaultEM) { - form.setFieldError( - "message", - "Please set an embedding model on the Settings > Ollama page" - ) + form.setFieldError("message", t("formError.noEmbeddingModel")) return } } @@ -223,12 +219,12 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { rows={1} style={{ minHeight: "60px" }} tabIndex={0} - placeholder="Type a message..." + placeholder={t("form.textarea.placeholder")} {...form.getInputProps("message")} /> - + { setWebSearch(e)} - checkedChildren="On" - unCheckedChildren="Off" + checkedChildren={t("form.webSearch.on")} + unCheckedChildren={t("form.webSearch.off")} /> - + { @@ -277,7 +273,7 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { )} - + { @@ -319,7 +315,7 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { onChange={(e) => setSendWhenEnter(e.target.checked) }> - Send when Enter pressed + {t("sendWhenEnter")} ) } @@ -340,11 +336,11 @@ export const PlaygroundForm = ({ dropedFile }: Props) => { ) : null} - Submit + {t("common:submit")} ) : ( - + { const { clearChat, speechToTextLanguage, setSpeechToTextLanguage } = @@ -16,6 +17,11 @@ export const SettingOther = () => { const { mode, toggleDarkMode } = useDarkMode() const { t } = useTranslation("option") + const { + changeLocale, + locale, + supportLanguage + }= useI18n() return ( @@ -46,6 +52,26 @@ export const SettingOther = () => { }} /> + + + {t("generalSettings.settings.language.label")} + + + + option!.label.toLowerCase().indexOf(input.toLowerCase()) >= 0 || + option!.value.toLowerCase().indexOf(input.toLowerCase()) >= 0 + } + onChange={(value) => { + changeLocale(value) + }} + /> + {t("generalSettings.settings.darkMode.label")} diff --git a/src/components/Option/Sidebar.tsx b/src/components/Option/Sidebar.tsx index 7922d1f..87628ff 100644 --- a/src/components/Option/Sidebar.tsx +++ b/src/components/Option/Sidebar.tsx @@ -8,9 +8,9 @@ import { } from "~/libs/db" import { Empty, Skeleton } from "antd" import { useMessageOption } from "~/hooks/useMessageOption" -import { useState } from "react" import { PencilIcon, Trash2 } from "lucide-react" import { useNavigate } from "react-router-dom" +import { useTranslation } from "react-i18next" type Props = { onClose: () => void @@ -19,6 +19,7 @@ type Props = { export const Sidebar = ({ onClose }: Props) => { const { setMessages, setHistory, setHistoryId, historyId, clearChat } = useMessageOption() + const { t } = useTranslation(["option", "common"]) const client = useQueryClient() const navigate = useNavigate() @@ -60,7 +61,7 @@ export const Sidebar = ({ onClose }: Props) => { {status === "success" && chatHistories.length === 0 && ( - + )} {status === "pending" && ( @@ -95,7 +96,7 @@ export const Sidebar = ({ onClose }: Props) => { { - const newTitle = prompt("Enter new title", chat.title) + const newTitle = prompt(t("editHistoryTitle"), chat.title) if (newTitle) { editHistory({ id: chat.id, title: newTitle }) @@ -107,10 +108,7 @@ export const Sidebar = ({ onClose }: Props) => { { - if ( - !confirm("Are you sure you want to delete this history?") - ) - return + if (!confirm(t("deleteHistoryConfirmation"))) return deleteHistory(chat.id) }} className="text-red-500 dark:text-red-400 opacity-80"> diff --git a/src/entries/background.ts b/src/entries/background.ts index 0dd2190..af5c1e3 100644 --- a/src/entries/background.ts +++ b/src/entries/background.ts @@ -86,26 +86,27 @@ export default defineBackground({ }) } else if (message.type === "pull_model") { const ollamaURL = await getOllamaURL() - + const isRunning = await isOllamaRunning() - + if (!isRunning) { chrome.action.setBadgeText({ text: "E" }) chrome.action.setBadgeBackgroundColor({ color: "#FF0000" }) - chrome.action.setTitle({ title: "Ollama is not running" }) + chrome.action.setTitle({ title: "Ollama is not running" + }) setTimeout(() => { clearBadge() }, 5000) } - + await streamDownload(ollamaURL, message.modelName) } }) - + chrome.action.onClicked.addListener((tab) => { chrome.tabs.create({ url: chrome.runtime.getURL("options.html") }) }) - + chrome.commands.onCommand.addListener((command) => { switch (command) { case "execute_side_panel": @@ -120,13 +121,13 @@ export default defineBackground({ break } }) - + chrome.contextMenus.create({ id: "open-side-panel-pa", - title: "Open Side Panel to Chat", + title: browser.i18n.getMessage("openSidePanelToChat"), contexts: ["all"] }) - + chrome.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "open-side-panel-pa") { chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => { diff --git a/src/entries/options/App.tsx b/src/entries/options/App.tsx index 5f11490..b0221ef 100644 --- a/src/entries/options/App.tsx +++ b/src/entries/options/App.tsx @@ -3,21 +3,32 @@ import { MemoryRouter } from "react-router-dom" import { ToastContainer } from "react-toastify" import "react-toastify/dist/ReactToastify.css" const queryClient = new QueryClient() -import { ConfigProvider, theme } from "antd" +import { ConfigProvider, Empty, theme } from "antd" import { StyleProvider } from "@ant-design/cssinjs" import { useDarkMode } from "~/hooks/useDarkmode" import { OptionRouting } from "~/routes" import "~/i18n" +import { useTranslation } from "react-i18next" function IndexOption() { const { mode } = useDarkMode() + const { t } = useTranslation() return ( + }} + renderEmpty={() => ( + + )} + > diff --git a/src/entries/sidepanel/App.tsx b/src/entries/sidepanel/App.tsx index 9cbda3c..26ce815 100644 --- a/src/entries/sidepanel/App.tsx +++ b/src/entries/sidepanel/App.tsx @@ -4,13 +4,15 @@ import { SidepanelRouting } from "~/routes" import { ToastContainer } from "react-toastify" import "react-toastify/dist/ReactToastify.css" const queryClient = new QueryClient() -import { ConfigProvider, theme } from "antd" +import { ConfigProvider, Empty, theme } from "antd" import { StyleProvider } from "@ant-design/cssinjs" import { useDarkMode } from "~/hooks/useDarkmode" import "~/i18n" +import { useTranslation } from "react-i18next" function IndexSidepanel() { const { mode } = useDarkMode() + const { t } = useTranslation() return ( @@ -18,7 +20,16 @@ function IndexSidepanel() { theme={{ algorithm: mode === "dark" ? theme.darkAlgorithm : theme.defaultAlgorithm - }}> + }} + renderEmpty={() => ( + + )} + > diff --git a/src/hooks/useI18n.tsx b/src/hooks/useI18n.tsx new file mode 100644 index 0000000..0077e22 --- /dev/null +++ b/src/hooks/useI18n.tsx @@ -0,0 +1,17 @@ +import { supportLanguage } from "@/i18n/support-language" +import { useState } from "react" +import { useTranslation } from "react-i18next" + +export const useI18n = () => { + const { i18n } = useTranslation() + const [locale, setLocale] = useState( + localStorage.getItem("i18nextLng") || "en" + ) + + const changeLocale = (lang: string) => { + setLocale(lang) + i18n.changeLanguage(lang) + } + + return { locale, changeLocale, supportLanguage } +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 3ce0794..626d1e7 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -2,6 +2,7 @@ import i18n from "i18next"; import LanguageDetector from "i18next-browser-languagedetector"; import { initReactI18next } from "react-i18next"; import { en } from "./lang/en"; +import { ml } from "./lang/ml"; i18n .use(LanguageDetector) @@ -9,7 +10,8 @@ i18n .init({ debug: true, resources: { - en: en + en: en, + ml: ml }, fallbackLng: "en", lng: localStorage.getItem("i18nextLng") || "en", diff --git a/src/i18n/lang/en.ts b/src/i18n/lang/en.ts index 7c65165..c0ba87d 100644 --- a/src/i18n/lang/en.ts +++ b/src/i18n/lang/en.ts @@ -1,10 +1,10 @@ import option from "@/assets/locale/en/option.json"; -import optionPlayground from "@/assets/locale/en/option-playground.json"; +import playground from "@/assets/locale/en/playground.json"; import common from "@/assets/locale/en/common.json"; export const en = { option, - optionPlayground, + playground, common } \ No newline at end of file diff --git a/src/i18n/lang/ml.ts b/src/i18n/lang/ml.ts new file mode 100644 index 0000000..344bd22 --- /dev/null +++ b/src/i18n/lang/ml.ts @@ -0,0 +1,10 @@ +import option from "@/assets/locale/ml/option.json"; +import playground from "@/assets/locale/ml/playground.json"; +import common from "@/assets/locale/ml/common.json"; + + +export const ml = { + option, + playground, + common +} \ No newline at end of file diff --git a/src/i18n/support-language.ts b/src/i18n/support-language.ts new file mode 100644 index 0000000..8fcf12e --- /dev/null +++ b/src/i18n/support-language.ts @@ -0,0 +1,11 @@ +// Please add new language code to supportLanguage array +export const supportLanguage = [ + { + label: "English", + value: "en" + }, + { + label: "เดฎเดฒเดฏเดพเดณเด", + value: "ml" + } +] \ No newline at end of file diff --git a/src/public/_locales/en/messages.json b/src/public/_locales/en/messages.json index 3aa2473..77ece77 100644 --- a/src/public/_locales/en/messages.json +++ b/src/public/_locales/en/messages.json @@ -4,5 +4,8 @@ }, "extDescription": { "message": "Use your locally running AI models to assist you in your web browsing." + }, + "openSidePanelToChat": { + "message": "Open Side Panel to Chat" } } \ No newline at end of file diff --git a/src/public/_locales/ml/messages.json b/src/public/_locales/ml/messages.json new file mode 100644 index 0000000..6b52038 --- /dev/null +++ b/src/public/_locales/ml/messages.json @@ -0,0 +1,11 @@ +{ + "extName": { + "message": "เดชเตเดเต เด เดธเดฟเดธเตเดฑเตเดฑเต - เดชเตเดฐเดพเดฆเตเดถเดฟเดเดฎเดพเดฏเดฟ เดชเตเดฐเดตเดฐเตโเดคเตเดคเดฟเดเตเดเตเดจเตเดจ AI เดฎเตเดกเดฒเตเดเดณเตโเดเตเดเตเดณเตเดณ เดตเตเดฌเต UI" + }, + "extDescription": { + "message": "เดจเดฟเดเตเดเดณเตเดเต เดชเตเดฐเดพเดฆเตเดถเดฟเดเดฎเดพเดฏเดฟ เดชเตเดฐเดตเดฐเตโเดคเตเดคเดฟเดเตเดเตเดจเตเดจ AI เดฎเตเดกเดฒเตเดเดณเตโ เดตเตเดฌเต เดฌเตเดฐเตเดธเดฟเดเดเดฟเดฒเตโ เดจเดฟเดเตเดเดณเต เดธเดนเดพเดฏเดฟเดเตเดเตเดจเตเดจเดคเดฟเดจเต เดเดชเดฏเตเดเดฟเดเตเดเตเด." + }, + "openSidePanelToChat": { + "message": "เดเดพเดฑเตเดฑเต เดเตเดฏเตเดฏเดพเดจเตโ เดธเตเดกเต เดชเดพเดจเดฒเตโ เดคเตเดฑเดเตเดเตเด" + } +} \ No newline at end of file
- Searching for Your Ollama ๐ฆ + {t("ollamaState.searching")}
- Ollama is running ๐ฆ + {t("ollamaState.running")}
- Unable to connect to Ollama ๐ฆ + {t("ollamaState.notRunning")}