Browse Source

Merge remote-tracking branch 'origin/dev' into feat/backend-web-search

Jun Siang Cheah 11 months ago
parent
commit
eb509c460a
100 changed files with 4475 additions and 690 deletions
  1. 14 6
      .github/pull_request_template.md
  2. 4 0
      .gitignore
  3. 4 0
      .prettierignore
  4. 19 0
      CHANGELOG.md
  5. 23 6
      Dockerfile
  6. 1 1
      backend/apps/images/main.py
  7. 4 4
      backend/apps/litellm/main.py
  8. 10 7
      backend/apps/ollama/main.py
  9. 32 9
      backend/apps/openai/main.py
  10. 15 3
      backend/apps/rag/main.py
  11. 53 0
      backend/apps/web/internal/migrations/008_add_memory.py
  12. 5 0
      backend/apps/web/main.py
  13. 118 0
      backend/apps/web/models/memories.py
  14. 145 0
      backend/apps/web/routers/memories.py
  15. 37 1
      backend/apps/web/routers/users.py
  16. 8 0
      backend/config.py
  17. 30 8
      backend/main.py
  18. 5 6
      cypress/e2e/chat.cy.ts
  19. 145 4
      package-lock.json
  20. 7 4
      package.json
  21. 39 0
      scripts/prepare-pyodide.js
  22. 1 0
      src/app.html
  23. 155 0
      src/lib/apis/memories/index.ts
  24. 67 0
      src/lib/apis/openai/index.ts
  25. 27 0
      src/lib/apis/users/index.ts
  26. 5 2
      src/lib/components/admin/AddUserModal.svelte
  27. 9 6
      src/lib/components/chat/MessageInput.svelte
  28. 43 7
      src/lib/components/chat/Messages.svelte
  29. 226 5
      src/lib/components/chat/Messages/CodeBlock.svelte
  30. 159 0
      src/lib/components/chat/Messages/CompareMessages.svelte
  31. 1 1
      src/lib/components/chat/Messages/Name.svelte
  32. 2 0
      src/lib/components/chat/Messages/Placeholder.svelte
  33. 15 2
      src/lib/components/chat/Messages/ProfileImage.svelte
  34. 100 93
      src/lib/components/chat/Messages/ResponseMessage.svelte
  35. 12 10
      src/lib/components/chat/Messages/UserMessage.svelte
  36. 5 3
      src/lib/components/chat/ModelSelector/Selector.svelte
  37. 1 1
      src/lib/components/chat/Settings/Account.svelte
  38. 18 13
      src/lib/components/chat/Settings/Connections.svelte
  39. 46 19
      src/lib/components/chat/Settings/Interface.svelte
  40. 96 0
      src/lib/components/chat/Settings/Personalization.svelte
  41. 125 0
      src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte
  42. 165 0
      src/lib/components/chat/Settings/Personalization/ManageModal.svelte
  43. 13 15
      src/lib/components/chat/SettingsModal.svelte
  44. 2 2
      src/lib/components/chat/ShareChatModal.svelte
  45. 1 1
      src/lib/components/common/Modal.svelte
  46. 1 1
      src/lib/components/common/Selector.svelte
  47. 22 0
      src/lib/components/common/Switch.svelte
  48. 2 0
      src/lib/components/documents/Settings/General.svelte
  49. 11 0
      src/lib/components/icons/User.svelte
  50. 4 3
      src/lib/components/layout/Navbar.svelte
  51. 5 5
      src/lib/components/layout/Navbar/Menu.svelte
  52. 1 0
      src/lib/components/layout/Sidebar.svelte
  53. 4 4
      src/lib/components/layout/Sidebar/ChatMenu.svelte
  54. 4 4
      src/lib/components/layout/Sidebar/UserMenu.svelte
  55. 0 1
      src/lib/components/workspace/Playground.svelte
  56. 11 2
      src/lib/i18n/locales/ar-BH/translation.json
  57. 17 8
      src/lib/i18n/locales/bg-BG/translation.json
  58. 18 9
      src/lib/i18n/locales/bn-BD/translation.json
  59. 18 9
      src/lib/i18n/locales/ca-ES/translation.json
  60. 11 2
      src/lib/i18n/locales/de-DE/translation.json
  61. 15 6
      src/lib/i18n/locales/dg-DG/translation.json
  62. 10 1
      src/lib/i18n/locales/en-GB/translation.json
  63. 10 1
      src/lib/i18n/locales/en-US/translation.json
  64. 15 6
      src/lib/i18n/locales/es-ES/translation.json
  65. 15 6
      src/lib/i18n/locales/fa-IR/translation.json
  66. 10 1
      src/lib/i18n/locales/fi-FI/translation.json
  67. 18 9
      src/lib/i18n/locales/fr-CA/translation.json
  68. 18 9
      src/lib/i18n/locales/fr-FR/translation.json
  69. 10 1
      src/lib/i18n/locales/he-IL/translation.json
  70. 17 8
      src/lib/i18n/locales/hi-IN/translation.json
  71. 511 0
      src/lib/i18n/locales/hr-HR/translation.json
  72. 10 1
      src/lib/i18n/locales/it-IT/translation.json
  73. 15 6
      src/lib/i18n/locales/ja-JP/translation.json
  74. 15 6
      src/lib/i18n/locales/ka-GE/translation.json
  75. 15 6
      src/lib/i18n/locales/ko-KR/translation.json
  76. 12 0
      src/lib/i18n/locales/languages.json
  77. 14 5
      src/lib/i18n/locales/nl-NL/translation.json
  78. 511 0
      src/lib/i18n/locales/pa-IN/translation.json
  79. 10 1
      src/lib/i18n/locales/pl-PL/translation.json
  80. 14 5
      src/lib/i18n/locales/pt-BR/translation.json
  81. 14 5
      src/lib/i18n/locales/pt-PT/translation.json
  82. 15 6
      src/lib/i18n/locales/ru-RU/translation.json
  83. 511 0
      src/lib/i18n/locales/sr-RS/translation.json
  84. 15 6
      src/lib/i18n/locales/sv-SE/translation.json
  85. 10 1
      src/lib/i18n/locales/tr-TR/translation.json
  86. 10 1
      src/lib/i18n/locales/uk-UA/translation.json
  87. 94 85
      src/lib/i18n/locales/vi-VN/translation.json
  88. 114 105
      src/lib/i18n/locales/zh-CN/translation.json
  89. 14 5
      src/lib/i18n/locales/zh-TW/translation.json
  90. 1 0
      src/lib/stores/index.ts
  91. 3 3
      src/lib/utils/index.ts
  92. 70 0
      src/lib/workers/pyodide.worker.ts
  93. 85 50
      src/routes/(app)/+page.svelte
  94. 7 3
      src/routes/(app)/admin/+page.svelte
  95. 88 51
      src/routes/(app)/c/[id]/+page.svelte
  96. 1 1
      src/routes/(app)/workspace/modelfiles/create/+page.svelte
  97. 1 1
      src/routes/(app)/workspace/modelfiles/edit/+page.svelte
  98. 1 1
      src/routes/+layout.svelte
  99. 6 1
      src/routes/auth/+page.svelte
  100. 9 0
      src/routes/s/[id]/+page.svelte

+ 14 - 6
.github/pull_request_template.md

@@ -1,13 +1,17 @@
 # Pull Request Checklist
 # Pull Request Checklist
 
 
-- [ ] **Target branch:** Pull requests should target the `dev` branch.
-- [ ] **Description:** Briefly describe the changes in this pull request.
+### Note to first-time contributors: Please open a discussion post in [Discussions](https://github.com/open-webui/open-webui/discussions) and describe your changes before submitting a pull request.
+
+**Before submitting, make sure you've checked the following:**
+
+- [ ] **Target branch:** Please verify that the pull request targets the `dev` branch.
+- [ ] **Description:** Provide a concise description of the changes made in this pull request.
 - [ ] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description.
 - [ ] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description.
 - [ ] **Documentation:** Have you updated relevant documentation [Open WebUI Docs](https://github.com/open-webui/docs), or other documentation sources?
 - [ ] **Documentation:** Have you updated relevant documentation [Open WebUI Docs](https://github.com/open-webui/docs), or other documentation sources?
 - [ ] **Dependencies:** Are there any new dependencies? Have you updated the dependency versions in the documentation?
 - [ ] **Dependencies:** Are there any new dependencies? Have you updated the dependency versions in the documentation?
-- [ ] **Testing:** Have you written and run sufficient tests for the changes?
-- [ ] **Code Review:** Have you self-reviewed your code and addressed any coding standard issues?
-- [ ] **Label title:** Ensure the pull request title is labeled properly using one of the following:
+- [ ] **Testing:** Have you written and run sufficient tests for validating the changes?
+- [ ] **Code review:** Have you performed a self-review of your code, addressing any coding standard issues and ensuring adherence to the project's coding standards?
+- [ ] **Label:** To cleary categorize this pull request, assign a relevant label to the pull request title, using one of the following:
   - **BREAKING CHANGE**: Significant changes that may affect compatibility
   - **BREAKING CHANGE**: Significant changes that may affect compatibility
   - **build**: Changes that affect the build system or external dependencies
   - **build**: Changes that affect the build system or external dependencies
   - **ci**: Changes to our continuous integration processes or workflows
   - **ci**: Changes to our continuous integration processes or workflows
@@ -26,7 +30,7 @@
 
 
 ### Description
 ### Description
 
 
-- [Briefly describe the changes made in this pull request, including any relevant motivation and impact.]
+- [Concisely describe the changes made in this pull request, including any relevant motivation and impact (e.g., fixing a bug, adding a feature, or improving performance)]
 
 
 ### Added
 ### Added
 
 
@@ -62,3 +66,7 @@
 
 
 - [Insert any additional context, notes, or explanations for the changes]
 - [Insert any additional context, notes, or explanations for the changes]
   - [Reference any related issues, commits, or other relevant information]
   - [Reference any related issues, commits, or other relevant information]
+
+### Screenshots or Videos
+
+- [Attach any relevant screenshots or videos demonstrating the changes]

+ 4 - 0
.gitignore

@@ -16,6 +16,10 @@ __pycache__/
 # C extensions
 # C extensions
 *.so
 *.so
 
 
+# Pyodide distribution
+static/pyodide/*
+!static/pyodide/pyodide-lock.json
+
 # Distribution / packaging
 # Distribution / packaging
 .Python
 .Python
 build/
 build/

+ 4 - 0
.prettierignore

@@ -310,3 +310,7 @@ dist
 # cypress artifacts
 # cypress artifacts
 cypress/videos
 cypress/videos
 cypress/screenshots
 cypress/screenshots
+
+
+
+/static/*

+ 19 - 0
CHANGELOG.md

@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
 
+## [0.1.125] - 2024-05-19
+
+### Added
+
+- **🔄 Updated UI**: Chat interface revamped with chat bubbles. Easily switch back to the old style via settings > interface > chat bubble UI.
+- **📂 Enhanced Sidebar UI**: Model files, documents, prompts, and playground merged into Workspace for streamlined access.
+- **🚀 Improved Many Model Interaction**: All responses now displayed simultaneously for a smoother experience.
+- **🐍 Python Code Execution**: Execute Python code locally in the browser with libraries like 'requests', 'beautifulsoup4', 'numpy', 'pandas', 'seaborn', 'matplotlib', 'scikit-learn', 'scipy', 'regex'.
+- **🧠 Experimental Memory Feature**: Manually input personal information you want LLMs to remember via settings > personalization > memory.
+- **💾 Persistent Settings**: Settings now saved as config.json for convenience.
+- **🩺 Health Check Endpoint**: Added for Docker deployment.
+- **↕️ RTL Support**: Toggle chat direction via settings > interface > chat direction.
+- **🖥️ PowerPoint Support**: RAG pipeline now supports PowerPoint documents.
+- **🌐 Language Updates**: Ukrainian, Turkish, Arabic, Chinese, Serbian, Vietnamese updated; Punjabi added.
+
+### Changed
+
+- **👤 Shared Chat Update**: Shared chat now includes creator user information.
+
 ## [0.1.124] - 2024-05-08
 ## [0.1.124] - 2024-05-08
 
 
 ### Added
 ### Added

+ 23 - 6
Dockerfile

@@ -11,6 +11,9 @@ ARG USE_CUDA_VER=cu121
 # IMPORTANT: If you change the embedding model (sentence-transformers/all-MiniLM-L6-v2) and vice versa, you aren't able to use RAG Chat with your previous documents loaded in the WebUI! You need to re-embed them.
 # IMPORTANT: If you change the embedding model (sentence-transformers/all-MiniLM-L6-v2) and vice versa, you aren't able to use RAG Chat with your previous documents loaded in the WebUI! You need to re-embed them.
 ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2
 ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2
 ARG USE_RERANKING_MODEL=""
 ARG USE_RERANKING_MODEL=""
+# Override at your own risk - non-root configurations are untested
+ARG UID=0
+ARG GID=0
 
 
 ######## WebUI frontend ########
 ######## WebUI frontend ########
 FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build
 FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build
@@ -32,6 +35,8 @@ ARG USE_OLLAMA
 ARG USE_CUDA_VER
 ARG USE_CUDA_VER
 ARG USE_EMBEDDING_MODEL
 ARG USE_EMBEDDING_MODEL
 ARG USE_RERANKING_MODEL
 ARG USE_RERANKING_MODEL
+ARG UID
+ARG GID
 
 
 ## Basis ##
 ## Basis ##
 ENV ENV=prod \
 ENV ENV=prod \
@@ -76,9 +81,20 @@ ENV HF_HOME="/app/backend/data/cache/embedding/models"
 WORKDIR /app/backend
 WORKDIR /app/backend
 
 
 ENV HOME /root
 ENV HOME /root
+# Create user and group if not root
+RUN if [ $UID -ne 0 ]; then \
+      if [ $GID -ne 0 ]; then \
+        addgroup --gid $GID app; \
+      fi; \
+      adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \
+    fi
+
 RUN mkdir -p $HOME/.cache/chroma
 RUN mkdir -p $HOME/.cache/chroma
 RUN echo -n 00000000-0000-0000-0000-000000000000 > $HOME/.cache/chroma/telemetry_user_id
 RUN echo -n 00000000-0000-0000-0000-000000000000 > $HOME/.cache/chroma/telemetry_user_id
 
 
+# Make sure the user has access to the app and root directory
+RUN chown -R $UID:$GID /app $HOME
+
 RUN if [ "$USE_OLLAMA" = "true" ]; then \
 RUN if [ "$USE_OLLAMA" = "true" ]; then \
     apt-get update && \
     apt-get update && \
     # Install pandoc and netcat
     # Install pandoc and netcat
@@ -94,7 +110,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
     else \
     else \
     apt-get update && \
     apt-get update && \
     # Install pandoc and netcat
     # Install pandoc and netcat
-    apt-get install -y --no-install-recommends pandoc netcat-openbsd curl && \
+    apt-get install -y --no-install-recommends pandoc netcat-openbsd curl jq && \
     # for RAG OCR
     # for RAG OCR
     apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
     apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \
     # cleanup
     # cleanup
@@ -102,7 +118,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
     fi
     fi
 
 
 # install python dependencies
 # install python dependencies
-COPY ./backend/requirements.txt ./requirements.txt
+COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt
 
 
 RUN pip3 install uv && \
 RUN pip3 install uv && \
     if [ "$USE_CUDA" = "true" ]; then \
     if [ "$USE_CUDA" = "true" ]; then \
@@ -125,16 +141,17 @@ RUN pip3 install uv && \
 # COPY --from=build /app/onnx /root/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx
 # COPY --from=build /app/onnx /root/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx
 
 
 # copy built frontend files
 # copy built frontend files
-COPY --from=build /app/build /app/build
-COPY --from=build /app/CHANGELOG.md /app/CHANGELOG.md
-COPY --from=build /app/package.json /app/package.json
+COPY --chown=$UID:$GID --from=build /app/build /app/build
+COPY --chown=$UID:$GID --from=build /app/CHANGELOG.md /app/CHANGELOG.md
+COPY --chown=$UID:$GID --from=build /app/package.json /app/package.json
 
 
 # copy backend files
 # copy backend files
-COPY ./backend .
+COPY --chown=$UID:$GID ./backend .
 
 
 EXPOSE 8080
 EXPOSE 8080
 
 
 HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1
 HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1
 
 
+USER $UID:$GID
 
 
 CMD [ "bash", "start.sh"]
 CMD [ "bash", "start.sh"]

+ 1 - 1
backend/apps/images/main.py

@@ -397,7 +397,7 @@ def generate_image(
     user=Depends(get_current_user),
     user=Depends(get_current_user),
 ):
 ):
 
 
-    width, height = tuple(map(int, app.state.config.IMAGE_SIZE).split("x"))
+    width, height = tuple(map(int, app.state.config.IMAGE_SIZE.split("x")))
 
 
     r = None
     r = None
     try:
     try:

+ 4 - 4
backend/apps/litellm/main.py

@@ -75,6 +75,10 @@ with open(LITELLM_CONFIG_DIR, "r") as file:
     litellm_config = yaml.safe_load(file)
     litellm_config = yaml.safe_load(file)
 
 
 
 
+app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER.value
+app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST.value
+
+
 app.state.ENABLE = ENABLE_LITELLM
 app.state.ENABLE = ENABLE_LITELLM
 app.state.CONFIG = litellm_config
 app.state.CONFIG = litellm_config
 
 
@@ -151,10 +155,6 @@ async def shutdown_litellm_background():
         background_process = None
         background_process = None
 
 
 
 
-app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
-app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
-
-
 @app.get("/")
 @app.get("/")
 async def get_status():
 async def get_status():
     return {"status": True}
     return {"status": True}

+ 10 - 7
backend/apps/ollama/main.py

@@ -64,8 +64,8 @@ app.add_middleware(
 
 
 app.state.config = AppConfig()
 app.state.config = AppConfig()
 
 
-app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
-app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
+app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
+app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
 
 app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
 app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
 app.state.MODELS = {}
 app.state.MODELS = {}
@@ -124,8 +124,9 @@ async def cancel_ollama_request(request_id: str, user=Depends(get_current_user))
 
 
 
 
 async def fetch_url(url):
 async def fetch_url(url):
+    timeout = aiohttp.ClientTimeout(total=5)
     try:
     try:
-        async with aiohttp.ClientSession() as session:
+        async with aiohttp.ClientSession(timeout=timeout) as session:
             async with session.get(url) as response:
             async with session.get(url) as response:
                 return await response.json()
                 return await response.json()
     except Exception as e:
     except Exception as e:
@@ -177,11 +178,12 @@ async def get_ollama_tags(
     if url_idx == None:
     if url_idx == None:
         models = await get_all_models()
         models = await get_all_models()
 
 
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
             if user.role == "user":
                 models["models"] = list(
                 models["models"] = list(
                     filter(
                     filter(
-                        lambda model: model["name"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["name"]
+                        in app.state.config.MODEL_FILTER_LIST,
                         models["models"],
                         models["models"],
                     )
                     )
                 )
                 )
@@ -1045,11 +1047,12 @@ async def get_openai_models(
     if url_idx == None:
     if url_idx == None:
         models = await get_all_models()
         models = await get_all_models()
 
 
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
             if user.role == "user":
                 models["models"] = list(
                 models["models"] = list(
                     filter(
                     filter(
-                        lambda model: model["name"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["name"]
+                        in app.state.config.MODEL_FILTER_LIST,
                         models["models"],
                         models["models"],
                     )
                     )
                 )
                 )

+ 32 - 9
backend/apps/openai/main.py

@@ -21,6 +21,7 @@ from utils.utils import (
 )
 )
 from config import (
 from config import (
     SRC_LOG_LEVELS,
     SRC_LOG_LEVELS,
+    ENABLE_OPENAI_API,
     OPENAI_API_BASE_URLS,
     OPENAI_API_BASE_URLS,
     OPENAI_API_KEYS,
     OPENAI_API_KEYS,
     CACHE_DIR,
     CACHE_DIR,
@@ -46,11 +47,14 @@ app.add_middleware(
     allow_headers=["*"],
     allow_headers=["*"],
 )
 )
 
 
+
 app.state.config = AppConfig()
 app.state.config = AppConfig()
 
 
-app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
-app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
+app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
+app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
+
 
 
+app.state.config.ENABLE_OPENAI_API = ENABLE_OPENAI_API
 app.state.config.OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS
 app.state.config.OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS
 app.state.config.OPENAI_API_KEYS = OPENAI_API_KEYS
 app.state.config.OPENAI_API_KEYS = OPENAI_API_KEYS
 
 
@@ -68,6 +72,21 @@ async def check_url(request: Request, call_next):
     return response
     return response
 
 
 
 
+@app.get("/config")
+async def get_config(user=Depends(get_admin_user)):
+    return {"ENABLE_OPENAI_API": app.state.config.ENABLE_OPENAI_API}
+
+
+class OpenAIConfigForm(BaseModel):
+    enable_openai_api: Optional[bool] = None
+
+
+@app.post("/config/update")
+async def update_config(form_data: OpenAIConfigForm, user=Depends(get_admin_user)):
+    app.state.config.ENABLE_OPENAI_API = form_data.enable_openai_api
+    return {"ENABLE_OPENAI_API": app.state.config.ENABLE_OPENAI_API}
+
+
 class UrlsUpdateForm(BaseModel):
 class UrlsUpdateForm(BaseModel):
     urls: List[str]
     urls: List[str]
 
 
@@ -164,11 +183,15 @@ async def speech(request: Request, user=Depends(get_verified_user)):
 
 
 
 
 async def fetch_url(url, key):
 async def fetch_url(url, key):
+    timeout = aiohttp.ClientTimeout(total=5)
     try:
     try:
-        headers = {"Authorization": f"Bearer {key}"}
-        async with aiohttp.ClientSession() as session:
-            async with session.get(url, headers=headers) as response:
-                return await response.json()
+        if key != "":
+            headers = {"Authorization": f"Bearer {key}"}
+            async with aiohttp.ClientSession(timeout=timeout) as session:
+                async with session.get(url, headers=headers) as response:
+                    return await response.json()
+        else:
+            return None
     except Exception as e:
     except Exception as e:
         # Handle connection error here
         # Handle connection error here
         log.error(f"Connection error: {e}")
         log.error(f"Connection error: {e}")
@@ -200,7 +223,7 @@ async def get_all_models():
     if (
     if (
         len(app.state.config.OPENAI_API_KEYS) == 1
         len(app.state.config.OPENAI_API_KEYS) == 1
         and app.state.config.OPENAI_API_KEYS[0] == ""
         and app.state.config.OPENAI_API_KEYS[0] == ""
-    ):
+    ) or not app.state.config.ENABLE_OPENAI_API:
         models = {"data": []}
         models = {"data": []}
     else:
     else:
         tasks = [
         tasks = [
@@ -237,11 +260,11 @@ async def get_all_models():
 async def get_models(url_idx: Optional[int] = None, user=Depends(get_current_user)):
 async def get_models(url_idx: Optional[int] = None, user=Depends(get_current_user)):
     if url_idx == None:
     if url_idx == None:
         models = await get_all_models()
         models = await get_all_models()
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
             if user.role == "user":
                 models["data"] = list(
                 models["data"] = list(
                     filter(
                     filter(
-                        lambda model: model["id"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["id"] in app.state.config.MODEL_FILTER_LIST,
                         models["data"],
                         models["data"],
                     )
                     )
                 )
                 )

+ 15 - 3
backend/apps/rag/main.py

@@ -70,6 +70,7 @@ from utils.misc import (
 from utils.utils import get_current_user, get_admin_user
 from utils.utils import get_current_user, get_admin_user
 
 
 from config import (
 from config import (
+    ENV,
     SRC_LOG_LEVELS,
     SRC_LOG_LEVELS,
     UPLOAD_DIR,
     UPLOAD_DIR,
     DOCS_DIR,
     DOCS_DIR,
@@ -266,7 +267,7 @@ async def update_embedding_config(
                 app.state.config.OPENAI_API_BASE_URL = form_data.openai_config.url
                 app.state.config.OPENAI_API_BASE_URL = form_data.openai_config.url
                 app.state.config.OPENAI_API_KEY = form_data.openai_config.key
                 app.state.config.OPENAI_API_KEY = form_data.openai_config.key
 
 
-        update_embedding_model(app.state.config.RAG_EMBEDDING_MODEL), True
+        update_embedding_model(app.state.config.RAG_EMBEDDING_MODEL)
 
 
         app.state.EMBEDDING_FUNCTION = get_embedding_function(
         app.state.EMBEDDING_FUNCTION = get_embedding_function(
             app.state.config.RAG_EMBEDDING_ENGINE,
             app.state.config.RAG_EMBEDDING_ENGINE,
@@ -439,12 +440,12 @@ async def update_query_settings(
     form_data: QuerySettingsForm, user=Depends(get_admin_user)
     form_data: QuerySettingsForm, user=Depends(get_admin_user)
 ):
 ):
     app.state.config.RAG_TEMPLATE = (
     app.state.config.RAG_TEMPLATE = (
-        form_data.template if form_data.template else RAG_TEMPLATE,
+        form_data.template if form_data.template else RAG_TEMPLATE
     )
     )
     app.state.config.TOP_K = form_data.k if form_data.k else 4
     app.state.config.TOP_K = form_data.k if form_data.k else 4
     app.state.config.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0
     app.state.config.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0
     app.state.config.ENABLE_RAG_HYBRID_SEARCH = (
     app.state.config.ENABLE_RAG_HYBRID_SEARCH = (
-        form_data.hybrid if form_data.hybrid else False,
+        form_data.hybrid if form_data.hybrid else False
     )
     )
     return {
     return {
         "status": True,
         "status": True,
@@ -1006,3 +1007,14 @@ def reset(user=Depends(get_admin_user)) -> bool:
         log.exception(e)
         log.exception(e)
 
 
     return True
     return True
+
+
+if ENV == "dev":
+
+    @app.get("/ef")
+    async def get_embeddings():
+        return {"result": app.state.EMBEDDING_FUNCTION("hello world")}
+
+    @app.get("/ef/{text}")
+    async def get_embeddings_text(text: str):
+        return {"result": app.state.EMBEDDING_FUNCTION(text)}

+ 53 - 0
backend/apps/web/internal/migrations/008_add_memory.py

@@ -0,0 +1,53 @@
+"""Peewee migrations -- 002_add_local_sharing.py.
+
+Some examples (model - class or model name)::
+
+    > Model = migrator.orm['table_name']            # Return model in current state by name
+    > Model = migrator.ModelClass                   # Return model in current state by name
+
+    > migrator.sql(sql)                             # Run custom SQL
+    > migrator.run(func, *args, **kwargs)           # Run python function with the given args
+    > migrator.create_model(Model)                  # Create a model (could be used as decorator)
+    > migrator.remove_model(model, cascade=True)    # Remove a model
+    > migrator.add_fields(model, **fields)          # Add fields to a model
+    > migrator.change_fields(model, **fields)       # Change fields
+    > migrator.remove_fields(model, *field_names, cascade=True)
+    > migrator.rename_field(model, old_field_name, new_field_name)
+    > migrator.rename_table(model, new_table_name)
+    > migrator.add_index(model, *col_names, unique=False)
+    > migrator.add_not_null(model, *field_names)
+    > migrator.add_default(model, field_name, default)
+    > migrator.add_constraint(model, name, sql)
+    > migrator.drop_index(model, *col_names)
+    > migrator.drop_not_null(model, *field_names)
+    > migrator.drop_constraints(model, *constraints)
+
+"""
+
+from contextlib import suppress
+
+import peewee as pw
+from peewee_migrate import Migrator
+
+
+with suppress(ImportError):
+    import playhouse.postgres_ext as pw_pext
+
+
+def migrate(migrator: Migrator, database: pw.Database, *, fake=False):
+    @migrator.create_model
+    class Memory(pw.Model):
+        id = pw.CharField(max_length=255, unique=True)
+        user_id = pw.CharField(max_length=255)
+        content = pw.TextField(null=False)
+        updated_at = pw.BigIntegerField(null=False)
+        created_at = pw.BigIntegerField(null=False)
+
+        class Meta:
+            table_name = "memory"
+
+
+def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your rollback migrations here."""
+
+    migrator.remove_model("memory")

+ 5 - 0
backend/apps/web/main.py

@@ -9,6 +9,7 @@ from apps.web.routers import (
     modelfiles,
     modelfiles,
     prompts,
     prompts,
     configs,
     configs,
+    memories,
     utils,
     utils,
 )
 )
 from config import (
 from config import (
@@ -41,6 +42,7 @@ app.state.config.USER_PERMISSIONS = USER_PERMISSIONS
 app.state.config.WEBHOOK_URL = WEBHOOK_URL
 app.state.config.WEBHOOK_URL = WEBHOOK_URL
 app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
 app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
 
 
+
 app.add_middleware(
 app.add_middleware(
     CORSMiddleware,
     CORSMiddleware,
     allow_origins=origins,
     allow_origins=origins,
@@ -52,9 +54,12 @@ app.add_middleware(
 app.include_router(auths.router, prefix="/auths", tags=["auths"])
 app.include_router(auths.router, prefix="/auths", tags=["auths"])
 app.include_router(users.router, prefix="/users", tags=["users"])
 app.include_router(users.router, prefix="/users", tags=["users"])
 app.include_router(chats.router, prefix="/chats", tags=["chats"])
 app.include_router(chats.router, prefix="/chats", tags=["chats"])
+
 app.include_router(documents.router, prefix="/documents", tags=["documents"])
 app.include_router(documents.router, prefix="/documents", tags=["documents"])
 app.include_router(modelfiles.router, prefix="/modelfiles", tags=["modelfiles"])
 app.include_router(modelfiles.router, prefix="/modelfiles", tags=["modelfiles"])
 app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
 app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
+app.include_router(memories.router, prefix="/memories", tags=["memories"])
+
 
 
 app.include_router(configs.router, prefix="/configs", tags=["configs"])
 app.include_router(configs.router, prefix="/configs", tags=["configs"])
 app.include_router(utils.router, prefix="/utils", tags=["utils"])
 app.include_router(utils.router, prefix="/utils", tags=["utils"])

+ 118 - 0
backend/apps/web/models/memories.py

@@ -0,0 +1,118 @@
+from pydantic import BaseModel
+from peewee import *
+from playhouse.shortcuts import model_to_dict
+from typing import List, Union, Optional
+
+from apps.web.internal.db import DB
+from apps.web.models.chats import Chats
+
+import time
+import uuid
+
+####################
+# Memory DB Schema
+####################
+
+
+class Memory(Model):
+    id = CharField(unique=True)
+    user_id = CharField()
+    content = TextField()
+    updated_at = BigIntegerField()
+    created_at = BigIntegerField()
+
+    class Meta:
+        database = DB
+
+
+class MemoryModel(BaseModel):
+    id: str
+    user_id: str
+    content: str
+    updated_at: int  # timestamp in epoch
+    created_at: int  # timestamp in epoch
+
+
+####################
+# Forms
+####################
+
+
+class MemoriesTable:
+    def __init__(self, db):
+        self.db = db
+        self.db.create_tables([Memory])
+
+    def insert_new_memory(
+        self,
+        user_id: str,
+        content: str,
+    ) -> Optional[MemoryModel]:
+        id = str(uuid.uuid4())
+
+        memory = MemoryModel(
+            **{
+                "id": id,
+                "user_id": user_id,
+                "content": content,
+                "created_at": int(time.time()),
+                "updated_at": int(time.time()),
+            }
+        )
+        result = Memory.create(**memory.model_dump())
+        if result:
+            return memory
+        else:
+            return None
+
+    def get_memories(self) -> List[MemoryModel]:
+        try:
+            memories = Memory.select()
+            return [MemoryModel(**model_to_dict(memory)) for memory in memories]
+        except:
+            return None
+
+    def get_memories_by_user_id(self, user_id: str) -> List[MemoryModel]:
+        try:
+            memories = Memory.select().where(Memory.user_id == user_id)
+            return [MemoryModel(**model_to_dict(memory)) for memory in memories]
+        except:
+            return None
+
+    def get_memory_by_id(self, id) -> Optional[MemoryModel]:
+        try:
+            memory = Memory.get(Memory.id == id)
+            return MemoryModel(**model_to_dict(memory))
+        except:
+            return None
+
+    def delete_memory_by_id(self, id: str) -> bool:
+        try:
+            query = Memory.delete().where(Memory.id == id)
+            query.execute()  # Remove the rows, return number of rows removed.
+
+            return True
+
+        except:
+            return False
+
+    def delete_memories_by_user_id(self, user_id: str) -> bool:
+        try:
+            query = Memory.delete().where(Memory.user_id == user_id)
+            query.execute()
+
+            return True
+        except:
+            return False
+
+    def delete_memory_by_id_and_user_id(self, id: str, user_id: str) -> bool:
+        try:
+            query = Memory.delete().where(Memory.id == id, Memory.user_id == user_id)
+            query.execute()
+
+            return True
+        except:
+            return False
+
+
+Memories = MemoriesTable(DB)

+ 145 - 0
backend/apps/web/routers/memories.py

@@ -0,0 +1,145 @@
+from fastapi import Response, Request
+from fastapi import Depends, FastAPI, HTTPException, status
+from datetime import datetime, timedelta
+from typing import List, Union, Optional
+
+from fastapi import APIRouter
+from pydantic import BaseModel
+import logging
+
+from apps.web.models.memories import Memories, MemoryModel
+
+from utils.utils import get_verified_user
+from constants import ERROR_MESSAGES
+
+from config import SRC_LOG_LEVELS, CHROMA_CLIENT
+
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["MODELS"])
+
+router = APIRouter()
+
+
+@router.get("/ef")
+async def get_embeddings(request: Request):
+    return {"result": request.app.state.EMBEDDING_FUNCTION("hello world")}
+
+
+############################
+# GetMemories
+############################
+
+
+@router.get("/", response_model=List[MemoryModel])
+async def get_memories(user=Depends(get_verified_user)):
+    return Memories.get_memories_by_user_id(user.id)
+
+
+############################
+# AddMemory
+############################
+
+
+class AddMemoryForm(BaseModel):
+    content: str
+
+
+@router.post("/add", response_model=Optional[MemoryModel])
+async def add_memory(
+    request: Request, form_data: AddMemoryForm, user=Depends(get_verified_user)
+):
+    memory = Memories.insert_new_memory(user.id, form_data.content)
+    memory_embedding = request.app.state.EMBEDDING_FUNCTION(memory.content)
+
+    collection = CHROMA_CLIENT.get_or_create_collection(name=f"user-memory-{user.id}")
+    collection.upsert(
+        documents=[memory.content],
+        ids=[memory.id],
+        embeddings=[memory_embedding],
+        metadatas=[{"created_at": memory.created_at}],
+    )
+
+    return memory
+
+
+############################
+# QueryMemory
+############################
+
+
+class QueryMemoryForm(BaseModel):
+    content: str
+
+
+@router.post("/query")
+async def query_memory(
+    request: Request, form_data: QueryMemoryForm, user=Depends(get_verified_user)
+):
+    query_embedding = request.app.state.EMBEDDING_FUNCTION(form_data.content)
+    collection = CHROMA_CLIENT.get_or_create_collection(name=f"user-memory-{user.id}")
+
+    results = collection.query(
+        query_embeddings=[query_embedding],
+        n_results=1,  # how many results to return
+    )
+
+    return results
+
+
+############################
+# ResetMemoryFromVectorDB
+############################
+@router.get("/reset", response_model=bool)
+async def reset_memory_from_vector_db(
+    request: Request, user=Depends(get_verified_user)
+):
+    CHROMA_CLIENT.delete_collection(f"user-memory-{user.id}")
+    collection = CHROMA_CLIENT.get_or_create_collection(name=f"user-memory-{user.id}")
+
+    memories = Memories.get_memories_by_user_id(user.id)
+    for memory in memories:
+        memory_embedding = request.app.state.EMBEDDING_FUNCTION(memory.content)
+        collection.upsert(
+            documents=[memory.content],
+            ids=[memory.id],
+            embeddings=[memory_embedding],
+        )
+    return True
+
+
+############################
+# DeleteMemoriesByUserId
+############################
+
+
+@router.delete("/user", response_model=bool)
+async def delete_memory_by_user_id(user=Depends(get_verified_user)):
+    result = Memories.delete_memories_by_user_id(user.id)
+
+    if result:
+        try:
+            CHROMA_CLIENT.delete_collection(f"user-memory-{user.id}")
+        except Exception as e:
+            log.error(e)
+        return True
+
+    return False
+
+
+############################
+# DeleteMemoryById
+############################
+
+
+@router.delete("/{memory_id}", response_model=bool)
+async def delete_memory_by_id(memory_id: str, user=Depends(get_verified_user)):
+    result = Memories.delete_memory_by_id_and_user_id(memory_id, user.id)
+
+    if result:
+        collection = CHROMA_CLIENT.get_or_create_collection(
+            name=f"user-memory-{user.id}"
+        )
+        collection.delete(ids=[memory_id])
+        return True
+
+    return False

+ 37 - 1
backend/apps/web/routers/users.py

@@ -11,8 +11,9 @@ import logging
 
 
 from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
 from apps.web.models.users import UserModel, UserUpdateForm, UserRoleUpdateForm, Users
 from apps.web.models.auths import Auths
 from apps.web.models.auths import Auths
+from apps.web.models.chats import Chats
 
 
-from utils.utils import get_current_user, get_password_hash, get_admin_user
+from utils.utils import get_verified_user, get_password_hash, get_admin_user
 from constants import ERROR_MESSAGES
 from constants import ERROR_MESSAGES
 
 
 from config import SRC_LOG_LEVELS
 from config import SRC_LOG_LEVELS
@@ -67,6 +68,41 @@ async def update_user_role(form_data: UserRoleUpdateForm, user=Depends(get_admin
     )
     )
 
 
 
 
+############################
+# GetUserById
+############################
+
+
+class UserResponse(BaseModel):
+    name: str
+    profile_image_url: str
+
+
+@router.get("/{user_id}", response_model=UserResponse)
+async def get_user_by_id(user_id: str, user=Depends(get_verified_user)):
+
+    if user_id.startswith("shared-"):
+        chat_id = user_id.replace("shared-", "")
+        chat = Chats.get_chat_by_id(chat_id)
+        if chat:
+            user_id = chat.user_id
+        else:
+            raise HTTPException(
+                status_code=status.HTTP_400_BAD_REQUEST,
+                detail=ERROR_MESSAGES.USER_NOT_FOUND,
+            )
+
+    user = Users.get_user_by_id(user_id)
+
+    if user:
+        return UserResponse(name=user.name, profile_image_url=user.profile_image_url)
+    else:
+        raise HTTPException(
+            status_code=status.HTTP_400_BAD_REQUEST,
+            detail=ERROR_MESSAGES.USER_NOT_FOUND,
+        )
+
+
 ############################
 ############################
 # UpdateUserById
 # UpdateUserById
 ############################
 ############################

+ 8 - 0
backend/config.py

@@ -417,6 +417,14 @@ OLLAMA_BASE_URLS = PersistentConfig(
 # OPENAI_API
 # OPENAI_API
 ####################################
 ####################################
 
 
+
+ENABLE_OPENAI_API = PersistentConfig(
+    "ENABLE_OPENAI_API",
+    "openai.enable",
+    os.environ.get("ENABLE_OPENAI_API", "True").lower() == "true",
+)
+
+
 OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
 OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
 OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
 OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
 
 

+ 30 - 8
backend/main.py

@@ -118,6 +118,18 @@ app.state.config.WEBHOOK_URL = WEBHOOK_URL
 origins = ["*"]
 origins = ["*"]
 
 
 
 
+# Custom middleware to add security headers
+# class SecurityHeadersMiddleware(BaseHTTPMiddleware):
+#     async def dispatch(self, request: Request, call_next):
+#         response: Response = await call_next(request)
+#         response.headers["Cross-Origin-Opener-Policy"] = "same-origin"
+#         response.headers["Cross-Origin-Embedder-Policy"] = "require-corp"
+#         return response
+
+
+# app.add_middleware(SecurityHeadersMiddleware)
+
+
 class RAGMiddleware(BaseHTTPMiddleware):
 class RAGMiddleware(BaseHTTPMiddleware):
     async def dispatch(self, request: Request, call_next):
     async def dispatch(self, request: Request, call_next):
         return_citations = False
         return_citations = False
@@ -227,9 +239,15 @@ async def check_url(request: Request, call_next):
     return response
     return response
 
 
 
 
-app.mount("/api/v1", webui_app)
-app.mount("/litellm/api", litellm_app)
+@app.middleware("http")
+async def update_embedding_function(request: Request, call_next):
+    response = await call_next(request)
+    if "/embedding/update" in request.url.path:
+        webui_app.state.EMBEDDING_FUNCTION = rag_app.state.EMBEDDING_FUNCTION
+    return response
 
 
+
+app.mount("/litellm/api", litellm_app)
 app.mount("/ollama", ollama_app)
 app.mount("/ollama", ollama_app)
 app.mount("/openai/api", openai_app)
 app.mount("/openai/api", openai_app)
 
 
@@ -237,6 +255,10 @@ app.mount("/images/api/v1", images_app)
 app.mount("/audio/api/v1", audio_app)
 app.mount("/audio/api/v1", audio_app)
 app.mount("/rag/api/v1", rag_app)
 app.mount("/rag/api/v1", rag_app)
 
 
+app.mount("/api/v1", webui_app)
+
+webui_app.state.EMBEDDING_FUNCTION = rag_app.state.EMBEDDING_FUNCTION
+
 
 
 @app.get("/api/config")
 @app.get("/api/config")
 async def get_app_config():
 async def get_app_config():
@@ -279,14 +301,14 @@ class ModelFilterConfigForm(BaseModel):
 async def update_model_filter_config(
 async def update_model_filter_config(
     form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
     form_data: ModelFilterConfigForm, user=Depends(get_admin_user)
 ):
 ):
-    app.state.config.ENABLE_MODEL_FILTER, form_data.enabled
-    app.state.config.MODEL_FILTER_LIST, form_data.models
+    app.state.config.ENABLE_MODEL_FILTER = form_data.enabled
+    app.state.config.MODEL_FILTER_LIST = form_data.models
 
 
-    ollama_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
-    ollama_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
+    ollama_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
+    ollama_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
 
 
-    openai_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
-    openai_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
+    openai_app.state.config.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
+    openai_app.state.config.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
 
 
     litellm_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
     litellm_app.state.ENABLE_MODEL_FILTER = app.state.config.ENABLE_MODEL_FILTER
     litellm_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST
     litellm_app.state.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST

+ 5 - 6
cypress/e2e/chat.cy.ts

@@ -62,18 +62,17 @@ describe('Settings', () => {
 				.should('exist');
 				.should('exist');
 			// spy on requests
 			// spy on requests
 			const spy = cy.spy();
 			const spy = cy.spy();
-			cy.intercept("GET", "/api/v1/chats/*", spy);
+			cy.intercept('GET', '/api/v1/chats/*', spy);
 			// Open context menu
 			// Open context menu
 			cy.get('#chat-context-menu-button').click();
 			cy.get('#chat-context-menu-button').click();
 			// Click share button
 			// Click share button
 			cy.get('#chat-share-button').click();
 			cy.get('#chat-share-button').click();
 			// Check if the share dialog is visible
 			// Check if the share dialog is visible
 			cy.get('#copy-and-share-chat-button').should('exist');
 			cy.get('#copy-and-share-chat-button').should('exist');
-			cy.wrap({}, { timeout: 5000 })
-				.should(() => {
-					// Check if the request was made twice (once for to replace chat object and once more due to change event)
-					expect(spy).to.be.callCount(2);
-				});
+			cy.wrap({}, { timeout: 5000 }).should(() => {
+				// Check if the request was made twice (once for to replace chat object and once more due to change event)
+				expect(spy).to.be.callCount(2);
+			});
 		});
 		});
 	});
 	});
 });
 });

+ 145 - 4
package-lock.json

@@ -1,13 +1,14 @@
 {
 {
 	"name": "open-webui",
 	"name": "open-webui",
-	"version": "0.1.124",
+	"version": "0.1.125",
 	"lockfileVersion": 3,
 	"lockfileVersion": 3,
 	"requires": true,
 	"requires": true,
 	"packages": {
 	"packages": {
 		"": {
 		"": {
 			"name": "open-webui",
 			"name": "open-webui",
-			"version": "0.1.124",
+			"version": "0.1.125",
 			"dependencies": {
 			"dependencies": {
+				"@pyscript/core": "^0.4.32",
 				"@sveltejs/adapter-node": "^1.3.1",
 				"@sveltejs/adapter-node": "^1.3.1",
 				"async": "^3.2.5",
 				"async": "^3.2.5",
 				"bits-ui": "^0.19.7",
 				"bits-ui": "^0.19.7",
@@ -22,6 +23,7 @@
 				"js-sha256": "^0.10.1",
 				"js-sha256": "^0.10.1",
 				"katex": "^0.16.9",
 				"katex": "^0.16.9",
 				"marked": "^9.1.0",
 				"marked": "^9.1.0",
+				"pyodide": "^0.26.0-alpha.4",
 				"svelte-sonner": "^0.3.19",
 				"svelte-sonner": "^0.3.19",
 				"tippy.js": "^6.3.7",
 				"tippy.js": "^6.3.7",
 				"uuid": "^9.0.1"
 				"uuid": "^9.0.1"
@@ -890,6 +892,19 @@
 				"url": "https://opencollective.com/popperjs"
 				"url": "https://opencollective.com/popperjs"
 			}
 			}
 		},
 		},
+		"node_modules/@pyscript/core": {
+			"version": "0.4.32",
+			"resolved": "https://registry.npmjs.org/@pyscript/core/-/core-0.4.32.tgz",
+			"integrity": "sha512-WQATzPp1ggf871+PukCmTypzScXkEB1EWD/vg5GNxpM96N6rDPqQ13msuA5XvwU01ZVhL8HHSFDLk4IfaXNGWg==",
+			"dependencies": {
+				"@ungap/with-resolvers": "^0.1.0",
+				"basic-devtools": "^0.1.6",
+				"polyscript": "^0.12.8",
+				"sticky-module": "^0.1.1",
+				"to-json-callback": "^0.1.1",
+				"type-checked-collections": "^0.1.7"
+			}
+		},
 		"node_modules/@rollup/plugin-commonjs": {
 		"node_modules/@rollup/plugin-commonjs": {
 			"version": "25.0.7",
 			"version": "25.0.7",
 			"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz",
 			"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz",
@@ -1605,8 +1620,12 @@
 		"node_modules/@ungap/structured-clone": {
 		"node_modules/@ungap/structured-clone": {
 			"version": "1.2.0",
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
 			"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
-			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-			"dev": true
+			"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
+		},
+		"node_modules/@ungap/with-resolvers": {
+			"version": "0.1.0",
+			"resolved": "https://registry.npmjs.org/@ungap/with-resolvers/-/with-resolvers-0.1.0.tgz",
+			"integrity": "sha512-g7f0IkJdPW2xhY7H4iE72DAsIyfuwEFc6JWc2tYFwKDMWWAF699vGjrM348cwQuOXgHpe1gWFe+Eiyjx/ewvvw=="
 		},
 		},
 		"node_modules/@vitest/expect": {
 		"node_modules/@vitest/expect": {
 			"version": "1.6.0",
 			"version": "1.6.0",
@@ -1713,6 +1732,11 @@
 				"@types/estree": "^1.0.0"
 				"@types/estree": "^1.0.0"
 			}
 			}
 		},
 		},
+		"node_modules/@webreflection/fetch": {
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/@webreflection/fetch/-/fetch-0.1.5.tgz",
+			"integrity": "sha512-zCcqCJoNLvdeF41asAK71XPlwSPieeRDsE09albBunJEksuYPYNillKNQjf8p5BqSoTKTuKrW3lUm3MNodUC4g=="
+		},
 		"node_modules/acorn": {
 		"node_modules/acorn": {
 			"version": "8.11.3",
 			"version": "8.11.3",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -2027,6 +2051,11 @@
 			"dev": true,
 			"dev": true,
 			"optional": true
 			"optional": true
 		},
 		},
+		"node_modules/base-64": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+			"integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
+		},
 		"node_modules/base64-js": {
 		"node_modules/base64-js": {
 			"version": "1.5.1",
 			"version": "1.5.1",
 			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
 			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
@@ -2047,6 +2076,11 @@
 				}
 				}
 			]
 			]
 		},
 		},
+		"node_modules/basic-devtools": {
+			"version": "0.1.6",
+			"resolved": "https://registry.npmjs.org/basic-devtools/-/basic-devtools-0.1.6.tgz",
+			"integrity": "sha512-g9zJ63GmdUesS3/Fwv0B5SYX6nR56TQXmGr+wE5PRTNCnGQMYWhUx/nZB/mMWnQJVLPPAp89oxDNlasdtNkW5Q=="
+		},
 		"node_modules/bcrypt-pbkdf": {
 		"node_modules/bcrypt-pbkdf": {
 			"version": "1.0.2",
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -2661,6 +2695,28 @@
 				"@types/estree": "^1.0.0"
 				"@types/estree": "^1.0.0"
 			}
 			}
 		},
 		},
+		"node_modules/codedent": {
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/codedent/-/codedent-0.1.2.tgz",
+			"integrity": "sha512-qEqzcy5viM3UoCN0jYHZeXZoyd4NZQzYFg0kOBj8O1CgoGG9WYYTF+VeQRsN0OSKFjF3G1u4WDUOtOsWEx6N2w==",
+			"dependencies": {
+				"plain-tag": "^0.1.3"
+			}
+		},
+		"node_modules/coincident": {
+			"version": "1.2.3",
+			"resolved": "https://registry.npmjs.org/coincident/-/coincident-1.2.3.tgz",
+			"integrity": "sha512-Uxz3BMTWIslzeWjuQnizGWVg0j6khbvHUQ8+5BdM7WuJEm4ALXwq3wluYoB+uF68uPBz/oUOeJnYURKyfjexlA==",
+			"dependencies": {
+				"@ungap/structured-clone": "^1.2.0",
+				"@ungap/with-resolvers": "^0.1.0",
+				"gc-hook": "^0.3.1",
+				"proxy-target": "^3.0.2"
+			},
+			"optionalDependencies": {
+				"ws": "^8.16.0"
+			}
+		},
 		"node_modules/color-convert": {
 		"node_modules/color-convert": {
 			"version": "2.0.1",
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -4001,6 +4057,11 @@
 				"url": "https://github.com/sponsors/ljharb"
 				"url": "https://github.com/sponsors/ljharb"
 			}
 			}
 		},
 		},
+		"node_modules/gc-hook": {
+			"version": "0.3.1",
+			"resolved": "https://registry.npmjs.org/gc-hook/-/gc-hook-0.3.1.tgz",
+			"integrity": "sha512-E5M+O/h2o7eZzGhzRZGex6hbB3k4NWqO0eA+OzLRLXxhdbYPajZnynPwAtphnh+cRHPwsj5Z80dqZlfI4eK55A=="
+		},
 		"node_modules/get-func-name": {
 		"node_modules/get-func-name": {
 			"version": "2.0.2",
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
@@ -4328,6 +4389,11 @@
 				"node": ">=12.0.0"
 				"node": ">=12.0.0"
 			}
 			}
 		},
 		},
+		"node_modules/html-escaper": {
+			"version": "3.0.3",
+			"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz",
+			"integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="
+		},
 		"node_modules/htmlparser2": {
 		"node_modules/htmlparser2": {
 			"version": "8.0.2",
 			"version": "8.0.2",
 			"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
@@ -5838,6 +5904,29 @@
 				"pathe": "^1.1.2"
 				"pathe": "^1.1.2"
 			}
 			}
 		},
 		},
+		"node_modules/plain-tag": {
+			"version": "0.1.3",
+			"resolved": "https://registry.npmjs.org/plain-tag/-/plain-tag-0.1.3.tgz",
+			"integrity": "sha512-yyVAOFKTAElc7KdLt2+UKGExNYwYb/Y/WE9i+1ezCQsJE8gbKSjewfpRqK2nQgZ4d4hhAAGgDCOcIZVilqE5UA=="
+		},
+		"node_modules/polyscript": {
+			"version": "0.12.8",
+			"resolved": "https://registry.npmjs.org/polyscript/-/polyscript-0.12.8.tgz",
+			"integrity": "sha512-kcG3W9jU/s1sYjWOTAa2jAh5D2jm3zJRi+glSTsC+lA3D1b/Sd67pEIGpyL9bWNKYSimqAx4se6jAhQjJZ7+jQ==",
+			"dependencies": {
+				"@ungap/structured-clone": "^1.2.0",
+				"@ungap/with-resolvers": "^0.1.0",
+				"@webreflection/fetch": "^0.1.5",
+				"basic-devtools": "^0.1.6",
+				"codedent": "^0.1.2",
+				"coincident": "^1.2.3",
+				"gc-hook": "^0.3.1",
+				"html-escaper": "^3.0.3",
+				"proxy-target": "^3.0.2",
+				"sticky-module": "^0.1.1",
+				"to-json-callback": "^0.1.1"
+			}
+		},
 		"node_modules/postcss": {
 		"node_modules/postcss": {
 			"version": "8.4.38",
 			"version": "8.4.38",
 			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
 			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -6151,6 +6240,11 @@
 			"integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
 			"integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"node_modules/proxy-target": {
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/proxy-target/-/proxy-target-3.0.2.tgz",
+			"integrity": "sha512-FFE1XNwXX/FNC3/P8HiKaJSy/Qk68RitG/QEcLy/bVnTAPlgTAWPZKh0pARLAnpfXQPKyalBhk009NRTgsk8vQ=="
+		},
 		"node_modules/psl": {
 		"node_modules/psl": {
 			"version": "1.9.0",
 			"version": "1.9.0",
 			"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
 			"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -6176,6 +6270,18 @@
 				"node": ">=6"
 				"node": ">=6"
 			}
 			}
 		},
 		},
+		"node_modules/pyodide": {
+			"version": "0.26.0-alpha.4",
+			"resolved": "https://registry.npmjs.org/pyodide/-/pyodide-0.26.0-alpha.4.tgz",
+			"integrity": "sha512-Ixuczq99DwhQlE+Bt0RaS6Ln9MHSZOkbU6iN8azwaeorjHtr7ukaxh+FeTxViFrp2y+ITyKgmcobY+JnBPcULw==",
+			"dependencies": {
+				"base-64": "^1.0.0",
+				"ws": "^8.5.0"
+			},
+			"engines": {
+				"node": ">=18.0.0"
+			}
+		},
 		"node_modules/qs": {
 		"node_modules/qs": {
 			"version": "6.10.4",
 			"version": "6.10.4",
 			"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
 			"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
@@ -6858,6 +6964,11 @@
 			"integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
 			"integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
 			"dev": true
 			"dev": true
 		},
 		},
+		"node_modules/sticky-module": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/sticky-module/-/sticky-module-0.1.1.tgz",
+			"integrity": "sha512-IuYgnyIMUx/m6rtu14l/LR2MaqOLtpXcWkxPmtPsiScRHEo+S4Tojk+DWFHOncSdFX/OsoLOM4+T92yOmI1AMw=="
+		},
 		"node_modules/stream-composer": {
 		"node_modules/stream-composer": {
 			"version": "1.0.2",
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
@@ -7520,6 +7631,11 @@
 				"node": ">=14.14"
 				"node": ">=14.14"
 			}
 			}
 		},
 		},
+		"node_modules/to-json-callback": {
+			"version": "0.1.1",
+			"resolved": "https://registry.npmjs.org/to-json-callback/-/to-json-callback-0.1.1.tgz",
+			"integrity": "sha512-BzOeinTT3NjE+FJ2iCvWB8HvyuyBzoH3WlSnJ+AYVC4tlePyZWSYdkQIFOARWiq0t35/XhmI0uQsFiUsRksRqg=="
+		},
 		"node_modules/to-regex-range": {
 		"node_modules/to-regex-range": {
 			"version": "5.0.1",
 			"version": "5.0.1",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -7629,6 +7745,11 @@
 				"node": ">= 0.8.0"
 				"node": ">= 0.8.0"
 			}
 			}
 		},
 		},
+		"node_modules/type-checked-collections": {
+			"version": "0.1.7",
+			"resolved": "https://registry.npmjs.org/type-checked-collections/-/type-checked-collections-0.1.7.tgz",
+			"integrity": "sha512-fLIydlJy7IG9XL4wjRwEcKhxx/ekLXiWiMvcGo01cOMF+TN+5ZqajM1mRNRz2bNNi1bzou2yofhjZEQi7kgl9A=="
+		},
 		"node_modules/type-detect": {
 		"node_modules/type-detect": {
 			"version": "4.0.8",
 			"version": "4.0.8",
 			"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
 			"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
@@ -8883,6 +9004,26 @@
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
 			"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
 			"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
 		},
 		},
+		"node_modules/ws": {
+			"version": "8.17.0",
+			"resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz",
+			"integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==",
+			"engines": {
+				"node": ">=10.0.0"
+			},
+			"peerDependencies": {
+				"bufferutil": "^4.0.1",
+				"utf-8-validate": ">=5.0.2"
+			},
+			"peerDependenciesMeta": {
+				"bufferutil": {
+					"optional": true
+				},
+				"utf-8-validate": {
+					"optional": true
+				}
+			}
+		},
 		"node_modules/xtend": {
 		"node_modules/xtend": {
 			"version": "4.0.2",
 			"version": "4.0.2",
 			"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
 			"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

+ 7 - 4
package.json

@@ -1,10 +1,10 @@
 {
 {
 	"name": "open-webui",
 	"name": "open-webui",
-	"version": "0.1.124",
+	"version": "0.1.125",
 	"private": true,
 	"private": true,
 	"scripts": {
 	"scripts": {
-		"dev": "vite dev --host",
-		"build": "vite build",
+		"dev": "npm run pyodide:fetch && vite dev --host",
+		"build": "npm run pyodide:fetch && vite build",
 		"preview": "vite preview",
 		"preview": "vite preview",
 		"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
 		"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
 		"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
@@ -16,7 +16,8 @@
 		"format:backend": "black . --exclude \"/venv/\"",
 		"format:backend": "black . --exclude \"/venv/\"",
 		"i18n:parse": "i18next --config i18next-parser.config.ts && prettier --write \"src/lib/i18n/**/*.{js,json}\"",
 		"i18n:parse": "i18next --config i18next-parser.config.ts && prettier --write \"src/lib/i18n/**/*.{js,json}\"",
 		"cy:open": "cypress open",
 		"cy:open": "cypress open",
-		"test:frontend": "vitest"
+		"test:frontend": "vitest",
+		"pyodide:fetch": "node scripts/prepare-pyodide.js"
 	},
 	},
 	"devDependencies": {
 	"devDependencies": {
 		"@sveltejs/adapter-auto": "^2.0.0",
 		"@sveltejs/adapter-auto": "^2.0.0",
@@ -47,6 +48,7 @@
 	},
 	},
 	"type": "module",
 	"type": "module",
 	"dependencies": {
 	"dependencies": {
+		"@pyscript/core": "^0.4.32",
 		"@sveltejs/adapter-node": "^1.3.1",
 		"@sveltejs/adapter-node": "^1.3.1",
 		"async": "^3.2.5",
 		"async": "^3.2.5",
 		"bits-ui": "^0.19.7",
 		"bits-ui": "^0.19.7",
@@ -61,6 +63,7 @@
 		"js-sha256": "^0.10.1",
 		"js-sha256": "^0.10.1",
 		"katex": "^0.16.9",
 		"katex": "^0.16.9",
 		"marked": "^9.1.0",
 		"marked": "^9.1.0",
+		"pyodide": "^0.26.0-alpha.4",
 		"svelte-sonner": "^0.3.19",
 		"svelte-sonner": "^0.3.19",
 		"tippy.js": "^6.3.7",
 		"tippy.js": "^6.3.7",
 		"uuid": "^9.0.1"
 		"uuid": "^9.0.1"

+ 39 - 0
scripts/prepare-pyodide.js

@@ -0,0 +1,39 @@
+const packages = [
+	'requests',
+	'beautifulsoup4',
+	'numpy',
+	'pandas',
+	'matplotlib',
+	'scikit-learn',
+	'scipy',
+	'regex',
+	'seaborn'
+];
+
+import { loadPyodide } from 'pyodide';
+import { writeFile, copyFile, readdir } from 'fs/promises';
+
+async function downloadPackages() {
+	console.log('Setting up pyodide + micropip');
+	const pyodide = await loadPyodide({
+		packageCacheDir: 'static/pyodide'
+	});
+	await pyodide.loadPackage('micropip');
+	const micropip = pyodide.pyimport('micropip');
+	console.log('Downloading Pyodide packages:', packages);
+	await micropip.install(packages);
+	console.log('Pyodide packages downloaded, freezing into lock file');
+	const lockFile = await micropip.freeze();
+	await writeFile('static/pyodide/pyodide-lock.json', lockFile);
+}
+
+async function copyPyodide() {
+	console.log('Copying Pyodide files into static directory');
+	// Copy all files from node_modules/pyodide to static/pyodide
+	for await (const entry of await readdir('node_modules/pyodide')) {
+		await copyFile(`node_modules/pyodide/${entry}`, `static/pyodide/${entry}`);
+	}
+}
+
+await downloadPackages();
+await copyPyodide();

+ 1 - 0
src/app.html

@@ -12,6 +12,7 @@
 			title="Open WebUI"
 			title="Open WebUI"
 			href="/opensearch.xml"
 			href="/opensearch.xml"
 		/>
 		/>
+
 		<script>
 		<script>
 			// On page load or when changing themes, best to add inline in `head` to avoid FOUC
 			// On page load or when changing themes, best to add inline in `head` to avoid FOUC
 			(() => {
 			(() => {

+ 155 - 0
src/lib/apis/memories/index.ts

@@ -0,0 +1,155 @@
+import { WEBUI_API_BASE_URL } from '$lib/constants';
+
+export const getMemories = async (token: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/memories`, {
+		method: 'GET',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			authorization: `Bearer ${token}`
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const addNewMemory = async (token: string, content: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/memories/add`, {
+		method: 'POST',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			authorization: `Bearer ${token}`
+		},
+		body: JSON.stringify({
+			content: content
+		})
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const queryMemory = async (token: string, content: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/memories/query`, {
+		method: 'POST',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			authorization: `Bearer ${token}`
+		},
+		body: JSON.stringify({
+			content: content
+		})
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			error = err.detail;
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const deleteMemoryById = async (token: string, id: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/memories/${id}`, {
+		method: 'DELETE',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			authorization: `Bearer ${token}`
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const deleteMemoriesByUserId = async (token: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/memories/user`, {
+		method: 'DELETE',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			authorization: `Bearer ${token}`
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.then((json) => {
+			return json;
+		})
+		.catch((err) => {
+			error = err.detail;
+
+			console.log(err);
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};

+ 67 - 0
src/lib/apis/openai/index.ts

@@ -2,6 +2,73 @@ import { OPENAI_API_BASE_URL } from '$lib/constants';
 import { promptTemplate } from '$lib/utils';
 import { promptTemplate } from '$lib/utils';
 import { type Model, models, settings } from '$lib/stores';
 import { type Model, models, settings } from '$lib/stores';
 
 
+export const getOpenAIConfig = async (token: string = '') => {
+	let error = null;
+
+	const res = await fetch(`${OPENAI_API_BASE_URL}/config`, {
+		method: 'GET',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			...(token && { authorization: `Bearer ${token}` })
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			if ('detail' in err) {
+				error = err.detail;
+			} else {
+				error = 'Server connection failed';
+			}
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
+export const updateOpenAIConfig = async (token: string = '', enable_openai_api: boolean) => {
+	let error = null;
+
+	const res = await fetch(`${OPENAI_API_BASE_URL}/config/update`, {
+		method: 'POST',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			...(token && { authorization: `Bearer ${token}` })
+		},
+		body: JSON.stringify({
+			enable_openai_api: enable_openai_api
+		})
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			if ('detail' in err) {
+				error = err.detail;
+			} else {
+				error = 'Server connection failed';
+			}
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
 export const getOpenAIUrls = async (token: string = '') => {
 export const getOpenAIUrls = async (token: string = '') => {
 	let error = null;
 	let error = null;
 
 

+ 27 - 0
src/lib/apis/users/index.ts

@@ -115,6 +115,33 @@ export const getUsers = async (token: string) => {
 	return res ? res : [];
 	return res ? res : [];
 };
 };
 
 
+export const getUserById = async (token: string, userId: string) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_API_BASE_URL}/users/${userId}`, {
+		method: 'GET',
+		headers: {
+			'Content-Type': 'application/json',
+			Authorization: `Bearer ${token}`
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			error = err.detail;
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};
+
 export const deleteUserById = async (token: string, userId: string) => {
 export const deleteUserById = async (token: string, userId: string) => {
 	let error = null;
 	let error = null;
 
 

+ 5 - 2
src/lib/components/admin/AddUserModal.svelte

@@ -73,13 +73,16 @@
 						console.log(idx, columns);
 						console.log(idx, columns);
 
 
 						if (idx > 0) {
 						if (idx > 0) {
-							if (columns.length === 4 && ['admin', 'user', 'pending'].includes(columns[3])) {
+							if (
+								columns.length === 4 &&
+								['admin', 'user', 'pending'].includes(columns[3].toLowerCase())
+							) {
 								const res = await addUser(
 								const res = await addUser(
 									localStorage.token,
 									localStorage.token,
 									columns[0],
 									columns[0],
 									columns[1],
 									columns[1],
 									columns[2],
 									columns[2],
-									columns[3]
+									columns[3].toLowerCase()
 								).catch((error) => {
 								).catch((error) => {
 									toast.error(`Row ${idx + 1}: ${error}`);
 									toast.error(`Row ${idx + 1}: ${error}`);
 									return null;
 									return null;

+ 9 - 6
src/lib/components/chat/MessageInput.svelte

@@ -330,7 +330,6 @@
 	};
 	};
 
 
 	onMount(() => {
 	onMount(() => {
-		console.log(document.getElementById('sidebar'));
 		window.setTimeout(() => chatTextAreaElement?.focus(), 0);
 		window.setTimeout(() => chatTextAreaElement?.focus(), 0);
 
 
 		const dropZone = document.querySelector('body');
 		const dropZone = document.querySelector('body');
@@ -361,7 +360,7 @@
 				if (inputFiles && inputFiles.length > 0) {
 				if (inputFiles && inputFiles.length > 0) {
 					inputFiles.forEach((file) => {
 					inputFiles.forEach((file) => {
 						console.log(file, file.name.split('.').at(-1));
 						console.log(file, file.name.split('.').at(-1));
-						if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
+						if (['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])) {
 							let reader = new FileReader();
 							let reader = new FileReader();
 							reader.onload = (event) => {
 							reader.onload = (event) => {
 								files = [
 								files = [
@@ -509,6 +508,7 @@
 						>
 						>
 							<div class="flex items-center gap-2 text-sm dark:text-gray-500">
 							<div class="flex items-center gap-2 text-sm dark:text-gray-500">
 								<img
 								<img
+									crossorigin="anonymous"
 									alt="model profile"
 									alt="model profile"
 									class="size-5 max-w-[28px] object-cover rounded-full"
 									class="size-5 max-w-[28px] object-cover rounded-full"
 									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedModel.id)
 									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedModel.id)
@@ -550,7 +550,9 @@
 							if (inputFiles && inputFiles.length > 0) {
 							if (inputFiles && inputFiles.length > 0) {
 								const _inputFiles = Array.from(inputFiles);
 								const _inputFiles = Array.from(inputFiles);
 								_inputFiles.forEach((file) => {
 								_inputFiles.forEach((file) => {
-									if (['image/gif', 'image/jpeg', 'image/png'].includes(file['type'])) {
+									if (
+										['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])
+									) {
 										let reader = new FileReader();
 										let reader = new FileReader();
 										reader.onload = (event) => {
 										reader.onload = (event) => {
 											files = [
 											files = [
@@ -587,7 +589,8 @@
 						}}
 						}}
 					/>
 					/>
 					<form
 					<form
-						class=" flex flex-col relative w-full rounded-3xl px-1.5 border border-gray-100 dark:border-gray-850 bg-white dark:bg-gray-900 dark:text-gray-100"
+						dir={$settings?.chatDirection ?? 'LTR'}
+						class=" flex flex-col relative w-full rounded-3xl px-1.5 bg-gray-50 dark:bg-gray-850 dark:text-gray-100"
 						on:submit|preventDefault={() => {
 						on:submit|preventDefault={() => {
 							submitPrompt(prompt, user);
 							submitPrompt(prompt, user);
 						}}
 						}}
@@ -757,7 +760,7 @@
 							<textarea
 							<textarea
 								id="chat-textarea"
 								id="chat-textarea"
 								bind:this={chatTextAreaElement}
 								bind:this={chatTextAreaElement}
-								class="scrollbar-hidden dark:bg-gray-900 dark:text-gray-100 outline-none w-full py-3 px-3 {fileUploadEnabled
+								class="scrollbar-hidden bg-gray-50 dark:bg-gray-850 dark:text-gray-100 outline-none w-full py-3 px-3 {fileUploadEnabled
 									? ''
 									? ''
 									: ' pl-4'} rounded-xl resize-none h-[48px]"
 									: ' pl-4'} rounded-xl resize-none h-[48px]"
 								placeholder={chatInputPlaceholder !== ''
 								placeholder={chatInputPlaceholder !== ''
@@ -1067,7 +1070,7 @@
 											id="send-message-button"
 											id="send-message-button"
 											class="{prompt !== ''
 											class="{prompt !== ''
 												? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
 												? 'bg-black text-white hover:bg-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-100 '
-												: 'text-white bg-gray-100 dark:text-gray-900 dark:bg-gray-800 disabled'} transition rounded-full p-1.5 self-center"
+												: 'text-white bg-gray-200 dark:text-gray-900 dark:bg-gray-700 disabled'} transition rounded-full p-1.5 self-center"
 											type="submit"
 											type="submit"
 											disabled={prompt === ''}
 											disabled={prompt === ''}
 										>
 										>

+ 43 - 7
src/lib/components/chat/Messages.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 <script lang="ts">
 	import { v4 as uuidv4 } from 'uuid';
 	import { v4 as uuidv4 } from 'uuid';
 
 
-	import { chats, config, modelfiles, settings, user } from '$lib/stores';
+	import { chats, config, modelfiles, settings, user as _user, mobile } from '$lib/stores';
 	import { tick, getContext } from 'svelte';
 	import { tick, getContext } from 'svelte';
 
 
 	import { toast } from 'svelte-sonner';
 	import { toast } from 'svelte-sonner';
@@ -13,6 +13,8 @@
 	import Spinner from '../common/Spinner.svelte';
 	import Spinner from '../common/Spinner.svelte';
 	import { imageGenerations } from '$lib/apis/images';
 	import { imageGenerations } from '$lib/apis/images';
 	import { copyToClipboard, findWordIndices } from '$lib/utils';
 	import { copyToClipboard, findWordIndices } from '$lib/utils';
+	import CompareMessages from './Messages/CompareMessages.svelte';
+	import { stringify } from 'postcss';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -22,15 +24,16 @@
 	export let continueGeneration: Function;
 	export let continueGeneration: Function;
 	export let regenerateResponse: Function;
 	export let regenerateResponse: Function;
 
 
+	export let user = $_user;
 	export let prompt;
 	export let prompt;
-	export let suggestionPrompts;
+	export let suggestionPrompts = [];
 	export let processing = '';
 	export let processing = '';
 	export let bottomPadding = false;
 	export let bottomPadding = false;
 	export let autoScroll;
 	export let autoScroll;
-	export let selectedModels;
 	export let history = {};
 	export let history = {};
 	export let messages = [];
 	export let messages = [];
 
 
+	export let selectedModels;
 	export let selectedModelfiles = [];
 	export let selectedModelfiles = [];
 
 
 	$: if (autoScroll && bottomPadding) {
 	$: if (autoScroll && bottomPadding) {
@@ -62,7 +65,8 @@
 			childrenIds: [],
 			childrenIds: [],
 			role: 'user',
 			role: 'user',
 			content: userPrompt,
 			content: userPrompt,
-			...(history.messages[messageId].files && { files: history.messages[messageId].files })
+			...(history.messages[messageId].files && { files: history.messages[messageId].files }),
+			models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
 		};
 		};
 
 
 		let messageParentId = history.messages[messageId].parentId;
 		let messageParentId = history.messages[messageId].parentId;
@@ -78,7 +82,7 @@
 		history.currentId = userMessageId;
 		history.currentId = userMessageId;
 
 
 		await tick();
 		await tick();
-		await sendPrompt(userPrompt, userMessageId, chatId);
+		await sendPrompt(userPrompt, userMessageId);
 	};
 	};
 
 
 	const updateChatMessages = async () => {
 	const updateChatMessages = async () => {
@@ -294,7 +298,7 @@
 							{#if message.role === 'user'}
 							{#if message.role === 'user'}
 								<UserMessage
 								<UserMessage
 									on:delete={() => messageDeleteHandler(message.id)}
 									on:delete={() => messageDeleteHandler(message.id)}
-									user={$user}
+									{user}
 									{readOnly}
 									{readOnly}
 									{message}
 									{message}
 									isFirstMessage={messageIdx === 0}
 									isFirstMessage={messageIdx === 0}
@@ -308,7 +312,7 @@
 									{showNextMessage}
 									{showNextMessage}
 									copyToClipboard={copyToClipboardWithToast}
 									copyToClipboard={copyToClipboardWithToast}
 								/>
 								/>
-							{:else}
+							{:else if $mobile || (history.messages[message.parentId]?.models?.length ?? 1) === 1}
 								{#key message.id}
 								{#key message.id}
 									<ResponseMessage
 									<ResponseMessage
 										{message}
 										{message}
@@ -336,6 +340,38 @@
 										}}
 										}}
 									/>
 									/>
 								{/key}
 								{/key}
+							{:else}
+								{#key message.parentId}
+									<CompareMessages
+										bind:history
+										{messages}
+										{chatId}
+										parentMessage={history.messages[message.parentId]}
+										{messageIdx}
+										{selectedModelfiles}
+										{updateChatMessages}
+										{confirmEditResponseMessage}
+										{rateMessage}
+										copyToClipboard={copyToClipboardWithToast}
+										{continueGeneration}
+										{regenerateResponse}
+										on:change={async () => {
+											await updateChatById(localStorage.token, chatId, {
+												messages: messages,
+												history: history
+											});
+
+											if (autoScroll) {
+												const element = document.getElementById('messages-container');
+												autoScroll =
+													element.scrollHeight - element.scrollTop <= element.clientHeight + 50;
+												setTimeout(() => {
+													scrollToBottom();
+												}, 100);
+											}
+										}}
+									/>
+								{/key}
 							{/if}
 							{/if}
 						</div>
 						</div>
 					</div>
 					</div>

+ 226 - 5
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -1,11 +1,23 @@
 <script lang="ts">
 <script lang="ts">
+	import Spinner from '$lib/components/common/Spinner.svelte';
 	import { copyToClipboard } from '$lib/utils';
 	import { copyToClipboard } from '$lib/utils';
 	import hljs from 'highlight.js';
 	import hljs from 'highlight.js';
 	import 'highlight.js/styles/github-dark.min.css';
 	import 'highlight.js/styles/github-dark.min.css';
+	import { loadPyodide } from 'pyodide';
+	import { tick } from 'svelte';
+	import PyodideWorker from '$lib/workers/pyodide.worker?worker';
+
+	export let id = '';
 
 
 	export let lang = '';
 	export let lang = '';
 	export let code = '';
 	export let code = '';
 
 
+	let executing = false;
+
+	let stdout = null;
+	let stderr = null;
+	let result = null;
+
 	let copied = false;
 	let copied = false;
 
 
 	const copyCode = async () => {
 	const copyCode = async () => {
@@ -17,24 +29,233 @@
 		}, 1000);
 		}, 1000);
 	};
 	};
 
 
+	const checkPythonCode = (str) => {
+		// Check if the string contains typical Python syntax characters
+		const pythonSyntax = [
+			'def ',
+			'else:',
+			'elif ',
+			'try:',
+			'except:',
+			'finally:',
+			'yield ',
+			'lambda ',
+			'assert ',
+			'nonlocal ',
+			'del ',
+			'True',
+			'False',
+			'None',
+			' and ',
+			' or ',
+			' not ',
+			' in ',
+			' is ',
+			' with '
+		];
+
+		for (let syntax of pythonSyntax) {
+			if (str.includes(syntax)) {
+				return true;
+			}
+		}
+
+		// If none of the above conditions met, it's probably not Python code
+		return false;
+	};
+
+	const executePython = async (code) => {
+		if (!code.includes('input') && !code.includes('matplotlib')) {
+			executePythonAsWorker(code);
+		} else {
+			result = null;
+			stdout = null;
+			stderr = null;
+
+			executing = true;
+
+			document.pyodideMplTarget = document.getElementById(`plt-canvas-${id}`);
+
+			let pyodide = await loadPyodide({
+				indexURL: '/pyodide/',
+				stdout: (text) => {
+					console.log('Python output:', text);
+
+					if (stdout) {
+						stdout += `${text}\n`;
+					} else {
+						stdout = `${text}\n`;
+					}
+				},
+				stderr: (text) => {
+					console.log('An error occured:', text);
+					if (stderr) {
+						stderr += `${text}\n`;
+					} else {
+						stderr = `${text}\n`;
+					}
+				},
+				packages: ['micropip']
+			});
+
+			try {
+				const micropip = pyodide.pyimport('micropip');
+
+				await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
+
+				let packages = [
+					code.includes('requests') ? 'requests' : null,
+					code.includes('bs4') ? 'beautifulsoup4' : null,
+					code.includes('numpy') ? 'numpy' : null,
+					code.includes('pandas') ? 'pandas' : null,
+					code.includes('matplotlib') ? 'matplotlib' : null,
+					code.includes('sklearn') ? 'scikit-learn' : null,
+					code.includes('scipy') ? 'scipy' : null,
+					code.includes('re') ? 'regex' : null,
+					code.includes('seaborn') ? 'seaborn' : null
+				].filter(Boolean);
+
+				console.log(packages);
+				await micropip.install(packages);
+
+				result = await pyodide.runPythonAsync(`from js import prompt
+def input(p):
+    return prompt(p)
+__builtins__.input = input`);
+
+				result = await pyodide.runPython(code);
+
+				if (!result) {
+					result = '[NO OUTPUT]';
+				}
+
+				console.log(result);
+				console.log(stdout);
+				console.log(stderr);
+
+				const pltCanvasElement = document.getElementById(`plt-canvas-${id}`);
+
+				if (pltCanvasElement?.innerHTML !== '') {
+					pltCanvasElement.classList.add('pt-4');
+				}
+			} catch (error) {
+				console.error('Error:', error);
+				stderr = error;
+			}
+
+			executing = false;
+		}
+	};
+
+	const executePythonAsWorker = async (code) => {
+		result = null;
+		stdout = null;
+		stderr = null;
+
+		executing = true;
+
+		let packages = [
+			code.includes('requests') ? 'requests' : null,
+			code.includes('bs4') ? 'beautifulsoup4' : null,
+			code.includes('numpy') ? 'numpy' : null,
+			code.includes('pandas') ? 'pandas' : null,
+			code.includes('sklearn') ? 'scikit-learn' : null,
+			code.includes('scipy') ? 'scipy' : null,
+			code.includes('re') ? 'regex' : null,
+			code.includes('seaborn') ? 'seaborn' : null
+		].filter(Boolean);
+
+		console.log(packages);
+
+		const pyodideWorker = new PyodideWorker();
+
+		pyodideWorker.postMessage({
+			id: id,
+			code: code,
+			packages: packages
+		});
+
+		setTimeout(() => {
+			if (executing) {
+				executing = false;
+				stderr = 'Execution Time Limit Exceeded';
+				pyodideWorker.terminate();
+			}
+		}, 60000);
+
+		pyodideWorker.onmessage = (event) => {
+			console.log('pyodideWorker.onmessage', event);
+			const { id, ...data } = event.data;
+
+			console.log(id, data);
+
+			data['stdout'] && (stdout = data['stdout']);
+			data['stderr'] && (stderr = data['stderr']);
+			data['result'] && (result = data['result']);
+
+			executing = false;
+		};
+
+		pyodideWorker.onerror = (event) => {
+			console.log('pyodideWorker.onerror', event);
+			executing = false;
+		};
+	};
+
 	$: highlightedCode = code ? hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value : '';
 	$: highlightedCode = code ? hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value : '';
 </script>
 </script>
 
 
 {#if code}
 {#if code}
-	<div class="mb-4">
+	<div class="mb-4" dir="ltr">
 		<div
 		<div
 			class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
 			class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
 		>
 		>
 			<div class="p-1">{@html lang}</div>
 			<div class="p-1">{@html lang}</div>
-			<button class="copy-code-button bg-none border-none p-1" on:click={copyCode}
-				>{copied ? 'Copied' : 'Copy Code'}</button
-			>
+
+			<div class="flex items-center">
+				{#if ['', 'python'].includes(lang) && (lang === 'python' || checkPythonCode(code))}
+					{#if executing}
+						<div class="copy-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
+					{:else}
+						<button
+							class="copy-code-button bg-none border-none p-1"
+							on:click={() => {
+								executePython(code);
+							}}>Run</button
+						>
+					{/if}
+				{/if}
+				<button class="copy-code-button bg-none border-none p-1" on:click={copyCode}
+					>{copied ? 'Copied' : 'Copy Code'}</button
+				>
+			</div>
 		</div>
 		</div>
 
 
 		<pre
 		<pre
 			class=" hljs p-4 px-5 overflow-x-auto"
 			class=" hljs p-4 px-5 overflow-x-auto"
-			style="border-top-left-radius: 0px; border-top-right-radius: 0px;"><code
+			style="border-top-left-radius: 0px; border-top-right-radius: 0px; {(executing ||
+				stdout ||
+				stderr ||
+				result) &&
+				'border-bottom-left-radius: 0px; border-bottom-right-radius: 0px;'}"><code
 				class="language-{lang} rounded-t-none whitespace-pre">{@html highlightedCode || code}</code
 				class="language-{lang} rounded-t-none whitespace-pre">{@html highlightedCode || code}</code
 			></pre>
 			></pre>
+
+		<div
+			id="plt-canvas-{id}"
+			class="bg-[#202123] text-white max-w-full overflow-x-auto scrollbar-hidden"
+		/>
+
+		{#if executing}
+			<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
+				<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+				<div class="text-sm">Running...</div>
+			</div>
+		{:else if stdout || stderr || result}
+			<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
+				<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+				<div class="text-sm">{stdout || stderr || result}</div>
+			</div>
+		{/if}
 	</div>
 	</div>
 {/if}
 {/if}

+ 159 - 0
src/lib/components/chat/Messages/CompareMessages.svelte

@@ -0,0 +1,159 @@
+<script lang="ts">
+	import { createEventDispatcher } from 'svelte';
+
+	import { updateChatById } from '$lib/apis/chats';
+	import { onMount, tick } from 'svelte';
+	import ResponseMessage from './ResponseMessage.svelte';
+
+	export let chatId;
+
+	export let history;
+	export let messages = [];
+	export let messageIdx;
+
+	export let parentMessage;
+
+	export let selectedModelfiles;
+
+	export let updateChatMessages: Function;
+	export let confirmEditResponseMessage: Function;
+	export let rateMessage: Function;
+
+	export let copyToClipboard: Function;
+	export let continueGeneration: Function;
+	export let regenerateResponse: Function;
+
+	const dispatch = createEventDispatcher();
+
+	let currentMessageId;
+
+	let groupedMessagesIdx = {};
+	let groupedMessages = {};
+
+	$: groupedMessages = parentMessage?.models.reduce((a, model) => {
+		const modelMessages = parentMessage?.childrenIds
+			.map((id) => history.messages[id])
+			.filter((m) => m.model === model);
+
+		return {
+			...a,
+			[model]: { messages: modelMessages }
+		};
+	}, {});
+
+	onMount(async () => {
+		await tick();
+		currentMessageId = messages[messageIdx].id;
+
+		for (const model of parentMessage?.models) {
+			const idx = groupedMessages[model].messages.findIndex((m) => m.id === currentMessageId);
+
+			if (idx !== -1) {
+				groupedMessagesIdx[model] = idx;
+			} else {
+				groupedMessagesIdx[model] = 0;
+			}
+		}
+	});
+</script>
+
+<div>
+	<div
+		class="flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden"
+		id="responses-container-{parentMessage.id}"
+	>
+		{#each Object.keys(groupedMessages) as model}
+			{#if groupedMessagesIdx[model] !== undefined && groupedMessages[model].messages.length > 0}
+				<!-- svelte-ignore a11y-no-static-element-interactions -->
+				<!-- svelte-ignore a11y-click-events-have-key-events -->
+
+				<div
+					class=" snap-center min-w-80 w-full max-w-full m-1 border {history.messages[
+						currentMessageId
+					].model === model
+						? 'border-gray-100 dark:border-gray-700 border-[1.5px]'
+						: 'border-gray-50 dark:border-gray-850 '} transition p-5 rounded-3xl"
+					on:click={() => {
+						currentMessageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
+
+						let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
+
+						console.log(messageId);
+						let messageChildrenIds = history.messages[messageId].childrenIds;
+
+						while (messageChildrenIds.length !== 0) {
+							messageId = messageChildrenIds.at(-1);
+							messageChildrenIds = history.messages[messageId].childrenIds;
+						}
+
+						history.currentId = messageId;
+						dispatch('change');
+					}}
+				>
+					<ResponseMessage
+						message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
+						modelfiles={selectedModelfiles}
+						siblings={groupedMessages[model].messages.map((m) => m.id)}
+						isLastMessage={true}
+						{updateChatMessages}
+						{confirmEditResponseMessage}
+						showPreviousMessage={() => {
+							groupedMessagesIdx[model] = Math.max(0, groupedMessagesIdx[model] - 1);
+							let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
+
+							console.log(messageId);
+							let messageChildrenIds = history.messages[messageId].childrenIds;
+
+							while (messageChildrenIds.length !== 0) {
+								messageId = messageChildrenIds.at(-1);
+								messageChildrenIds = history.messages[messageId].childrenIds;
+							}
+
+							history.currentId = messageId;
+
+							dispatch('change');
+						}}
+						showNextMessage={() => {
+							groupedMessagesIdx[model] = Math.min(
+								groupedMessages[model].messages.length - 1,
+								groupedMessagesIdx[model] + 1
+							);
+
+							let messageId = groupedMessages[model].messages[groupedMessagesIdx[model]].id;
+							console.log(messageId);
+
+							let messageChildrenIds = history.messages[messageId].childrenIds;
+
+							while (messageChildrenIds.length !== 0) {
+								messageId = messageChildrenIds.at(-1);
+								messageChildrenIds = history.messages[messageId].childrenIds;
+							}
+
+							history.currentId = messageId;
+
+							dispatch('change');
+						}}
+						{rateMessage}
+						{copyToClipboard}
+						{continueGeneration}
+						regenerateResponse={async (message) => {
+							regenerateResponse(message);
+							await tick();
+							groupedMessagesIdx[model] = groupedMessages[model].messages.length - 1;
+						}}
+						on:save={async (e) => {
+							console.log('save', e);
+
+							const message = e.detail;
+							history.messages[message.id] = message;
+							await updateChatById(localStorage.token, chatId, {
+								messages: messages,
+								history: history
+							});
+						}}
+					/>
+				</div>
+			{/if}
+		{/each}
+	</div>
+</div>

+ 1 - 1
src/lib/components/chat/Messages/Name.svelte

@@ -1,3 +1,3 @@
-<div class=" self-center font-bold mb-0.5 line-clamp-1">
+<div class=" self-center font-bold mb-0.5 line-clamp-1 contents">
 	<slot />
 	<slot />
 </div>
 </div>

+ 2 - 0
src/lib/components/chat/Messages/Placeholder.svelte

@@ -43,6 +43,7 @@
 					>
 					>
 						{#if model in modelfiles}
 						{#if model in modelfiles}
 							<img
 							<img
+								crossorigin="anonymous"
 								src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`}
 								src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`}
 								alt="modelfile"
 								alt="modelfile"
 								class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
 								class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
@@ -50,6 +51,7 @@
 							/>
 							/>
 						{:else}
 						{:else}
 							<img
 							<img
+								crossorigin="anonymous"
 								src={$i18n.language === 'dg-DG'
 								src={$i18n.language === 'dg-DG'
 									? `/doge.png`
 									? `/doge.png`
 									: `${WEBUI_BASE_URL}/static/favicon.png`}
 									: `${WEBUI_BASE_URL}/static/favicon.png`}

+ 15 - 2
src/lib/components/chat/Messages/ProfileImage.svelte

@@ -1,7 +1,20 @@
 <script lang="ts">
 <script lang="ts">
+	import { settings } from '$lib/stores';
+	import { WEBUI_BASE_URL } from '$lib/constants';
+
 	export let src = '/user.png';
 	export let src = '/user.png';
 </script>
 </script>
 
 
-<div class=" mr-3">
-	<img {src} class=" w-8 object-cover rounded-full" alt="profile" draggable="false" />
+<div class={($settings?.chatDirection ?? 'LTR') === 'LTR' ? 'mr-3' : 'ml-3'}>
+	<img
+		crossorigin="anonymous"
+		src={src.startsWith(WEBUI_BASE_URL) ||
+		src.startsWith('https://www.gravatar.com/avatar/') ||
+		src.startsWith('data:')
+			? src
+			: `/user.png`}
+		class=" w-8 object-cover rounded-full"
+		alt="profile"
+		draggable="false"
+	/>
 </div>
 </div>

+ 100 - 93
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -69,7 +69,7 @@
 
 
 	let selectedCitation = null;
 	let selectedCitation = null;
 
 
-	$: tokens = marked.lexer(sanitizeResponseContent(message.content));
+	$: tokens = marked.lexer(sanitizeResponseContent(message?.content));
 
 
 	const renderer = new marked.Renderer();
 	const renderer = new marked.Renderer();
 
 
@@ -332,7 +332,11 @@
 <CitationsModal bind:show={showCitationModal} citation={selectedCitation} />
 <CitationsModal bind:show={showCitationModal} citation={selectedCitation} />
 
 
 {#key message.id}
 {#key message.id}
-	<div class=" flex w-full message-{message.id}" id="message-{message.id}">
+	<div
+		class=" flex w-full message-{message.id}"
+		id="message-{message.id}"
+		dir={$settings.chatDirection}
+	>
 		<ProfileImage
 		<ProfileImage
 			src={modelfiles[message.model]?.imageUrl ??
 			src={modelfiles[message.model]?.imageUrl ??
 				($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
 				($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
@@ -533,9 +537,10 @@
 							{:else if message.content === ''}
 							{:else if message.content === ''}
 								<Skeleton />
 								<Skeleton />
 							{:else}
 							{:else}
-								{#each tokens as token}
+								{#each tokens as token, tokenIdx}
 									{#if token.type === 'code'}
 									{#if token.type === 'code'}
 										<CodeBlock
 										<CodeBlock
+											id={`${message.id}-${tokenIdx}`}
 											lang={token.lang}
 											lang={token.lang}
 											code={revertSanitizedResponseContent(token.text)}
 											code={revertSanitizedResponseContent(token.text)}
 										/>
 										/>
@@ -595,10 +600,10 @@
 
 
 							{#if message.done || siblings.length > 1}
 							{#if message.done || siblings.length > 1}
 								<div
 								<div
-									class=" flex justify-start space-x-1 overflow-x-auto buttons text-gray-700 dark:text-gray-500"
+									class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500"
 								>
 								>
 									{#if siblings.length > 1}
 									{#if siblings.length > 1}
-										<div class="flex self-center">
+										<div class="flex self-center min-w-fit" dir="ltr">
 											<button
 											<button
 												class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 												class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 												on:click={() => {
 												on:click={() => {
@@ -622,7 +627,7 @@
 											</button>
 											</button>
 
 
 											<div
 											<div
-												class="text-sm tracking-widest font-semibold self-center dark:text-gray-100"
+												class="text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit"
 											>
 											>
 												{siblings.indexOf(message.id) + 1}/{siblings.length}
 												{siblings.indexOf(message.id) + 1}/{siblings.length}
 											</div>
 											</div>
@@ -657,7 +662,7 @@
 												<button
 												<button
 													class="{isLastMessage
 													class="{isLastMessage
 														? 'visible'
 														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition"
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
 													on:click={() => {
 													on:click={() => {
 														editMessageHandler();
 														editMessageHandler();
 													}}
 													}}
@@ -666,7 +671,7 @@
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>
@@ -684,7 +689,7 @@
 											<button
 											<button
 												class="{isLastMessage
 												class="{isLastMessage
 													? 'visible'
 													? 'visible'
-													: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition copy-response-button"
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition copy-response-button"
 												on:click={() => {
 												on:click={() => {
 													copyToClipboard(message.content);
 													copyToClipboard(message.content);
 												}}
 												}}
@@ -693,7 +698,7 @@
 													xmlns="http://www.w3.org/2000/svg"
 													xmlns="http://www.w3.org/2000/svg"
 													fill="none"
 													fill="none"
 													viewBox="0 0 24 24"
 													viewBox="0 0 24 24"
-													stroke-width="2"
+													stroke-width="2.3"
 													stroke="currentColor"
 													stroke="currentColor"
 													class="w-4 h-4"
 													class="w-4 h-4"
 												>
 												>
@@ -706,83 +711,12 @@
 											</button>
 											</button>
 										</Tooltip>
 										</Tooltip>
 
 
-										{#if !readOnly}
-											<Tooltip content={$i18n.t('Good Response')} placement="bottom">
-												<button
-													class="{isLastMessage
-														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded {message?.annotation
-														?.rating === 1
-														? 'bg-gray-100 dark:bg-gray-800'
-														: ''} dark:hover:text-white hover:text-black transition"
-													on:click={() => {
-														rateMessage(message.id, 1);
-														showRateComment = true;
-
-														window.setTimeout(() => {
-															document
-																.getElementById(`message-feedback-${message.id}`)
-																?.scrollIntoView();
-														}, 0);
-													}}
-												>
-													<svg
-														stroke="currentColor"
-														fill="none"
-														stroke-width="2"
-														viewBox="0 0 24 24"
-														stroke-linecap="round"
-														stroke-linejoin="round"
-														class="w-4 h-4"
-														xmlns="http://www.w3.org/2000/svg"
-														><path
-															d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"
-														/></svg
-													>
-												</button>
-											</Tooltip>
-
-											<Tooltip content={$i18n.t('Bad Response')} placement="bottom">
-												<button
-													class="{isLastMessage
-														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded {message?.annotation
-														?.rating === -1
-														? 'bg-gray-100 dark:bg-gray-800'
-														: ''} dark:hover:text-white hover:text-black transition"
-													on:click={() => {
-														rateMessage(message.id, -1);
-														showRateComment = true;
-														window.setTimeout(() => {
-															document
-																.getElementById(`message-feedback-${message.id}`)
-																?.scrollIntoView();
-														}, 0);
-													}}
-												>
-													<svg
-														stroke="currentColor"
-														fill="none"
-														stroke-width="2"
-														viewBox="0 0 24 24"
-														stroke-linecap="round"
-														stroke-linejoin="round"
-														class="w-4 h-4"
-														xmlns="http://www.w3.org/2000/svg"
-														><path
-															d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"
-														/></svg
-													>
-												</button>
-											</Tooltip>
-										{/if}
-
 										<Tooltip content={$i18n.t('Read Aloud')} placement="bottom">
 										<Tooltip content={$i18n.t('Read Aloud')} placement="bottom">
 											<button
 											<button
 												id="speak-button-{message.id}"
 												id="speak-button-{message.id}"
 												class="{isLastMessage
 												class="{isLastMessage
 													? 'visible'
 													? 'visible'
-													: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition"
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
 												on:click={() => {
 												on:click={() => {
 													if (!loadingSpeech) {
 													if (!loadingSpeech) {
 														toggleSpeakMessage(message);
 														toggleSpeakMessage(message);
@@ -829,7 +763,7 @@
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>
@@ -844,7 +778,7 @@
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>
@@ -863,7 +797,7 @@
 												<button
 												<button
 													class="{isLastMessage
 													class="{isLastMessage
 														? 'visible'
 														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition"
+														: 'invisible group-hover:visible'}  p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
 													on:click={() => {
 													on:click={() => {
 														if (!generatingImage) {
 														if (!generatingImage) {
 															generateImage(message);
 															generateImage(message);
@@ -910,7 +844,7 @@
 															xmlns="http://www.w3.org/2000/svg"
 															xmlns="http://www.w3.org/2000/svg"
 															fill="none"
 															fill="none"
 															viewBox="0 0 24 24"
 															viewBox="0 0 24 24"
-															stroke-width="2"
+															stroke-width="2.3"
 															stroke="currentColor"
 															stroke="currentColor"
 															class="w-4 h-4"
 															class="w-4 h-4"
 														>
 														>
@@ -930,7 +864,7 @@
 												<button
 												<button
 													class=" {isLastMessage
 													class=" {isLastMessage
 														? 'visible'
 														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition whitespace-pre-wrap"
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition whitespace-pre-wrap"
 													on:click={() => {
 													on:click={() => {
 														console.log(message);
 														console.log(message);
 													}}
 													}}
@@ -940,7 +874,7 @@
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>
@@ -954,13 +888,84 @@
 											</Tooltip>
 											</Tooltip>
 										{/if}
 										{/if}
 
 
+										{#if !readOnly}
+											<Tooltip content={$i18n.t('Good Response')} placement="bottom">
+												<button
+													class="{isLastMessage
+														? 'visible'
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
+														?.annotation?.rating === 1
+														? 'bg-gray-100 dark:bg-gray-800'
+														: ''} dark:hover:text-white hover:text-black transition"
+													on:click={() => {
+														rateMessage(message.id, 1);
+														showRateComment = true;
+
+														window.setTimeout(() => {
+															document
+																.getElementById(`message-feedback-${message.id}`)
+																?.scrollIntoView();
+														}, 0);
+													}}
+												>
+													<svg
+														stroke="currentColor"
+														fill="none"
+														stroke-width="2.3"
+														viewBox="0 0 24 24"
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														class="w-4 h-4"
+														xmlns="http://www.w3.org/2000/svg"
+														><path
+															d="M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3"
+														/></svg
+													>
+												</button>
+											</Tooltip>
+
+											<Tooltip content={$i18n.t('Bad Response')} placement="bottom">
+												<button
+													class="{isLastMessage
+														? 'visible'
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
+														?.annotation?.rating === -1
+														? 'bg-gray-100 dark:bg-gray-800'
+														: ''} dark:hover:text-white hover:text-black transition"
+													on:click={() => {
+														rateMessage(message.id, -1);
+														showRateComment = true;
+														window.setTimeout(() => {
+															document
+																.getElementById(`message-feedback-${message.id}`)
+																?.scrollIntoView();
+														}, 0);
+													}}
+												>
+													<svg
+														stroke="currentColor"
+														fill="none"
+														stroke-width="2.3"
+														viewBox="0 0 24 24"
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														class="w-4 h-4"
+														xmlns="http://www.w3.org/2000/svg"
+														><path
+															d="M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17"
+														/></svg
+													>
+												</button>
+											</Tooltip>
+										{/if}
+
 										{#if isLastMessage && !readOnly}
 										{#if isLastMessage && !readOnly}
 											<Tooltip content={$i18n.t('Continue Response')} placement="bottom">
 											<Tooltip content={$i18n.t('Continue Response')} placement="bottom">
 												<button
 												<button
 													type="button"
 													type="button"
 													class="{isLastMessage
 													class="{isLastMessage
 														? 'visible'
 														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition regenerate-response-button"
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
 													on:click={() => {
 													on:click={() => {
 														continueGeneration();
 														continueGeneration();
 													}}
 													}}
@@ -969,7 +974,7 @@
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>
@@ -992,14 +997,16 @@
 													type="button"
 													type="button"
 													class="{isLastMessage
 													class="{isLastMessage
 														? 'visible'
 														? 'visible'
-														: 'invisible group-hover:visible'} p-1 rounded dark:hover:text-white hover:text-black transition regenerate-response-button"
-													on:click={regenerateResponse}
+														: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
+													on:click={() => {
+														regenerateResponse(message);
+													}}
 												>
 												>
 													<svg
 													<svg
 														xmlns="http://www.w3.org/2000/svg"
 														xmlns="http://www.w3.org/2000/svg"
 														fill="none"
 														fill="none"
 														viewBox="0 0 24 24"
 														viewBox="0 0 24 24"
-														stroke-width="2"
+														stroke-width="2.3"
 														stroke="currentColor"
 														stroke="currentColor"
 														class="w-4 h-4"
 														class="w-4 h-4"
 													>
 													>

+ 12 - 10
src/lib/components/chat/Messages/UserMessage.svelte

@@ -7,6 +7,8 @@
 	import { modelfiles, settings } from '$lib/stores';
 	import { modelfiles, settings } from '$lib/stores';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
 
+	import { user as _user } from '$lib/stores';
+
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
 	const dispatch = createEventDispatcher();
 	const dispatch = createEventDispatcher();
@@ -54,7 +56,7 @@
 	};
 	};
 </script>
 </script>
 
 
-<div class=" flex w-full user-message">
+<div class=" flex w-full user-message" dir={$settings.chatDirection}>
 	{#if !($settings?.chatBubble ?? true)}
 	{#if !($settings?.chatBubble ?? true)}
 		<ProfileImage
 		<ProfileImage
 			src={message.user
 			src={message.user
@@ -63,7 +65,7 @@
 				: user?.profile_image_url ?? '/user.png'}
 				: user?.profile_image_url ?? '/user.png'}
 		/>
 		/>
 	{/if}
 	{/if}
-	<div class="w-full overflow-hidden">
+	<div class="w-full overflow-hidden pl-1">
 		{#if !($settings?.chatBubble ?? true)}
 		{#if !($settings?.chatBubble ?? true)}
 			<div>
 			<div>
 				<Name>
 				<Name>
@@ -74,7 +76,7 @@
 							{$i18n.t('You')}
 							{$i18n.t('You')}
 							<span class=" text-gray-500 text-sm font-medium">{message?.user ?? ''}</span>
 							<span class=" text-gray-500 text-sm font-medium">{message?.user ?? ''}</span>
 						{/if}
 						{/if}
-					{:else if $settings.showUsername}
+					{:else if $settings.showUsername || $_user.name !== user.name}
 						{user.name}
 						{user.name}
 					{:else}
 					{:else}
 						{$i18n.t('You')}
 						{$i18n.t('You')}
@@ -235,11 +237,11 @@
 					<div
 					<div
 						class=" flex {$settings?.chatBubble ?? true
 						class=" flex {$settings?.chatBubble ?? true
 							? 'justify-end'
 							? 'justify-end'
-							: ''} space-x-1 text-gray-700 dark:text-gray-500"
+							: ''}  text-gray-600 dark:text-gray-500"
 					>
 					>
 						{#if !($settings?.chatBubble ?? true)}
 						{#if !($settings?.chatBubble ?? true)}
 							{#if siblings.length > 1}
 							{#if siblings.length > 1}
-								<div class="flex self-center">
+								<div class="flex self-center" dir="ltr">
 									<button
 									<button
 										class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 										class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 										on:click={() => {
 										on:click={() => {
@@ -293,7 +295,7 @@
 						{#if !readOnly}
 						{#if !readOnly}
 							<Tooltip content={$i18n.t('Edit')} placement="bottom">
 							<Tooltip content={$i18n.t('Edit')} placement="bottom">
 								<button
 								<button
-									class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition edit-user-message-button"
+									class="invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition edit-user-message-button"
 									on:click={() => {
 									on:click={() => {
 										editMessageHandler();
 										editMessageHandler();
 									}}
 									}}
@@ -302,7 +304,7 @@
 										xmlns="http://www.w3.org/2000/svg"
 										xmlns="http://www.w3.org/2000/svg"
 										fill="none"
 										fill="none"
 										viewBox="0 0 24 24"
 										viewBox="0 0 24 24"
-										stroke-width="2"
+										stroke-width="2.3"
 										stroke="currentColor"
 										stroke="currentColor"
 										class="w-4 h-4"
 										class="w-4 h-4"
 									>
 									>
@@ -318,7 +320,7 @@
 
 
 						<Tooltip content={$i18n.t('Copy')} placement="bottom">
 						<Tooltip content={$i18n.t('Copy')} placement="bottom">
 							<button
 							<button
-								class="invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition"
+								class="invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition"
 								on:click={() => {
 								on:click={() => {
 									copyToClipboard(message.content);
 									copyToClipboard(message.content);
 								}}
 								}}
@@ -327,7 +329,7 @@
 									xmlns="http://www.w3.org/2000/svg"
 									xmlns="http://www.w3.org/2000/svg"
 									fill="none"
 									fill="none"
 									viewBox="0 0 24 24"
 									viewBox="0 0 24 24"
-									stroke-width="2"
+									stroke-width="2.3"
 									stroke="currentColor"
 									stroke="currentColor"
 									class="w-4 h-4"
 									class="w-4 h-4"
 								>
 								>
@@ -368,7 +370,7 @@
 
 
 						{#if $settings?.chatBubble ?? true}
 						{#if $settings?.chatBubble ?? true}
 							{#if siblings.length > 1}
 							{#if siblings.length > 1}
-								<div class="flex self-center">
+								<div class="flex self-center" dir="ltr">
 									<button
 									<button
 										class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 										class="self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition"
 										on:click={() => {
 										on:click={() => {

+ 5 - 3
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -25,7 +25,7 @@
 
 
 	export let items = [{ value: 'mango', label: 'Mango' }];
 	export let items = [{ value: 'mango', label: 'Mango' }];
 
 
-	export let className = ' w-[30rem]';
+	export let className = 'w-[30rem]';
 
 
 	let show = false;
 	let show = false;
 
 
@@ -36,7 +36,7 @@
 	let ollamaVersion = null;
 	let ollamaVersion = null;
 
 
 	$: filteredItems = searchValue
 	$: filteredItems = searchValue
-		? items.filter((item) => item.value.includes(searchValue.toLowerCase()))
+		? items.filter((item) => item.value.toLowerCase().includes(searchValue.toLowerCase()))
 		: items;
 		: items;
 
 
 	const pullModelHandler = async () => {
 	const pullModelHandler = async () => {
@@ -203,7 +203,9 @@
 	</DropdownMenu.Trigger>
 	</DropdownMenu.Trigger>
 
 
 	<DropdownMenu.Content
 	<DropdownMenu.Content
-		class=" z-40 {className} max-w-[calc(100vw-1rem)] justify-start rounded-xl  bg-white dark:bg-gray-850 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50  outline-none "
+		class=" z-40 {$mobile
+			? `w-full`
+			: `${className}`} max-w-[calc(100vw-1rem)] justify-start rounded-xl  bg-white dark:bg-gray-850 dark:text-white shadow-lg border border-gray-300/30 dark:border-gray-700/50  outline-none "
 		transition={flyAndScale}
 		transition={flyAndScale}
 		side={$mobile ? 'bottom' : 'bottom-start'}
 		side={$mobile ? 'bottom' : 'bottom-start'}
 		sideOffset={4}
 		sideOffset={4}

+ 1 - 1
src/lib/components/chat/Settings/Account.svelte

@@ -127,7 +127,7 @@
 
 
 				if (
 				if (
 					files.length > 0 &&
 					files.length > 0 &&
-					['image/gif', 'image/jpeg', 'image/png'].includes(files[0]['type'])
+					['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(files[0]['type'])
 				) {
 				) {
 					reader.readAsDataURL(files[0]);
 					reader.readAsDataURL(files[0]);
 				}
 				}

+ 18 - 13
src/lib/components/chat/Settings/Connections.svelte

@@ -5,28 +5,27 @@
 
 
 	import { getOllamaUrls, getOllamaVersion, updateOllamaUrls } from '$lib/apis/ollama';
 	import { getOllamaUrls, getOllamaVersion, updateOllamaUrls } from '$lib/apis/ollama';
 	import {
 	import {
+		getOpenAIConfig,
 		getOpenAIKeys,
 		getOpenAIKeys,
 		getOpenAIUrls,
 		getOpenAIUrls,
+		updateOpenAIConfig,
 		updateOpenAIKeys,
 		updateOpenAIKeys,
 		updateOpenAIUrls
 		updateOpenAIUrls
 	} from '$lib/apis/openai';
 	} from '$lib/apis/openai';
 	import { toast } from 'svelte-sonner';
 	import { toast } from 'svelte-sonner';
+	import Switch from '$lib/components/common/Switch.svelte';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
 	export let getModels: Function;
 	export let getModels: Function;
 
 
 	// External
 	// External
-	let OLLAMA_BASE_URL = '';
 	let OLLAMA_BASE_URLS = [''];
 	let OLLAMA_BASE_URLS = [''];
 
 
-	let OPENAI_API_KEY = '';
-	let OPENAI_API_BASE_URL = '';
-
 	let OPENAI_API_KEYS = [''];
 	let OPENAI_API_KEYS = [''];
 	let OPENAI_API_BASE_URLS = [''];
 	let OPENAI_API_BASE_URLS = [''];
 
 
-	let showOpenAI = false;
+	let ENABLE_OPENAI_API = false;
 
 
 	const updateOpenAIHandler = async () => {
 	const updateOpenAIHandler = async () => {
 		OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
 		OPENAI_API_BASE_URLS = await updateOpenAIUrls(localStorage.token, OPENAI_API_BASE_URLS);
@@ -52,6 +51,10 @@
 	onMount(async () => {
 	onMount(async () => {
 		if ($user.role === 'admin') {
 		if ($user.role === 'admin') {
 			OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token);
 			OLLAMA_BASE_URLS = await getOllamaUrls(localStorage.token);
+
+			const config = await getOpenAIConfig(localStorage.token);
+			ENABLE_OPENAI_API = config.ENABLE_OPENAI_API;
+
 			OPENAI_API_BASE_URLS = await getOpenAIUrls(localStorage.token);
 			OPENAI_API_BASE_URLS = await getOpenAIUrls(localStorage.token);
 			OPENAI_API_KEYS = await getOpenAIKeys(localStorage.token);
 			OPENAI_API_KEYS = await getOpenAIKeys(localStorage.token);
 		}
 		}
@@ -70,16 +73,18 @@
 			<div class="mt-2 space-y-2 pr-1.5">
 			<div class="mt-2 space-y-2 pr-1.5">
 				<div class="flex justify-between items-center text-sm">
 				<div class="flex justify-between items-center text-sm">
 					<div class="  font-medium">{$i18n.t('OpenAI API')}</div>
 					<div class="  font-medium">{$i18n.t('OpenAI API')}</div>
-					<button
-						class=" text-xs font-medium text-gray-500"
-						type="button"
-						on:click={() => {
-							showOpenAI = !showOpenAI;
-						}}>{showOpenAI ? $i18n.t('Hide') : $i18n.t('Show')}</button
-					>
+
+					<div class="mt-1">
+						<Switch
+							bind:state={ENABLE_OPENAI_API}
+							on:change={async () => {
+								updateOpenAIConfig(localStorage.token, ENABLE_OPENAI_API);
+							}}
+						/>
+					</div>
 				</div>
 				</div>
 
 
-				{#if showOpenAI}
+				{#if ENABLE_OPENAI_API}
 					<div class="flex flex-col gap-1">
 					<div class="flex flex-col gap-1">
 						{#each OPENAI_API_BASE_URLS as url, idx}
 						{#each OPENAI_API_BASE_URLS as url, idx}
 							<div class="flex w-full gap-2">
 							<div class="flex w-full gap-2">

+ 46 - 19
src/lib/components/chat/Settings/Interface.svelte

@@ -24,6 +24,7 @@
 	let promptSuggestions = [];
 	let promptSuggestions = [];
 	let showUsername = false;
 	let showUsername = false;
 	let chatBubble = true;
 	let chatBubble = true;
+	let chatDirection: 'LTR' | 'RTL' = 'LTR';
 
 
 	const toggleSplitLargeChunks = async () => {
 	const toggleSplitLargeChunks = async () => {
 		splitLargeChunks = !splitLargeChunks;
 		splitLargeChunks = !splitLargeChunks;
@@ -77,6 +78,11 @@
 		}
 		}
 	};
 	};
 
 
+	const toggleChangeChatDirection = async () => {
+		chatDirection = chatDirection === 'LTR' ? 'RTL' : 'LTR';
+		saveSettings({ chatDirection });
+	};
+
 	const updateInterfaceHandler = async () => {
 	const updateInterfaceHandler = async () => {
 		if ($user.role === 'admin') {
 		if ($user.role === 'admin') {
 			promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions);
 			promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions);
@@ -115,6 +121,7 @@
 		chatBubble = settings.chatBubble ?? true;
 		chatBubble = settings.chatBubble ?? true;
 		fullScreenMode = settings.fullScreenMode ?? false;
 		fullScreenMode = settings.fullScreenMode ?? false;
 		splitLargeChunks = settings.splitLargeChunks ?? false;
 		splitLargeChunks = settings.splitLargeChunks ?? false;
+		chatDirection = settings.chatDirection ?? 'LTR';
 	});
 	});
 </script>
 </script>
 
 
@@ -211,27 +218,29 @@
 				</div>
 				</div>
 			</div>
 			</div>
 
 
-			<div>
-				<div class=" py-0.5 flex w-full justify-between">
-					<div class=" self-center text-xs font-medium">
-						{$i18n.t('Display the username instead of You in the Chat')}
-					</div>
+			{#if !$settings.chatBubble}
+				<div>
+					<div class=" py-0.5 flex w-full justify-between">
+						<div class=" self-center text-xs font-medium">
+							{$i18n.t('Display the username instead of You in the Chat')}
+						</div>
 
 
-					<button
-						class="p-1 px-3 text-xs flex rounded transition"
-						on:click={() => {
-							toggleShowUsername();
-						}}
-						type="button"
-					>
-						{#if showUsername === true}
-							<span class="ml-2 self-center">{$i18n.t('On')}</span>
-						{:else}
-							<span class="ml-2 self-center">{$i18n.t('Off')}</span>
-						{/if}
-					</button>
+						<button
+							class="p-1 px-3 text-xs flex rounded transition"
+							on:click={() => {
+								toggleShowUsername();
+							}}
+							type="button"
+						>
+							{#if showUsername === true}
+								<span class="ml-2 self-center">{$i18n.t('On')}</span>
+							{:else}
+								<span class="ml-2 self-center">{$i18n.t('Off')}</span>
+							{/if}
+						</button>
+					</div>
 				</div>
 				</div>
-			</div>
+			{/if}
 
 
 			<div>
 			<div>
 				<div class=" py-0.5 flex w-full justify-between">
 				<div class=" py-0.5 flex w-full justify-between">
@@ -256,6 +265,24 @@
 			</div>
 			</div>
 		</div>
 		</div>
 
 
+		<div>
+			<div class=" py-0.5 flex w-full justify-between">
+				<div class=" self-center text-xs font-medium">{$i18n.t('Chat direction')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					on:click={toggleChangeChatDirection}
+					type="button"
+				>
+					{#if chatDirection === 'LTR'}
+						<span class="ml-2 self-center">{$i18n.t('LTR')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('RTL')}</span>
+					{/if}
+				</button>
+			</div>
+		</div>
+
 		<hr class=" dark:border-gray-700" />
 		<hr class=" dark:border-gray-700" />
 
 
 		<div>
 		<div>

+ 96 - 0
src/lib/components/chat/Settings/Personalization.svelte

@@ -0,0 +1,96 @@
+<script lang="ts">
+	import { getBackendConfig } from '$lib/apis';
+	import { setDefaultPromptSuggestions } from '$lib/apis/configs';
+	import Switch from '$lib/components/common/Switch.svelte';
+	import { config, models, settings, user } from '$lib/stores';
+	import { createEventDispatcher, onMount, getContext, tick } from 'svelte';
+	import { toast } from 'svelte-sonner';
+	import ManageModal from './Personalization/ManageModal.svelte';
+	import Tooltip from '$lib/components/common/Tooltip.svelte';
+	const dispatch = createEventDispatcher();
+
+	const i18n = getContext('i18n');
+
+	export let saveSettings: Function;
+
+	let showManageModal = false;
+
+	// Addons
+	let enableMemory = false;
+
+	onMount(async () => {
+		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}');
+		enableMemory = settings?.memory ?? false;
+	});
+</script>
+
+<ManageModal bind:show={showManageModal} />
+
+<form
+	class="flex flex-col h-full justify-between space-y-3 text-sm"
+	on:submit|preventDefault={() => {
+		dispatch('save');
+	}}
+>
+	<div class="  pr-1.5 overflow-y-scroll max-h-[25rem]">
+		<div>
+			<div class="flex items-center justify-between mb-1">
+				<Tooltip
+					content="This is an experimental feature, it may not function as expected and is subject to change at any time."
+				>
+					<div class="text-sm font-medium">
+						{$i18n.t('Memory')}
+
+						<span class=" text-xs text-gray-500">({$i18n.t('Experimental')})</span>
+					</div>
+				</Tooltip>
+
+				<div class="mt-1">
+					<Switch
+						bind:state={enableMemory}
+						on:change={async () => {
+							saveSettings({ memory: enableMemory });
+						}}
+					/>
+				</div>
+			</div>
+		</div>
+
+		<div class="text-xs text-gray-600 dark:text-gray-400">
+			<div>
+				You can personalize your interactions with LLMs by adding memories through the 'Manage'
+				button below, making them more helpful and tailored to you.
+			</div>
+
+			<!-- <div class="mt-3">
+				To understand what LLM remembers or teach it something new, just chat with it:
+
+				<div>- “Remember that I like concise responses.”</div>
+				<div>- “I just got a puppy!”</div>
+				<div>- “What do you remember about me?”</div>
+				<div>- “Where did we leave off on my last project?”</div>
+			</div> -->
+		</div>
+
+		<div class="mt-3 mb-1 ml-1">
+			<button
+				type="button"
+				class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
+				on:click={() => {
+					showManageModal = true;
+				}}
+			>
+				Manage
+			</button>
+		</div>
+	</div>
+
+	<div class="flex justify-end text-sm font-medium">
+		<button
+			class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
+			type="submit"
+		>
+			{$i18n.t('Save')}
+		</button>
+	</div>
+</form>

+ 125 - 0
src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte

@@ -0,0 +1,125 @@
+<script>
+	import { createEventDispatcher, getContext } from 'svelte';
+
+	import Modal from '$lib/components/common/Modal.svelte';
+	import { addNewMemory } from '$lib/apis/memories';
+	import { toast } from 'svelte-sonner';
+
+	const dispatch = createEventDispatcher();
+
+	export let show;
+
+	const i18n = getContext('i18n');
+
+	let loading = false;
+	let content = '';
+
+	const submitHandler = async () => {
+		loading = true;
+
+		const res = await addNewMemory(localStorage.token, content).catch((error) => {
+			toast.error(error);
+
+			return null;
+		});
+
+		if (res) {
+			console.log(res);
+			toast.success('Memory added successfully');
+			content = '';
+			show = false;
+			dispatch('save');
+		}
+
+		loading = false;
+	};
+</script>
+
+<Modal bind:show size="sm">
+	<div>
+		<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
+			<div class=" text-lg font-medium self-center">{$i18n.t('Add Memory')}</div>
+			<button
+				class="self-center"
+				on:click={() => {
+					show = false;
+				}}
+			>
+				<svg
+					xmlns="http://www.w3.org/2000/svg"
+					viewBox="0 0 20 20"
+					fill="currentColor"
+					class="w-5 h-5"
+				>
+					<path
+						d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+					/>
+				</svg>
+			</button>
+		</div>
+
+		<div class="flex flex-col md:flex-row w-full px-5 pb-4 md:space-x-4 dark:text-gray-200">
+			<div class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6">
+				<form
+					class="flex flex-col w-full"
+					on:submit|preventDefault={() => {
+						submitHandler();
+					}}
+				>
+					<div class="">
+						<textarea
+							bind:value={content}
+							class=" bg-transparent w-full text-sm resize-none rounded-xl p-3 outline outline-1 outline-gray-100 dark:outline-gray-800"
+							rows="3"
+							placeholder={$i18n.t('Enter a detail about yourself for your LLMs to recall')}
+						/>
+
+						<div class="text-xs text-gray-500">
+							ⓘ Refer to yourself as "User" (e.g., "User is learning Spanish")
+						</div>
+					</div>
+
+					<div class="flex justify-end pt-1 text-sm font-medium">
+						<button
+							class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-3xl flex flex-row space-x-1 items-center {loading
+								? ' cursor-not-allowed'
+								: ''}"
+							type="submit"
+							disabled={loading}
+						>
+							{$i18n.t('Add')}
+
+							{#if loading}
+								<div class="ml-2 self-center">
+									<svg
+										class=" w-4 h-4"
+										viewBox="0 0 24 24"
+										fill="currentColor"
+										xmlns="http://www.w3.org/2000/svg"
+										><style>
+											.spinner_ajPY {
+												transform-origin: center;
+												animation: spinner_AtaB 0.75s infinite linear;
+											}
+											@keyframes spinner_AtaB {
+												100% {
+													transform: rotate(360deg);
+												}
+											}
+										</style><path
+											d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
+											opacity=".25"
+										/><path
+											d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
+											class="spinner_ajPY"
+										/></svg
+									>
+								</div>
+							{/if}
+						</button>
+					</div>
+				</form>
+			</div>
+		</div>
+	</div>
+</Modal>

+ 165 - 0
src/lib/components/chat/Settings/Personalization/ManageModal.svelte

@@ -0,0 +1,165 @@
+<script lang="ts">
+	import { toast } from 'svelte-sonner';
+	import dayjs from 'dayjs';
+	import { getContext, createEventDispatcher } from 'svelte';
+
+	const dispatch = createEventDispatcher();
+
+	import Modal from '$lib/components/common/Modal.svelte';
+	import AddMemoryModal from './AddMemoryModal.svelte';
+	import { deleteMemoriesByUserId, deleteMemoryById, getMemories } from '$lib/apis/memories';
+	import Tooltip from '$lib/components/common/Tooltip.svelte';
+	import { error } from '@sveltejs/kit';
+
+	const i18n = getContext('i18n');
+
+	export let show = false;
+
+	let memories = [];
+
+	let showAddMemoryModal = false;
+
+	$: if (show) {
+		(async () => {
+			memories = await getMemories(localStorage.token);
+		})();
+	}
+</script>
+
+<Modal size="xl" bind:show>
+	<div>
+		<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-1">
+			<div class=" text-lg font-medium self-center">{$i18n.t('Memory')}</div>
+			<button
+				class="self-center"
+				on:click={() => {
+					show = false;
+				}}
+			>
+				<svg
+					xmlns="http://www.w3.org/2000/svg"
+					viewBox="0 0 20 20"
+					fill="currentColor"
+					class="w-5 h-5"
+				>
+					<path
+						d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+					/>
+				</svg>
+			</button>
+		</div>
+
+		<div class="flex flex-col w-full px-5 pb-5 dark:text-gray-200">
+			<div
+				class=" flex flex-col w-full sm:flex-row sm:justify-center sm:space-x-6 h-[28rem] max-h-screen outline outline-1 rounded-xl outline-gray-100 dark:outline-gray-800 mb-4 mt-1"
+			>
+				{#if memories.length > 0}
+					<div class="text-left text-sm w-full mb-4 max-h-[22rem] overflow-y-scroll">
+						<div class="relative overflow-x-auto">
+							<table class="w-full text-sm text-left text-gray-600 dark:text-gray-400 table-auto">
+								<thead
+									class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800"
+								>
+									<tr>
+										<th scope="col" class="px-3 py-2"> {$i18n.t('Name')} </th>
+										<th scope="col" class="px-3 py-2 hidden md:flex"> {$i18n.t('Created At')} </th>
+										<th scope="col" class="px-3 py-2 text-right" />
+									</tr>
+								</thead>
+								<tbody>
+									{#each memories as memory}
+										<tr class="border-b dark:border-gray-800 items-center">
+											<td class="px-3 py-1">
+												<div class="line-clamp-1">
+													{memory.content}
+												</div>
+											</td>
+											<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
+												<div class="my-auto whitespace-nowrap">
+													{dayjs(memory.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
+												</div>
+											</td>
+											<td class="px-3 py-1">
+												<div class="flex justify-end w-full">
+													<Tooltip content="Delete">
+														<button
+															class="self-center w-fit text-sm px-2 py-2 hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
+															on:click={async () => {
+																const res = await deleteMemoryById(
+																	localStorage.token,
+																	memory.id
+																).catch((error) => {
+																	toast.error(error);
+																	return null;
+																});
+
+																if (res) {
+																	toast.success('Memory deleted successfully');
+																	memories = await getMemories(localStorage.token);
+																}
+															}}
+														>
+															<svg
+																xmlns="http://www.w3.org/2000/svg"
+																fill="none"
+																viewBox="0 0 24 24"
+																stroke-width="1.5"
+																stroke="currentColor"
+																class="w-4 h-4"
+															>
+																<path
+																	stroke-linecap="round"
+																	stroke-linejoin="round"
+																	d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
+																/>
+															</svg>
+														</button>
+													</Tooltip>
+												</div>
+											</td>
+										</tr>
+									{/each}
+								</tbody>
+							</table>
+						</div>
+					</div>
+				{:else}
+					<div class="text-center flex h-full text-sm w-full">
+						<div class=" my-auto pb-10 px-4 w-full text-gray-500">
+							{$i18n.t('Memories accessible by LLMs will be shown here.')}
+						</div>
+					</div>
+				{/if}
+			</div>
+			<div class="flex text-sm font-medium gap-1.5">
+				<button
+					class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
+					on:click={() => {
+						showAddMemoryModal = true;
+					}}>Add memory</button
+				>
+				<button
+					class=" px-3.5 py-1.5 font-medium text-red-500 hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-red-300 dark:outline-red-800 rounded-3xl"
+					on:click={async () => {
+						const res = await deleteMemoriesByUserId(localStorage.token).catch((error) => {
+							toast.error(error);
+							return null;
+						});
+
+						if (res) {
+							toast.success('Memory cleared successfully');
+							memories = [];
+						}
+					}}>Clear memory</button
+				>
+			</div>
+		</div>
+	</div>
+</Modal>
+
+<AddMemoryModal
+	bind:show={showAddMemoryModal}
+	on:save={async () => {
+		memories = await getMemories(localStorage.token);
+	}}
+/>

+ 13 - 15
src/lib/components/chat/SettingsModal.svelte

@@ -15,6 +15,8 @@
 	import Chats from './Settings/Chats.svelte';
 	import Chats from './Settings/Chats.svelte';
 	import Connections from './Settings/Connections.svelte';
 	import Connections from './Settings/Connections.svelte';
 	import Images from './Settings/Images.svelte';
 	import Images from './Settings/Images.svelte';
+	import User from '../icons/User.svelte';
+	import Personalization from './Settings/Personalization.svelte';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -167,28 +169,17 @@
 
 
 				<button
 				<button
 					class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
 					class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
-					'interface'
+					'personalization'
 						? 'bg-gray-200 dark:bg-gray-700'
 						? 'bg-gray-200 dark:bg-gray-700'
 						: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
 						: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
 					on:click={() => {
 					on:click={() => {
-						selectedTab = 'interface';
+						selectedTab = 'personalization';
 					}}
 					}}
 				>
 				>
 					<div class=" self-center mr-2">
 					<div class=" self-center mr-2">
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 16 16"
-							fill="currentColor"
-							class="w-4 h-4"
-						>
-							<path
-								fill-rule="evenodd"
-								d="M2 4.25A2.25 2.25 0 0 1 4.25 2h7.5A2.25 2.25 0 0 1 14 4.25v5.5A2.25 2.25 0 0 1 11.75 12h-1.312c.1.128.21.248.328.36a.75.75 0 0 1 .234.545v.345a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1-.75-.75v-.345a.75.75 0 0 1 .234-.545c.118-.111.228-.232.328-.36H4.25A2.25 2.25 0 0 1 2 9.75v-5.5Zm2.25-.75a.75.75 0 0 0-.75.75v4.5c0 .414.336.75.75.75h7.5a.75.75 0 0 0 .75-.75v-4.5a.75.75 0 0 0-.75-.75h-7.5Z"
-								clip-rule="evenodd"
-							/>
-						</svg>
+						<User />
 					</div>
 					</div>
-					<div class=" self-center">{$i18n.t('Interface')}</div>
+					<div class=" self-center">{$i18n.t('Personalization')}</div>
 				</button>
 				</button>
 
 
 				<button
 				<button
@@ -349,6 +340,13 @@
 							toast.success($i18n.t('Settings saved successfully!'));
 							toast.success($i18n.t('Settings saved successfully!'));
 						}}
 						}}
 					/>
 					/>
+				{:else if selectedTab === 'personalization'}
+					<Personalization
+						{saveSettings}
+						on:save={() => {
+							toast.success($i18n.t('Settings saved successfully!'));
+						}}
+					/>
 				{:else if selectedTab === 'audio'}
 				{:else if selectedTab === 'audio'}
 					<Audio
 					<Audio
 						{saveSettings}
 						{saveSettings}

+ 2 - 2
src/lib/components/chat/ShareChatModal.svelte

@@ -65,7 +65,7 @@
 			return false;
 			return false;
 		}
 		}
 		return chat.id !== _chat.id || chat.share_id !== _chat.share_id;
 		return chat.id !== _chat.id || chat.share_id !== _chat.share_id;
-	}
+	};
 
 
 	$: if (show) {
 	$: if (show) {
 		(async () => {
 		(async () => {
@@ -128,7 +128,7 @@
 						{$i18n.t('and create a new shared link.')}
 						{$i18n.t('and create a new shared link.')}
 					{:else}
 					{:else}
 						{$i18n.t(
 						{$i18n.t(
-							"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat."
+							"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat."
 						)}
 						)}
 					{/if}
 					{/if}
 				</div>
 				</div>

+ 1 - 1
src/lib/components/common/Modal.svelte

@@ -18,7 +18,7 @@
 		} else if (size === 'md') {
 		} else if (size === 'md') {
 			return 'w-[48rem]';
 			return 'w-[48rem]';
 		} else {
 		} else {
-			return 'w-[50rem]';
+			return 'w-[56rem]';
 		}
 		}
 	};
 	};
 
 

+ 1 - 1
src/lib/components/common/Selector.svelte

@@ -26,7 +26,7 @@
 	let searchValue = '';
 	let searchValue = '';
 
 
 	$: filteredItems = searchValue
 	$: filteredItems = searchValue
-		? items.filter((item) => item.value.includes(searchValue.toLowerCase()))
+		? items.filter((item) => item.value.toLowerCase().includes(searchValue.toLowerCase()))
 		: items;
 		: items;
 </script>
 </script>
 
 

+ 22 - 0
src/lib/components/common/Switch.svelte

@@ -0,0 +1,22 @@
+<script lang="ts">
+	import { createEventDispatcher, tick } from 'svelte';
+	import { Switch } from 'bits-ui';
+	export let state = true;
+
+	const dispatch = createEventDispatcher();
+</script>
+
+<Switch.Root
+	bind:checked={state}
+	onCheckedChange={async (e) => {
+		await tick();
+		dispatch('change', e);
+	}}
+	class="flex h-5 min-h-5 w-9 shrink-0 cursor-pointer items-center rounded-full px-[3px] transition  {state
+		? ' bg-emerald-600'
+		: 'bg-gray-200 dark:bg-transparent'} outline outline-1 outline-gray-100 dark:outline-gray-800"
+>
+	<Switch.Thumb
+		class="pointer-events-none block size-4 shrink-0 rounded-full bg-white transition-transform data-[state=checked]:translate-x-3.5 data-[state=unchecked]:translate-x-0 data-[state=unchecked]:shadow-mini "
+	/>
+</Switch.Root>

+ 2 - 0
src/lib/components/documents/Settings/General.svelte

@@ -254,6 +254,8 @@
 								embeddingModel = '';
 								embeddingModel = '';
 							} else if (e.target.value === 'openai') {
 							} else if (e.target.value === 'openai') {
 								embeddingModel = 'text-embedding-3-small';
 								embeddingModel = 'text-embedding-3-small';
+							} else if (e.target.value === '') {
+								embeddingModel = 'sentence-transformers/all-MiniLM-L6-v2';
 							}
 							}
 						}}
 						}}
 					>
 					>

+ 11 - 0
src/lib/components/icons/User.svelte

@@ -0,0 +1,11 @@
+<script lang="ts">
+	export let className = 'w-4 h-4';
+</script>
+
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
+	<path
+		fill-rule="evenodd"
+		d="M7.5 6a4.5 4.5 0 1 1 9 0 4.5 4.5 0 0 1-9 0ZM3.751 20.105a8.25 8.25 0 0 1 16.498 0 .75.75 0 0 1-.437.695A18.683 18.683 0 0 1 12 22.5c-2.786 0-5.433-.608-7.812-1.7a.75.75 0 0 1-.437-.695Z"
+		clip-rule="evenodd"
+	/>
+</svg>

+ 4 - 3
src/lib/components/layout/Navbar.svelte

@@ -82,7 +82,7 @@
 						<button
 						<button
 							class="hidden md:flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
 							class="hidden md:flex cursor-pointer px-2 py-2 rounded-xl hover:bg-gray-100 dark:hover:bg-gray-850 transition"
 							id="chat-context-menu-button"
 							id="chat-context-menu-button"
-            >
+						>
 							<div class=" m-auto self-center">
 							<div class=" m-auto self-center">
 								<svg
 								<svg
 									xmlns="http://www.w3.org/2000/svg"
 									xmlns="http://www.w3.org/2000/svg"
@@ -141,14 +141,15 @@
 						}}
 						}}
 					>
 					>
 						<button
 						<button
-							class=" flex rounded-xl p-1.5 w-full hover:bg-gray-100 dark:hover:bg-gray-850 transition"
+							class="select-none flex rounded-xl p-1.5 w-full hover:bg-gray-100 dark:hover:bg-gray-850 transition"
 							aria-label="User Menu"
 							aria-label="User Menu"
 						>
 						>
 							<div class=" self-center">
 							<div class=" self-center">
 								<img
 								<img
 									src={$user.profile_image_url}
 									src={$user.profile_image_url}
-									class=" size-6 object-cover rounded-full"
+									class="size-6 object-cover rounded-full"
 									alt="User profile"
 									alt="User profile"
+									draggable="false"
 								/>
 								/>
 							</div>
 							</div>
 						</button>
 						</button>

+ 5 - 5
src/lib/components/layout/Navbar/Menu.svelte

@@ -111,8 +111,8 @@
 			</DropdownMenu.Item> -->
 			</DropdownMenu.Item> -->
 
 
 			<DropdownMenu.Item
 			<DropdownMenu.Item
-				class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer dark:hover:bg-gray-800 rounded-md"
-        id="chat-share-button"
+				class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
+				id="chat-share-button"
 				on:click={() => {
 				on:click={() => {
 					shareHandler();
 					shareHandler();
 				}}
 				}}
@@ -140,7 +140,7 @@
 				/> -->
 				/> -->
 			<DropdownMenu.Sub>
 			<DropdownMenu.Sub>
 				<DropdownMenu.SubTrigger
 				<DropdownMenu.SubTrigger
-					class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer dark:hover:bg-gray-800 rounded-md"
+					class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 				>
 				>
 					<svg
 					<svg
 						xmlns="http://www.w3.org/2000/svg"
 						xmlns="http://www.w3.org/2000/svg"
@@ -165,7 +165,7 @@
 					sideOffset={8}
 					sideOffset={8}
 				>
 				>
 					<DropdownMenu.Item
 					<DropdownMenu.Item
-						class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer dark:hover:bg-gray-800 rounded-md"
+						class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 						on:click={() => {
 						on:click={() => {
 							downloadTxt();
 							downloadTxt();
 						}}
 						}}
@@ -174,7 +174,7 @@
 					</DropdownMenu.Item>
 					</DropdownMenu.Item>
 
 
 					<DropdownMenu.Item
 					<DropdownMenu.Item
-						class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer dark:hover:bg-gray-800 rounded-md"
+						class="flex gap-2 items-center px-3 py-2 text-sm  cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 						on:click={() => {
 						on:click={() => {
 							downloadPdf();
 							downloadPdf();
 						}}
 						}}

+ 1 - 0
src/lib/components/layout/Sidebar.svelte

@@ -248,6 +248,7 @@
 			>
 			>
 				<div class="self-center mx-1.5">
 				<div class="self-center mx-1.5">
 					<img
 					<img
+						crossorigin="anonymous"
 						src="{WEBUI_BASE_URL}/static/favicon.png"
 						src="{WEBUI_BASE_URL}/static/favicon.png"
 						class=" size-6 -translate-x-1.5 rounded-full"
 						class=" size-6 -translate-x-1.5 rounded-full"
 						alt="logo"
 						alt="logo"

+ 4 - 4
src/lib/components/layout/Sidebar/ChatMenu.svelte

@@ -45,7 +45,7 @@
 			transition={flyAndScale}
 			transition={flyAndScale}
 		>
 		>
 			<DropdownMenu.Item
 			<DropdownMenu.Item
-				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer dark:hover:bg-gray-800 rounded-md"
+				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800  rounded-md"
 				on:click={() => {
 				on:click={() => {
 					shareHandler();
 					shareHandler();
 				}}
 				}}
@@ -55,7 +55,7 @@
 			</DropdownMenu.Item>
 			</DropdownMenu.Item>
 
 
 			<DropdownMenu.Item
 			<DropdownMenu.Item
-				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer dark:hover:bg-gray-800 rounded-md"
+				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 				on:click={() => {
 				on:click={() => {
 					renameHandler();
 					renameHandler();
 				}}
 				}}
@@ -65,7 +65,7 @@
 			</DropdownMenu.Item>
 			</DropdownMenu.Item>
 
 
 			<DropdownMenu.Item
 			<DropdownMenu.Item
-				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer dark:hover:bg-gray-800 rounded-md"
+				class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 				on:click={() => {
 				on:click={() => {
 					archiveChatHandler();
 					archiveChatHandler();
 				}}
 				}}
@@ -75,7 +75,7 @@
 			</DropdownMenu.Item>
 			</DropdownMenu.Item>
 
 
 			<DropdownMenu.Item
 			<DropdownMenu.Item
-				class="flex  gap-2  items-center px-3 py-2 text-sm  font-medium cursor-pointer dark:hover:bg-gray-800 rounded-md"
+				class="flex  gap-2  items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
 				on:click={() => {
 				on:click={() => {
 					deleteHandler();
 					deleteHandler();
 				}}
 				}}

+ 4 - 4
src/lib/components/layout/Sidebar/UserMenu.svelte

@@ -36,7 +36,7 @@
 			transition={(e) => fade(e, { duration: 100 })}
 			transition={(e) => fade(e, { duration: 100 })}
 		>
 		>
 			<button
 			<button
-				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-100 dark:hover:bg-gray-800 transition"
+				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
 				on:click={async () => {
 				on:click={async () => {
 					await showSettings.set(true);
 					await showSettings.set(true);
 					show = false;
 					show = false;
@@ -67,7 +67,7 @@
 			</button>
 			</button>
 
 
 			<button
 			<button
-				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-100 dark:hover:bg-gray-800 transition"
+				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
 				on:click={() => {
 				on:click={() => {
 					dispatch('show', 'archived-chat');
 					dispatch('show', 'archived-chat');
 					show = false;
 					show = false;
@@ -81,7 +81,7 @@
 
 
 			{#if role === 'admin'}
 			{#if role === 'admin'}
 				<button
 				<button
-					class="flex rounded-md py-2 px-3 w-full hover:bg-gray-100 dark:hover:bg-gray-800 transition"
+					class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
 					on:click={() => {
 					on:click={() => {
 						goto('/admin');
 						goto('/admin');
 						show = false;
 						show = false;
@@ -110,7 +110,7 @@
 			<hr class=" dark:border-gray-800 my-2 p-0" />
 			<hr class=" dark:border-gray-800 my-2 p-0" />
 
 
 			<button
 			<button
-				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-100 dark:hover:bg-gray-800 transition"
+				class="flex rounded-md py-2 px-3 w-full hover:bg-gray-50 dark:hover:bg-gray-800 transition"
 				on:click={() => {
 				on:click={() => {
 					localStorage.removeItem('token');
 					localStorage.removeItem('token');
 					location.href = '/auth';
 					location.href = '/auth';

+ 0 - 1
src/lib/components/workspace/Playground.svelte

@@ -329,7 +329,6 @@
 											info: model
 											info: model
 										}))}
 										}))}
 									bind:value={selectedModelId}
 									bind:value={selectedModelId}
-									className="w-[42rem]"
 								/>
 								/>
 							</div>
 							</div>
 						</div>
 						</div>

+ 11 - 2
src/lib/i18n/locales/ar-BH/translation.json

@@ -11,6 +11,7 @@
 	"About": "عن",
 	"About": "عن",
 	"Account": "الحساب",
 	"Account": "الحساب",
 	"Accurate information": "معلومات دقيقة",
 	"Accurate information": "معلومات دقيقة",
+	"Add": "",
 	"Add a model": "أضافة موديل",
 	"Add a model": "أضافة موديل",
 	"Add a model tag name": "ضع تاق للأسم الموديل",
 	"Add a model tag name": "ضع تاق للأسم الموديل",
 	"Add a short description about what this modelfile does": "أضف وصفًا قصيرًا حول ما يفعله ملف الموديل هذا",
 	"Add a short description about what this modelfile does": "أضف وصفًا قصيرًا حول ما يفعله ملف الموديل هذا",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "أضافة مطالبة مخصصه",
 	"Add custom prompt": "أضافة مطالبة مخصصه",
 	"Add Docs": "إضافة المستندات",
 	"Add Docs": "إضافة المستندات",
 	"Add Files": "إضافة ملفات",
 	"Add Files": "إضافة ملفات",
+	"Add Memory": "",
 	"Add message": "اضافة رسالة",
 	"Add message": "اضافة رسالة",
 	"Add Model": "اضافة موديل",
 	"Add Model": "اضافة موديل",
 	"Add Tags": "اضافة تاق",
 	"Add Tags": "اضافة تاق",
@@ -68,6 +70,7 @@
 	"Change Password": "تغير الباسورد",
 	"Change Password": "تغير الباسورد",
 	"Chat": "المحادثة",
 	"Chat": "المحادثة",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "تاريخ المحادثة",
 	"Chat History": "تاريخ المحادثة",
 	"Chat History is off for this browser.": "سجل الدردشة معطل لهذا المتصفح",
 	"Chat History is off for this browser.": "سجل الدردشة معطل لهذا المتصفح",
 	"Chats": "المحادثات",
 	"Chats": "المحادثات",
@@ -169,6 +172,7 @@
 	"Enabled": "تفعيل",
 	"Enabled": "تفعيل",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "تأكد من أن ملف CSV الخاص بك يتضمن 4 أعمدة بهذا الترتيب: Name, Email, Password, Role.",
 	"Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
 	"Enter {{role}} message here": "أدخل رسالة {{role}} هنا",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "أدخل Chunk المتداخل",
 	"Enter Chunk Overlap": "أدخل Chunk المتداخل",
 	"Enter Chunk Size": "أدخل Chunk الحجم",
 	"Enter Chunk Size": "أدخل Chunk الحجم",
 	"Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ",
 	"Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "استيراد ملفات النماذج",
 	"Import Modelfiles": "استيراد ملفات النماذج",
 	"Import Prompts": "مطالبات الاستيراد",
 	"Import Prompts": "مطالبات الاستيراد",
 	"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "إدخال الأوامر",
 	"Interface": "واجهه المستخدم",
 	"Interface": "واجهه المستخدم",
 	"Invalid Tag": "تاق غير صالحة",
 	"Invalid Tag": "تاق غير صالحة",
 	"January": "يناير",
 	"January": "يناير",
@@ -247,6 +251,7 @@
 	"Light": "فاتح",
 	"Light": "فاتح",
 	"Listening...": "جاري الاستماع",
 	"Listening...": "جاري الاستماع",
 	"LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة",
 	"LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
 	"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
 	"Make sure to enclose them with": "تأكد من إرفاقها",
 	"Make sure to enclose them with": "تأكد من إرفاقها",
 	"Manage LiteLLM Models": "LiteLLM إدارة نماذج ",
 	"Manage LiteLLM Models": "LiteLLM إدارة نماذج ",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max Tokens",
 	"Max Tokens": "Max Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "لن تتم مشاركة الرسائل التي ترسلها بعد إنشاء الرابط الخاص بك. سيتمكن المستخدمون الذين لديهم عنوان URL من عرض الدردشة المشتركة.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "الحد الأدنى من النقاط",
 	"Minimum Score": "الحد الأدنى من النقاط",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
 	"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
 	"pending": "قيد الانتظار",
 	"pending": "قيد الانتظار",
 	"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
 	"Permission denied when accessing microphone: {{error}}": "{{error}} تم رفض الإذن عند الوصول إلى الميكروفون ",
+	"Personalization": "",
 	"Plain text (.txt)": "نص عادي (.txt)",
 	"Plain text (.txt)": "نص عادي (.txt)",
 	"Playground": "مكان التجربة",
 	"Playground": "مكان التجربة",
 	"Positive attitude": "موقف ايجابي",
 	"Positive attitude": "موقف ايجابي",
@@ -362,6 +370,7 @@
 	"Role": "منصب",
 	"Role": "منصب",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "حفظ",
 	"Save": "حفظ",
 	"Save & Create": "حفظ وإنشاء",
 	"Save & Create": "حفظ وإنشاء",
 	"Save & Update": "حفظ وتحديث",
 	"Save & Update": "حفظ وتحديث",

+ 17 - 8
src/lib/i18n/locales/bg-BG/translation.json

@@ -11,14 +11,16 @@
 	"About": "Относно",
 	"About": "Относно",
 	"Account": "Акаунт",
 	"Account": "Акаунт",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Добавяне на модел",
 	"Add a model": "Добавяне на модел",
 	"Add a model tag name": "Добавяне на име на таг за модел",
 	"Add a model tag name": "Добавяне на име на таг за модел",
 	"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
 	"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
 	"Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт",
 	"Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт",
 	"Add a tag": "Добавяне на таг",
 	"Add a tag": "Добавяне на таг",
-	"Add custom prompt": "",
+	"Add custom prompt": "Добавяне на собствен промпт",
 	"Add Docs": "Добавяне на Документи",
 	"Add Docs": "Добавяне на Документи",
 	"Add Files": "Добавяне на Файлове",
 	"Add Files": "Добавяне на Файлове",
+	"Add Memory": "",
 	"Add message": "Добавяне на съобщение",
 	"Add message": "Добавяне на съобщение",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "добавяне на тагове",
 	"Add Tags": "добавяне на тагове",
@@ -48,7 +50,7 @@
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
 	"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
 	"Are you sure?": "Сигурни ли сте?",
 	"Are you sure?": "Сигурни ли сте?",
-	"Attach file": "",
+	"Attach file": "Прикачване на файл",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "Аудио",
 	"Audio": "Аудио",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Промяна на Парола",
 	"Change Password": "Промяна на Парола",
 	"Chat": "Чат",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Чат История",
 	"Chat History": "Чат История",
 	"Chat History is off for this browser.": "Чат История е изключен за този браузър.",
 	"Chat History is off for this browser.": "Чат История е изключен за този браузър.",
 	"Chats": "Чатове",
 	"Chats": "Чатове",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "Chunk Overlap",
 	"Chunk Overlap": "Chunk Overlap",
 	"Chunk Params": "Chunk Params",
 	"Chunk Params": "Chunk Params",
 	"Chunk Size": "Chunk Size",
 	"Chunk Size": "Chunk Size",
-	"Citation": "",
+	"Citation": "Цитат",
 	"Click here for help.": "Натиснете тук за помощ.",
 	"Click here for help.": "Натиснете тук за помощ.",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.",
 	"Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.",
@@ -169,6 +172,7 @@
 	"Enabled": "Включено",
 	"Enabled": "Включено",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
 	"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Въведете Chunk Overlap",
 	"Enter Chunk Overlap": "Въведете Chunk Overlap",
 	"Enter Chunk Size": "Въведете Chunk Size",
 	"Enter Chunk Size": "Въведете Chunk Size",
 	"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Импортване на модфайлове",
 	"Import Modelfiles": "Импортване на модфайлове",
 	"Import Prompts": "Импортване на промптове",
 	"Import Prompts": "Импортване на промптове",
 	"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Въведете команди",
 	"Interface": "Интерфейс",
 	"Interface": "Интерфейс",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Светъл",
 	"Light": "Светъл",
 	"Listening...": "Слушам...",
 	"Listening...": "Слушам...",
 	"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
 	"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
 	"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
 	"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
 	"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max Tokens",
 	"Max Tokens": "Max Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "Няма наличен източник",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "Не сте сигурни, какво да добавите?",
 	"Not sure what to add?": "Не сте сигурни, какво да добавите?",
 	"Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към",
 	"Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
 	"pending": "в очакване",
 	"pending": "в очакване",
 	"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Плейграунд",
 	"Playground": "Плейграунд",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Роля",
 	"Role": "Роля",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Запис",
 	"Save": "Запис",
 	"Save & Create": "Запис & Създаване",
 	"Save & Create": "Запис & Създаване",
 	"Save & Update": "Запис & Актуализиране",
 	"Save & Update": "Запис & Актуализиране",
@@ -381,7 +390,7 @@
 	"Select a mode": "Изберете режим",
 	"Select a mode": "Изберете режим",
 	"Select a model": "Изберете модел",
 	"Select a model": "Изберете модел",
 	"Select an Ollama instance": "Изберете Ollama инстанция",
 	"Select an Ollama instance": "Изберете Ollama инстанция",
-	"Select model": "",
+	"Select model": "Изберете модел",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Изпращане на Съобщение",
 	"Send a Message": "Изпращане на Съобщение",
 	"Send message": "Изпращане на съобщение",
 	"Send message": "Изпращане на съобщение",
@@ -411,7 +420,7 @@
 	"Sign Out": "Изход",
 	"Sign Out": "Изход",
 	"Sign up": "Регистрация",
 	"Sign up": "Регистрация",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "Източник",
 	"Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
 	"Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
 	"Speech-to-Text Engine": "Speech-to-Text Engine",
 	"Speech-to-Text Engine": "Speech-to-Text Engine",
 	"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.",
 	"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.",

+ 18 - 9
src/lib/i18n/locales/bn-BD/translation.json

@@ -11,14 +11,16 @@
 	"About": "সম্পর্কে",
 	"About": "সম্পর্কে",
 	"Account": "একাউন্ট",
 	"Account": "একাউন্ট",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "একটি মডেল যোগ করুন",
 	"Add a model": "একটি মডেল যোগ করুন",
 	"Add a model tag name": "একটি মডেল ট্যাগ যোগ করুন",
 	"Add a model tag name": "একটি মডেল ট্যাগ যোগ করুন",
 	"Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন",
 	"Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন",
 	"Add a short title for this prompt": "এই প্রম্পটের জন্য একটি সংক্ষিপ্ত টাইটেল যোগ করুন",
 	"Add a short title for this prompt": "এই প্রম্পটের জন্য একটি সংক্ষিপ্ত টাইটেল যোগ করুন",
 	"Add a tag": "একটি ট্যাগ যোগ করুন",
 	"Add a tag": "একটি ট্যাগ যোগ করুন",
-	"Add custom prompt": "",
+	"Add custom prompt": "একটি কাস্টম প্রম্পট যোগ করুন",
 	"Add Docs": "ডকুমেন্ট যোগ করুন",
 	"Add Docs": "ডকুমেন্ট যোগ করুন",
 	"Add Files": "ফাইল যোগ করুন",
 	"Add Files": "ফাইল যোগ করুন",
+	"Add Memory": "",
 	"Add message": "মেসেজ যোগ করুন",
 	"Add message": "মেসেজ যোগ করুন",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "ট্যাগ যোগ করুন",
 	"Add Tags": "ট্যাগ যোগ করুন",
@@ -48,8 +50,8 @@
 	"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
 	"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
 	"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
 	"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
 	"Are you sure?": "আপনি নিশ্চিত?",
 	"Are you sure?": "আপনি নিশ্চিত?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "ফাইল যুক্ত করুন",
+	"Attention to detail": "বিস্তারিত বিশেষতা",
 	"Audio": "অডিও",
 	"Audio": "অডিও",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
 	"Auto-playback response": "রেসপন্স অটো-প্লেব্যাক",
@@ -68,6 +70,7 @@
 	"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
 	"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
 	"Chat": "চ্যাট",
 	"Chat": "চ্যাট",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "চ্যাট হিস্টোরি",
 	"Chat History": "চ্যাট হিস্টোরি",
 	"Chat History is off for this browser.": "এই ব্রাউজারের জন্য চ্যাট হিস্টোরি বন্ধ আছে",
 	"Chat History is off for this browser.": "এই ব্রাউজারের জন্য চ্যাট হিস্টোরি বন্ধ আছে",
 	"Chats": "চ্যাটসমূহ",
 	"Chats": "চ্যাটসমূহ",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "চাঙ্ক ওভারল্যাপ",
 	"Chunk Overlap": "চাঙ্ক ওভারল্যাপ",
 	"Chunk Params": "চাঙ্ক প্যারামিটার্স",
 	"Chunk Params": "চাঙ্ক প্যারামিটার্স",
 	"Chunk Size": "চাঙ্ক সাইজ",
 	"Chunk Size": "চাঙ্ক সাইজ",
-	"Citation": "",
+	"Citation": "উদ্ধৃতি",
 	"Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন",
 	"Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "অন্যান্য মডেলফাইল চেক করার জন্য এখানে ক্লিক করুন",
 	"Click here to check other modelfiles.": "অন্যান্য মডেলফাইল চেক করার জন্য এখানে ক্লিক করুন",
@@ -169,6 +172,7 @@
 	"Enabled": "চালু করা হয়েছে",
 	"Enabled": "চালু করা হয়েছে",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
 	"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "চাঙ্ক ওভারল্যাপ লিখুন",
 	"Enter Chunk Overlap": "চাঙ্ক ওভারল্যাপ লিখুন",
 	"Enter Chunk Size": "চাংক সাইজ লিখুন",
 	"Enter Chunk Size": "চাংক সাইজ লিখুন",
 	"Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)",
 	"Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "মডেলফাইলগুলো ইমপোর্ট করুন",
 	"Import Modelfiles": "মডেলফাইলগুলো ইমপোর্ট করুন",
 	"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
 	"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
-	"Input commands": "",
+	"Input commands": "ইনপুট কমান্ডস",
 	"Interface": "ইন্টারফেস",
 	"Interface": "ইন্টারফেস",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "লাইট",
 	"Light": "লাইট",
 	"Listening...": "শুনছে...",
 	"Listening...": "শুনছে...",
 	"LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।",
 	"LLMs can make mistakes. Verify important information.": "LLM ভুল করতে পারে। গুরুত্বপূর্ণ তথ্য যাচাই করে নিন।",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
 	"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
 	"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
 	"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
 	"Manage LiteLLM Models": "LiteLLM মডেল ব্যবস্থাপনা করুন",
 	"Manage LiteLLM Models": "LiteLLM মডেল ব্যবস্থাপনা করুন",
@@ -256,7 +261,9 @@
 	"Max Tokens": "সর্বোচ্চ টোকন",
 	"Max Tokens": "সর্বোচ্চ টোকন",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "কোন উৎস পাওয়া যায়নি",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "কী যুক্ত করতে হবে নিশ্চিত না?",
 	"Not sure what to add?": "কী যুক্ত করতে হবে নিশ্চিত না?",
 	"Not sure what to write? Switch to": "কী লিখতে হবে নিশ্চিত না? পরিবর্তন করুন:",
 	"Not sure what to write? Switch to": "কী লিখতে হবে নিশ্চিত না? পরিবর্তন করুন:",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
 	"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
 	"pending": "অপেক্ষমান",
 	"pending": "অপেক্ষমান",
 	"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "মাইক্রোফোন ব্যবহারের অনুমতি পাওয়া যায়নি: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "খেলাঘর",
 	"Playground": "খেলাঘর",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "পদবি",
 	"Role": "পদবি",
 	"Rosé Pine": "রোজ পাইন",
 	"Rosé Pine": "রোজ পাইন",
 	"Rosé Pine Dawn": "ভোরের রোজ পাইন",
 	"Rosé Pine Dawn": "ভোরের রোজ পাইন",
+	"RTL": "",
 	"Save": "সংরক্ষণ",
 	"Save": "সংরক্ষণ",
 	"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
 	"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
 	"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
 	"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
@@ -381,7 +390,7 @@
 	"Select a mode": "একটি মডেল নির্বাচন করুন",
 	"Select a mode": "একটি মডেল নির্বাচন করুন",
 	"Select a model": "একটি মডেল নির্বাচন করুন",
 	"Select a model": "একটি মডেল নির্বাচন করুন",
 	"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
 	"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
-	"Select model": "",
+	"Select model": "মডেল নির্বাচন করুন",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "একটি মেসেজ পাঠান",
 	"Send a Message": "একটি মেসেজ পাঠান",
 	"Send message": "মেসেজ পাঠান",
 	"Send message": "মেসেজ পাঠান",
@@ -411,7 +420,7 @@
 	"Sign Out": "সাইন আউট",
 	"Sign Out": "সাইন আউট",
 	"Sign up": "সাইন আপ",
 	"Sign up": "সাইন আপ",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "উৎস",
 	"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
 	"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
 	"Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন",
 	"Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন",
 	"SpeechRecognition API is not supported in this browser.": "এই ব্রাউজার স্পিচরিকগনিশন এপিআই সাপোর্ট করে না।",
 	"SpeechRecognition API is not supported in this browser.": "এই ব্রাউজার স্পিচরিকগনিশন এপিআই সাপোর্ট করে না।",

+ 18 - 9
src/lib/i18n/locales/ca-ES/translation.json

@@ -11,14 +11,16 @@
 	"About": "Sobre",
 	"About": "Sobre",
 	"Account": "Compte",
 	"Account": "Compte",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Afegeix un model",
 	"Add a model": "Afegeix un model",
 	"Add a model tag name": "Afegeix un nom d'etiqueta de model",
 	"Add a model tag name": "Afegeix un nom d'etiqueta de model",
 	"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
 	"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
 	"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
 	"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
 	"Add a tag": "Afegeix una etiqueta",
 	"Add a tag": "Afegeix una etiqueta",
-	"Add custom prompt": "",
+	"Add custom prompt": "Afegir un prompt personalitzat",
 	"Add Docs": "Afegeix Documents",
 	"Add Docs": "Afegeix Documents",
 	"Add Files": "Afegeix Arxius",
 	"Add Files": "Afegeix Arxius",
+	"Add Memory": "",
 	"Add message": "Afegeix missatge",
 	"Add message": "Afegeix missatge",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "afegeix etiquetes",
 	"Add Tags": "afegeix etiquetes",
@@ -48,8 +50,8 @@
 	"Archived Chats": "Arxiu d'historial de xat",
 	"Archived Chats": "Arxiu d'historial de xat",
 	"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
 	"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
 	"Are you sure?": "Estàs segur?",
 	"Are you sure?": "Estàs segur?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Adjuntar arxiu",
+	"Attention to detail": "Detall atent",
 	"Audio": "Àudio",
 	"Audio": "Àudio",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Resposta de reproducció automàtica",
 	"Auto-playback response": "Resposta de reproducció automàtica",
@@ -68,6 +70,7 @@
 	"Change Password": "Canvia la Contrasenya",
 	"Change Password": "Canvia la Contrasenya",
 	"Chat": "Xat",
 	"Chat": "Xat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Històric del Xat",
 	"Chat History": "Històric del Xat",
 	"Chat History is off for this browser.": "L'historial de xat està desactivat per a aquest navegador.",
 	"Chat History is off for this browser.": "L'historial de xat està desactivat per a aquest navegador.",
 	"Chats": "Xats",
 	"Chats": "Xats",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "Solapament de Blocs",
 	"Chunk Overlap": "Solapament de Blocs",
 	"Chunk Params": "Paràmetres de Blocs",
 	"Chunk Params": "Paràmetres de Blocs",
 	"Chunk Size": "Mida del Bloc",
 	"Chunk Size": "Mida del Bloc",
-	"Citation": "",
+	"Citation": "Citació",
 	"Click here for help.": "Fes clic aquí per ajuda.",
 	"Click here for help.": "Fes clic aquí per ajuda.",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.",
 	"Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.",
@@ -169,6 +172,7 @@
 	"Enabled": "Activat",
 	"Enabled": "Activat",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
 	"Enter {{role}} message here": "Introdueix aquí el missatge de {{role}}",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Introdueix el Solapament de Blocs",
 	"Enter Chunk Overlap": "Introdueix el Solapament de Blocs",
 	"Enter Chunk Size": "Introdueix la Mida del Bloc",
 	"Enter Chunk Size": "Introdueix la Mida del Bloc",
 	"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importa Fitxers de Model",
 	"Import Modelfiles": "Importa Fitxers de Model",
 	"Import Prompts": "Importa Prompts",
 	"Import Prompts": "Importa Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Entra ordres",
 	"Interface": "Interfície",
 	"Interface": "Interfície",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Clar",
 	"Light": "Clar",
 	"Listening...": "Escoltant...",
 	"Listening...": "Escoltant...",
 	"LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.",
 	"LLMs can make mistakes. Verify important information.": "Els LLMs poden cometre errors. Verifica la informació important.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
 	"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
 	"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
 	"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
 	"Manage LiteLLM Models": "Gestiona Models LiteLLM",
 	"Manage LiteLLM Models": "Gestiona Models LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Màxim de Tokens",
 	"Max Tokens": "Màxim de Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Eta de Mirostat",
 	"Mirostat Eta": "Eta de Mirostat",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "Sense font disponible",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "No estàs segur del que afegir?",
 	"Not sure what to add?": "No estàs segur del que afegir?",
 	"Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a",
 	"Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
 	"pending": "pendent",
 	"pending": "pendent",
 	"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permís denegat en accedir al micròfon: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Zona de Jocs",
 	"Playground": "Zona de Jocs",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Rol",
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Albada Rosé Pine",
 	"Rosé Pine Dawn": "Albada Rosé Pine",
+	"RTL": "",
 	"Save": "Guarda",
 	"Save": "Guarda",
 	"Save & Create": "Guarda i Crea",
 	"Save & Create": "Guarda i Crea",
 	"Save & Update": "Guarda i Actualitza",
 	"Save & Update": "Guarda i Actualitza",
@@ -381,7 +390,7 @@
 	"Select a mode": "Selecciona un mode",
 	"Select a mode": "Selecciona un mode",
 	"Select a model": "Selecciona un model",
 	"Select a model": "Selecciona un model",
 	"Select an Ollama instance": "Selecciona una instància d'Ollama",
 	"Select an Ollama instance": "Selecciona una instància d'Ollama",
-	"Select model": "",
+	"Select model": "Selecciona un model",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Envia un Missatge",
 	"Send a Message": "Envia un Missatge",
 	"Send message": "Envia missatge",
 	"Send message": "Envia missatge",
@@ -411,7 +420,7 @@
 	"Sign Out": "Tanca sessió",
 	"Sign Out": "Tanca sessió",
 	"Sign up": "Registra't",
 	"Sign up": "Registra't",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "Font",
 	"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
 	"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
 	"Speech-to-Text Engine": "Motor de Veu a Text",
 	"Speech-to-Text Engine": "Motor de Veu a Text",
 	"SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.",
 	"SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.",

+ 11 - 2
src/lib/i18n/locales/de-DE/translation.json

@@ -11,6 +11,7 @@
 	"About": "Über",
 	"About": "Über",
 	"Account": "Account",
 	"Account": "Account",
 	"Accurate information": "Genaue Information",
 	"Accurate information": "Genaue Information",
+	"Add": "",
 	"Add a model": "Füge ein Modell hinzu",
 	"Add a model": "Füge ein Modell hinzu",
 	"Add a model tag name": "Benenne deinen Modell-Tag",
 	"Add a model tag name": "Benenne deinen Modell-Tag",
 	"Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann",
 	"Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Eigenen Prompt hinzufügen",
 	"Add custom prompt": "Eigenen Prompt hinzufügen",
 	"Add Docs": "Dokumente hinzufügen",
 	"Add Docs": "Dokumente hinzufügen",
 	"Add Files": "Dateien hinzufügen",
 	"Add Files": "Dateien hinzufügen",
+	"Add Memory": "",
 	"Add message": "Nachricht eingeben",
 	"Add message": "Nachricht eingeben",
 	"Add Model": "Modell hinzufügen",
 	"Add Model": "Modell hinzufügen",
 	"Add Tags": "Tags hinzufügen",
 	"Add Tags": "Tags hinzufügen",
@@ -68,6 +70,7 @@
 	"Change Password": "Passwort ändern",
 	"Change Password": "Passwort ändern",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat Verlauf",
 	"Chat History": "Chat Verlauf",
 	"Chat History is off for this browser.": "Chat Verlauf ist für diesen Browser ausgeschaltet.",
 	"Chat History is off for this browser.": "Chat Verlauf ist für diesen Browser ausgeschaltet.",
 	"Chats": "Chats",
 	"Chats": "Chats",
@@ -169,6 +172,7 @@
 	"Enabled": "Aktiviert",
 	"Enabled": "Aktiviert",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Gib die {{role}} Nachricht hier ein",
 	"Enter {{role}} message here": "Gib die {{role}} Nachricht hier ein",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Gib den Chunk Overlap ein",
 	"Enter Chunk Overlap": "Gib den Chunk Overlap ein",
 	"Enter Chunk Size": "Gib die Chunk Size ein",
 	"Enter Chunk Size": "Gib die Chunk Size ein",
 	"Enter Image Size (e.g. 512x512)": "Gib die Bildgröße ein (z.B. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Gib die Bildgröße ein (z.B. 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Hell",
 	"Light": "Hell",
 	"Listening...": "Hören...",
 	"Listening...": "Hören...",
 	"LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.",
 	"LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Von der OpenWebUI-Community",
 	"Made by OpenWebUI Community": "Von der OpenWebUI-Community",
 	"Make sure to enclose them with": "Formatiere deine Variablen mit:",
 	"Make sure to enclose them with": "Formatiere deine Variablen mit:",
 	"Manage LiteLLM Models": "LiteLLM-Modelle verwalten",
 	"Manage LiteLLM Models": "LiteLLM-Modelle verwalten",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Maximale Tokens",
 	"Max Tokens": "Maximale Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuche es später erneut.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuche es später erneut.",
 	"May": "Mai",
 	"May": "Mai",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "Fortlaudende Nachrichten in diesem Chat werden nicht automatisch geteilt. Benutzer mit dem Link können den Chat einsehen.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Mindestscore",
 	"Minimum Score": "Mindestscore",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
 	"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
 	"pending": "ausstehend",
 	"pending": "ausstehend",
 	"Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Nur Text (.txt)",
 	"Plain text (.txt)": "Nur Text (.txt)",
 	"Playground": "Testumgebung",
 	"Playground": "Testumgebung",
 	"Positive attitude": "Positive Einstellung",
 	"Positive attitude": "Positive Einstellung",
@@ -362,6 +370,7 @@
 	"Role": "Rolle",
 	"Role": "Rolle",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Speichern",
 	"Save": "Speichern",
 	"Save & Create": "Speichern und erstellen",
 	"Save & Create": "Speichern und erstellen",
 	"Save & Update": "Speichern und aktualisieren",
 	"Save & Update": "Speichern und aktualisieren",
@@ -381,7 +390,7 @@
 	"Select a mode": "Einen Modus auswählen",
 	"Select a mode": "Einen Modus auswählen",
 	"Select a model": "Ein Modell auswählen",
 	"Select a model": "Ein Modell auswählen",
 	"Select an Ollama instance": "Eine Ollama Instanz auswählen",
 	"Select an Ollama instance": "Eine Ollama Instanz auswählen",
-	"Select model": "",
+	"Select model": "Modell auswählen",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Eine Nachricht senden",
 	"Send a Message": "Eine Nachricht senden",
 	"Send message": "Nachricht senden",
 	"Send message": "Nachricht senden",

+ 15 - 6
src/lib/i18n/locales/dg-DG/translation.json

@@ -11,6 +11,7 @@
 	"About": "Much About",
 	"About": "Much About",
 	"Account": "Account",
 	"Account": "Account",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Add a model",
 	"Add a model": "Add a model",
 	"Add a model tag name": "Add a model tag name",
 	"Add a model tag name": "Add a model tag name",
 	"Add a short description about what this modelfile does": "Add short description about what this modelfile does",
 	"Add a short description about what this modelfile does": "Add short description about what this modelfile does",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "",
 	"Add custom prompt": "",
 	"Add Docs": "Add Docs",
 	"Add Docs": "Add Docs",
 	"Add Files": "Add Files",
 	"Add Files": "Add Files",
+	"Add Memory": "",
 	"Add message": "Add Prompt",
 	"Add message": "Add Prompt",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "",
 	"Add Tags": "",
@@ -48,7 +50,7 @@
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "are allowed. Activate typing",
 	"are allowed - Activate this command by typing": "are allowed. Activate typing",
 	"Are you sure?": "Such certainty?",
 	"Are you sure?": "Such certainty?",
-	"Attach file": "",
+	"Attach file": "Attach file",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "Audio",
 	"Audio": "Audio",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Change Password",
 	"Change Password": "Change Password",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat History",
 	"Chat History": "Chat History",
 	"Chat History is off for this browser.": "Chat History off for this browser. Such sadness.",
 	"Chat History is off for this browser.": "Chat History off for this browser. Such sadness.",
 	"Chats": "Chats",
 	"Chats": "Chats",
@@ -169,6 +172,7 @@
 	"Enabled": "So Activated",
 	"Enabled": "So Activated",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Enter {{role}} bork here",
 	"Enter {{role}} message here": "Enter {{role}} bork here",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Enter Overlap of Chunks",
 	"Enter Chunk Overlap": "Enter Overlap of Chunks",
 	"Enter Chunk Size": "Enter Size of Chunk",
 	"Enter Chunk Size": "Enter Size of Chunk",
 	"Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Import Modelfiles",
 	"Import Modelfiles": "Import Modelfiles",
 	"Import Prompts": "Import Promptos",
 	"Import Prompts": "Import Promptos",
 	"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Input commands",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Light",
 	"Light": "Light",
 	"Listening...": "Listening...",
 	"Listening...": "Listening...",
 	"LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.",
 	"LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Made by OpenWebUI Community",
 	"Made by OpenWebUI Community": "Made by OpenWebUI Community",
 	"Make sure to enclose them with": "Make sure to enclose them with",
 	"Make sure to enclose them with": "Make sure to enclose them with",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max Tokens",
 	"Max Tokens": "Max Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "No source available",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "Not sure what to add?",
 	"Not sure what to add?": "Not sure what to add?",
 	"Not sure what to write? Switch to": "Not sure what to write? Switch to",
 	"Not sure what to write? Switch to": "Not sure what to write? Switch to",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
 	"pending": "pending",
 	"pending": "pending",
 	"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permission denied when accessing microphone: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Playground",
 	"Playground": "Playground",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Role",
 	"Role": "Role",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Save much wow",
 	"Save": "Save much wow",
 	"Save & Create": "Save & Create much create",
 	"Save & Create": "Save & Create much create",
 	"Save & Update": "Save & Update much update",
 	"Save & Update": "Save & Update much update",
@@ -381,7 +390,7 @@
 	"Select a mode": "Select a mode very choose",
 	"Select a mode": "Select a mode very choose",
 	"Select a model": "Select a model much choice",
 	"Select a model": "Select a model much choice",
 	"Select an Ollama instance": "Select an Ollama instance very choose",
 	"Select an Ollama instance": "Select an Ollama instance very choose",
-	"Select model": "",
+	"Select model": "Select model much choice",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Send a Message much message",
 	"Send a Message": "Send a Message much message",
 	"Send message": "Send message very send",
 	"Send message": "Send message very send",
@@ -411,7 +420,7 @@
 	"Sign Out": "Sign Out much logout",
 	"Sign Out": "Sign Out much logout",
 	"Sign up": "Sign up much join",
 	"Sign up": "Sign up much join",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "Source",
 	"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
 	"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
 	"Speech-to-Text Engine": "Speech-to-Text Engine much speak",
 	"Speech-to-Text Engine": "Speech-to-Text Engine much speak",
 	"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser. Much sad.",
 	"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser. Much sad.",

+ 10 - 1
src/lib/i18n/locales/en-GB/translation.json

@@ -11,6 +11,7 @@
 	"About": "",
 	"About": "",
 	"Account": "",
 	"Account": "",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "",
 	"Add a model": "",
 	"Add a model tag name": "",
 	"Add a model tag name": "",
 	"Add a short description about what this modelfile does": "",
 	"Add a short description about what this modelfile does": "",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "",
 	"Add custom prompt": "",
 	"Add Docs": "",
 	"Add Docs": "",
 	"Add Files": "",
 	"Add Files": "",
+	"Add Memory": "",
 	"Add message": "",
 	"Add message": "",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "",
 	"Add Tags": "",
@@ -68,6 +70,7 @@
 	"Change Password": "",
 	"Change Password": "",
 	"Chat": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "",
 	"Chat History": "",
 	"Chat History is off for this browser.": "",
 	"Chat History is off for this browser.": "",
 	"Chats": "",
 	"Chats": "",
@@ -169,6 +172,7 @@
 	"Enabled": "",
 	"Enabled": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "",
 	"Enter {{role}} message here": "",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Size": "",
 	"Enter Chunk Size": "",
 	"Enter Image Size (e.g. 512x512)": "",
 	"Enter Image Size (e.g. 512x512)": "",
@@ -247,6 +251,7 @@
 	"Light": "",
 	"Light": "",
 	"Listening...": "",
 	"Listening...": "",
 	"LLMs can make mistakes. Verify important information.": "",
 	"LLMs can make mistakes. Verify important information.": "",
+	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
 	"Manage LiteLLM Models": "",
@@ -256,7 +261,9 @@
 	"Max Tokens": "",
 	"Max Tokens": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Eta": "",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "",
 	"PDF Extract Images (OCR)": "",
 	"pending": "",
 	"pending": "",
 	"Permission denied when accessing microphone: {{error}}": "",
 	"Permission denied when accessing microphone: {{error}}": "",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "",
 	"Playground": "",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "",
 	"Role": "",
 	"Rosé Pine": "",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "",
 	"Save": "",
 	"Save & Create": "",
 	"Save & Create": "",
 	"Save & Update": "",
 	"Save & Update": "",

+ 10 - 1
src/lib/i18n/locales/en-US/translation.json

@@ -11,6 +11,7 @@
 	"About": "",
 	"About": "",
 	"Account": "",
 	"Account": "",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "",
 	"Add a model": "",
 	"Add a model tag name": "",
 	"Add a model tag name": "",
 	"Add a short description about what this modelfile does": "",
 	"Add a short description about what this modelfile does": "",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "",
 	"Add custom prompt": "",
 	"Add Docs": "",
 	"Add Docs": "",
 	"Add Files": "",
 	"Add Files": "",
+	"Add Memory": "",
 	"Add message": "",
 	"Add message": "",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "",
 	"Add Tags": "",
@@ -68,6 +70,7 @@
 	"Change Password": "",
 	"Change Password": "",
 	"Chat": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "",
 	"Chat History": "",
 	"Chat History is off for this browser.": "",
 	"Chat History is off for this browser.": "",
 	"Chats": "",
 	"Chats": "",
@@ -169,6 +172,7 @@
 	"Enabled": "",
 	"Enabled": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "",
 	"Enter {{role}} message here": "",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Overlap": "",
 	"Enter Chunk Size": "",
 	"Enter Chunk Size": "",
 	"Enter Image Size (e.g. 512x512)": "",
 	"Enter Image Size (e.g. 512x512)": "",
@@ -247,6 +251,7 @@
 	"Light": "",
 	"Light": "",
 	"Listening...": "",
 	"Listening...": "",
 	"LLMs can make mistakes. Verify important information.": "",
 	"LLMs can make mistakes. Verify important information.": "",
+	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
 	"Manage LiteLLM Models": "",
@@ -256,7 +261,9 @@
 	"Max Tokens": "",
 	"Max Tokens": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Eta": "",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "",
 	"PDF Extract Images (OCR)": "",
 	"pending": "",
 	"pending": "",
 	"Permission denied when accessing microphone: {{error}}": "",
 	"Permission denied when accessing microphone: {{error}}": "",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "",
 	"Playground": "",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "",
 	"Role": "",
 	"Rosé Pine": "",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "",
 	"Save": "",
 	"Save & Create": "",
 	"Save & Create": "",
 	"Save & Update": "",
 	"Save & Update": "",

+ 15 - 6
src/lib/i18n/locales/es-ES/translation.json

@@ -11,14 +11,16 @@
 	"About": "Sobre nosotros",
 	"About": "Sobre nosotros",
 	"Account": "Cuenta",
 	"Account": "Cuenta",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Agregar un modelo",
 	"Add a model": "Agregar un modelo",
 	"Add a model tag name": "Agregar un nombre de etiqueta de modelo",
 	"Add a model tag name": "Agregar un nombre de etiqueta de modelo",
 	"Add a short description about what this modelfile does": "Agregue una descripción corta de lo que este modelfile hace",
 	"Add a short description about what this modelfile does": "Agregue una descripción corta de lo que este modelfile hace",
 	"Add a short title for this prompt": "Agregue un título corto para este Prompt",
 	"Add a short title for this prompt": "Agregue un título corto para este Prompt",
 	"Add a tag": "Agregar una etiqueta",
 	"Add a tag": "Agregar una etiqueta",
-	"Add custom prompt": "",
+	"Add custom prompt": "Agregar un prompt personalizado",
 	"Add Docs": "Agregar Documentos",
 	"Add Docs": "Agregar Documentos",
 	"Add Files": "Agregar Archivos",
 	"Add Files": "Agregar Archivos",
+	"Add Memory": "",
 	"Add message": "Agregar Prompt",
 	"Add message": "Agregar Prompt",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "agregar etiquetas",
 	"Add Tags": "agregar etiquetas",
@@ -48,8 +50,8 @@
 	"Archived Chats": "Chats archivados",
 	"Archived Chats": "Chats archivados",
 	"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
 	"are allowed - Activate this command by typing": "están permitidos - Active este comando escribiendo",
 	"Are you sure?": "¿Está seguro?",
 	"Are you sure?": "¿Está seguro?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Adjuntar archivo",
+	"Attention to detail": "Detalle preciso",
 	"Audio": "Audio",
 	"Audio": "Audio",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Respuesta de reproducción automática",
 	"Auto-playback response": "Respuesta de reproducción automática",
@@ -68,6 +70,7 @@
 	"Change Password": "Cambia la Contraseña",
 	"Change Password": "Cambia la Contraseña",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historial del Chat",
 	"Chat History": "Historial del Chat",
 	"Chat History is off for this browser.": "El Historial del Chat está apagado para este navegador.",
 	"Chat History is off for this browser.": "El Historial del Chat está apagado para este navegador.",
 	"Chats": "Chats",
 	"Chats": "Chats",
@@ -169,6 +172,7 @@
 	"Enabled": "Activado",
 	"Enabled": "Activado",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí",
 	"Enter {{role}} message here": "Ingrese el mensaje {{role}} aquí",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
 	"Enter Chunk Overlap": "Ingresar superposición de fragmentos",
 	"Enter Chunk Size": "Ingrese el tamaño del fragmento",
 	"Enter Chunk Size": "Ingrese el tamaño del fragmento",
 	"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importar Modelfiles",
 	"Import Modelfiles": "Importar Modelfiles",
 	"Import Prompts": "Importar Prompts",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Ingresar comandos",
 	"Interface": "Interfaz",
 	"Interface": "Interfaz",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Claro",
 	"Light": "Claro",
 	"Listening...": "Escuchando...",
 	"Listening...": "Escuchando...",
 	"LLMs can make mistakes. Verify important information.": "Los LLM pueden cometer errores. Verifica la información importante.",
 	"LLMs can make mistakes. Verify important information.": "Los LLM pueden cometer errores. Verifica la información importante.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
 	"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
 	"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
 	"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
 	"Manage LiteLLM Models": "Administrar Modelos LiteLLM",
 	"Manage LiteLLM Models": "Administrar Modelos LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Máximo de Tokens",
 	"Max Tokens": "Máximo de Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
 	"pending": "pendiente",
 	"pending": "pendiente",
 	"Permission denied when accessing microphone: {{error}}": "Permiso denegado al acceder al micrófono: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permiso denegado al acceder al micrófono: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Patio de juegos",
 	"Playground": "Patio de juegos",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Rol",
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Guardar",
 	"Save": "Guardar",
 	"Save & Create": "Guardar y Crear",
 	"Save & Create": "Guardar y Crear",
 	"Save & Update": "Guardar y Actualizar",
 	"Save & Update": "Guardar y Actualizar",
@@ -381,7 +390,7 @@
 	"Select a mode": "Selecciona un modo",
 	"Select a mode": "Selecciona un modo",
 	"Select a model": "Selecciona un modelo",
 	"Select a model": "Selecciona un modelo",
 	"Select an Ollama instance": "Seleccione una instancia de Ollama",
 	"Select an Ollama instance": "Seleccione una instancia de Ollama",
-	"Select model": "",
+	"Select model": "Selecciona un modelo",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Enviar un Mensaje",
 	"Send a Message": "Enviar un Mensaje",
 	"Send message": "Enviar Mensaje",
 	"Send message": "Enviar Mensaje",

+ 15 - 6
src/lib/i18n/locales/fa-IR/translation.json

@@ -11,14 +11,16 @@
 	"About": "درباره",
 	"About": "درباره",
 	"Account": "حساب کاربری",
 	"Account": "حساب کاربری",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "اضافه کردن یک مدل",
 	"Add a model": "اضافه کردن یک مدل",
 	"Add a model tag name": "اضافه کردن یک نام تگ برای مدل",
 	"Add a model tag name": "اضافه کردن یک نام تگ برای مدل",
 	"Add a short description about what this modelfile does": "توضیح کوتاهی در مورد کاری که این فایل\u200cمدل انجام می دهد اضافه کنید",
 	"Add a short description about what this modelfile does": "توضیح کوتاهی در مورد کاری که این فایل\u200cمدل انجام می دهد اضافه کنید",
 	"Add a short title for this prompt": "یک عنوان کوتاه برای این درخواست اضافه کنید",
 	"Add a short title for this prompt": "یک عنوان کوتاه برای این درخواست اضافه کنید",
 	"Add a tag": "اضافه کردن یک تگ",
 	"Add a tag": "اضافه کردن یک تگ",
-	"Add custom prompt": "",
+	"Add custom prompt": "اضافه کردن یک درخواست سفارشی",
 	"Add Docs": "اضافه کردن اسناد",
 	"Add Docs": "اضافه کردن اسناد",
 	"Add Files": "اضافه کردن فایل\u200cها",
 	"Add Files": "اضافه کردن فایل\u200cها",
+	"Add Memory": "",
 	"Add message": "اضافه کردن پیغام",
 	"Add message": "اضافه کردن پیغام",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "اضافه کردن تگ\u200cها",
 	"Add Tags": "اضافه کردن تگ\u200cها",
@@ -48,8 +50,8 @@
 	"Archived Chats": "آرشیو تاریخچه چت",
 	"Archived Chats": "آرشیو تاریخچه چت",
 	"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
 	"are allowed - Activate this command by typing": "مجاز هستند - این دستور را با تایپ کردن این فعال کنید:",
 	"Are you sure?": "آیا مطمئن هستید؟",
 	"Are you sure?": "آیا مطمئن هستید؟",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "پیوست فایل",
+	"Attention to detail": "دقیق",
 	"Audio": "صدا",
 	"Audio": "صدا",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "پخش خودکار پاسخ ",
 	"Auto-playback response": "پخش خودکار پاسخ ",
@@ -68,6 +70,7 @@
 	"Change Password": "تغییر رمز عبور",
 	"Change Password": "تغییر رمز عبور",
 	"Chat": "گپ",
 	"Chat": "گپ",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "تاریخچه\u200cی گفتگو",
 	"Chat History": "تاریخچه\u200cی گفتگو",
 	"Chat History is off for this browser.": "سابقه گپ برای این مرورگر خاموش است.",
 	"Chat History is off for this browser.": "سابقه گپ برای این مرورگر خاموش است.",
 	"Chats": "گپ\u200cها",
 	"Chats": "گپ\u200cها",
@@ -169,6 +172,7 @@
 	"Enabled": "فعال",
 	"Enabled": "فعال",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید",
 	"Enter {{role}} message here": "پیام {{role}} را اینجا وارد کنید",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "مقدار Chunk Overlap را وارد کنید",
 	"Enter Chunk Overlap": "مقدار Chunk Overlap را وارد کنید",
 	"Enter Chunk Size": "مقدار Chunk Size را وارد کنید",
 	"Enter Chunk Size": "مقدار Chunk Size را وارد کنید",
 	"Enter Image Size (e.g. 512x512)": "اندازه تصویر را وارد کنید (مثال: 512x512)",
 	"Enter Image Size (e.g. 512x512)": "اندازه تصویر را وارد کنید (مثال: 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "ایمپورت فایل\u200cهای مدل",
 	"Import Modelfiles": "ایمپورت فایل\u200cهای مدل",
 	"Import Prompts": "ایمپورت پرامپت\u200cها",
 	"Import Prompts": "ایمپورت پرامپت\u200cها",
 	"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
 	"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
-	"Input commands": "",
+	"Input commands": "ورودی دستورات",
 	"Interface": "رابط",
 	"Interface": "رابط",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "روشن",
 	"Light": "روشن",
 	"Listening...": "در حال گوش دادن...",
 	"Listening...": "در حال گوش دادن...",
 	"LLMs can make mistakes. Verify important information.": "مدل\u200cهای زبانی بزرگ می\u200cتوانند اشتباه کنند. اطلاعات مهم را راستی\u200cآزمایی کنید.",
 	"LLMs can make mistakes. Verify important information.": "مدل\u200cهای زبانی بزرگ می\u200cتوانند اشتباه کنند. اطلاعات مهم را راستی\u200cآزمایی کنید.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
 	"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
 	"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
 	"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
@@ -256,7 +261,9 @@
 	"Max Tokens": "حداکثر توکن",
 	"Max Tokens": "حداکثر توکن",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
 	"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
 	"pending": "در انتظار",
 	"pending": "در انتظار",
 	"Permission denied when accessing microphone: {{error}}": "هنگام دسترسی به میکروفون، اجازه داده نشد: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "هنگام دسترسی به میکروفون، اجازه داده نشد: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "زمین بازی",
 	"Playground": "زمین بازی",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "نقش",
 	"Role": "نقش",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "ذخیره",
 	"Save": "ذخیره",
 	"Save & Create": "ذخیره و ایجاد",
 	"Save & Create": "ذخیره و ایجاد",
 	"Save & Update": "ذخیره و به\u200cروزرسانی",
 	"Save & Update": "ذخیره و به\u200cروزرسانی",
@@ -381,7 +390,7 @@
 	"Select a mode": "یک حالت انتخاب کنید",
 	"Select a mode": "یک حالت انتخاب کنید",
 	"Select a model": "انتخاب یک مدل",
 	"Select a model": "انتخاب یک مدل",
 	"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
 	"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
-	"Select model": "",
+	"Select model": "انتخاب یک مدل",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "ارسال یک پیام",
 	"Send a Message": "ارسال یک پیام",
 	"Send message": "ارسال پیام",
 	"Send message": "ارسال پیام",

+ 10 - 1
src/lib/i18n/locales/fi-FI/translation.json

@@ -11,6 +11,7 @@
 	"About": "Tietoja",
 	"About": "Tietoja",
 	"Account": "Tili",
 	"Account": "Tili",
 	"Accurate information": "Tarkkaa tietoa",
 	"Accurate information": "Tarkkaa tietoa",
+	"Add": "",
 	"Add a model": "Lisää malli",
 	"Add a model": "Lisää malli",
 	"Add a model tag name": "Lisää mallitagi",
 	"Add a model tag name": "Lisää mallitagi",
 	"Add a short description about what this modelfile does": "Lisää lyhyt kuvaus siitä, mitä tämä mallitiedosto tekee",
 	"Add a short description about what this modelfile does": "Lisää lyhyt kuvaus siitä, mitä tämä mallitiedosto tekee",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Lisää mukautettu kehote",
 	"Add custom prompt": "Lisää mukautettu kehote",
 	"Add Docs": "Lisää asiakirjoja",
 	"Add Docs": "Lisää asiakirjoja",
 	"Add Files": "Lisää tiedostoja",
 	"Add Files": "Lisää tiedostoja",
+	"Add Memory": "",
 	"Add message": "Lisää viesti",
 	"Add message": "Lisää viesti",
 	"Add Model": "Lisää malli",
 	"Add Model": "Lisää malli",
 	"Add Tags": "Lisää tageja",
 	"Add Tags": "Lisää tageja",
@@ -68,6 +70,7 @@
 	"Change Password": "Vaihda salasana",
 	"Change Password": "Vaihda salasana",
 	"Chat": "Keskustelu",
 	"Chat": "Keskustelu",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Keskusteluhistoria",
 	"Chat History": "Keskusteluhistoria",
 	"Chat History is off for this browser.": "Keskusteluhistoria on pois päältä tällä selaimella.",
 	"Chat History is off for this browser.": "Keskusteluhistoria on pois päältä tällä selaimella.",
 	"Chats": "Keskustelut",
 	"Chats": "Keskustelut",
@@ -169,6 +172,7 @@
 	"Enabled": "Käytössä",
 	"Enabled": "Käytössä",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta seuraavassa järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.",
 	"Enter {{role}} message here": "Kirjoita {{role}} viesti tähän",
 	"Enter {{role}} message here": "Kirjoita {{role}} viesti tähän",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Syötä osien päällekkäisyys",
 	"Enter Chunk Overlap": "Syötä osien päällekkäisyys",
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter Image Size (e.g. 512x512)": "Syötä kuvan koko (esim. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Syötä kuvan koko (esim. 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Vaalea",
 	"Light": "Vaalea",
 	"Listening...": "Kuunnellaan...",
 	"Listening...": "Kuunnellaan...",
 	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Varmista tärkeät tiedot.",
 	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Varmista tärkeät tiedot.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
 	"Manage LiteLLM Models": "Hallitse LiteLLM-malleja",
 	"Manage LiteLLM Models": "Hallitse LiteLLM-malleja",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Maksimitokenit",
 	"Max Tokens": "Maksimitokenit",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
 	"May": "toukokuu",
 	"May": "toukokuu",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "Viestejä, jotka lähetät luotuasi linkin, ei jaeta. Käyttäjät, joilla on tämä osoite voivat tarkastella jaettua keskustelua.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Vähimmäispisteet",
 	"Minimum Score": "Vähimmäispisteet",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
 	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
 	"pending": "odottaa",
 	"pending": "odottaa",
 	"Permission denied when accessing microphone: {{error}}": "Mikrofonin käyttöoikeus evätty: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Mikrofonin käyttöoikeus evätty: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Pelkkä teksti (.txt)",
 	"Plain text (.txt)": "Pelkkä teksti (.txt)",
 	"Playground": "Leikkipaikka",
 	"Playground": "Leikkipaikka",
 	"Positive attitude": "Positiivinen asenne",
 	"Positive attitude": "Positiivinen asenne",
@@ -362,6 +370,7 @@
 	"Role": "Rooli",
 	"Role": "Rooli",
 	"Rosé Pine": "Rosee-mänty",
 	"Rosé Pine": "Rosee-mänty",
 	"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
 	"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
+	"RTL": "",
 	"Save": "Tallenna",
 	"Save": "Tallenna",
 	"Save & Create": "Tallenna ja luo",
 	"Save & Create": "Tallenna ja luo",
 	"Save & Update": "Tallenna ja päivitä",
 	"Save & Update": "Tallenna ja päivitä",

+ 18 - 9
src/lib/i18n/locales/fr-CA/translation.json

@@ -11,14 +11,16 @@
 	"About": "À propos",
 	"About": "À propos",
 	"Account": "Compte",
 	"Account": "Compte",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Ajouter un modèle",
 	"Add a model": "Ajouter un modèle",
 	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
 	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
 	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
 	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a tag": "Ajouter un tag",
 	"Add a tag": "Ajouter un tag",
-	"Add custom prompt": "",
+	"Add custom prompt": "Ajouter un prompt personnalisé",
 	"Add Docs": "Ajouter des documents",
 	"Add Docs": "Ajouter des documents",
 	"Add Files": "Ajouter des fichiers",
 	"Add Files": "Ajouter des fichiers",
+	"Add Memory": "",
 	"Add message": "Ajouter un message",
 	"Add message": "Ajouter un message",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "ajouter des tags",
 	"Add Tags": "ajouter des tags",
@@ -48,8 +50,8 @@
 	"Archived Chats": "enregistrement du chat",
 	"Archived Chats": "enregistrement du chat",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"Are you sure?": "Êtes-vous sûr ?",
 	"Are you sure?": "Êtes-vous sûr ?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Joindre un fichier",
+	"Attention to detail": "Attention aux détails",
 	"Audio": "Audio",
 	"Audio": "Audio",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Réponse en lecture automatique",
 	"Auto-playback response": "Réponse en lecture automatique",
@@ -68,6 +70,7 @@
 	"Change Password": "Changer le mot de passe",
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Discussion",
 	"Chat": "Discussion",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historique des discussions",
 	"Chat History": "Historique des discussions",
 	"Chat History is off for this browser.": "L'historique des discussions est désactivé pour ce navigateur.",
 	"Chat History is off for this browser.": "L'historique des discussions est désactivé pour ce navigateur.",
 	"Chats": "Discussions",
 	"Chats": "Discussions",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Size": "Taille de bloc",
 	"Chunk Size": "Taille de bloc",
-	"Citation": "",
+	"Citation": "Citations",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
 	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
@@ -169,6 +172,7 @@
 	"Enabled": "Activé",
 	"Enabled": "Activé",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importer les fichiers de modèle",
 	"Import Modelfiles": "Importer les fichiers de modèle",
 	"Import Prompts": "Importer les prompts",
 	"Import Prompts": "Importer les prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Entrez des commandes d'entrée",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Lumière",
 	"Light": "Lumière",
 	"Listening...": "Écoute...",
 	"Listening...": "Écoute...",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Tokens maximaux",
 	"Max Tokens": "Tokens maximaux",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "Aucune source disponible",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "Pas sûr de quoi ajouter ?",
 	"Not sure what to add?": "Pas sûr de quoi ajouter ?",
 	"Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour",
 	"Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"pending": "en attente",
 	"pending": "en attente",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Aire de jeu",
 	"Playground": "Aire de jeu",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Rôle",
 	"Role": "Rôle",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
+	"RTL": "",
 	"Save": "Enregistrer",
 	"Save": "Enregistrer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Update": "Enregistrer & Mettre à jour",
 	"Save & Update": "Enregistrer & Mettre à jour",
@@ -381,7 +390,7 @@
 	"Select a mode": "Sélectionnez un mode",
 	"Select a mode": "Sélectionnez un mode",
 	"Select a model": "Sélectionnez un modèle",
 	"Select a model": "Sélectionnez un modèle",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
-	"Select model": "",
+	"Select model": "Sélectionnez un modèle",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Envoyer un message",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -411,7 +420,7 @@
 	"Sign Out": "Se déconnecter",
 	"Sign Out": "Se déconnecter",
 	"Sign up": "S'inscrire",
 	"Sign up": "S'inscrire",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "Source",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
 	"Speech-to-Text Engine": "Moteur reconnaissance vocale",
 	"Speech-to-Text Engine": "Moteur reconnaissance vocale",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",

+ 18 - 9
src/lib/i18n/locales/fr-FR/translation.json

@@ -11,14 +11,16 @@
 	"About": "À propos",
 	"About": "À propos",
 	"Account": "Compte",
 	"Account": "Compte",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Ajouter un modèle",
 	"Add a model": "Ajouter un modèle",
 	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
 	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
 	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
 	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a tag": "Ajouter un tag",
 	"Add a tag": "Ajouter un tag",
-	"Add custom prompt": "",
+	"Add custom prompt": "Ajouter un prompt personnalisé",
 	"Add Docs": "Ajouter des documents",
 	"Add Docs": "Ajouter des documents",
 	"Add Files": "Ajouter des fichiers",
 	"Add Files": "Ajouter des fichiers",
+	"Add Memory": "",
 	"Add message": "Ajouter un message",
 	"Add message": "Ajouter un message",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "ajouter des tags",
 	"Add Tags": "ajouter des tags",
@@ -48,8 +50,8 @@
 	"Archived Chats": "enregistrement du chat",
 	"Archived Chats": "enregistrement du chat",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"are allowed - Activate this command by typing": "sont autorisés - Activez cette commande en tapant",
 	"Are you sure?": "Êtes-vous sûr ?",
 	"Are you sure?": "Êtes-vous sûr ?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Joindre un fichier",
+	"Attention to detail": "Attention aux détails",
 	"Audio": "Audio",
 	"Audio": "Audio",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Réponse en lecture automatique",
 	"Auto-playback response": "Réponse en lecture automatique",
@@ -68,6 +70,7 @@
 	"Change Password": "Changer le mot de passe",
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historique du chat",
 	"Chat History": "Historique du chat",
 	"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
 	"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
 	"Chats": "Chats",
 	"Chats": "Chats",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Overlap": "Chevauchement de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Params": "Paramètres de bloc",
 	"Chunk Size": "Taille de bloc",
 	"Chunk Size": "Taille de bloc",
-	"Citation": "",
+	"Citation": "Citations",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
 	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
@@ -169,6 +172,7 @@
 	"Enabled": "Activé",
 	"Enabled": "Activé",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
 	"Enter {{role}} message here": "Entrez le message {{role}} ici",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Overlap": "Entrez le chevauchement de bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importer les fichiers de modèle",
 	"Import Modelfiles": "Importer les fichiers de modèle",
 	"Import Prompts": "Importer les prompts",
 	"Import Prompts": "Importer les prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Entrez les commandes d'entrée",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Clair",
 	"Light": "Clair",
 	"Listening...": "Écoute...",
 	"Listening...": "Écoute...",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
 	"LLMs can make mistakes. Verify important information.": "Les LLMs peuvent faire des erreurs. Vérifiez les informations importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Tokens maximaux",
 	"Max Tokens": "Tokens maximaux",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "Aucune source disponible",
 	"Not factually correct": "",
 	"Not factually correct": "",
 	"Not sure what to add?": "Vous ne savez pas quoi ajouter ?",
 	"Not sure what to add?": "Vous ne savez pas quoi ajouter ?",
 	"Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers",
 	"Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
 	"pending": "en attente",
 	"pending": "en attente",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permission refusée lors de l'accès au microphone : {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Aire de jeu",
 	"Playground": "Aire de jeu",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Rôle",
 	"Role": "Rôle",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
+	"RTL": "",
 	"Save": "Enregistrer",
 	"Save": "Enregistrer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Update": "Enregistrer & Mettre à jour",
 	"Save & Update": "Enregistrer & Mettre à jour",
@@ -381,7 +390,7 @@
 	"Select a mode": "Sélectionnez un mode",
 	"Select a mode": "Sélectionnez un mode",
 	"Select a model": "Sélectionner un modèle",
 	"Select a model": "Sélectionner un modèle",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
-	"Select model": "",
+	"Select model": "Sélectionner un modèle",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Envoyer un message",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -411,7 +420,7 @@
 	"Sign Out": "Se déconnecter",
 	"Sign Out": "Se déconnecter",
 	"Sign up": "S'inscrire",
 	"Sign up": "S'inscrire",
 	"Signing in": "",
 	"Signing in": "",
-	"Source": "",
+	"Source": "Source",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
 	"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
 	"Speech-to-Text Engine": "Moteur de reconnaissance vocale",
 	"Speech-to-Text Engine": "Moteur de reconnaissance vocale",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
 	"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",

+ 10 - 1
src/lib/i18n/locales/he-IL/translation.json

@@ -11,6 +11,7 @@
 	"About": "אודות",
 	"About": "אודות",
 	"Account": "חשבון",
 	"Account": "חשבון",
 	"Accurate information": "מידע מדויק",
 	"Accurate information": "מידע מדויק",
+	"Add": "",
 	"Add a model": "הוסף מודל",
 	"Add a model": "הוסף מודל",
 	"Add a model tag name": "הוסף שם תג למודל",
 	"Add a model tag name": "הוסף שם תג למודל",
 	"Add a short description about what this modelfile does": "הוסף תיאור קצר על מה שהקובץ מודל עושה",
 	"Add a short description about what this modelfile does": "הוסף תיאור קצר על מה שהקובץ מודל עושה",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "הוסף פקודה מותאמת אישית",
 	"Add custom prompt": "הוסף פקודה מותאמת אישית",
 	"Add Docs": "הוסף מסמכים",
 	"Add Docs": "הוסף מסמכים",
 	"Add Files": "הוסף קבצים",
 	"Add Files": "הוסף קבצים",
+	"Add Memory": "",
 	"Add message": "הוסף הודעה",
 	"Add message": "הוסף הודעה",
 	"Add Model": "הוסף מודל",
 	"Add Model": "הוסף מודל",
 	"Add Tags": "הוסף תגים",
 	"Add Tags": "הוסף תגים",
@@ -68,6 +70,7 @@
 	"Change Password": "שנה סיסמה",
 	"Change Password": "שנה סיסמה",
 	"Chat": "צ'אט",
 	"Chat": "צ'אט",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "היסטוריית צ'אט",
 	"Chat History": "היסטוריית צ'אט",
 	"Chat History is off for this browser.": "היסטוריית הצ'אט כבויה לדפדפן זה.",
 	"Chat History is off for this browser.": "היסטוריית הצ'אט כבויה לדפדפן זה.",
 	"Chats": "צ'אטים",
 	"Chats": "צ'אטים",
@@ -169,6 +172,7 @@
 	"Enabled": "מופעל",
 	"Enabled": "מופעל",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ודא שקובץ ה-CSV שלך כולל 4 עמודות בסדר הבא: שם, דוא\"ל, סיסמה, תפקיד.",
 	"Enter {{role}} message here": "הזן הודעת {{role}} כאן",
 	"Enter {{role}} message here": "הזן הודעת {{role}} כאן",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "הזן חפיפת נתונים",
 	"Enter Chunk Overlap": "הזן חפיפת נתונים",
 	"Enter Chunk Size": "הזן גודל נתונים",
 	"Enter Chunk Size": "הזן גודל נתונים",
 	"Enter Image Size (e.g. 512x512)": "הזן גודל תמונה (למשל 512x512)",
 	"Enter Image Size (e.g. 512x512)": "הזן גודל תמונה (למשל 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "בהיר",
 	"Light": "בהיר",
 	"Listening...": "מאזין...",
 	"Listening...": "מאזין...",
 	"LLMs can make mistakes. Verify important information.": "מודלים בשפה טבעית יכולים לטעות. אמת מידע חשוב.",
 	"LLMs can make mistakes. Verify important information.": "מודלים בשפה טבעית יכולים לטעות. אמת מידע חשוב.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
 	"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
 	"Make sure to enclose them with": "ודא להקיף אותם עם",
 	"Make sure to enclose them with": "ודא להקיף אותם עם",
 	"Manage LiteLLM Models": "נהל מודלים של LiteLLM",
 	"Manage LiteLLM Models": "נהל מודלים של LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "מקסימום טוקנים",
 	"Max Tokens": "מקסימום טוקנים",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
 	"May": "מאי",
 	"May": "מאי",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "הודעות שתשלח לאחר יצירת הקישור שלך לא ישותפו. משתמשים עם הכתובת URL יוכלו לצפות בצ'אט המשותף.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "ציון מינימלי",
 	"Minimum Score": "ציון מינימלי",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
 	"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
 	"pending": "ממתין",
 	"pending": "ממתין",
 	"Permission denied when accessing microphone: {{error}}": "ההרשאה נדחתה בעת גישה למיקרופון: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "ההרשאה נדחתה בעת גישה למיקרופון: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "טקסט פשוט (.txt)",
 	"Plain text (.txt)": "טקסט פשוט (.txt)",
 	"Playground": "אזור משחקים",
 	"Playground": "אזור משחקים",
 	"Positive attitude": "גישה חיובית",
 	"Positive attitude": "גישה חיובית",
@@ -362,6 +370,7 @@
 	"Role": "תפקיד",
 	"Role": "תפקיד",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "שמור",
 	"Save": "שמור",
 	"Save & Create": "שמור וצור",
 	"Save & Create": "שמור וצור",
 	"Save & Update": "שמור ועדכן",
 	"Save & Update": "שמור ועדכן",

+ 17 - 8
src/lib/i18n/locales/hi-IN/translation.json

@@ -11,14 +11,16 @@
 	"About": "हमारे बारे में",
 	"About": "हमारे बारे में",
 	"Account": "खाता",
 	"Account": "खाता",
 	"Accurate information": "सटीक जानकारी",
 	"Accurate information": "सटीक जानकारी",
+	"Add": "",
 	"Add a model": "एक मॉडल जोड़ें",
 	"Add a model": "एक मॉडल जोड़ें",
 	"Add a model tag name": "एक मॉडल टैग नाम जोड़ें",
 	"Add a model tag name": "एक मॉडल टैग नाम जोड़ें",
 	"Add a short description about what this modelfile does": "यह मॉडलफ़ाइल क्या करती है इसके बारे में एक संक्षिप्त विवरण जोड़ें",
 	"Add a short description about what this modelfile does": "यह मॉडलफ़ाइल क्या करती है इसके बारे में एक संक्षिप्त विवरण जोड़ें",
 	"Add a short title for this prompt": "इस संकेत के लिए एक संक्षिप्त शीर्षक जोड़ें",
 	"Add a short title for this prompt": "इस संकेत के लिए एक संक्षिप्त शीर्षक जोड़ें",
 	"Add a tag": "एक टैग जोड़े",
 	"Add a tag": "एक टैग जोड़े",
-	"Add custom prompt": "",
+	"Add custom prompt": "अनुकूल संकेत जोड़ें",
 	"Add Docs": "दस्तावेज़ जोड़ें",
 	"Add Docs": "दस्तावेज़ जोड़ें",
 	"Add Files": "फाइलें जोड़ें",
 	"Add Files": "फाइलें जोड़ें",
+	"Add Memory": "",
 	"Add message": "संदेश डालें",
 	"Add message": "संदेश डालें",
 	"Add Model": "मॉडल जोड़ें",
 	"Add Model": "मॉडल जोड़ें",
 	"Add Tags": "टैगों को जोड़ें",
 	"Add Tags": "टैगों को जोड़ें",
@@ -48,7 +50,7 @@
 	"Archived Chats": "संग्रहीत चैट",
 	"Archived Chats": "संग्रहीत चैट",
 	"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
 	"are allowed - Activate this command by typing": "अनुमति है - टाइप करके इस कमांड को सक्रिय करें",
 	"Are you sure?": "क्या आपको यकीन है?",
 	"Are you sure?": "क्या आपको यकीन है?",
-	"Attach file": "",
+	"Attach file": "फ़ाइल atta",
 	"Attention to detail": "विस्तार पर ध्यान",
 	"Attention to detail": "विस्तार पर ध्यान",
 	"Audio": "ऑडियो",
 	"Audio": "ऑडियो",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "पासवर्ड बदलें",
 	"Change Password": "पासवर्ड बदलें",
 	"Chat": "चैट करें",
 	"Chat": "चैट करें",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "चैट का इतिहास",
 	"Chat History": "चैट का इतिहास",
 	"Chat History is off for this browser.": "इस ब्राउज़र के लिए चैट इतिहास बंद है।",
 	"Chat History is off for this browser.": "इस ब्राउज़र के लिए चैट इतिहास बंद है।",
 	"Chats": "सभी चैट",
 	"Chats": "सभी चैट",
@@ -78,7 +81,7 @@
 	"Chunk Overlap": "चंक ओवरलैप",
 	"Chunk Overlap": "चंक ओवरलैप",
 	"Chunk Params": "चंक पैरामीटर्स",
 	"Chunk Params": "चंक पैरामीटर्स",
 	"Chunk Size": "चंक आकार",
 	"Chunk Size": "चंक आकार",
-	"Citation": "",
+	"Citation": "उद्धरण",
 	"Click here for help.": "सहायता के लिए यहां क्लिक करें।",
 	"Click here for help.": "सहायता के लिए यहां क्लिक करें।",
 	"Click here to": "",
 	"Click here to": "",
 	"Click here to check other modelfiles.": "अन्य मॉडल फ़ाइलों की जांच के लिए यहां क्लिक करें।",
 	"Click here to check other modelfiles.": "अन्य मॉडल फ़ाइलों की जांच के लिए यहां क्लिक करें।",
@@ -169,6 +172,7 @@
 	"Enabled": "सक्रिय",
 	"Enabled": "सक्रिय",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "सुनिश्चित करें कि आपकी CSV फ़ाइल में इस क्रम में 4 कॉलम शामिल हैं: नाम, ईमेल, पासवर्ड, भूमिका।",
 	"Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें",
 	"Enter {{role}} message here": "यहां {{role}} संदेश दर्ज करें",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "चंक ओवरलैप दर्ज करें",
 	"Enter Chunk Overlap": "चंक ओवरलैप दर्ज करें",
 	"Enter Chunk Size": "खंड आकार दर्ज करें",
 	"Enter Chunk Size": "खंड आकार दर्ज करें",
 	"Enter Image Size (e.g. 512x512)": "छवि का आकार दर्ज करें (उदा. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "छवि का आकार दर्ज करें (उदा. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "मॉडल फ़ाइलें आयात करें",
 	"Import Modelfiles": "मॉडल फ़ाइलें आयात करें",
 	"Import Prompts": "प्रॉम्प्ट आयात करें",
 	"Import Prompts": "प्रॉम्प्ट आयात करें",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
-	"Input commands": "",
+	"Input commands": "इनपुट क命",
 	"Interface": "इंटरफेस",
 	"Interface": "इंटरफेस",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "",
 	"Light": "",
 	"Listening...": "सुन रहा हूँ...",
 	"Listening...": "सुन रहा हूँ...",
 	"LLMs can make mistakes. Verify important information.": "एलएलएम गलतियाँ कर सकते हैं। महत्वपूर्ण जानकारी सत्यापित करें.",
 	"LLMs can make mistakes. Verify important information.": "एलएलएम गलतियाँ कर सकते हैं। महत्वपूर्ण जानकारी सत्यापित करें.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
 	"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
 	"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
 	"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
 	"Manage LiteLLM Models": "LiteLLM मॉडल प्रबंधित करें",
 	"Manage LiteLLM Models": "LiteLLM मॉडल प्रबंधित करें",
@@ -256,7 +261,9 @@
 	"Max Tokens": "अधिकतम टोकन",
 	"Max Tokens": "अधिकतम टोकन",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "न्यूनतम स्कोर",
 	"Minimum Score": "न्यूनतम स्कोर",
 	"Mirostat": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Eta": "",
@@ -287,7 +294,7 @@
 	"No results found": "",
 	"No results found": "",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
-	"No source available": "",
+	"No source available": "कोई स्रोत उपलब्ध नहीं है",
 	"Not factually correct": "तथ्यात्मक रूप से सही नहीं है",
 	"Not factually correct": "तथ्यात्मक रूप से सही नहीं है",
 	"Not sure what to add?": "निश्चित नहीं कि क्या जोड़ें?",
 	"Not sure what to add?": "निश्चित नहीं कि क्या जोड़ें?",
 	"Not sure what to write? Switch to": "मैं आश्वस्त नहीं हूं कि क्या लिखना है? स्विच करें",
 	"Not sure what to write? Switch to": "मैं आश्वस्त नहीं हूं कि क्या लिखना है? स्विच करें",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
 	"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
 	"pending": "लंबित",
 	"pending": "लंबित",
 	"Permission denied when accessing microphone: {{error}}": "माइक्रोफ़ोन तक पहुँचने पर अनुमति अस्वीकृत: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "माइक्रोफ़ोन तक पहुँचने पर अनुमति अस्वीकृत: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "सादा पाठ (.txt)",
 	"Plain text (.txt)": "सादा पाठ (.txt)",
 	"Playground": "कार्यक्षेत्र",
 	"Playground": "कार्यक्षेत्र",
 	"Positive attitude": "सकारात्मक रवैया",
 	"Positive attitude": "सकारात्मक रवैया",
@@ -362,6 +370,7 @@
 	"Role": "भूमिका",
 	"Role": "भूमिका",
 	"Rosé Pine": "",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "सहेजें",
 	"Save": "सहेजें",
 	"Save & Create": "सहेजें और बनाएं",
 	"Save & Create": "सहेजें और बनाएं",
 	"Save & Update": "सहेजें और अपडेट करें",
 	"Save & Update": "सहेजें और अपडेट करें",
@@ -381,7 +390,7 @@
 	"Select a mode": "एक मोड चुनें",
 	"Select a mode": "एक मोड चुनें",
 	"Select a model": "एक मॉडल चुनें",
 	"Select a model": "एक मॉडल चुनें",
 	"Select an Ollama instance": "एक Ollama Instance चुनें",
 	"Select an Ollama instance": "एक Ollama Instance चुनें",
-	"Select model": "",
+	"Select model": "मॉडल चुनें",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "एक संदेश भेजो",
 	"Send a Message": "एक संदेश भेजो",
 	"Send message": "मेसेज भेजें",
 	"Send message": "मेसेज भेजें",
@@ -411,7 +420,7 @@
 	"Sign Out": "साइन आउट",
 	"Sign Out": "साइन आउट",
 	"Sign up": "साइन अप",
 	"Sign up": "साइन अप",
 	"Signing in": "साइन इन हो रहा है",
 	"Signing in": "साइन इन हो रहा है",
-	"Source": "",
+	"Source": "स्रोत",
 	"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
 	"Speech recognition error: {{error}}": "वाक् पहचान त्रुटि: {{error}}",
 	"Speech-to-Text Engine": "वाक्-से-पाठ इंजन",
 	"Speech-to-Text Engine": "वाक्-से-पाठ इंजन",
 	"SpeechRecognition API is not supported in this browser.": "इस ब्राउज़र में SpeechRecognition API समर्थित नहीं है",
 	"SpeechRecognition API is not supported in this browser.": "इस ब्राउज़र में SpeechRecognition API समर्थित नहीं है",

+ 511 - 0
src/lib/i18n/locales/hr-HR/translation.json

@@ -0,0 +1,511 @@
+{
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' ili '-1' za bez isteka.",
+	"(Beta)": "(Beta)",
+	"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
+	"(latest)": "(najnovije)",
+	"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
+	"{{user}}'s Chats": "Razgovori korisnika {{user}}",
+	"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
+	"a user": "korisnik",
+	"About": "O",
+	"Account": "Račun",
+	"Accurate information": "Točne informacije",
+	"Add": "",
+	"Add a model": "Dodaj model",
+	"Add a model tag name": "Dodaj oznaku modela",
+	"Add a short description about what this modelfile does": "Dodajte kratak opis što ova datoteka modela radi",
+	"Add a short title for this prompt": "Dodajte kratki naslov za ovaj prompt",
+	"Add a tag": "Dodaj oznaku",
+	"Add custom prompt": "Dodaj prilagođeni prompt",
+	"Add Docs": "Dodaj dokumente",
+	"Add Files": "Dodaj datoteke",
+	"Add Memory": "",
+	"Add message": "Dodaj poruku",
+	"Add Model": "Dodaj model",
+	"Add Tags": "Dodaj oznake",
+	"Add User": "Dodaj korisnika",
+	"Adjusting these settings will apply changes universally to all users.": "Podešavanje ovih postavki primijenit će promjene univerzalno na sve korisnike.",
+	"admin": "administrator",
+	"Admin Panel": "Administratorska ploča",
+	"Admin Settings": "Administratorske postavke",
+	"Advanced Parameters": "Napredni parametri",
+	"all": "sve",
+	"All Documents": "Svi dokumenti",
+	"All Users": "Svi korisnici",
+	"Allow": "Dopusti",
+	"Allow Chat Deletion": "Dopusti brisanje razgovora",
+	"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
+	"Already have an account?": "Već imate račun?",
+	"an assistant": "asistent",
+	"and": "i",
+	"and create a new shared link.": "i stvorite novu dijeljenu vezu.",
+	"API Base URL": "Osnovni URL API-ja",
+	"API Key": "API ključ",
+	"API Key created.": "API ključ je stvoren.",
+	"API keys": "API ključevi",
+	"API RPM": "API RPM",
+	"April": "Travanj",
+	"Archive": "Arhiva",
+	"Archived Chats": "Arhivirani razgovori",
+	"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
+	"Are you sure?": "Jeste li sigurni?",
+	"Attach file": "Priloži datoteku",
+	"Attention to detail": "Pažnja na detalje",
+	"Audio": "Audio",
+	"August": "Kolovoz",
+	"Auto-playback response": "Automatska reprodukcija odgovora",
+	"Auto-send input after 3 sec.": "Automatsko slanje unosa nakon 3 sek.",
+	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 osnovni URL",
+	"AUTOMATIC1111 Base URL is required.": "Potreban je AUTOMATIC1111 osnovni URL.",
+	"available!": "dostupno!",
+	"Back": "Natrag",
+	"Bad Response": "Loš odgovor",
+	"before": "prije",
+	"Being lazy": "Biti lijen",
+	"Builder Mode": "Način graditelja",
+	"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
+	"Cancel": "Otkaži",
+	"Categories": "Kategorije",
+	"Change Password": "Promijeni lozinku",
+	"Chat": "Razgovor",
+	"Chat Bubble UI": "",
+	"Chat direction": "",
+	"Chat History": "Povijest razgovora",
+	"Chat History is off for this browser.": "Povijest razgovora je isključena za ovaj preglednik.",
+	"Chats": "Razgovori",
+	"Check Again": "Provjeri ponovo",
+	"Check for updates": "Provjeri za ažuriranja",
+	"Checking for updates...": "Provjeravam ažuriranja...",
+	"Choose a model before saving...": "Odaberite model prije spremanja...",
+	"Chunk Overlap": "Preklapanje dijelova",
+	"Chunk Params": "Parametri dijelova",
+	"Chunk Size": "Veličina dijela",
+	"Citation": "Citiranje",
+	"Click here for help.": "Kliknite ovdje za pomoć.",
+	"Click here to": "Kliknite ovdje za",
+	"Click here to check other modelfiles.": "Kliknite ovdje da provjerite druge datoteke modela.",
+	"Click here to select": "Kliknite ovdje za odabir",
+	"Click here to select a csv file.": "Kliknite ovdje da odaberete csv datoteku.",
+	"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
+	"click here.": "kliknite ovdje.",
+	"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
+	"Close": "Zatvori",
+	"Collection": "Kolekcija",
+	"ComfyUI": "ComfyUI",
+	"ComfyUI Base URL": "ComfyUI osnovni URL",
+	"ComfyUI Base URL is required.": "Potreban je ComfyUI osnovni URL.",
+	"Command": "Naredba",
+	"Confirm Password": "Potvrdite lozinku",
+	"Connections": "Povezivanja",
+	"Content": "Sadržaj",
+	"Context Length": "Dužina konteksta",
+	"Continue Response": "Nastavi odgovor",
+	"Conversation Mode": "Način razgovora",
+	"Copied shared chat URL to clipboard!": "Kopirana URL dijeljenog razgovora u međuspremnik!",
+	"Copy": "Kopiraj",
+	"Copy last code block": "Kopiraj zadnji blok koda",
+	"Copy last response": "Kopiraj zadnji odgovor",
+	"Copy Link": "Kopiraj vezu",
+	"Copying to clipboard was successful!": "Kopiranje u međuspremnik je bilo uspješno!",
+	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Stvorite sažetu frazu od 3-5 riječi kao naslov za sljedeći upit, strogo se pridržavajući ograničenja od 3-5 riječi i izbjegavajući upotrebu riječi 'naslov':",
+	"Create a modelfile": "Stvorite datoteku modela",
+	"Create Account": "Stvori račun",
+	"Create new key": "Stvori novi ključ",
+	"Create new secret key": "Stvori novi tajni ključ",
+	"Created at": "Stvoreno",
+	"Created At": "Stvoreno",
+	"Current Model": "Trenutni model",
+	"Current Password": "Trenutna lozinka",
+	"Custom": "Prilagođeno",
+	"Customize Ollama models for a specific purpose": "Prilagodite Ollama modele za specifičnu svrhu",
+	"Dark": "Tamno",
+	"Dashboard": "Nadzorna ploča",
+	"Database": "Baza podataka",
+	"December": "Prosinac",
+	"Default": "Zadano",
+	"Default (Automatic1111)": "Zadano (Automatic1111)",
+	"Default (SentenceTransformers)": "Zadano (SentenceTransformers)",
+	"Default (Web API)": "Zadano (Web API)",
+	"Default model updated": "Zadani model ažuriran",
+	"Default Prompt Suggestions": "Zadani prijedlozi prompta",
+	"Default User Role": "Zadana korisnička uloga",
+	"delete": "izbriši",
+	"Delete": "Izbriši",
+	"Delete a model": "Izbriši model",
+	"Delete chat": "Izbriši razgovor",
+	"Delete Chat": "Izbriši razgovor",
+	"Delete Chats": "Izbriši razgovore",
+	"delete this link": "izbriši ovu vezu",
+	"Delete User": "Izbriši korisnika",
+	"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
+	"Deleted {{tagName}}": "Izbrisan {{tagName}}",
+	"Description": "Opis",
+	"Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
+	"Disabled": "Onemogućeno",
+	"Discover a modelfile": "Otkrijte datoteku modela",
+	"Discover a prompt": "Otkrijte prompt",
+	"Discover, download, and explore custom prompts": "Otkrijte, preuzmite i istražite prilagođene prompte",
+	"Discover, download, and explore model presets": "Otkrijte, preuzmite i istražite unaprijed postavljene modele",
+	"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
+	"Document": "Dokument",
+	"Document Settings": "Postavke dokumenta",
+	"Documents": "Dokumenti",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.",
+	"Don't Allow": "Ne dopuštaj",
+	"Don't have an account?": "Nemate račun?",
+	"Don't like the style": "Ne sviđa mi se stil",
+	"Download": "Preuzimanje",
+	"Download canceled": "Preuzimanje otkazano",
+	"Download Database": "Preuzmi bazu podataka",
+	"Drop any files here to add to the conversation": "Spustite bilo koje datoteke ovdje za dodavanje u razgovor",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "npr. '30s','10m'. Važeće vremenske jedinice su 's', 'm', 'h'.",
+	"Edit": "Uredi",
+	"Edit Doc": "Uredi dokument",
+	"Edit User": "Uredi korisnika",
+	"Email": "Email",
+	"Embedding Model": "Umetanje modela",
+	"Embedding Model Engine": "Stroj za umetanje modela",
+	"Embedding model set to \"{{embedding_model}}\"": "Model za umetanje postavljen na \"{{embedding_model}}\"",
+	"Enable Chat History": "Omogući povijest razgovora",
+	"Enable New Sign Ups": "Omogući nove prijave",
+	"Enabled": "Omogućeno",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Ime, Email, Lozinka, Uloga.",
+	"Enter {{role}} message here": "Unesite poruku {{role}} ovdje",
+	"Enter a detail about yourself for your LLMs to recall": "",
+	"Enter Chunk Overlap": "Unesite preklapanje dijelova",
+	"Enter Chunk Size": "Unesite veličinu dijela",
+	"Enter Image Size (e.g. 512x512)": "Unesite veličinu slike (npr. 512x512)",
+	"Enter language codes": "Unesite kodove jezika",
+	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Unesite osnovni URL LiteLLM API-ja (litellm_params.api_base)",
+	"Enter LiteLLM API Key (litellm_params.api_key)": "Unesite ključ LiteLLM API-ja (litellm_params.api_key)",
+	"Enter LiteLLM API RPM (litellm_params.rpm)": "Unesite LiteLLM API RPM (litellm_params.rpm)",
+	"Enter LiteLLM Model (litellm_params.model)": "Unesite LiteLLM model (litellm_params.model)",
+	"Enter Max Tokens (litellm_params.max_tokens)": "Unesite maksimalan broj tokena (litellm_params.max_tokens)",
+	"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
+	"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
+	"Enter Score": "Unesite ocjenu",
+	"Enter stop sequence": "Unesite sekvencu zaustavljanja",
+	"Enter Top K": "Unesite Top K",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Unesite URL (npr. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Unesite URL (npr. http://localhost:11434)",
+	"Enter Your Email": "Unesite svoj email",
+	"Enter Your Full Name": "Unesite svoje puno ime",
+	"Enter Your Password": "Unesite svoju lozinku",
+	"Enter Your Role": "Unesite svoju ulogu",
+	"Experimental": "Eksperimentalno",
+	"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
+	"Export Chats": "Izvoz razgovora",
+	"Export Documents Mapping": "Izvoz mapiranja dokumenata",
+	"Export Modelfiles": "Izvoz datoteka modela",
+	"Export Prompts": "Izvoz prompta",
+	"Failed to create API Key.": "Neuspješno stvaranje API ključa.",
+	"Failed to read clipboard contents": "Neuspješno čitanje sadržaja međuspremnika",
+	"February": "Veljača",
+	"Feel free to add specific details": "Slobodno dodajte specifične detalje",
+	"File Mode": "Način datoteke",
+	"File not found.": "Datoteka nije pronađena.",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Otkriveno krivotvorenje otisaka prstiju: Nemoguće je koristiti inicijale kao avatar. Postavljanje na zadanu profilnu sliku.",
+	"Fluidly stream large external response chunks": "Glavno strujanje velikih vanjskih dijelova odgovora",
+	"Focus chat input": "Fokusiraj unos razgovora",
+	"Followed instructions perfectly": "Savršeno slijedio upute",
+	"Format your variables using square brackets like this:": "Formatirajte svoje varijable pomoću uglatih zagrada ovako:",
+	"From (Base Model)": "Od (osnovni model)",
+	"Full Screen Mode": "Način cijelog zaslona",
+	"General": "Općenito",
+	"General Settings": "Opće postavke",
+	"Generating search query": "",
+	"Generation Info": "Informacije o generaciji",
+	"Good Response": "Dobar odgovor",
+	"h:mm a": "",
+	"has no conversations.": "nema razgovora.",
+	"Hello, {{name}}": "Bok, {{name}}",
+	"Help": "Pomoć",
+	"Hide": "Sakrij",
+	"Hide Additional Params": "Sakrij dodatne parametre",
+	"How can I help you today?": "Kako vam mogu pomoći danas?",
+	"Hybrid Search": "Hibridna pretraga",
+	"Image Generation (Experimental)": "Generiranje slika (eksperimentalno)",
+	"Image Generation Engine": "Stroj za generiranje slika",
+	"Image Settings": "Postavke slike",
+	"Images": "Slike",
+	"Import Chats": "Uvoz razgovora",
+	"Import Documents Mapping": "Uvoz mapiranja dokumenata",
+	"Import Modelfiles": "Uvoz datoteka modela",
+	"Import Prompts": "Uvoz prompta",
+	"Include `--api` flag when running stable-diffusion-webui": "Uključite zastavicu `--api` prilikom pokretanja stable-diffusion-webui",
+	"Input commands": "Unos naredbi",
+	"Interface": "Sučelje",
+	"Invalid Tag": "Nevažeća oznaka",
+	"January": "Siječanj",
+	"join our Discord for help.": "pridružite se našem Discordu za pomoć.",
+	"JSON": "JSON",
+	"July": "Srpanj",
+	"June": "Lipanj",
+	"JWT Expiration": "Isticanje JWT-a",
+	"JWT Token": "JWT token",
+	"Keep Alive": "Održavanje živim",
+	"Keyboard shortcuts": "Tipkovnički prečaci",
+	"Language": "Jezik",
+	"Last Active": "Zadnja aktivnost",
+	"Light": "Svijetlo",
+	"Listening...": "Slušanje...",
+	"LLMs can make mistakes. Verify important information.": "LLM-ovi mogu pogriješiti. Provjerite važne informacije.",
+	"LTR": "",
+	"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
+	"Make sure to enclose them with": "Provjerite da ih zatvorite s",
+	"Manage LiteLLM Models": "Upravljajte LiteLLM modelima",
+	"Manage Models": "Upravljanje modelima",
+	"Manage Ollama Models": "Upravljanje Ollama modelima",
+	"March": "Ožujak",
+	"Max Tokens": "Maksimalni tokeni",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalno 3 modela mogu se preuzeti istovremeno. Pokušajte ponovo kasnije.",
+	"May": "Svibanj",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
+	"Minimum Score": "Minimalna ocjena",
+	"Mirostat": "Mirostat",
+	"Mirostat Eta": "Mirostat Eta",
+	"Mirostat Tau": "Mirostat Tau",
+	"MMMM DD, YYYY": "MMMM DD, YYYY",
+	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
+	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' je uspješno preuzet.",
+	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je već u redu za preuzimanje.",
+	"Model {{modelId}} not found": "Model {{modelId}} nije pronađen",
+	"Model {{modelName}} already exists.": "Model {{modelName}} već postoji.",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkriven put datotečnog sustava modela. Kratko ime modela je potrebno za ažuriranje, nije moguće nastaviti.",
+	"Model Name": "Naziv modela",
+	"Model not selected": "Model nije odabran",
+	"Model Tag Name": "Naziv oznake modela",
+	"Model Whitelisting": "Bijela lista modela",
+	"Model(s) Whitelisted": "Model(i) na bijeloj listi",
+	"Modelfile": "Datoteka modela",
+	"Modelfile Advanced Settings": "Napredne postavke datoteke modela",
+	"Modelfile Content": "Sadržaj datoteke modela",
+	"Modelfiles": "Datoteke modela",
+	"Models": "Modeli",
+	"More": "Više",
+	"Name": "Ime",
+	"Name Tag": "Naziv oznake",
+	"Name your modelfile": "Nazovite svoju datoteku modela",
+	"New Chat": "Novi razgovor",
+	"New Password": "Nova lozinka",
+	"No results found": "Nema rezultata",
+	"No search query generated": "",
+	"No search results found": "",
+	"No source available": "Nema dostupnog izvora",
+	"Not factually correct": "Nije činjenično točno",
+	"Not sure what to add?": "Niste sigurni što dodati?",
+	"Not sure what to write? Switch to": "Niste sigurni što napisati? Prebacite se na",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
+	"Notifications": "Obavijesti",
+	"November": "Studeni",
+	"October": "Listopad",
+	"Off": "Isključeno",
+	"Okay, Let's Go!": "U redu, idemo!",
+	"OLED Dark": "OLED Tamno",
+	"Ollama": "Ollama",
+	"Ollama Base URL": "Osnovni URL Ollama",
+	"Ollama Version": "Verzija Ollama",
+	"On": "Uključeno",
+	"Only": "Samo",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "Samo alfanumerički znakovi i crtice su dopušteni u naredbenom nizu.",
+	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Ups! Držite se! Vaše datoteke su još uvijek u procesu obrade. Pečemo ih do savršenstva. Molimo vas da budete strpljivi i obavijestit ćemo vas kada budu spremne.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Izgleda da je URL nevažeći. Molimo provjerite ponovno i pokušajte ponovo.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Koristite nepodržanu metodu (samo frontend). Molimo poslužite WebUI s backend-a.",
+	"Open": "Otvoreno",
+	"Open AI": "Open AI",
+	"Open AI (Dall-E)": "Open AI (Dall-E)",
+	"Open new chat": "Otvorite novi razgovor",
+	"OpenAI": "OpenAI",
+	"OpenAI API": "OpenAI API",
+	"OpenAI API Config": "OpenAI API konfiguracija",
+	"OpenAI API Key is required.": "Potreban je OpenAI API ključ.",
+	"OpenAI URL/Key required.": "Potreban je OpenAI URL/ključ.",
+	"or": "ili",
+	"Other": "Ostalo",
+	"Overview": "Pregled",
+	"Parameters": "Parametri",
+	"Password": "Lozinka",
+	"PDF document (.pdf)": "PDF dokument (.pdf)",
+	"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
+	"pending": "u tijeku",
+	"Permission denied when accessing microphone: {{error}}": "Dopuštenje odbijeno prilikom pristupa mikrofonu: {{error}}",
+	"Personalization": "",
+	"Plain text (.txt)": "Običan tekst (.txt)",
+	"Playground": "Igralište",
+	"Positive attitude": "Pozitivan stav",
+	"Previous 30 days": "Prethodnih 30 dana",
+	"Previous 7 days": "Prethodnih 7 dana",
+	"Profile Image": "Profilna slika",
+	"Prompt": "Prompt",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (npr. Reci mi zanimljivost o Rimskom carstvu)",
+	"Prompt Content": "Sadržaj prompta",
+	"Prompt suggestions": "Prijedlozi prompta",
+	"Prompts": "Prompti",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Povucite \"{{searchValue}}\" s Ollama.com",
+	"Pull a model from Ollama.com": "Povucite model s Ollama.com",
+	"Pull Progress": "Napredak povlačenja",
+	"Query Params": "Parametri upita",
+	"RAG Template": "RAG predložak",
+	"Raw Format": "Neobrađeni format",
+	"Read Aloud": "Čitaj naglas",
+	"Record voice": "Snimanje glasa",
+	"Redirecting you to OpenWebUI Community": "Preusmjeravanje na OpenWebUI zajednicu",
+	"Refused when it shouldn't have": "Odbijen kada nije trebao biti",
+	"Regenerate": "Regeneriraj",
+	"Release Notes": "Bilješke o izdanju",
+	"Remove": "Ukloni",
+	"Remove Model": "Ukloni model",
+	"Rename": "Preimenuj",
+	"Repeat Last N": "Ponovi zadnjih N",
+	"Repeat Penalty": "Kazna za ponavljanje",
+	"Request Mode": "Način zahtjeva",
+	"Reranking Model": "Model za ponovno rangiranje",
+	"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
+	"Reranking model set to \"{{reranking_model}}\"": "Model za ponovno rangiranje postavljen na \"{{reranking_model}}\"",
+	"Reset Vector Storage": "Resetiraj pohranu vektora",
+	"Response AutoCopy to Clipboard": "Automatsko kopiranje odgovora u međuspremnik",
+	"Role": "Uloga",
+	"Rosé Pine": "Rosé Pine",
+	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
+	"Save": "Spremi",
+	"Save & Create": "Spremi i stvori",
+	"Save & Update": "Spremi i ažuriraj",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Spremanje zapisnika razgovora izravno u pohranu vašeg preglednika više nije podržano. Molimo vas da odvojite trenutak za preuzimanje i brisanje zapisnika razgovora klikom na gumb ispod. Ne brinite, možete lako ponovno uvesti zapisnike razgovora u backend putem",
+	"Scan": "Skeniraj",
+	"Scan complete!": "Skeniranje dovršeno!",
+	"Scan for documents from {{path}}": "Skeniraj dokumente s {{path}}",
+	"Search": "Pretraga",
+	"Search a model": "Pretraži model",
+	"Search Documents": "Pretraga dokumenata",
+	"Search Prompts": "Pretraga prompta",
+	"Search Results": "",
+	"Searching the web for '{{searchQuery}}'": "",
+	"See readme.md for instructions": "Pogledajte readme.md za upute",
+	"See what's new": "Pogledajte što je novo",
+	"Seed": "Sjeme",
+	"Select a mode": "Odaberite način",
+	"Select a model": "Odaberite model",
+	"Select an Ollama instance": "Odaberite Ollama instancu",
+	"Select model": "Odaberite model",
+	"Send": "",
+	"Send a Message": "Pošaljite poruku",
+	"Send message": "Pošalji poruku",
+	"September": "Rujan",
+	"Server connection verified": "Veza s poslužiteljem potvrđena",
+	"Set as default": "Postavi kao zadano",
+	"Set Default Model": "Postavi zadani model",
+	"Set embedding model (e.g. {{model}})": "Postavi model za umetanje (npr. {{model}})",
+	"Set Image Size": "Postavi veličinu slike",
+	"Set Model": "Postavi model",
+	"Set reranking model (e.g. {{model}})": "Postavi model za ponovno rangiranje (npr. {{model}})",
+	"Set Steps": "Postavi korake",
+	"Set Task Model": "",
+	"Set Voice": "Postavi glas",
+	"Settings": "Postavke",
+	"Settings saved successfully!": "Postavke su uspješno spremljene!",
+	"Share": "Podijeli",
+	"Share Chat": "Podijeli razgovor",
+	"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
+	"short-summary": "kratki sažetak",
+	"Show": "Pokaži",
+	"Show Additional Params": "Pokaži dodatne parametre",
+	"Show shortcuts": "Pokaži prečace",
+	"Showcased creativity": "Prikazana kreativnost",
+	"sidebar": "bočna traka",
+	"Sign in": "Prijava",
+	"Sign Out": "Odjava",
+	"Sign up": "Registracija",
+	"Signing in": "Prijava",
+	"Source": "Izvor",
+	"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
+	"Speech-to-Text Engine": "Stroj za prepoznavanje govora",
+	"SpeechRecognition API is not supported in this browser.": "API za prepoznavanje govora nije podržan u ovom pregledniku.",
+	"Stop Sequence": "Zaustavi sekvencu",
+	"STT Settings": "STT postavke",
+	"Submit": "Pošalji",
+	"Subtitle (e.g. about the Roman Empire)": "Podnaslov (npr. o Rimskom carstvu)",
+	"Success": "Uspjeh",
+	"Successfully updated.": "Uspješno ažurirano.",
+	"Suggested": "Predloženo",
+	"Sync All": "Sinkroniziraj sve",
+	"System": "Sustav",
+	"System Prompt": "Sistemski prompt",
+	"Tags": "Oznake",
+	"Tell us more:": "Recite nam više:",
+	"Temperature": "Temperatura",
+	"Template": "Predložak",
+	"Text Completion": "Dovršavanje teksta",
+	"Text-to-Speech Engine": "Stroj za pretvorbu teksta u govor",
+	"Tfs Z": "Tfs Z",
+	"Thanks for your feedback!": "Hvala na povratnim informacijama!",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).",
+	"Theme": "Tema",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ovo osigurava da su vaši vrijedni razgovori sigurno spremljeni u vašu bazu podataka na backendu. Hvala vam!",
+	"This setting does not sync across browsers or devices.": "Ova postavka se ne sinkronizira između preglednika ili uređaja.",
+	"Thorough explanation": "Detaljno objašnjenje",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Savjet: Ažurirajte više mjesta za varijable uzastopno pritiskom na tipku tab u unosu razgovora nakon svake zamjene.",
+	"Title": "Naslov",
+	"Title (e.g. Tell me a fun fact)": "Naslov (npr. Reci mi zanimljivost)",
+	"Title Auto-Generation": "Automatsko generiranje naslova",
+	"Title cannot be an empty string.": "Naslov ne može biti prazni niz.",
+	"Title Generation Prompt": "Prompt za generiranje naslova",
+	"to": "do",
+	"To access the available model names for downloading,": "Za pristup dostupnim nazivima modela za preuzimanje,",
+	"To access the GGUF models available for downloading,": "Za pristup GGUF modelima dostupnim za preuzimanje,",
+	"to chat input.": "u unos razgovora.",
+	"Today": "Danas",
+	"Toggle settings": "Prebaci postavke",
+	"Toggle sidebar": "Prebaci bočnu traku",
+	"Top K": "Top K",
+	"Top P": "Top P",
+	"Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
+	"TTS Settings": "TTS postavke",
+	"Type Hugging Face Resolve (Download) URL": "Upišite Hugging Face Resolve (Download) URL",
+	"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Pojavio se problem s povezivanjem na {{provider}}.",
+	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Nepoznata vrsta datoteke '{{file_type}}', ali prihvaćena i obrađuje se kao običan tekst",
+	"Update and Copy Link": "Ažuriraj i kopiraj vezu",
+	"Update password": "Ažuriraj lozinku",
+	"Upload a GGUF model": "Učitaj GGUF model",
+	"Upload files": "Učitaj datoteke",
+	"Upload Progress": "Napredak učitavanja",
+	"URL Mode": "URL način",
+	"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
+	"Use Gravatar": "Koristi Gravatar",
+	"Use Initials": "Koristi inicijale",
+	"user": "korisnik",
+	"User Permissions": "Korisnička dopuštenja",
+	"Users": "Korisnici",
+	"Utilize": "Iskoristi",
+	"Valid time units:": "Važeće vremenske jedinice:",
+	"variable": "varijabla",
+	"variable to have them replaced with clipboard content.": "varijabla za zamjenu sadržajem međuspremnika.",
+	"Version": "Verzija",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.",
+	"Web": "Web",
+	"Web Loader Settings": "Postavke web učitavanja",
+	"Web Params": "Web parametri",
+	"Web Search Disabled": "",
+	"Web Search Enabled": "",
+	"Webhook URL": "URL webkuke",
+	"WebUI Add-ons": "Dodaci za WebUI",
+	"WebUI Settings": "WebUI postavke",
+	"WebUI will make requests to": "WebUI će slati zahtjeve na",
+	"What’s New in": "Što je novo u",
+	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kada je povijest isključena, novi razgovori na ovom pregledniku neće se pojaviti u vašoj povijesti na bilo kojem od vaših uređaja.",
+	"Whisper (Local)": "Whisper (lokalno)",
+	"Workspace": "",
+	"Write a prompt suggestion (e.g. Who are you?)": "Napišite prijedlog prompta (npr. Tko si ti?)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Napišite sažetak u 50 riječi koji sažima [temu ili ključnu riječ].",
+	"Yesterday": "Jučer",
+	"You": "Vi",
+	"You have no archived conversations.": "Nemate arhiviranih razgovora.",
+	"You have shared this chat": "Podijelili ste ovaj razgovor",
+	"You're a helpful assistant.": "Vi ste korisni asistent.",
+	"You're now logged in.": "Sada ste prijavljeni.",
+	"Youtube": "YouTube",
+	"Youtube Loader Settings": "YouTube postavke učitavanja"
+}

+ 10 - 1
src/lib/i18n/locales/it-IT/translation.json

@@ -11,6 +11,7 @@
 	"About": "Informazioni",
 	"About": "Informazioni",
 	"Account": "Account",
 	"Account": "Account",
 	"Accurate information": "Informazioni accurate",
 	"Accurate information": "Informazioni accurate",
+	"Add": "",
 	"Add a model": "Aggiungi un modello",
 	"Add a model": "Aggiungi un modello",
 	"Add a model tag name": "Aggiungi un nome tag del modello",
 	"Add a model tag name": "Aggiungi un nome tag del modello",
 	"Add a short description about what this modelfile does": "Aggiungi una breve descrizione di ciò che fa questo file modello",
 	"Add a short description about what this modelfile does": "Aggiungi una breve descrizione di ciò che fa questo file modello",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Aggiungi un prompt custom",
 	"Add custom prompt": "Aggiungi un prompt custom",
 	"Add Docs": "Aggiungi documenti",
 	"Add Docs": "Aggiungi documenti",
 	"Add Files": "Aggiungi file",
 	"Add Files": "Aggiungi file",
+	"Add Memory": "",
 	"Add message": "Aggiungi messaggio",
 	"Add message": "Aggiungi messaggio",
 	"Add Model": "Aggiungi modello",
 	"Add Model": "Aggiungi modello",
 	"Add Tags": "Aggiungi tag",
 	"Add Tags": "Aggiungi tag",
@@ -68,6 +70,7 @@
 	"Change Password": "Cambia password",
 	"Change Password": "Cambia password",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Cronologia chat",
 	"Chat History": "Cronologia chat",
 	"Chat History is off for this browser.": "La cronologia chat è disattivata per questo browser.",
 	"Chat History is off for this browser.": "La cronologia chat è disattivata per questo browser.",
 	"Chats": "Chat",
 	"Chats": "Chat",
@@ -169,6 +172,7 @@
 	"Enabled": "Abilitato",
 	"Enabled": "Abilitato",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Assicurati che il tuo file CSV includa 4 colonne in questo ordine: Nome, Email, Password, Ruolo.",
 	"Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui",
 	"Enter {{role}} message here": "Inserisci il messaggio per {{role}} qui",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Inserisci la sovrapposizione chunk",
 	"Enter Chunk Overlap": "Inserisci la sovrapposizione chunk",
 	"Enter Chunk Size": "Inserisci la dimensione chunk",
 	"Enter Chunk Size": "Inserisci la dimensione chunk",
 	"Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Chiaro",
 	"Light": "Chiaro",
 	"Listening...": "Ascolto...",
 	"Listening...": "Ascolto...",
 	"LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.",
 	"LLMs can make mistakes. Verify important information.": "Gli LLM possono commettere errori. Verifica le informazioni importanti.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
 	"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
 	"Make sure to enclose them with": "Assicurati di racchiuderli con",
 	"Make sure to enclose them with": "Assicurati di racchiuderli con",
 	"Manage LiteLLM Models": "Gestisci modelli LiteLLM",
 	"Manage LiteLLM Models": "Gestisci modelli LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max token",
 	"Max Tokens": "Max token",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
 	"May": "Maggio",
 	"May": "Maggio",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "I messaggi che invii dopo aver creato il tuo link non verranno condivisi. Gli utenti con l'URL potranno visualizzare la chat condivisa.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Punteggio minimo",
 	"Minimum Score": "Punteggio minimo",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
 	"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
 	"pending": "in sospeso",
 	"pending": "in sospeso",
 	"Permission denied when accessing microphone: {{error}}": "Autorizzazione negata durante l'accesso al microfono: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Autorizzazione negata durante l'accesso al microfono: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Testo normale (.txt)",
 	"Plain text (.txt)": "Testo normale (.txt)",
 	"Playground": "Terreno di gioco",
 	"Playground": "Terreno di gioco",
 	"Positive attitude": "Attitudine positiva",
 	"Positive attitude": "Attitudine positiva",
@@ -362,6 +370,7 @@
 	"Role": "Ruolo",
 	"Role": "Ruolo",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salva",
 	"Save": "Salva",
 	"Save & Create": "Salva e crea",
 	"Save & Create": "Salva e crea",
 	"Save & Update": "Salva e aggiorna",
 	"Save & Update": "Salva e aggiorna",

+ 15 - 6
src/lib/i18n/locales/ja-JP/translation.json

@@ -11,14 +11,16 @@
 	"About": "概要",
 	"About": "概要",
 	"Account": "アカウント",
 	"Account": "アカウント",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "モデルを追加",
 	"Add a model": "モデルを追加",
 	"Add a model tag name": "モデルタグ名を追加",
 	"Add a model tag name": "モデルタグ名を追加",
 	"Add a short description about what this modelfile does": "このモデルファイルの機能に関する簡単な説明を追加",
 	"Add a short description about what this modelfile does": "このモデルファイルの機能に関する簡単な説明を追加",
 	"Add a short title for this prompt": "このプロンプトの短いタイトルを追加",
 	"Add a short title for this prompt": "このプロンプトの短いタイトルを追加",
 	"Add a tag": "タグを追加",
 	"Add a tag": "タグを追加",
-	"Add custom prompt": "",
+	"Add custom prompt": "カスタムプロンプトを追加",
 	"Add Docs": "ドキュメントを追加",
 	"Add Docs": "ドキュメントを追加",
 	"Add Files": "ファイルを追加",
 	"Add Files": "ファイルを追加",
+	"Add Memory": "",
 	"Add message": "メッセージを追加",
 	"Add message": "メッセージを追加",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "タグを追加",
 	"Add Tags": "タグを追加",
@@ -48,8 +50,8 @@
 	"Archived Chats": "チャット記録",
 	"Archived Chats": "チャット記録",
 	"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
 	"are allowed - Activate this command by typing": "が許可されています - 次のように入力してこのコマンドをアクティブ化します",
 	"Are you sure?": "よろしいですか?",
 	"Are you sure?": "よろしいですか?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "ファイルを添付する",
+	"Attention to detail": "詳細に注意する",
 	"Audio": "オーディオ",
 	"Audio": "オーディオ",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "応答の自動再生",
 	"Auto-playback response": "応答の自動再生",
@@ -68,6 +70,7 @@
 	"Change Password": "パスワードを変更",
 	"Change Password": "パスワードを変更",
 	"Chat": "チャット",
 	"Chat": "チャット",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "チャット履歴",
 	"Chat History": "チャット履歴",
 	"Chat History is off for this browser.": "このブラウザではチャット履歴が無効になっています。",
 	"Chat History is off for this browser.": "このブラウザではチャット履歴が無効になっています。",
 	"Chats": "チャット",
 	"Chats": "チャット",
@@ -169,6 +172,7 @@
 	"Enabled": "有効",
 	"Enabled": "有効",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "{{role}} メッセージをここに入力してください",
 	"Enter {{role}} message here": "{{role}} メッセージをここに入力してください",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "チャンクオーバーラップを入力してください",
 	"Enter Chunk Overlap": "チャンクオーバーラップを入力してください",
 	"Enter Chunk Size": "チャンクサイズを入力してください",
 	"Enter Chunk Size": "チャンクサイズを入力してください",
 	"Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)",
 	"Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "モデルファイルをインポート",
 	"Import Modelfiles": "モデルファイルをインポート",
 	"Import Prompts": "プロンプトをインポート",
 	"Import Prompts": "プロンプトをインポート",
 	"Include `--api` flag when running stable-diffusion-webui": "",
 	"Include `--api` flag when running stable-diffusion-webui": "",
-	"Input commands": "",
+	"Input commands": "入力コマンド",
 	"Interface": "インターフェース",
 	"Interface": "インターフェース",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "ライト",
 	"Light": "ライト",
 	"Listening...": "聞いています...",
 	"Listening...": "聞いています...",
 	"LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。",
 	"LLMs can make mistakes. Verify important information.": "LLM は間違いを犯す可能性があります。重要な情報を検証してください。",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
 	"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
 	"Make sure to enclose them with": "必ず次で囲んでください",
 	"Make sure to enclose them with": "必ず次で囲んでください",
 	"Manage LiteLLM Models": "LiteLLM モデルを管理",
 	"Manage LiteLLM Models": "LiteLLM モデルを管理",
@@ -256,7 +261,9 @@
 	"Max Tokens": "最大トークン数",
 	"Max Tokens": "最大トークン数",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "ミロスタット",
 	"Mirostat": "ミロスタット",
 	"Mirostat Eta": "ミロスタット Eta",
 	"Mirostat Eta": "ミロスタット Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
 	"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
 	"pending": "保留中",
 	"pending": "保留中",
 	"Permission denied when accessing microphone: {{error}}": "マイクへのアクセス時に権限が拒否されました: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "マイクへのアクセス時に権限が拒否されました: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "プレイグラウンド",
 	"Playground": "プレイグラウンド",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "役割",
 	"Role": "役割",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "保存",
 	"Save": "保存",
 	"Save & Create": "保存して作成",
 	"Save & Create": "保存して作成",
 	"Save & Update": "保存して更新",
 	"Save & Update": "保存して更新",
@@ -381,7 +390,7 @@
 	"Select a mode": "モードを選択",
 	"Select a mode": "モードを選択",
 	"Select a model": "モデルを選択",
 	"Select a model": "モデルを選択",
 	"Select an Ollama instance": "Ollama インスタンスを選択",
 	"Select an Ollama instance": "Ollama インスタンスを選択",
-	"Select model": "",
+	"Select model": "モデルを選択",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "メッセージを送信",
 	"Send a Message": "メッセージを送信",
 	"Send message": "メッセージを送信",
 	"Send message": "メッセージを送信",

+ 15 - 6
src/lib/i18n/locales/ka-GE/translation.json

@@ -11,14 +11,16 @@
 	"About": "შესახებ",
 	"About": "შესახებ",
 	"Account": "ანგარიში",
 	"Account": "ანგარიში",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "მოდელის დამატება",
 	"Add a model": "მოდელის დამატება",
 	"Add a model tag name": "მოდელის ტეგის სახელის დამატება",
 	"Add a model tag name": "მოდელის ტეგის სახელის დამატება",
 	"Add a short description about what this modelfile does": "დაამატე მოკლე აღწერა იმის შესახებ, თუ რას აკეთებს ეს მოდელური ფაილი",
 	"Add a short description about what this modelfile does": "დაამატე მოკლე აღწერა იმის შესახებ, თუ რას აკეთებს ეს მოდელური ფაილი",
 	"Add a short title for this prompt": "დაამატე მოკლე სათაური ამ მოთხოვნისთვის",
 	"Add a short title for this prompt": "დაამატე მოკლე სათაური ამ მოთხოვნისთვის",
 	"Add a tag": "დაამატე ტეგი",
 	"Add a tag": "დაამატე ტეგი",
-	"Add custom prompt": "",
+	"Add custom prompt": "პირველადი მოთხოვნის დამატება",
 	"Add Docs": "დოკუმენტის დამატება",
 	"Add Docs": "დოკუმენტის დამატება",
 	"Add Files": "ფაილების დამატება",
 	"Add Files": "ფაილების დამატება",
+	"Add Memory": "",
 	"Add message": "შეტყობინების დამატება",
 	"Add message": "შეტყობინების დამატება",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "ტეგების დამატება",
 	"Add Tags": "ტეგების დამატება",
@@ -48,8 +50,8 @@
 	"Archived Chats": "ჩატის ისტორიის არქივი",
 	"Archived Chats": "ჩატის ისტორიის არქივი",
 	"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
 	"are allowed - Activate this command by typing": "დაშვებულია - ბრძანების გასააქტიურებლად აკრიფეთ:",
 	"Are you sure?": "დარწმუნებული ხარ?",
 	"Are you sure?": "დარწმუნებული ხარ?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "ფაილის ჩაწერა",
+	"Attention to detail": "დეტალური მიმართვა",
 	"Audio": "ხმოვანი",
 	"Audio": "ხმოვანი",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "ავტომატური დაკვრის პასუხი",
 	"Auto-playback response": "ავტომატური დაკვრის პასუხი",
@@ -68,6 +70,7 @@
 	"Change Password": "პაროლის შეცვლა",
 	"Change Password": "პაროლის შეცვლა",
 	"Chat": "მიმოწერა",
 	"Chat": "მიმოწერა",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "მიმოწერის ისტორია",
 	"Chat History": "მიმოწერის ისტორია",
 	"Chat History is off for this browser.": "მიმოწერის ისტორია ამ ბრაუზერისთვის გათიშულია",
 	"Chat History is off for this browser.": "მიმოწერის ისტორია ამ ბრაუზერისთვის გათიშულია",
 	"Chats": "მიმოწერები",
 	"Chats": "მიმოწერები",
@@ -169,6 +172,7 @@
 	"Enabled": "ჩართულია",
 	"Enabled": "ჩართულია",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ",
 	"Enter {{role}} message here": "შეიყვანე {{role}} შეტყობინება აქ",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "შეიყვანეთ ნაწილის გადახურვა",
 	"Enter Chunk Overlap": "შეიყვანეთ ნაწილის გადახურვა",
 	"Enter Chunk Size": "შეიყვანე ბლოკის ზომა",
 	"Enter Chunk Size": "შეიყვანე ბლოკის ზომა",
 	"Enter Image Size (e.g. 512x512)": "შეიყვანეთ სურათის ზომა (მაგ. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "შეიყვანეთ სურათის ზომა (მაგ. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "მოდელური ფაილების იმპორტი",
 	"Import Modelfiles": "მოდელური ფაილების იმპორტი",
 	"Import Prompts": "მოთხოვნების იმპორტი",
 	"Import Prompts": "მოთხოვნების იმპორტი",
 	"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
 	"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
-	"Input commands": "",
+	"Input commands": "შეყვანით ბრძანებებს",
 	"Interface": "ინტერფეისი",
 	"Interface": "ინტერფეისი",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "მსუბუქი",
 	"Light": "მსუბუქი",
 	"Listening...": "გისმენ...",
 	"Listening...": "გისმენ...",
 	"LLMs can make mistakes. Verify important information.": "შესაძლოა LLM-ებმა შეცდომები დაუშვან. გადაამოწმეთ მნიშვნელოვანი ინფორმაცია.",
 	"LLMs can make mistakes. Verify important information.": "შესაძლოა LLM-ებმა შეცდომები დაუშვან. გადაამოწმეთ მნიშვნელოვანი ინფორმაცია.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
 	"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
 	"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
 	"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
 	"Manage LiteLLM Models": "LiteLLM მოდელების მართვა",
 	"Manage LiteLLM Models": "LiteLLM მოდელების მართვა",
@@ -256,7 +261,9 @@
 	"Max Tokens": "მაქსიმალური ტოკენები",
 	"Max Tokens": "მაქსიმალური ტოკენები",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "მიროსტატი",
 	"Mirostat": "მიროსტატი",
 	"Mirostat Eta": "მიროსტატი ეტა",
 	"Mirostat Eta": "მიროსტატი ეტა",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
 	"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
 	"pending": "ლოდინის რეჟიმშია",
 	"pending": "ლოდინის რეჟიმშია",
 	"Permission denied when accessing microphone: {{error}}": "ნებართვა უარყოფილია მიკროფონზე წვდომისას: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "ნებართვა უარყოფილია მიკროფონზე წვდომისას: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "სათამაშო მოედანი",
 	"Playground": "სათამაშო მოედანი",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "როლი",
 	"Role": "როლი",
 	"Rosé Pine": "ვარდისფერი ფიჭვის ხე",
 	"Rosé Pine": "ვარდისფერი ფიჭვის ხე",
 	"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
 	"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
+	"RTL": "",
 	"Save": "შენახვა",
 	"Save": "შენახვა",
 	"Save & Create": "დამახსოვრება და შექმნა",
 	"Save & Create": "დამახსოვრება და შექმნა",
 	"Save & Update": "დამახსოვრება და განახლება",
 	"Save & Update": "დამახსოვრება და განახლება",
@@ -381,7 +390,7 @@
 	"Select a mode": "რეჟიმის არჩევა",
 	"Select a mode": "რეჟიმის არჩევა",
 	"Select a model": "მოდელის არჩევა",
 	"Select a model": "მოდელის არჩევა",
 	"Select an Ollama instance": "",
 	"Select an Ollama instance": "",
-	"Select model": "",
+	"Select model": "მოდელის არჩევა",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "შეტყობინების გაგზავნა",
 	"Send a Message": "შეტყობინების გაგზავნა",
 	"Send message": "შეტყობინების გაგზავნა",
 	"Send message": "შეტყობინების გაგზავნა",

+ 15 - 6
src/lib/i18n/locales/ko-KR/translation.json

@@ -11,14 +11,16 @@
 	"About": "소개",
 	"About": "소개",
 	"Account": "계정",
 	"Account": "계정",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "모델 추가",
 	"Add a model": "모델 추가",
 	"Add a model tag name": "모델 태그명 추가",
 	"Add a model tag name": "모델 태그명 추가",
 	"Add a short description about what this modelfile does": "이 모델파일이 하는 일에 대한 간단한 설명 추가",
 	"Add a short description about what this modelfile does": "이 모델파일이 하는 일에 대한 간단한 설명 추가",
 	"Add a short title for this prompt": "이 프롬프트에 대한 간단한 제목 추가",
 	"Add a short title for this prompt": "이 프롬프트에 대한 간단한 제목 추가",
 	"Add a tag": "태그 추가",
 	"Add a tag": "태그 추가",
-	"Add custom prompt": "",
+	"Add custom prompt": "프롬프트 추가",
 	"Add Docs": "문서 추가",
 	"Add Docs": "문서 추가",
 	"Add Files": "파일 추가",
 	"Add Files": "파일 추가",
+	"Add Memory": "",
 	"Add message": "메시지 추가",
 	"Add message": "메시지 추가",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "태그들 추가",
 	"Add Tags": "태그들 추가",
@@ -48,8 +50,8 @@
 	"Archived Chats": "채팅 기록 아카이브",
 	"Archived Chats": "채팅 기록 아카이브",
 	"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
 	"are allowed - Activate this command by typing": "허용됩니다 - 이 명령을 활성화하려면 입력하세요.",
 	"Are you sure?": "확실합니까?",
 	"Are you sure?": "확실합니까?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "파일 첨부",
+	"Attention to detail": "상세한 주의",
 	"Audio": "오디오",
 	"Audio": "오디오",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "응답 자동 재생",
 	"Auto-playback response": "응답 자동 재생",
@@ -68,6 +70,7 @@
 	"Change Password": "비밀번호 변경",
 	"Change Password": "비밀번호 변경",
 	"Chat": "채팅",
 	"Chat": "채팅",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "채팅 기록",
 	"Chat History": "채팅 기록",
 	"Chat History is off for this browser.": "이 브라우저에서 채팅 기록이 꺼져 있습니다.",
 	"Chat History is off for this browser.": "이 브라우저에서 채팅 기록이 꺼져 있습니다.",
 	"Chats": "채팅",
 	"Chats": "채팅",
@@ -169,6 +172,7 @@
 	"Enabled": "활성화",
 	"Enabled": "활성화",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "여기에 {{role}} 메시지 입력",
 	"Enter {{role}} message here": "여기에 {{role}} 메시지 입력",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "청크 오버랩 입력",
 	"Enter Chunk Overlap": "청크 오버랩 입력",
 	"Enter Chunk Size": "청크 크기 입력",
 	"Enter Chunk Size": "청크 크기 입력",
 	"Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)",
 	"Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "모델파일 가져오기",
 	"Import Modelfiles": "모델파일 가져오기",
 	"Import Prompts": "프롬프트 가져오기",
 	"Import Prompts": "프롬프트 가져오기",
 	"Include `--api` flag when running stable-diffusion-webui": "",
 	"Include `--api` flag when running stable-diffusion-webui": "",
-	"Input commands": "",
+	"Input commands": "입력 명령",
 	"Interface": "인터페이스",
 	"Interface": "인터페이스",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "밝음",
 	"Light": "밝음",
 	"Listening...": "청취 중...",
 	"Listening...": "청취 중...",
 	"LLMs can make mistakes. Verify important information.": "LLM은 실수를 할 수 있습니다. 중요한 정보를 확인하세요.",
 	"LLMs can make mistakes. Verify important information.": "LLM은 실수를 할 수 있습니다. 중요한 정보를 확인하세요.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에서 제작",
 	"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에서 제작",
 	"Make sure to enclose them with": "다음으로 묶는 것을 잊지 마세요:",
 	"Make sure to enclose them with": "다음으로 묶는 것을 잊지 마세요:",
 	"Manage LiteLLM Models": "LiteLLM 모델 관리",
 	"Manage LiteLLM Models": "LiteLLM 모델 관리",
@@ -256,7 +261,9 @@
 	"Max Tokens": "최대 토큰 수",
 	"Max Tokens": "최대 토큰 수",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
 	"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
 	"pending": "보류 중",
 	"pending": "보류 중",
 	"Permission denied when accessing microphone: {{error}}": "마이크 액세스가 거부되었습니다: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "마이크 액세스가 거부되었습니다: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "놀이터",
 	"Playground": "놀이터",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "역할",
 	"Role": "역할",
 	"Rosé Pine": "로제 파인",
 	"Rosé Pine": "로제 파인",
 	"Rosé Pine Dawn": "로제 파인 던",
 	"Rosé Pine Dawn": "로제 파인 던",
+	"RTL": "",
 	"Save": "저장",
 	"Save": "저장",
 	"Save & Create": "저장 및 생성",
 	"Save & Create": "저장 및 생성",
 	"Save & Update": "저장 및 업데이트",
 	"Save & Update": "저장 및 업데이트",
@@ -381,7 +390,7 @@
 	"Select a mode": "모드 선택",
 	"Select a mode": "모드 선택",
 	"Select a model": "모델 선택",
 	"Select a model": "모델 선택",
 	"Select an Ollama instance": "Ollama 인스턴스 선택",
 	"Select an Ollama instance": "Ollama 인스턴스 선택",
-	"Select model": "",
+	"Select model": "모델 선택",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "메시지 보내기",
 	"Send a Message": "메시지 보내기",
 	"Send message": "메시지 보내기",
 	"Send message": "메시지 보내기",

+ 12 - 0
src/lib/i18n/locales/languages.json

@@ -55,6 +55,10 @@
 		"code": "hi-IN",
 		"code": "hi-IN",
 		"title": "Hindi (हिंदी)"
 		"title": "Hindi (हिंदी)"
 	},
 	},
+	{
+		"code": "hr-HR",
+		"title": "Croatian"
+	},
 	{
 	{
 		"code": "it-IT",
 		"code": "it-IT",
 		"title": "Italian"
 		"title": "Italian"
@@ -75,6 +79,10 @@
 		"code": "nl-NL",
 		"code": "nl-NL",
 		"title": "Dutch (Netherlands)"
 		"title": "Dutch (Netherlands)"
 	},
 	},
+	{
+		"code": "pa-IN",
+		"title": "Punjabi (India)"
+	},
 	{
 	{
 		"code": "pl-PL",
 		"code": "pl-PL",
 		"title": "Polish"
 		"title": "Polish"
@@ -95,6 +103,10 @@
 		"code": "sv-SE",
 		"code": "sv-SE",
 		"title": "Swedish"
 		"title": "Swedish"
 	},
 	},
+	{
+		"code": "sr-RS",
+		"title": "Serbian (Српски)"
+	},
 	{
 	{
 		"code": "tr-TR",
 		"code": "tr-TR",
 		"title": "Turkish"
 		"title": "Turkish"

+ 14 - 5
src/lib/i18n/locales/nl-NL/translation.json

@@ -11,14 +11,16 @@
 	"About": "Over",
 	"About": "Over",
 	"Account": "Account",
 	"Account": "Account",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Voeg een model toe",
 	"Add a model": "Voeg een model toe",
 	"Add a model tag name": "Voeg een model tag naam toe",
 	"Add a model tag name": "Voeg een model tag naam toe",
 	"Add a short description about what this modelfile does": "Voeg een korte beschrijving toe over wat dit modelfile doet",
 	"Add a short description about what this modelfile does": "Voeg een korte beschrijving toe over wat dit modelfile doet",
 	"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
 	"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
 	"Add a tag": "Voeg een tag toe",
 	"Add a tag": "Voeg een tag toe",
-	"Add custom prompt": "",
+	"Add custom prompt": "Voeg een aangepaste prompt toe",
 	"Add Docs": "Voeg Docs toe",
 	"Add Docs": "Voeg Docs toe",
 	"Add Files": "Voege Bestanden toe",
 	"Add Files": "Voege Bestanden toe",
+	"Add Memory": "",
 	"Add message": "Voeg bericht toe",
 	"Add message": "Voeg bericht toe",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "voeg tags toe",
 	"Add Tags": "voeg tags toe",
@@ -48,7 +50,7 @@
 	"Archived Chats": "chatrecord",
 	"Archived Chats": "chatrecord",
 	"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
 	"are allowed - Activate this command by typing": "zijn toegestaan - Activeer deze commando door te typen",
 	"Are you sure?": "Zeker weten?",
 	"Are you sure?": "Zeker weten?",
-	"Attach file": "",
+	"Attach file": "Voeg een bestand toe",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "Audio",
 	"Audio": "Audio",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Wijzig Wachtwoord",
 	"Change Password": "Wijzig Wachtwoord",
 	"Chat": "Chat",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat Geschiedenis",
 	"Chat History": "Chat Geschiedenis",
 	"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
 	"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
 	"Chats": "Chats",
 	"Chats": "Chats",
@@ -169,6 +172,7 @@
 	"Enabled": "Ingeschakeld",
 	"Enabled": "Ingeschakeld",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Voeg {{role}} bericht hier toe",
 	"Enter {{role}} message here": "Voeg {{role}} bericht hier toe",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Voeg Chunk Overlap toe",
 	"Enter Chunk Overlap": "Voeg Chunk Overlap toe",
 	"Enter Chunk Size": "Voeg Chunk Size toe",
 	"Enter Chunk Size": "Voeg Chunk Size toe",
 	"Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importeer Modelfiles",
 	"Import Modelfiles": "Importeer Modelfiles",
 	"Import Prompts": "Importeer Prompts",
 	"Import Prompts": "Importeer Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Voer commando's in",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Licht",
 	"Light": "Licht",
 	"Listening...": "Luisteren...",
 	"Listening...": "Luisteren...",
 	"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
 	"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
 	"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
 	"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
 	"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
 	"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
 	"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max Tokens",
 	"Max Tokens": "Max Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
 	"pending": "wachtend",
 	"pending": "wachtend",
 	"Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Toestemming geweigerd bij toegang tot microfoon: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Speeltuin",
 	"Playground": "Speeltuin",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Rol",
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Opslaan",
 	"Save": "Opslaan",
 	"Save & Create": "Opslaan & Creëren",
 	"Save & Create": "Opslaan & Creëren",
 	"Save & Update": "Opslaan & Bijwerken",
 	"Save & Update": "Opslaan & Bijwerken",
@@ -381,7 +390,7 @@
 	"Select a mode": "Selecteer een modus",
 	"Select a mode": "Selecteer een modus",
 	"Select a model": "Selecteer een model",
 	"Select a model": "Selecteer een model",
 	"Select an Ollama instance": "Selecteer een Ollama instantie",
 	"Select an Ollama instance": "Selecteer een Ollama instantie",
-	"Select model": "",
+	"Select model": "Selecteer een model",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Stuur een Bericht",
 	"Send a Message": "Stuur een Bericht",
 	"Send message": "Stuur bericht",
 	"Send message": "Stuur bericht",

+ 511 - 0
src/lib/i18n/locales/pa-IN/translation.json

@@ -0,0 +1,511 @@
+{
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'ਸ', 'ਮ', 'ਘੰ', 'ਦ', 'ਹਫ਼ਤਾ' ਜਾਂ '-1' ਬਿਨਾ ਮਿਆਦ ਦੇ।",
+	"(Beta)": "(ਬੀਟਾ)",
+	"(e.g. `sh webui.sh --api`)": "(ਉਦਾਹਰਣ ਦੇ ਤੌਰ ਤੇ `sh webui.sh --api`)",
+	"(latest)": "(ਤਾਜ਼ਾ)",
+	"{{modelName}} is thinking...": "{{modelName}} ਸੋਚ ਰਿਹਾ ਹੈ...",
+	"{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ",
+	"{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
+	"a user": "ਇੱਕ ਉਪਭੋਗਤਾ",
+	"About": "ਬਾਰੇ",
+	"Account": "ਖਾਤਾ",
+	"Accurate information": "ਸਹੀ ਜਾਣਕਾਰੀ",
+	"Add": "",
+	"Add a model": "ਇੱਕ ਮਾਡਲ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add a model tag name": "ਇੱਕ ਮਾਡਲ ਟੈਗ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add a short description about what this modelfile does": "ਇਸ ਮਾਡਲਫਾਈਲ ਦੇ ਕੀ ਕਰਨ ਬਾਰੇ ਇੱਕ ਛੋਟੀ ਵਰਣਨਾ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add a short title for this prompt": "ਇਸ ਪ੍ਰੰਪਟ ਲਈ ਇੱਕ ਛੋਟਾ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add a tag": "ਇੱਕ ਟੈਗ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add custom prompt": "ਕਸਟਮ ਪ੍ਰੰਪਟ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Docs": "ਡਾਕੂਮੈਂਟ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Files": "ਫਾਈਲਾਂ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Memory": "",
+	"Add message": "ਸੁਨੇਹਾ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Model": "ਮਾਡਲ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add Tags": "ਟੈਗ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add User": "ਉਪਭੋਗਤਾ ਸ਼ਾਮਲ ਕਰੋ",
+	"Adjusting these settings will apply changes universally to all users.": "ਇਹ ਸੈਟਿੰਗਾਂ ਨੂੰ ਠੀਕ ਕਰਨ ਨਾਲ ਸਾਰੇ ਉਪਭੋਗਤਾਵਾਂ ਲਈ ਬਦਲਾਅ ਲਾਗੂ ਹੋਣਗੇ।",
+	"admin": "ਪ੍ਰਬੰਧਕ",
+	"Admin Panel": "ਪ੍ਰਬੰਧਕ ਪੈਨਲ",
+	"Admin Settings": "ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ",
+	"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
+	"all": "ਸਾਰੇ",
+	"All Documents": "ਸਾਰੇ ਡਾਕੂਮੈਂਟ",
+	"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
+	"Allow": "ਅਨੁਮਤੀ",
+	"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
+	"alphanumeric characters and hyphens": "ਅਲਫ਼ਾਨਯੂਮੈਰਿਕ ਅੱਖਰ ਅਤੇ ਹਾਈਫਨ",
+	"Already have an account?": "ਪਹਿਲਾਂ ਹੀ ਖਾਤਾ ਹੈ?",
+	"an assistant": "ਇੱਕ ਸਹਾਇਕ",
+	"and": "ਅਤੇ",
+	"and create a new shared link.": "ਅਤੇ ਇੱਕ ਨਵਾਂ ਸਾਂਝਾ ਲਿੰਕ ਬਣਾਓ।",
+	"API Base URL": "API ਬੇਸ URL",
+	"API Key": "API ਕੁੰਜੀ",
+	"API Key created.": "API ਕੁੰਜੀ ਬਣਾਈ ਗਈ।",
+	"API keys": "API ਕੁੰਜੀਆਂ",
+	"API RPM": "API RPM",
+	"April": "ਅਪ੍ਰੈਲ",
+	"Archive": "ਆਰਕਾਈਵ",
+	"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
+	"are allowed - Activate this command by typing": "ਅਨੁਮਤ ਹਨ - ਇਸ ਕਮਾਂਡ ਨੂੰ ਟਾਈਪ ਕਰਕੇ ਸਰਗਰਮ ਕਰੋ",
+	"Are you sure?": "ਕੀ ਤੁਸੀਂ ਯਕੀਨਨ ਹੋ?",
+	"Attach file": "ਫਾਈਲ ਜੋੜੋ",
+	"Attention to detail": "ਵੇਰਵੇ 'ਤੇ ਧਿਆਨ",
+	"Audio": "ਆਡੀਓ",
+	"August": "ਅਗਸਤ",
+	"Auto-playback response": "ਆਟੋ-ਪਲੇਬੈਕ ਜਵਾਬ",
+	"Auto-send input after 3 sec.": "3 ਸਕਿੰਟ ਬਾਅਦ ਆਟੋ-ਭੇਜੋ ਇਨਪੁਟ",
+	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 ਬੇਸ URL",
+	"AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 ਬੇਸ URL ਦੀ ਲੋੜ ਹੈ।",
+	"available!": "ਉਪਲਬਧ ਹੈ!",
+	"Back": "ਵਾਪਸ",
+	"Bad Response": "ਖਰਾਬ ਜਵਾਬ",
+	"before": "ਪਹਿਲਾਂ",
+	"Being lazy": "ਆਲਸੀ ਹੋਣਾ",
+	"Builder Mode": "ਬਿਲਡਰ ਮੋਡ",
+	"Bypass SSL verification for Websites": "ਵੈਬਸਾਈਟਾਂ ਲਈ SSL ਪ੍ਰਮਾਣਿਕਤਾ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ",
+	"Cancel": "ਰੱਦ ਕਰੋ",
+	"Categories": "ਸ਼੍ਰੇਣੀਆਂ",
+	"Change Password": "ਪਾਸਵਰਡ ਬਦਲੋ",
+	"Chat": "ਗੱਲਬਾਤ",
+	"Chat Bubble UI": "ਗੱਲਬਾਤ ਬਬਲ UI",
+	"Chat direction": "",
+	"Chat History": "ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ",
+	"Chat History is off for this browser.": "ਇਸ ਬ੍ਰਾਊਜ਼ਰ ਲਈ ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ ਬੰਦ ਹੈ।",
+	"Chats": "ਗੱਲਾਂ",
+	"Check Again": "ਮੁੜ ਜਾਂਚ ਕਰੋ",
+	"Check for updates": "ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ",
+	"Checking for updates...": "ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਰਿਹਾ ਹੈ...",
+	"Choose a model before saving...": "ਸੰਭਾਲਣ ਤੋਂ ਪਹਿਲਾਂ ਇੱਕ ਮਾਡਲ ਚੁਣੋ...",
+	"Chunk Overlap": "ਚੰਕ ਓਵਰਲੈਪ",
+	"Chunk Params": "ਚੰਕ ਪੈਰਾਮੀਟਰ",
+	"Chunk Size": "ਚੰਕ ਆਕਾਰ",
+	"Citation": "ਹਵਾਲਾ",
+	"Click here for help.": "ਮਦਦ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
+	"Click here to": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
+	"Click here to check other modelfiles.": "ਹੋਰ ਮਾਡਲਫਾਈਲਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
+	"Click here to select": "ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
+	"Click here to select a csv file.": "CSV ਫਾਈਲ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
+	"Click here to select documents.": "ਡਾਕੂਮੈਂਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
+	"click here.": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
+	"Click on the user role button to change a user's role.": "ਉਪਭੋਗਤਾ ਦੀ ਭੂਮਿਕਾ ਬਦਲਣ ਲਈ ਉਪਭੋਗਤਾ ਭੂਮਿਕਾ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।",
+	"Close": "ਬੰਦ ਕਰੋ",
+	"Collection": "ਸੰਗ੍ਰਹਿ",
+	"ComfyUI": "ਕੰਫੀਯੂਆਈ",
+	"ComfyUI Base URL": "ਕੰਫੀਯੂਆਈ ਬੇਸ URL",
+	"ComfyUI Base URL is required.": "ਕੰਫੀਯੂਆਈ ਬੇਸ URL ਦੀ ਲੋੜ ਹੈ।",
+	"Command": "ਕਮਾਂਡ",
+	"Confirm Password": "ਪਾਸਵਰਡ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ",
+	"Connections": "ਕਨੈਕਸ਼ਨ",
+	"Content": "ਸਮੱਗਰੀ",
+	"Context Length": "ਸੰਦਰਭ ਲੰਬਾਈ",
+	"Continue Response": "ਜਵਾਬ ਜਾਰੀ ਰੱਖੋ",
+	"Conversation Mode": "ਗੱਲਬਾਤ ਮੋਡ",
+	"Copied shared chat URL to clipboard!": "ਸਾਂਝੇ ਕੀਤੇ ਗੱਲਬਾਤ URL ਨੂੰ ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰ ਦਿੱਤਾ!",
+	"Copy": "ਕਾਪੀ ਕਰੋ",
+	"Copy last code block": "ਆਖਰੀ ਕੋਡ ਬਲਾਕ ਨੂੰ ਕਾਪੀ ਕਰੋ",
+	"Copy last response": "ਆਖਰੀ ਜਵਾਬ ਨੂੰ ਕਾਪੀ ਕਰੋ",
+	"Copy Link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
+	"Copying to clipboard was successful!": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰਨਾ ਸਫਲ ਰਿਹਾ!",
+	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "ਹੇਠਾਂ ਦਿੱਤੀ ਪੁੱਛਗਿੱਛ ਲਈ ਇੱਕ ਛੋਟਾ, 3-5 ਸ਼ਬਦਾਂ ਦਾ ਵਾਕ ਬਣਾਓ, 3-5 ਸ਼ਬਦਾਂ ਦੀ ਸੀਮਾ ਦਾ ਪਾਲਣ ਕਰਦੇ ਹੋਏ ਅਤੇ 'ਸਿਰਲੇਖ' ਸ਼ਬਦ ਦੇ ਇਸਤੇਮਾਲ ਤੋਂ ਬਚਦੇ ਹੋਏ:",
+	"Create a modelfile": "ਇੱਕ ਮਾਡਲਫਾਈਲ ਬਣਾਓ",
+	"Create Account": "ਖਾਤਾ ਬਣਾਓ",
+	"Create new key": "ਨਵੀਂ ਕੁੰਜੀ ਬਣਾਓ",
+	"Create new secret key": "ਨਵੀਂ ਗੁਪਤ ਕੁੰਜੀ ਬਣਾਓ",
+	"Created at": "ਤੇ ਬਣਾਇਆ ਗਿਆ",
+	"Created At": "ਤੇ ਬਣਾਇਆ ਗਿਆ",
+	"Current Model": "ਮੌਜੂਦਾ ਮਾਡਲ",
+	"Current Password": "ਮੌਜੂਦਾ ਪਾਸਵਰਡ",
+	"Custom": "ਕਸਟਮ",
+	"Customize Ollama models for a specific purpose": "ਇੱਕ ਖਾਸ ਉਦੇਸ਼ ਲਈ ਓਲਾਮਾ ਮਾਡਲਾਂ ਨੂੰ ਕਸਟਮਾਈਜ਼ ਕਰੋ",
+	"Dark": "ਗੂੜ੍ਹਾ",
+	"Dashboard": "ਡੈਸ਼ਬੋਰਡ",
+	"Database": "ਡਾਟਾਬੇਸ",
+	"December": "ਦਸੰਬਰ",
+	"Default": "ਮੂਲ",
+	"Default (Automatic1111)": "ਮੂਲ (Automatic1111)",
+	"Default (SentenceTransformers)": "ਮੂਲ (ਸੈਂਟੈਂਸਟ੍ਰਾਂਸਫਾਰਮਰਸ)",
+	"Default (Web API)": "ਮੂਲ (ਵੈਬ API)",
+	"Default model updated": "ਮੂਲ ਮਾਡਲ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ",
+	"Default Prompt Suggestions": "ਮੂਲ ਪ੍ਰੰਪਟ ਸੁਝਾਅ",
+	"Default User Role": "ਮੂਲ ਉਪਭੋਗਤਾ ਭੂਮਿਕਾ",
+	"delete": "ਮਿਟਾਓ",
+	"Delete": "ਮਿਟਾਓ",
+	"Delete a model": "ਇੱਕ ਮਾਡਲ ਮਿਟਾਓ",
+	"Delete chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
+	"Delete Chat": "ਗੱਲਬਾਤ ਮਿਟਾਓ",
+	"Delete Chats": "ਗੱਲਾਂ ਮਿਟਾਓ",
+	"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
+	"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
+	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
+	"Deleted {{tagName}}": "{{tagName}} ਮਿਟਾਇਆ ਗਿਆ",
+	"Description": "ਵਰਣਨਾ",
+	"Didn't fully follow instructions": "ਹਦਾਇਤਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਫਾਲੋ ਨਹੀਂ ਕੀਤਾ",
+	"Disabled": "ਅਯੋਗ",
+	"Discover a modelfile": "ਇੱਕ ਮਾਡਲਫਾਈਲ ਖੋਜੋ",
+	"Discover a prompt": "ਇੱਕ ਪ੍ਰੰਪਟ ਖੋਜੋ",
+	"Discover, download, and explore custom prompts": "ਕਸਟਮ ਪ੍ਰੰਪਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
+	"Discover, download, and explore model presets": "ਮਾਡਲ ਪ੍ਰੀਸੈਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
+	"Display the username instead of You in the Chat": "ਗੱਲਬਾਤ 'ਚ ਤੁਹਾਡੇ ਸਥਾਨ 'ਤੇ ਉਪਭੋਗਤਾ ਨਾਮ ਦਿਖਾਓ",
+	"Document": "ਡਾਕੂਮੈਂਟ",
+	"Document Settings": "ਡਾਕੂਮੈਂਟ ਸੈਟਿੰਗਾਂ",
+	"Documents": "ਡਾਕੂਮੈਂਟ",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "ਕੋਈ ਬਾਹਰੀ ਕਨੈਕਸ਼ਨ ਨਹੀਂ ਬਣਾਉਂਦਾ, ਅਤੇ ਤੁਹਾਡਾ ਡਾਟਾ ਤੁਹਾਡੇ ਸਥਾਨਕ ਸਰਵਰ 'ਤੇ ਸੁਰੱਖਿਅਤ ਰਹਿੰਦਾ ਹੈ।",
+	"Don't Allow": "ਆਗਿਆ ਨਾ ਦਿਓ",
+	"Don't have an account?": "ਖਾਤਾ ਨਹੀਂ ਹੈ?",
+	"Don't like the style": "ਸਟਾਈਲ ਪਸੰਦ ਨਹੀਂ ਹੈ",
+	"Download": "ਡਾਊਨਲੋਡ",
+	"Download canceled": "ਡਾਊਨਲੋਡ ਰੱਦ ਕੀਤਾ ਗਿਆ",
+	"Download Database": "ਡਾਟਾਬੇਸ ਡਾਊਨਲੋਡ ਕਰੋ",
+	"Drop any files here to add to the conversation": "ਗੱਲਬਾਤ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰਨ ਲਈ ਕੋਈ ਵੀ ਫਾਈਲ ਇੱਥੇ ਛੱਡੋ",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "ਉਦਾਹਰਣ ਲਈ '30ਸ','10ਮਿ'. ਸਹੀ ਸਮਾਂ ਇਕਾਈਆਂ ਹਨ 'ਸ', 'ਮ', 'ਘੰ'.",
+	"Edit": "ਸੰਪਾਦਨ ਕਰੋ",
+	"Edit Doc": "ਡਾਕੂਮੈਂਟ ਸੰਪਾਦਨ ਕਰੋ",
+	"Edit User": "ਉਪਭੋਗਤਾ ਸੰਪਾਦਨ ਕਰੋ",
+	"Email": "ਈਮੇਲ",
+	"Embedding Model": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ",
+	"Embedding Model Engine": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਇੰਜਣ",
+	"Embedding model set to \"{{embedding_model}}\"": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਨੂੰ \"{{embedding_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ",
+	"Enable Chat History": "ਗੱਲਬਾਤ ਦਾ ਇਤਿਹਾਸ ਯੋਗ ਕਰੋ",
+	"Enable New Sign Ups": "ਨਵੇਂ ਸਾਈਨ ਅਪ ਯੋਗ ਕਰੋ",
+	"Enabled": "ਯੋਗ ਕੀਤਾ ਗਿਆ",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਤੁਹਾਡੀ CSV ਫਾਈਲ ਵਿੱਚ ਇਸ ਕ੍ਰਮ ਵਿੱਚ 4 ਕਾਲਮ ਹਨ: ਨਾਮ, ਈਮੇਲ, ਪਾਸਵਰਡ, ਭੂਮਿਕਾ।",
+	"Enter {{role}} message here": "{{role}} ਸੁਨੇਹਾ ਇੱਥੇ ਦਰਜ ਕਰੋ",
+	"Enter a detail about yourself for your LLMs to recall": "",
+	"Enter Chunk Overlap": "ਚੰਕ ਓਵਰਲੈਪ ਦਰਜ ਕਰੋ",
+	"Enter Chunk Size": "ਚੰਕ ਆਕਾਰ ਦਰਜ ਕਰੋ",
+	"Enter Image Size (e.g. 512x512)": "ਚਿੱਤਰ ਆਕਾਰ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 512x512)",
+	"Enter language codes": "ਭਾਸ਼ਾ ਕੋਡ ਦਰਜ ਕਰੋ",
+	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API ਬੇਸ URL (litellm_params.api_base) ਦਰਜ ਕਰੋ",
+	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API ਕੁੰਜੀ (litellm_params.api_key) ਦਰਜ ਕਰੋ",
+	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM (litellm_params.rpm) ਦਰਜ ਕਰੋ",
+	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM ਮਾਡਲ (litellm_params.model) ਦਰਜ ਕਰੋ",
+	"Enter Max Tokens (litellm_params.max_tokens)": "ਅਧਿਕਤਮ ਟੋਕਨ ਦਰਜ ਕਰੋ (litellm_params.max_tokens)",
+	"Enter model tag (e.g. {{modelTag}})": "ਮਾਡਲ ਟੈਗ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{modelTag}})",
+	"Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)",
+	"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
+	"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
+	"Enter Top K": "ਸਿਖਰ K ਦਰਜ ਕਰੋ",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "URL ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "URL ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ http://localhost:11434)",
+	"Enter Your Email": "ਆਪਣੀ ਈਮੇਲ ਦਰਜ ਕਰੋ",
+	"Enter Your Full Name": "ਆਪਣਾ ਪੂਰਾ ਨਾਮ ਦਰਜ ਕਰੋ",
+	"Enter Your Password": "ਆਪਣਾ ਪਾਸਵਰਡ ਦਰਜ ਕਰੋ",
+	"Enter Your Role": "ਆਪਣੀ ਭੂਮਿਕਾ ਦਰਜ ਕਰੋ",
+	"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
+	"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
+	"Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
+	"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
+	"Export Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
+	"Export Prompts": "ਪ੍ਰੰਪਟ ਨਿਰਯਾਤ ਕਰੋ",
+	"Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।",
+	"Failed to read clipboard contents": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਪੜ੍ਹਣ ਵਿੱਚ ਅਸਫਲ",
+	"February": "ਫਰਵਰੀ",
+	"Feel free to add specific details": "ਖੁੱਲ੍ਹੇ ਦਿਲ ਨਾਲ ਖਾਸ ਵੇਰਵੇ ਸ਼ਾਮਲ ਕਰੋ",
+	"File Mode": "ਫਾਈਲ ਮੋਡ",
+	"File not found.": "ਫਾਈਲ ਨਹੀਂ ਮਿਲੀ।",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "ਫਿੰਗਰਪ੍ਰਿੰਟ ਸਪੂਫਿੰਗ ਪਾਈ ਗਈ: ਅਵਤਾਰ ਵਜੋਂ ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤਣ ਵਿੱਚ ਅਸਮਰੱਥ। ਮੂਲ ਪ੍ਰੋਫਾਈਲ ਚਿੱਤਰ 'ਤੇ ਡਿਫਾਲਟ।",
+	"Fluidly stream large external response chunks": "ਵੱਡੇ ਬਾਹਰੀ ਜਵਾਬ ਚੰਕਾਂ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਸਟ੍ਰੀਮ ਕਰੋ",
+	"Focus chat input": "ਗੱਲਬਾਤ ਇਨਪੁਟ 'ਤੇ ਧਿਆਨ ਦਿਓ",
+	"Followed instructions perfectly": "ਹਦਾਇਤਾਂ ਨੂੰ ਬਿਲਕੁਲ ਫਾਲੋ ਕੀਤਾ",
+	"Format your variables using square brackets like this:": "ਤੁਹਾਡੀਆਂ ਵੈਰੀਏਬਲਾਂ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਵਰਤੋਂ: [ ]",
+	"From (Base Model)": "ਤੋਂ (ਮੂਲ ਮਾਡਲ)",
+	"Full Screen Mode": "ਪੂਰੀ ਸਕਰੀਨ ਮੋਡ",
+	"General": "ਆਮ",
+	"General Settings": "ਆਮ ਸੈਟਿੰਗਾਂ",
+	"Generating search query": "",
+	"Generation Info": "ਜਨਰੇਸ਼ਨ ਜਾਣਕਾਰੀ",
+	"Good Response": "ਵਧੀਆ ਜਵਾਬ",
+	"h:mm a": "ਹ:ਮਿੰਟ ਪੂਃ",
+	"has no conversations.": "ਕੋਈ ਗੱਲਬਾਤ ਨਹੀਂ ਹੈ।",
+	"Hello, {{name}}": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ, {{name}}",
+	"Help": "ਮਦਦ",
+	"Hide": "ਲੁਕਾਓ",
+	"Hide Additional Params": "ਵਾਧੂ ਪੈਰਾਮੀਟਰ ਲੁਕਾਓ",
+	"How can I help you today?": "ਮੈਂ ਅੱਜ ਤੁਹਾਡੀ ਕਿਵੇਂ ਮਦਦ ਕਰ ਸਕਦਾ ਹਾਂ?",
+	"Hybrid Search": "ਹਾਈਬ੍ਰਿਡ ਖੋਜ",
+	"Image Generation (Experimental)": "ਚਿੱਤਰ ਜਨਰੇਸ਼ਨ (ਪਰਮਾਣੂਕ੍ਰਿਤ)",
+	"Image Generation Engine": "ਚਿੱਤਰ ਜਨਰੇਸ਼ਨ ਇੰਜਣ",
+	"Image Settings": "ਚਿੱਤਰ ਸੈਟਿੰਗਾਂ",
+	"Images": "ਚਿੱਤਰ",
+	"Import Chats": "ਗੱਲਾਂ ਆਯਾਤ ਕਰੋ",
+	"Import Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਆਯਾਤ ਕਰੋ",
+	"Import Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ ਆਯਾਤ ਕਰੋ",
+	"Import Prompts": "ਪ੍ਰੰਪਟ ਆਯਾਤ ਕਰੋ",
+	"Include `--api` flag when running stable-diffusion-webui": "ਸਟੇਬਲ-ਡਿਫਿਊਸ਼ਨ-ਵੈਬਯੂਆਈ ਚਲਾਉਣ ਸਮੇਂ `--api` ਝੰਡਾ ਸ਼ਾਮਲ ਕਰੋ",
+	"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
+	"Interface": "ਇੰਟਰਫੇਸ",
+	"Invalid Tag": "ਗਲਤ ਟੈਗ",
+	"January": "ਜਨਵਰੀ",
+	"join our Discord for help.": "ਮਦਦ ਲਈ ਸਾਡੇ ਡਿਸਕੋਰਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ।",
+	"JSON": "JSON",
+	"July": "ਜੁਲਾਈ",
+	"June": "ਜੂਨ",
+	"JWT Expiration": "JWT ਮਿਆਦ ਖਤਮ",
+	"JWT Token": "JWT ਟੋਕਨ",
+	"Keep Alive": "ਜੀਵਿਤ ਰੱਖੋ",
+	"Keyboard shortcuts": "ਕੀਬੋਰਡ ਸ਼ਾਰਟਕਟ",
+	"Language": "ਭਾਸ਼ਾ",
+	"Last Active": "ਆਖਰੀ ਸਰਗਰਮ",
+	"Light": "ਹਲਕਾ",
+	"Listening...": "ਸੁਣ ਰਿਹਾ ਹੈ...",
+	"LLMs can make mistakes. Verify important information.": "LLMs ਗਲਤੀਆਂ ਕਰ ਸਕਦੇ ਹਨ। ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ।",
+	"LTR": "",
+	"Made by OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ",
+	"Make sure to enclose them with": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਘੇਰੋ",
+	"Manage LiteLLM Models": "LiteLLM ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"March": "ਮਾਰਚ",
+	"Max Tokens": "ਅਧਿਕਤਮ ਟੋਕਨ",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ 3 ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
+	"May": "ਮਈ",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
+	"Minimum Score": "ਘੱਟੋ-ਘੱਟ ਸਕੋਰ",
+	"Mirostat": "ਮਿਰੋਸਟੈਟ",
+	"Mirostat Eta": "ਮਿਰੋਸਟੈਟ ਈਟਾ",
+	"Mirostat Tau": "ਮਿਰੋਸਟੈਟ ਟਾਉ",
+	"MMMM DD, YYYY": "MMMM DD, YYYY",
+	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
+	"Model '{{modelName}}' has been successfully downloaded.": "ਮਾਡਲ '{{modelName}}' ਸਫਲਤਾਪੂਰਵਕ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ।",
+	"Model '{{modelTag}}' is already in queue for downloading.": "ਮਾਡਲ '{{modelTag}}' ਪਹਿਲਾਂ ਹੀ ਡਾਊਨਲੋਡ ਲਈ ਕਤਾਰ ਵਿੱਚ ਹੈ।",
+	"Model {{modelId}} not found": "ਮਾਡਲ {{modelId}} ਨਹੀਂ ਮਿਲਿਆ",
+	"Model {{modelName}} already exists.": "ਮਾਡਲ {{modelName}} ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "ਮਾਡਲ ਫਾਈਲਸਿਸਟਮ ਪੱਥ ਪਾਇਆ ਗਿਆ। ਅੱਪਡੇਟ ਲਈ ਮਾਡਲ ਸ਼ੌਰਟਨੇਮ ਦੀ ਲੋੜ ਹੈ, ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦੇ।",
+	"Model Name": "ਮਾਡਲ ਨਾਮ",
+	"Model not selected": "ਮਾਡਲ ਚੁਣਿਆ ਨਹੀਂ ਗਿਆ",
+	"Model Tag Name": "ਮਾਡਲ ਟੈਗ ਨਾਮ",
+	"Model Whitelisting": "ਮਾਡਲ ਵ੍ਹਾਈਟਲਿਸਟਿੰਗ",
+	"Model(s) Whitelisted": "ਮਾਡਲ(ਜ਼) ਵ੍ਹਾਈਟਲਿਸਟ ਕੀਤਾ ਗਿਆ",
+	"Modelfile": "ਮਾਡਲਫਾਈਲ",
+	"Modelfile Advanced Settings": "ਮਾਡਲਫਾਈਲ ਉੱਚ ਸਤਰ ਦੀਆਂ ਸੈਟਿੰਗਾਂ",
+	"Modelfile Content": "ਮਾਡਲਫਾਈਲ ਸਮੱਗਰੀ",
+	"Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ",
+	"Models": "ਮਾਡਲ",
+	"More": "ਹੋਰ",
+	"Name": "ਨਾਮ",
+	"Name Tag": "ਨਾਮ ਟੈਗ",
+	"Name your modelfile": "ਆਪਣੀ ਮਾਡਲਫਾਈਲ ਦਾ ਨਾਮ ਰੱਖੋ",
+	"New Chat": "ਨਵੀਂ ਗੱਲਬਾਤ",
+	"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
+	"No results found": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ",
+	"No search query generated": "",
+	"No search results found": "",
+	"No source available": "ਕੋਈ ਸਰੋਤ ਉਪਲਬਧ ਨਹੀਂ",
+	"Not factually correct": "ਤੱਥਕ ਰੂਪ ਵਿੱਚ ਸਹੀ ਨਹੀਂ",
+	"Not sure what to add?": "ਕੀ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ ਇਹ ਯਕੀਨੀ ਨਹੀਂ?",
+	"Not sure what to write? Switch to": "ਕੀ ਲਿਖਣਾ ਹੈ ਇਹ ਯਕੀਨੀ ਨਹੀਂ? ਬਦਲੋ",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।",
+	"Notifications": "ਸੂਚਨਾਵਾਂ",
+	"November": "ਨਵੰਬਰ",
+	"October": "ਅਕਤੂਬਰ",
+	"Off": "ਬੰਦ",
+	"Okay, Let's Go!": "ਠੀਕ ਹੈ, ਚੱਲੋ ਚੱਲੀਏ!",
+	"OLED Dark": "OLED ਗੂੜ੍ਹਾ",
+	"Ollama": "ਓਲਾਮਾ",
+	"Ollama Base URL": "ਓਲਾਮਾ ਬੇਸ URL",
+	"Ollama Version": "ਓਲਾਮਾ ਵਰਜਨ",
+	"On": "ਚਾਲੂ",
+	"Only": "ਸਿਰਫ਼",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "ਕਮਾਂਡ ਸਤਰ ਵਿੱਚ ਸਿਰਫ਼ ਅਲਫ਼ਾਨਯੂਮੈਰਿਕ ਅੱਖਰ ਅਤੇ ਹਾਈਫਨ ਦੀ ਆਗਿਆ ਹੈ।",
+	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "ਓਹੋ! ਥੋੜਾ ਸਬਰ ਕਰੋ! ਤੁਹਾਡੀਆਂ ਫਾਈਲਾਂ ਅਜੇ ਵੀ ਪ੍ਰਕਿਰਿਆ ਵਿੱਚ ਹਨ। ਅਸੀਂ ਉਨ੍ਹਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਤਿਆਰ ਕਰ ਰਹੇ ਹਾਂ। ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ ਅਤੇ ਅਸੀਂ ਤੁਹਾਨੂੰ ਦੱਸਾਂਗੇ ਜਦੋਂ ਉਹ ਤਿਆਰ ਹੋ ਜਾਣਗੇ।",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "ਓਹੋ! ਲੱਗਦਾ ਹੈ ਕਿ URL ਗਲਤ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਦੁਬਾਰਾ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "ਓਹੋ! ਤੁਸੀਂ ਇੱਕ ਅਣਸਮਰਥਿਤ ਢੰਗ ਵਰਤ ਰਹੇ ਹੋ (ਸਿਰਫ਼ ਫਰੰਟਐਂਡ)। ਕਿਰਪਾ ਕਰਕੇ ਵੈਬਯੂਆਈ ਨੂੰ ਬੈਕਐਂਡ ਤੋਂ ਸਰਵ ਕਰੋ।",
+	"Open": "ਖੋਲ੍ਹੋ",
+	"Open AI": "ਓਪਨ ਏਆਈ",
+	"Open AI (Dall-E)": "ਓਪਨ ਏਆਈ (ਡਾਲ-ਈ)",
+	"Open new chat": "ਨਵੀਂ ਗੱਲਬਾਤ ਖੋਲ੍ਹੋ",
+	"OpenAI": "ਓਪਨਏਆਈ",
+	"OpenAI API": "ਓਪਨਏਆਈ API",
+	"OpenAI API Config": "ਓਪਨਏਆਈ API ਕਨਫਿਗ",
+	"OpenAI API Key is required.": "ਓਪਨਏਆਈ API ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
+	"OpenAI URL/Key required.": "ਓਪਨਏਆਈ URL/ਕੁੰਜੀ ਦੀ ਲੋੜ ਹੈ।",
+	"or": "ਜਾਂ",
+	"Other": "ਹੋਰ",
+	"Overview": "ਸੰਖੇਪ",
+	"Parameters": "ਪੈਰਾਮੀਟਰ",
+	"Password": "ਪਾਸਵਰਡ",
+	"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
+	"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
+	"pending": "ਬਕਾਇਆ",
+	"Permission denied when accessing microphone: {{error}}": "ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਤੱਕ ਪਹੁੰਚਣ ਸਮੇਂ ਆਗਿਆ ਰੱਦ ਕੀਤੀ ਗਈ: {{error}}",
+	"Personalization": "",
+	"Plain text (.txt)": "ਸਧਾਰਨ ਪਾਠ (.txt)",
+	"Playground": "ਖੇਡ ਦਾ ਮੈਦਾਨ",
+	"Positive attitude": "ਸਕਾਰਾਤਮਕ ਰਵੱਈਆ",
+	"Previous 30 days": "ਪਿਛਲੇ 30 ਦਿਨ",
+	"Previous 7 days": "ਪਿਛਲੇ 7 ਦਿਨ",
+	"Profile Image": "ਪ੍ਰੋਫਾਈਲ ਚਿੱਤਰ",
+	"Prompt": "ਪ੍ਰੰਪਟ",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "ਪ੍ਰੰਪਟ (ਉਦਾਹਰਣ ਲਈ ਮੈਨੂੰ ਰੋਮਨ ਸਾਮਰਾਜ ਬਾਰੇ ਇੱਕ ਮਜ਼ੇਦਾਰ ਤੱਥ ਦੱਸੋ)",
+	"Prompt Content": "ਪ੍ਰੰਪਟ ਸਮੱਗਰੀ",
+	"Prompt suggestions": "ਪ੍ਰੰਪਟ ਸੁਝਾਅ",
+	"Prompts": "ਪ੍ਰੰਪਟ",
+	"Pull \"{{searchValue}}\" from Ollama.com": "ਓਲਾਮਾ.ਕਾਮ ਤੋਂ \"{{searchValue}}\" ਖਿੱਚੋ",
+	"Pull a model from Ollama.com": "ਓਲਾਮਾ.ਕਾਮ ਤੋਂ ਇੱਕ ਮਾਡਲ ਖਿੱਚੋ",
+	"Pull Progress": "ਪ੍ਰਗਤੀ ਖਿੱਚੋ",
+	"Query Params": "ਪ੍ਰਸ਼ਨ ਪੈਰਾਮੀਟਰ",
+	"RAG Template": "RAG ਟੈਮਪਲੇਟ",
+	"Raw Format": "ਕੱਚਾ ਫਾਰਮੈਟ",
+	"Read Aloud": "ਜੋਰ ਨਾਲ ਪੜ੍ਹੋ",
+	"Record voice": "ਆਵਾਜ਼ ਰਿਕਾਰਡ ਕਰੋ",
+	"Redirecting you to OpenWebUI Community": "ਤੁਹਾਨੂੰ ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਵੱਲ ਰੀਡਾਇਰੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
+	"Refused when it shouldn't have": "ਜਦੋਂ ਇਹ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ ਤਾਂ ਇਨਕਾਰ ਕੀਤਾ",
+	"Regenerate": "ਮੁੜ ਬਣਾਓ",
+	"Release Notes": "ਰਿਲੀਜ਼ ਨੋਟਸ",
+	"Remove": "ਹਟਾਓ",
+	"Remove Model": "ਮਾਡਲ ਹਟਾਓ",
+	"Rename": "ਨਾਮ ਬਦਲੋ",
+	"Repeat Last N": "ਆਖਰੀ N ਨੂੰ ਦੁਹਰਾਓ",
+	"Repeat Penalty": "ਪੈਨਲਟੀ ਦੁਹਰਾਓ",
+	"Request Mode": "ਬੇਨਤੀ ਮੋਡ",
+	"Reranking Model": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ",
+	"Reranking model disabled": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਅਯੋਗ ਕੀਤਾ ਗਿਆ",
+	"Reranking model set to \"{{reranking_model}}\"": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਨੂੰ \"{{reranking_model}}\" 'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ",
+	"Reset Vector Storage": "ਵੈਕਟਰ ਸਟੋਰੇਜ ਨੂੰ ਰੀਸੈਟ ਕਰੋ",
+	"Response AutoCopy to Clipboard": "ਜਵਾਬ ਆਟੋ ਕਾਪੀ ਕਲਿੱਪਬੋਰਡ 'ਤੇ",
+	"Role": "ਭੂਮਿਕਾ",
+	"Rosé Pine": "ਰੋਜ਼ ਪਾਈਨ",
+	"Rosé Pine Dawn": "ਰੋਜ਼ ਪਾਈਨ ਡਾਨ",
+	"RTL": "",
+	"Save": "ਸੰਭਾਲੋ",
+	"Save & Create": "ਸੰਭਾਲੋ ਅਤੇ ਬਣਾਓ",
+	"Save & Update": "ਸੰਭਾਲੋ ਅਤੇ ਅੱਪਡੇਟ ਕਰੋ",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "ਤੁਹਾਡੇ ਬ੍ਰਾਊਜ਼ਰ ਦੇ ਸਟੋਰੇਜ ਵਿੱਚ ਸਿੱਧੇ ਗੱਲਬਾਤ ਲੌਗ ਸੰਭਾਲਣਾ ਹੁਣ ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰਕੇ ਆਪਣੇ ਗੱਲਬਾਤ ਲੌਗ ਡਾਊਨਲੋਡ ਅਤੇ ਮਿਟਾਉਣ ਲਈ ਕੁਝ ਸਮਾਂ ਲਓ। ਚਿੰਤਾ ਨਾ ਕਰੋ, ਤੁਸੀਂ ਆਪਣੇ ਗੱਲਬਾਤ ਲੌਗ ਨੂੰ ਬੈਕਐਂਡ ਵਿੱਚ ਆਸਾਨੀ ਨਾਲ ਮੁੜ ਆਯਾਤ ਕਰ ਸਕਦੇ ਹੋ",
+	"Scan": "ਸਕੈਨ ਕਰੋ",
+	"Scan complete!": "ਸਕੈਨ ਪੂਰਾ!",
+	"Scan for documents from {{path}}": "{{path}} ਤੋਂ ਡਾਕੂਮੈਂਟਾਂ ਲਈ ਸਕੈਨ ਕਰੋ",
+	"Search": "ਖੋਜ",
+	"Search a model": "ਇੱਕ ਮਾਡਲ ਖੋਜੋ",
+	"Search Documents": "ਡਾਕੂਮੈਂਟ ਖੋਜੋ",
+	"Search Prompts": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
+	"Search Results": "",
+	"Searching the web for '{{searchQuery}}'": "",
+	"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
+	"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
+	"Seed": "ਬੀਜ",
+	"Select a mode": "ਇੱਕ ਮੋਡ ਚੁਣੋ",
+	"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
+	"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
+	"Select model": "ਮਾਡਲ ਚੁਣੋ",
+	"Send": "ਭੇਜੋ",
+	"Send a Message": "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ",
+	"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
+	"September": "ਸਤੰਬਰ",
+	"Server connection verified": "ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ",
+	"Set as default": "ਮੂਲ ਵਜੋਂ ਸੈੱਟ ਕਰੋ",
+	"Set Default Model": "ਮੂਲ ਮਾਡਲ ਸੈੱਟ ਕਰੋ",
+	"Set embedding model (e.g. {{model}})": "ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਸੈੱਟ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{model}})",
+	"Set Image Size": "ਚਿੱਤਰ ਆਕਾਰ ਸੈੱਟ ਕਰੋ",
+	"Set Model": "ਮਾਡਲ ਸੈੱਟ ਕਰੋ",
+	"Set reranking model (e.g. {{model}})": "ਮੁੜ ਰੈਂਕਿੰਗ ਮਾਡਲ ਸੈੱਟ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{model}})",
+	"Set Steps": "ਕਦਮ ਸੈੱਟ ਕਰੋ",
+	"Set Task Model": "",
+	"Set Voice": "ਆਵਾਜ਼ ਸੈੱਟ ਕਰੋ",
+	"Settings": "ਸੈਟਿੰਗਾਂ",
+	"Settings saved successfully!": "ਸੈਟਿੰਗਾਂ ਸਫਲਤਾਪੂਰਵਕ ਸੰਭਾਲੀਆਂ ਗਈਆਂ!",
+	"Share": "ਸਾਂਝਾ ਕਰੋ",
+	"Share Chat": "ਗੱਲਬਾਤ ਸਾਂਝੀ ਕਰੋ",
+	"Share to OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਨਾਲ ਸਾਂਝਾ ਕਰੋ",
+	"short-summary": "ਛੋਟੀ-ਸੰਖੇਪ",
+	"Show": "ਦਿਖਾਓ",
+	"Show Additional Params": "ਵਾਧੂ ਪੈਰਾਮੀਟਰ ਦਿਖਾਓ",
+	"Show shortcuts": "ਸ਼ਾਰਟਕਟ ਦਿਖਾਓ",
+	"Showcased creativity": "ਸਿਰਜਣਾਤਮਕਤਾ ਦਿਖਾਈ",
+	"sidebar": "ਸਾਈਡਬਾਰ",
+	"Sign in": "ਸਾਈਨ ਇਨ ਕਰੋ",
+	"Sign Out": "ਸਾਈਨ ਆਊਟ ਕਰੋ",
+	"Sign up": "ਰਜਿਸਟਰ ਕਰੋ",
+	"Signing in": "ਸਾਈਨ ਇਨ ਕਰ ਰਿਹਾ ਹੈ",
+	"Source": "ਸਰੋਤ",
+	"Speech recognition error: {{error}}": "ਬੋਲ ਪਛਾਣ ਗਲਤੀ: {{error}}",
+	"Speech-to-Text Engine": "ਬੋਲ-ਤੋਂ-ਪਾਠ ਇੰਜਣ",
+	"SpeechRecognition API is not supported in this browser.": "ਇਸ ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ SpeechRecognition API ਸਮਰਥਿਤ ਨਹੀਂ ਹੈ।",
+	"Stop Sequence": "ਰੋਕੋ ਕ੍ਰਮ",
+	"STT Settings": "STT ਸੈਟਿੰਗਾਂ",
+	"Submit": "ਜਮ੍ਹਾਂ ਕਰੋ",
+	"Subtitle (e.g. about the Roman Empire)": "ਉਪਸਿਰਲੇਖ (ਉਦਾਹਰਣ ਲਈ ਰੋਮਨ ਸਾਮਰਾਜ ਬਾਰੇ)",
+	"Success": "ਸਫਲਤਾ",
+	"Successfully updated.": "ਸਫਲਤਾਪੂਰਵਕ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ।",
+	"Suggested": "ਸੁਝਾਇਆ ਗਿਆ",
+	"Sync All": "ਸਾਰੇ ਸਿੰਕ ਕਰੋ",
+	"System": "ਸਿਸਟਮ",
+	"System Prompt": "ਸਿਸਟਮ ਪ੍ਰੰਪਟ",
+	"Tags": "ਟੈਗ",
+	"Tell us more:": "ਸਾਨੂੰ ਹੋਰ ਦੱਸੋ:",
+	"Temperature": "ਤਾਪਮਾਨ",
+	"Template": "ਟੈਮਪਲੇਟ",
+	"Text Completion": "ਪਾਠ ਪੂਰਨਤਾ",
+	"Text-to-Speech Engine": "ਪਾਠ-ਤੋਂ-ਬੋਲ ਇੰਜਣ",
+	"Tfs Z": "Tfs Z",
+	"Thanks for your feedback!": "ਤੁਹਾਡੇ ਫੀਡਬੈਕ ਲਈ ਧੰਨਵਾਦ!",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "ਸਕੋਰ 0.0 (0%) ਅਤੇ 1.0 (100%) ਦੇ ਵਿਚਕਾਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।",
+	"Theme": "ਥੀਮ",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਤੁਹਾਡੀਆਂ ਕੀਮਤੀ ਗੱਲਾਂ ਤੁਹਾਡੇ ਬੈਕਐਂਡ ਡਾਟਾਬੇਸ ਵਿੱਚ ਸੁਰੱਖਿਅਤ ਤੌਰ 'ਤੇ ਸੰਭਾਲੀਆਂ ਗਈਆਂ ਹਨ। ਧੰਨਵਾਦ!",
+	"This setting does not sync across browsers or devices.": "ਇਹ ਸੈਟਿੰਗ ਬ੍ਰਾਊਜ਼ਰ ਜਾਂ ਡਿਵਾਈਸਾਂ ਵਿੱਚ ਸਿੰਕ ਨਹੀਂ ਹੁੰਦੀ।",
+	"Thorough explanation": "ਵਿਸਥਾਰ ਨਾਲ ਵਿਆਖਿਆ",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "ਸਲਾਹ: ਹਰ ਬਦਲਾਅ ਦੇ ਬਾਅਦ ਗੱਲਬਾਤ ਇਨਪੁਟ ਵਿੱਚ ਟੈਬ ਕੀ ਦਬਾ ਕੇ ਲਗਾਤਾਰ ਕਈ ਵੈਰੀਏਬਲ ਸਲਾਟਾਂ ਨੂੰ ਅੱਪਡੇਟ ਕਰੋ।",
+	"Title": "ਸਿਰਲੇਖ",
+	"Title (e.g. Tell me a fun fact)": "ਸਿਰਲੇਖ (ਉਦਾਹਰਣ ਲਈ ਮੈਨੂੰ ਇੱਕ ਮਜ਼ੇਦਾਰ ਤੱਥ ਦੱਸੋ)",
+	"Title Auto-Generation": "ਸਿਰਲੇਖ ਆਟੋ-ਜਨਰੇਸ਼ਨ",
+	"Title cannot be an empty string.": "ਸਿਰਲੇਖ ਖਾਲੀ ਸਤਰ ਨਹੀਂ ਹੋ ਸਕਦਾ।",
+	"Title Generation Prompt": "ਸਿਰਲੇਖ ਜਨਰੇਸ਼ਨ ਪ੍ਰੰਪਟ",
+	"to": "ਨੂੰ",
+	"To access the available model names for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਮਾਡਲ ਨਾਮਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
+	"To access the GGUF models available for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ GGUF ਮਾਡਲਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
+	"to chat input.": "ਗੱਲਬਾਤ ਇਨਪੁਟ ਲਈ।",
+	"Today": "ਅੱਜ",
+	"Toggle settings": "ਸੈਟਿੰਗਾਂ ਟੌਗਲ ਕਰੋ",
+	"Toggle sidebar": "ਸਾਈਡਬਾਰ ਟੌਗਲ ਕਰੋ",
+	"Top K": "ਸਿਖਰ K",
+	"Top P": "ਸਿਖਰ P",
+	"Trouble accessing Ollama?": "ਓਲਾਮਾ ਤੱਕ ਪਹੁੰਚਣ ਵਿੱਚ ਮੁਸ਼ਕਲ?",
+	"TTS Settings": "TTS ਸੈਟਿੰਗਾਂ",
+	"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (ਡਾਊਨਲੋਡ) URL ਟਾਈਪ ਕਰੋ",
+	"Uh-oh! There was an issue connecting to {{provider}}.": "ਓਹੋ! {{provider}} ਨਾਲ ਕਨੈਕਟ ਕਰਨ ਵਿੱਚ ਸਮੱਸਿਆ ਆਈ।",
+	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "ਅਣਜਾਣ ਫਾਈਲ ਕਿਸਮ '{{file_type}}', ਪਰ ਸਧਾਰਨ ਪਾਠ ਵਜੋਂ ਸਵੀਕਾਰ ਕਰਦੇ ਹੋਏ",
+	"Update and Copy Link": "ਅੱਪਡੇਟ ਕਰੋ ਅਤੇ ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
+	"Update password": "ਪਾਸਵਰਡ ਅੱਪਡੇਟ ਕਰੋ",
+	"Upload a GGUF model": "ਇੱਕ GGUF ਮਾਡਲ ਅਪਲੋਡ ਕਰੋ",
+	"Upload files": "ਫਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ",
+	"Upload Progress": "ਅਪਲੋਡ ਪ੍ਰਗਤੀ",
+	"URL Mode": "URL ਮੋਡ",
+	"Use '#' in the prompt input to load and select your documents.": "ਆਪਣੇ ਡਾਕੂਮੈਂਟ ਲੋਡ ਅਤੇ ਚੁਣਨ ਲਈ ਪ੍ਰੰਪਟ ਇਨਪੁਟ ਵਿੱਚ '#' ਵਰਤੋ।",
+	"Use Gravatar": "ਗ੍ਰਾਵਾਟਾਰ ਵਰਤੋ",
+	"Use Initials": "ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤੋ",
+	"user": "ਉਪਭੋਗਤਾ",
+	"User Permissions": "ਉਪਭੋਗਤਾ ਅਧਿਕਾਰ",
+	"Users": "ਉਪਭੋਗਤਾ",
+	"Utilize": "ਵਰਤੋਂ",
+	"Valid time units:": "ਵੈਧ ਸਮਾਂ ਇਕਾਈਆਂ:",
+	"variable": "ਵੈਰੀਏਬਲ",
+	"variable to have them replaced with clipboard content.": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਨਾਲ ਬਦਲਣ ਲਈ ਵੈਰੀਏਬਲ।",
+	"Version": "ਵਰਜਨ",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "ਚੇਤਾਵਨੀ: ਜੇ ਤੁਸੀਂ ਆਪਣਾ ਐਮਬੈੱਡਿੰਗ ਮਾਡਲ ਅੱਪਡੇਟ ਜਾਂ ਬਦਲਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਨੂੰ ਸਾਰੇ ਡਾਕੂਮੈਂਟ ਮੁੜ ਆਯਾਤ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ।",
+	"Web": "ਵੈਬ",
+	"Web Loader Settings": "ਵੈਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ",
+	"Web Params": "ਵੈਬ ਪੈਰਾਮੀਟਰ",
+	"Web Search Disabled": "",
+	"Web Search Enabled": "",
+	"Webhook URL": "ਵੈਬਹੁੱਕ URL",
+	"WebUI Add-ons": "ਵੈਬਯੂਆਈ ਐਡ-ਆਨ",
+	"WebUI Settings": "ਵੈਬਯੂਆਈ ਸੈਟਿੰਗਾਂ",
+	"WebUI will make requests to": "ਵੈਬਯੂਆਈ ਬੇਨਤੀਆਂ ਕਰੇਗਾ",
+	"What’s New in": "ਨਵਾਂ ਕੀ ਹੈ",
+	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "ਜਦੋਂ ਇਤਿਹਾਸ ਬੰਦ ਹੁੰਦਾ ਹੈ, ਤਾਂ ਇਸ ਬ੍ਰਾਊਜ਼ਰ 'ਤੇ ਨਵੀਆਂ ਗੱਲਾਂ ਤੁਹਾਡੇ ਕਿਸੇ ਵੀ ਜੰਤਰ 'ਤੇ ਤੁਹਾਡੇ ਇਤਿਹਾਸ ਵਿੱਚ ਨਹੀਂ ਆਉਣਗੀਆਂ।",
+	"Whisper (Local)": "ਵਿਸਪਰ (ਸਥਾਨਕ)",
+	"Workspace": "ਕਾਰਜਸਥਲ",
+	"Write a prompt suggestion (e.g. Who are you?)": "ਇੱਕ ਪ੍ਰੰਪਟ ਸੁਝਾਅ ਲਿਖੋ (ਉਦਾਹਰਣ ਲਈ ਤੁਸੀਂ ਕੌਣ ਹੋ?)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "50 ਸ਼ਬਦਾਂ ਵਿੱਚ ਇੱਕ ਸੰਖੇਪ ਲਿਖੋ ਜੋ [ਵਿਸ਼ਾ ਜਾਂ ਕੁੰਜੀ ਸ਼ਬਦ] ਨੂੰ ਸੰਖੇਪ ਕਰਦਾ ਹੈ।",
+	"Yesterday": "ਕੱਲ੍ਹ",
+	"You": "ਤੁਸੀਂ",
+	"You have no archived conversations.": "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ ਨਹੀਂ ਹਨ।",
+	"You have shared this chat": "ਤੁਸੀਂ ਇਹ ਗੱਲਬਾਤ ਸਾਂਝੀ ਕੀਤੀ ਹੈ",
+	"You're a helpful assistant.": "ਤੁਸੀਂ ਇੱਕ ਮਦਦਗਾਰ ਸਹਾਇਕ ਹੋ।",
+	"You're now logged in.": "ਤੁਸੀਂ ਹੁਣ ਲੌਗ ਇਨ ਹੋ ਗਏ ਹੋ।",
+	"Youtube": "ਯੂਟਿਊਬ",
+	"Youtube Loader Settings": "ਯੂਟਿਊਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ"
+}

+ 10 - 1
src/lib/i18n/locales/pl-PL/translation.json

@@ -11,6 +11,7 @@
 	"About": "O nas",
 	"About": "O nas",
 	"Account": "Konto",
 	"Account": "Konto",
 	"Accurate information": "Dokładna informacja",
 	"Accurate information": "Dokładna informacja",
+	"Add": "",
 	"Add a model": "Dodaj model",
 	"Add a model": "Dodaj model",
 	"Add a model tag name": "Dodaj nazwę tagu modelu",
 	"Add a model tag name": "Dodaj nazwę tagu modelu",
 	"Add a short description about what this modelfile does": "Dodaj krótki opis tego, co robi ten plik modelu",
 	"Add a short description about what this modelfile does": "Dodaj krótki opis tego, co robi ten plik modelu",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Dodaj własne polecenie",
 	"Add custom prompt": "Dodaj własne polecenie",
 	"Add Docs": "Dodaj dokumenty",
 	"Add Docs": "Dodaj dokumenty",
 	"Add Files": "Dodaj pliki",
 	"Add Files": "Dodaj pliki",
+	"Add Memory": "",
 	"Add message": "Dodaj wiadomość",
 	"Add message": "Dodaj wiadomość",
 	"Add Model": "Dodaj model",
 	"Add Model": "Dodaj model",
 	"Add Tags": "Dodaj tagi",
 	"Add Tags": "Dodaj tagi",
@@ -68,6 +70,7 @@
 	"Change Password": "Zmień hasło",
 	"Change Password": "Zmień hasło",
 	"Chat": "Czat",
 	"Chat": "Czat",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historia czatu",
 	"Chat History": "Historia czatu",
 	"Chat History is off for this browser.": "Historia czatu jest wyłączona dla tej przeglądarki.",
 	"Chat History is off for this browser.": "Historia czatu jest wyłączona dla tej przeglądarki.",
 	"Chats": "Czaty",
 	"Chats": "Czaty",
@@ -169,6 +172,7 @@
 	"Enabled": "Włączone",
 	"Enabled": "Włączone",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera 4 kolumny w następującym porządku: Nazwa, Email, Hasło, Rola.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Upewnij się, że twój plik CSV zawiera 4 kolumny w następującym porządku: Nazwa, Email, Hasło, Rola.",
 	"Enter {{role}} message here": "Wprowadź wiadomość {{role}} tutaj",
 	"Enter {{role}} message here": "Wprowadź wiadomość {{role}} tutaj",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Wprowadź zakchodzenie bloku",
 	"Enter Chunk Overlap": "Wprowadź zakchodzenie bloku",
 	"Enter Chunk Size": "Wprowadź rozmiar bloku",
 	"Enter Chunk Size": "Wprowadź rozmiar bloku",
 	"Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Jasny",
 	"Light": "Jasny",
 	"Listening...": "Nasłuchiwanie...",
 	"Listening...": "Nasłuchiwanie...",
 	"LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Zweryfikuj ważne informacje.",
 	"LLMs can make mistakes. Verify important information.": "LLMy mogą popełniać błędy. Zweryfikuj ważne informacje.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Stworzone przez społeczność OpenWebUI",
 	"Made by OpenWebUI Community": "Stworzone przez społeczność OpenWebUI",
 	"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
 	"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
 	"Manage LiteLLM Models": "Zarządzaj modelami LiteLLM",
 	"Manage LiteLLM Models": "Zarządzaj modelami LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Maksymalna liczba tokenów",
 	"Max Tokens": "Maksymalna liczba tokenów",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Spróbuj ponownie później.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Spróbuj ponownie później.",
 	"May": "Maj",
 	"May": "Maj",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "WIadomości, które wyślesz po utworzeniu linku nie będą udostępnione. Użytkownicy z URL-em będą mogli zobaczyć udostępniony czat.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Minimalny wynik",
 	"Minimum Score": "Minimalny wynik",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
 	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
 	"pending": "oczekujące",
 	"pending": "oczekujące",
 	"Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Zwykły tekst (.txt)",
 	"Plain text (.txt)": "Zwykły tekst (.txt)",
 	"Playground": "Plac zabaw",
 	"Playground": "Plac zabaw",
 	"Positive attitude": "Pozytywne podejście",
 	"Positive attitude": "Pozytywne podejście",
@@ -362,6 +370,7 @@
 	"Role": "Rola",
 	"Role": "Rola",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Zapisz",
 	"Save": "Zapisz",
 	"Save & Create": "Zapisz i utwórz",
 	"Save & Create": "Zapisz i utwórz",
 	"Save & Update": "Zapisz i zaktualizuj",
 	"Save & Update": "Zapisz i zaktualizuj",

+ 14 - 5
src/lib/i18n/locales/pt-BR/translation.json

@@ -11,14 +11,16 @@
 	"About": "Sobre",
 	"About": "Sobre",
 	"Account": "Conta",
 	"Account": "Conta",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Adicionar um modelo",
 	"Add a model": "Adicionar um modelo",
 	"Add a model tag name": "Adicionar um nome de tag de modelo",
 	"Add a model tag name": "Adicionar um nome de tag de modelo",
 	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
 	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a tag": "Adicionar uma tag",
 	"Add a tag": "Adicionar uma tag",
-	"Add custom prompt": "",
+	"Add custom prompt": "Adicionar prompt personalizado",
 	"Add Docs": "Adicionar Documentos",
 	"Add Docs": "Adicionar Documentos",
 	"Add Files": "Adicionar Arquivos",
 	"Add Files": "Adicionar Arquivos",
+	"Add Memory": "",
 	"Add message": "Adicionar mensagem",
 	"Add message": "Adicionar mensagem",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "adicionar tags",
 	"Add Tags": "adicionar tags",
@@ -48,7 +50,7 @@
 	"Archived Chats": "Bate-papos arquivados",
 	"Archived Chats": "Bate-papos arquivados",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"Are you sure?": "Tem certeza?",
 	"Are you sure?": "Tem certeza?",
-	"Attach file": "",
+	"Attach file": "Anexar arquivo",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "Áudio",
 	"Audio": "Áudio",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Alterar Senha",
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Histórico de Bate-papo",
 	"Chat History": "Histórico de Bate-papo",
 	"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
 	"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
 	"Chats": "Bate-papos",
 	"Chats": "Bate-papos",
@@ -169,6 +172,7 @@
 	"Enabled": "Ativado",
 	"Enabled": "Ativado",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
 	"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
 	"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importar Arquivos de Modelo",
 	"Import Modelfiles": "Importar Arquivos de Modelo",
 	"Import Prompts": "Importar Prompts",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Comandos de entrada",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Claro",
 	"Light": "Claro",
 	"Listening...": "Ouvindo...",
 	"Listening...": "Ouvindo...",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Máximo de Tokens",
 	"Max Tokens": "Máximo de Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"pending": "pendente",
 	"pending": "pendente",
 	"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Parque infantil",
 	"Playground": "Parque infantil",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Função",
 	"Role": "Função",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salvar",
 	"Save": "Salvar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Update": "Salvar e Atualizar",
 	"Save & Update": "Salvar e Atualizar",
@@ -381,7 +390,7 @@
 	"Select a mode": "Selecione um modo",
 	"Select a mode": "Selecione um modo",
 	"Select a model": "Selecione um modelo",
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
-	"Select model": "",
+	"Select model": "Selecione um modelo",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
 	"Send message": "Enviar mensagem",

+ 14 - 5
src/lib/i18n/locales/pt-PT/translation.json

@@ -11,14 +11,16 @@
 	"About": "Sobre",
 	"About": "Sobre",
 	"Account": "Conta",
 	"Account": "Conta",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Adicionar um modelo",
 	"Add a model": "Adicionar um modelo",
 	"Add a model tag name": "Adicionar um nome de tag de modelo",
 	"Add a model tag name": "Adicionar um nome de tag de modelo",
 	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
 	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a tag": "Adicionar uma tag",
 	"Add a tag": "Adicionar uma tag",
-	"Add custom prompt": "",
+	"Add custom prompt": "Adicionar um prompt curto",
 	"Add Docs": "Adicionar Documentos",
 	"Add Docs": "Adicionar Documentos",
 	"Add Files": "Adicionar Arquivos",
 	"Add Files": "Adicionar Arquivos",
+	"Add Memory": "",
 	"Add message": "Adicionar mensagem",
 	"Add message": "Adicionar mensagem",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "adicionar tags",
 	"Add Tags": "adicionar tags",
@@ -48,7 +50,7 @@
 	"Archived Chats": "Bate-papos arquivados",
 	"Archived Chats": "Bate-papos arquivados",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
 	"Are you sure?": "Tem certeza?",
 	"Are you sure?": "Tem certeza?",
-	"Attach file": "",
+	"Attach file": "Anexar arquivo",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "Áudio",
 	"Audio": "Áudio",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Alterar Senha",
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Histórico de Bate-papo",
 	"Chat History": "Histórico de Bate-papo",
 	"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
 	"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
 	"Chats": "Bate-papos",
 	"Chats": "Bate-papos",
@@ -169,6 +172,7 @@
 	"Enabled": "Ativado",
 	"Enabled": "Ativado",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
 	"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
 	"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importar Arquivos de Modelo",
 	"Import Modelfiles": "Importar Arquivos de Modelo",
 	"Import Prompts": "Importar Prompts",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Comandos de entrada",
 	"Interface": "Interface",
 	"Interface": "Interface",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Claro",
 	"Light": "Claro",
 	"Listening...": "Ouvindo...",
 	"Listening...": "Ouvindo...",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Máximo de Tokens",
 	"Max Tokens": "Máximo de Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
 	"pending": "pendente",
 	"pending": "pendente",
 	"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Parque infantil",
 	"Playground": "Parque infantil",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Função",
 	"Role": "Função",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salvar",
 	"Save": "Salvar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Update": "Salvar e Atualizar",
 	"Save & Update": "Salvar e Atualizar",
@@ -381,7 +390,7 @@
 	"Select a mode": "Selecione um modo",
 	"Select a mode": "Selecione um modo",
 	"Select a model": "Selecione um modelo",
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
-	"Select model": "",
+	"Select model": "Selecione um modelo",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
 	"Send message": "Enviar mensagem",

+ 15 - 6
src/lib/i18n/locales/ru-RU/translation.json

@@ -11,14 +11,16 @@
 	"About": "Об",
 	"About": "Об",
 	"Account": "Аккаунт",
 	"Account": "Аккаунт",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Добавьте модель",
 	"Add a model": "Добавьте модель",
 	"Add a model tag name": "Добавьте имя тэга модели",
 	"Add a model tag name": "Добавьте имя тэга модели",
 	"Add a short description about what this modelfile does": "Добавьте краткое описание, что делает этот моделфайл",
 	"Add a short description about what this modelfile does": "Добавьте краткое описание, что делает этот моделфайл",
 	"Add a short title for this prompt": "Добавьте краткий заголовок для этого ввода",
 	"Add a short title for this prompt": "Добавьте краткий заголовок для этого ввода",
 	"Add a tag": "Добавьте тэг",
 	"Add a tag": "Добавьте тэг",
-	"Add custom prompt": "",
+	"Add custom prompt": "Добавьте пользовательский ввод",
 	"Add Docs": "Добавьте документы",
 	"Add Docs": "Добавьте документы",
 	"Add Files": "Добавьте файлы",
 	"Add Files": "Добавьте файлы",
+	"Add Memory": "",
 	"Add message": "Добавьте сообщение",
 	"Add message": "Добавьте сообщение",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "Добавьте тэгы",
 	"Add Tags": "Добавьте тэгы",
@@ -48,8 +50,8 @@
 	"Archived Chats": "запис на чат",
 	"Archived Chats": "запис на чат",
 	"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
 	"are allowed - Activate this command by typing": "разрешено - активируйте эту команду вводом",
 	"Are you sure?": "Вы уверены?",
 	"Are you sure?": "Вы уверены?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Прикрепить файл",
+	"Attention to detail": "детализированный",
 	"Audio": "Аудио",
 	"Audio": "Аудио",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Автоматическое воспроизведение ответа",
 	"Auto-playback response": "Автоматическое воспроизведение ответа",
@@ -68,6 +70,7 @@
 	"Change Password": "Изменить пароль",
 	"Change Password": "Изменить пароль",
 	"Chat": "Чат",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "История чат",
 	"Chat History": "История чат",
 	"Chat History is off for this browser.": "История чат отключен для этого браузера.",
 	"Chat History is off for this browser.": "История чат отключен для этого браузера.",
 	"Chats": "Чаты",
 	"Chats": "Чаты",
@@ -169,6 +172,7 @@
 	"Enabled": "Включено",
 	"Enabled": "Включено",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Введите сообщение {{role}} здесь",
 	"Enter {{role}} message here": "Введите сообщение {{role}} здесь",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Введите перекрытие фрагмента",
 	"Enter Chunk Overlap": "Введите перекрытие фрагмента",
 	"Enter Chunk Size": "Введите размер фрагмента",
 	"Enter Chunk Size": "Введите размер фрагмента",
 	"Enter Image Size (e.g. 512x512)": "Введите размер изображения (например, 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Введите размер изображения (например, 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Импорт файлов модели",
 	"Import Modelfiles": "Импорт файлов модели",
 	"Import Prompts": "Импорт подсказок",
 	"Import Prompts": "Импорт подсказок",
 	"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Введите команды",
 	"Interface": "Интерфейс",
 	"Interface": "Интерфейс",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Светлый",
 	"Light": "Светлый",
 	"Listening...": "Слушаю...",
 	"Listening...": "Слушаю...",
 	"LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.",
 	"LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
 	"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
 	"Make sure to enclose them with": "Убедитесь, что они заключены в",
 	"Make sure to enclose them with": "Убедитесь, что они заключены в",
 	"Manage LiteLLM Models": "Управление моделями LiteLLM",
 	"Manage LiteLLM Models": "Управление моделями LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Максимальное количество токенов",
 	"Max Tokens": "Максимальное количество токенов",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимальное количество моделей для загрузки одновременно - 3. Пожалуйста, попробуйте позже.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимальное количество моделей для загрузки одновременно - 3. Пожалуйста, попробуйте позже.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
 	"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
 	"pending": "ожидание",
 	"pending": "ожидание",
 	"Permission denied when accessing microphone: {{error}}": "Отказано в доступе к микрофону: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Отказано в доступе к микрофону: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Площадка",
 	"Playground": "Площадка",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Роль",
 	"Role": "Роль",
 	"Rosé Pine": "Розовое сосновое дерево",
 	"Rosé Pine": "Розовое сосновое дерево",
 	"Rosé Pine Dawn": "Розовое сосновое дерево рассвет",
 	"Rosé Pine Dawn": "Розовое сосновое дерево рассвет",
+	"RTL": "",
 	"Save": "Сохранить",
 	"Save": "Сохранить",
 	"Save & Create": "Сохранить и создать",
 	"Save & Create": "Сохранить и создать",
 	"Save & Update": "Сохранить и обновить",
 	"Save & Update": "Сохранить и обновить",
@@ -381,7 +390,7 @@
 	"Select a mode": "Выберите режим",
 	"Select a mode": "Выберите режим",
 	"Select a model": "Выберите модель",
 	"Select a model": "Выберите модель",
 	"Select an Ollama instance": "Выберите экземпляр Ollama",
 	"Select an Ollama instance": "Выберите экземпляр Ollama",
-	"Select model": "",
+	"Select model": "Выберите модель",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Отправить сообщение",
 	"Send a Message": "Отправить сообщение",
 	"Send message": "Отправить сообщение",
 	"Send message": "Отправить сообщение",

+ 511 - 0
src/lib/i18n/locales/sr-RS/translation.json

@@ -0,0 +1,511 @@
+{
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "„s“, „m“, „h“, „d“, „w“ или „-1“ за без истека.",
+	"(Beta)": "(бета)",
+	"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
+	"(latest)": "(најновије)",
+	"{{modelName}} is thinking...": "{{modelName}} размишља...",
+	"{{user}}'s Chats": "Ћаскања корисника {{user}}",
+	"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
+	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
+	"a user": "корисник",
+	"About": "О нама",
+	"Account": "Налог",
+	"Accurate information": "Прецизне информације",
+	"Add": "",
+	"Add a model": "Додај модел",
+	"Add a model tag name": "Додај ознаку модела",
+	"Add a short description about what this modelfile does": "Додај кратак опис ове модел-датотеке",
+	"Add a short title for this prompt": "Додај кратак наслов за овај упит",
+	"Add a tag": "Додај ознаку",
+	"Add custom prompt": "Додај прилагођен упит",
+	"Add Docs": "Додај документе",
+	"Add Files": "Додај датотеке",
+	"Add Memory": "",
+	"Add message": "Додај поруку",
+	"Add Model": "Додај модел",
+	"Add Tags": "Додај ознаке",
+	"Add User": "Додај корисника",
+	"Adjusting these settings will apply changes universally to all users.": "Прилагођавање ових подешавања ће применити промене на све кориснике.",
+	"admin": "админ",
+	"Admin Panel": "Админ табла",
+	"Admin Settings": "Админ подешавања",
+	"Advanced Parameters": "Напредни параметри",
+	"all": "сви",
+	"All Documents": "Сви документи",
+	"All Users": "Сви корисници",
+	"Allow": "Дозволи",
+	"Allow Chat Deletion": "Дозволи брисање ћаскања",
+	"alphanumeric characters and hyphens": "алфанумерички знакови и цртице",
+	"Already have an account?": "Већ имате налог?",
+	"an assistant": "помоћник",
+	"and": "и",
+	"and create a new shared link.": "и направи нову дељену везу.",
+	"API Base URL": "Основна адреса API-ја",
+	"API Key": "API кључ",
+	"API Key created.": "API кључ направљен.",
+	"API keys": "API кључеви",
+	"API RPM": "API RPM",
+	"April": "Април",
+	"Archive": "Архива",
+	"Archived Chats": "Архивирана ћаскања",
+	"are allowed - Activate this command by typing": "су дозвољени - Покрените ову наредбу уношењем",
+	"Are you sure?": "Да ли сте сигурни?",
+	"Attach file": "Приложи датотеку",
+	"Attention to detail": "Пажња на детаље",
+	"Audio": "Звук",
+	"August": "Август",
+	"Auto-playback response": "Самостално пуштање одговора",
+	"Auto-send input after 3 sec.": "Самостално слање уноса након 3 сек.",
+	"AUTOMATIC1111 Base URL": "Основна адреса за AUTOMATIC1111",
+	"AUTOMATIC1111 Base URL is required.": "Потребна је основна адреса за AUTOMATIC1111.",
+	"available!": "доступно!",
+	"Back": "Назад",
+	"Bad Response": "Лош одговор",
+	"before": "пре",
+	"Being lazy": "Бити лењ",
+	"Builder Mode": "Режим градитеља",
+	"Bypass SSL verification for Websites": "Заобиђи SSL потврђивање за веб странице",
+	"Cancel": "Откажи",
+	"Categories": "Категорије",
+	"Change Password": "Промени лозинку",
+	"Chat": "Ћаскање",
+	"Chat Bubble UI": "Интерфејс балона ћаскања",
+	"Chat direction": "Смер ћаскања",
+	"Chat History": "Историја ћаскања",
+	"Chat History is off for this browser.": "Историја ћаскања је искључена за овај прегледач.",
+	"Chats": "Ћаскања",
+	"Check Again": "Провери поново",
+	"Check for updates": "Потражи ажурирања",
+	"Checking for updates...": "Траже се ажурирања...",
+	"Choose a model before saving...": "Изабери модел пре чувања...",
+	"Chunk Overlap": "Преклапање делова",
+	"Chunk Params": "Параметри делова",
+	"Chunk Size": "Величина дела",
+	"Citation": "Цитат",
+	"Click here for help.": "Кликните овде за помоћ.",
+	"Click here to": "Кликните овде да",
+	"Click here to check other modelfiles.": "Кликните овде да проверите друге модел-датотеке.",
+	"Click here to select": "Кликните овде да изаберете",
+	"Click here to select a csv file.": "Кликните овде да изаберете csv датотеку.",
+	"Click here to select documents.": "Кликните овде да изаберете документе.",
+	"click here.": "кликните овде.",
+	"Click on the user role button to change a user's role.": "Кликните на дугме за улогу корисника да промените улогу корисника.",
+	"Close": "Затвори",
+	"Collection": "Колекција",
+	"ComfyUI": "ComfyUI",
+	"ComfyUI Base URL": "Основна адреса за ComfyUI",
+	"ComfyUI Base URL is required.": "Потребна је основна адреса за ComfyUI.",
+	"Command": "Наредба",
+	"Confirm Password": "Потврди лозинку",
+	"Connections": "Везе",
+	"Content": "Садржај",
+	"Context Length": "Дужина контекста",
+	"Continue Response": "Настави одговор",
+	"Conversation Mode": "Режим разговарања",
+	"Copied shared chat URL to clipboard!": "Адреса дељеног ћаскања ископирана у оставу!",
+	"Copy": "Копирај",
+	"Copy last code block": "Копирај последњи блок кода",
+	"Copy last response": "Копирај последњи одговор",
+	"Copy Link": "Копирај везу",
+	"Copying to clipboard was successful!": "Успешно копирање у оставу!",
+	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Направи сажету фразу од 3 до 5 речи као наслов за следећи упит, строго се придржавајући ограничења од 3-5 речи и избегавајући коришћење речи „наслов“:",
+	"Create a modelfile": "Направи модел-датотеку",
+	"Create Account": "Направи налог",
+	"Create new key": "Направи нови кључ",
+	"Create new secret key": "Направи нови тајни кључ",
+	"Created at": "Направљено у",
+	"Created At": "Направљено у",
+	"Current Model": "Тренутни модел",
+	"Current Password": "Тренутна лозинка",
+	"Custom": "Прилагођено",
+	"Customize Ollama models for a specific purpose": "Прилагоди Ollama моделе за специфичну намену",
+	"Dark": "Тамна",
+	"Dashboard": "Контролна табла",
+	"Database": "База података",
+	"December": "Децембар",
+	"Default": "Подразумевано",
+	"Default (Automatic1111)": "Подразумевано (Automatic1111)",
+	"Default (SentenceTransformers)": "Подразумевано (SentenceTransformers)",
+	"Default (Web API)": "Подразумевано (Web API)",
+	"Default model updated": "Подразумевани модел ажуриран",
+	"Default Prompt Suggestions": "Подразумевани предлози упита",
+	"Default User Role": "Подразумевана улога корисника",
+	"delete": "обриши",
+	"Delete": "Обриши",
+	"Delete a model": "Обриши модел",
+	"Delete chat": "Обриши ћаскање",
+	"Delete Chat": "Обриши ћаскање",
+	"Delete Chats": "Обриши ћаскања",
+	"delete this link": "обриши ову везу",
+	"Delete User": "Обриши корисника",
+	"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
+	"Deleted {{tagName}}": "Обрисано {{tagName}}",
+	"Description": "Опис",
+	"Didn't fully follow instructions": "Упутства нису праћена у потпуности",
+	"Disabled": "Онемогућено",
+	"Discover a modelfile": "Откриј модел-датотеку",
+	"Discover a prompt": "Откриј упит",
+	"Discover, download, and explore custom prompts": "Откријте, преузмите и истражите прилагођене упите",
+	"Discover, download, and explore model presets": "Откријте, преузмите и истражите образце модела",
+	"Display the username instead of You in the Chat": "Прикажи корисничко име уместо Ти у чату",
+	"Document": "Документ",
+	"Document Settings": "Подешавања документа",
+	"Documents": "Документи",
+	"does not make any external connections, and your data stays securely on your locally hosted server.": "не отвара никакве спољне везе и ваши подаци остају сигурно на вашем локално хостованом серверу.",
+	"Don't Allow": "Не дозволи",
+	"Don't have an account?": "Немате налог?",
+	"Don't like the style": "Не свиђа ми се стил",
+	"Download": "Преузми",
+	"Download canceled": "Преузимање отказано",
+	"Download Database": "Преузми базу података",
+	"Drop any files here to add to the conversation": "Убаците било које датотеке овде да их додате у разговор",
+	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "нпр. '30s', '10m'. Важеће временске јединице су 's', 'm', 'h'.",
+	"Edit": "Уреди",
+	"Edit Doc": "Уреди документ",
+	"Edit User": "Уреди корисника",
+	"Email": "Е-пошта",
+	"Embedding Model": "Модел уградње",
+	"Embedding Model Engine": "Мотор модела уградње",
+	"Embedding model set to \"{{embedding_model}}\"": "Модел уградње подешен на \"{{embedding_model}}\"",
+	"Enable Chat History": "Омогући историју ћаскања",
+	"Enable New Sign Ups": "Омогући нове пријаве",
+	"Enabled": "Омогућено",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверите се да ваша CSV датотека укључује 4 колоне у овом редоследу: Име, Е-пошта, Лозинка, Улога.",
+	"Enter {{role}} message here": "Унесите {{role}} поруку овде",
+	"Enter a detail about yourself for your LLMs to recall": "",
+	"Enter Chunk Overlap": "Унесите преклапање делова",
+	"Enter Chunk Size": "Унесите величину дела",
+	"Enter Image Size (e.g. 512x512)": "Унесите величину слике (нпр. 512x512)",
+	"Enter language codes": "Унесите кодове језика",
+	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Унесите основни URL LiteLLM API (litellm_params.api_base)",
+	"Enter LiteLLM API Key (litellm_params.api_key)": "Унесите LiteLLM API кључ (litellm_params.api_key)",
+	"Enter LiteLLM API RPM (litellm_params.rpm)": "Унесите LiteLLM API RPM (litellm_params.rpm)",
+	"Enter LiteLLM Model (litellm_params.model)": "Унесите LiteLLM модел (litellm_params.model)",
+	"Enter Max Tokens (litellm_params.max_tokens)": "Унесите највећи број жетона (litellm_params.max_tokens)",
+	"Enter model tag (e.g. {{modelTag}})": "Унесите ознаку модела (нпр. {{modelTag}})",
+	"Enter Number of Steps (e.g. 50)": "Унесите број корака (нпр. 50)",
+	"Enter Score": "Унесите резултат",
+	"Enter stop sequence": "Унесите секвенцу заустављања",
+	"Enter Top K": "Унесите Топ К",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Унесите адресу (нпр. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Унесите адресу (нпр. http://localhost:11434)",
+	"Enter Your Email": "Унесите вашу е-пошту",
+	"Enter Your Full Name": "Унесите ваше име и презиме",
+	"Enter Your Password": "Унесите вашу лозинку",
+	"Enter Your Role": "Унесите вашу улогу",
+	"Experimental": "Експериментално",
+	"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
+	"Export Chats": "Извези ћаскања",
+	"Export Documents Mapping": "Извези мапирање докумената",
+	"Export Modelfiles": "Извези модел-датотеке",
+	"Export Prompts": "Извези упите",
+	"Failed to create API Key.": "Неуспешно стварање API кључа.",
+	"Failed to read clipboard contents": "Неуспешно читање садржаја оставе",
+	"February": "Фебруар",
+	"Feel free to add specific details": "Слободно додајте специфичне детаље",
+	"File Mode": "Режим датотеке",
+	"File not found.": "Датотека није пронађена.",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Откривено лажно представљање отиска прста: Немогуће је користити иницијале као аватар. Прелазак на подразумевану профилну слику.",
+	"Fluidly stream large external response chunks": "Течно стримујте велике спољне делове одговора",
+	"Focus chat input": "Усредсредите унос ћаскања",
+	"Followed instructions perfectly": "Упутства су савршено праћена",
+	"Format your variables using square brackets like this:": "Форматирајте ваше променљиве користећи угластe заграде овако:",
+	"From (Base Model)": "Од (основни модел)",
+	"Full Screen Mode": "Режим целог екрана",
+	"General": "Опште",
+	"General Settings": "Општа подешавања",
+	"Generating search query": "",
+	"Generation Info": "Информације о стварању",
+	"Good Response": "Добар одговор",
+	"h:mm a": "h:mm a",
+	"has no conversations.": "нема разговора.",
+	"Hello, {{name}}": "Здраво, {{name}}",
+	"Help": "Помоћ",
+	"Hide": "Сакриј",
+	"Hide Additional Params": "Сакриј додатне параметре",
+	"How can I help you today?": "Како могу да вам помогнем данас?",
+	"Hybrid Search": "Хибридна претрага",
+	"Image Generation (Experimental)": "Стварање слика (експериментално)",
+	"Image Generation Engine": "Мотор за стварање слика",
+	"Image Settings": "Подешавања слике",
+	"Images": "Слике",
+	"Import Chats": "Увези ћаскања",
+	"Import Documents Mapping": "Увези мапирање докумената",
+	"Import Modelfiles": "Увези модел-датотеке",
+	"Import Prompts": "Увези упите",
+	"Include `--api` flag when running stable-diffusion-webui": "Укључи `--api` заставицу при покретању stable-diffusion-webui",
+	"Input commands": "Унеси наредбе",
+	"Interface": "Изглед",
+	"Invalid Tag": "Неисправна ознака",
+	"January": "Јануар",
+	"join our Discord for help.": "придружите се нашем Дискорду за помоћ.",
+	"JSON": "JSON",
+	"July": "Јул",
+	"June": "Јун",
+	"JWT Expiration": "Истек JWT-а",
+	"JWT Token": "JWT жетон",
+	"Keep Alive": "Одржи трајање",
+	"Keyboard shortcuts": "Пречице на тастатури",
+	"Language": "Језик",
+	"Last Active": "Последња активност",
+	"Light": "Светла",
+	"Listening...": "Слушам...",
+	"LLMs can make mistakes. Verify important information.": "ВЈМ-ови (LLM-ови) могу правити грешке. Проверите важне податке.",
+	"LTR": "ЛНД",
+	"Made by OpenWebUI Community": "Израдила OpenWebUI заједница",
+	"Make sure to enclose them with": "Уверите се да их затворите са",
+	"Manage LiteLLM Models": "Управљај LiteLLM моделима",
+	"Manage Models": "Управљај моделима",
+	"Manage Ollama Models": "Управљај Ollama моделима",
+	"March": "Март",
+	"Max Tokens": "Највише жетона",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Највише 3 модела могу бити преузета истовремено. Покушајте поново касније.",
+	"May": "Мај",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "Памћење",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Поруке које пошаљете након стварања ваше везе неће бити подељене. Корисници са URL-ом ће моћи да виде дељено ћаскање.",
+	"Minimum Score": "Најмањи резултат",
+	"Mirostat": "Миростат",
+	"Mirostat Eta": "Миростат Ета",
+	"Mirostat Tau": "Миростат Тау",
+	"MMMM DD, YYYY": "ММММ ДД, ГГГГ",
+	"MMMM DD, YYYY HH:mm": "ММММ ДД, ГГГГ ЧЧ:мм",
+	"Model '{{modelName}}' has been successfully downloaded.": "Модел „{{modelName}}“ је успешно преузет.",
+	"Model '{{modelTag}}' is already in queue for downloading.": "Модел „{{modelTag}}“ је већ у реду за преузимање.",
+	"Model {{modelId}} not found": "Модел {{modelId}} није пронађен",
+	"Model {{modelName}} already exists.": "Модел {{modelName}} већ постоји.",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Откривена путања система датотека модела. За ажурирање је потребан кратак назив модела, не може се наставити.",
+	"Model Name": "Назив модела",
+	"Model not selected": "Модел није изабран",
+	"Model Tag Name": "Назив ознаке модела",
+	"Model Whitelisting": "Бели списак модела",
+	"Model(s) Whitelisted": "Модел(и) на белом списку",
+	"Modelfile": "Модел-датотека",
+	"Modelfile Advanced Settings": "Напредна подешавања модел-датотеке",
+	"Modelfile Content": "Садржај модел-датотеке",
+	"Modelfiles": "Модел-датотеке",
+	"Models": "Модели",
+	"More": "Више",
+	"Name": "Име",
+	"Name Tag": "Назив ознаке",
+	"Name your modelfile": "Назовите вашу модел-датотеку",
+	"New Chat": "Ново ћаскање",
+	"New Password": "Нова лозинка",
+	"No results found": "Нема резултата",
+	"No search query generated": "",
+	"No search results found": "",
+	"No source available": "Нема доступног извора",
+	"Not factually correct": "Није чињенично тачно",
+	"Not sure what to add?": "Нисте сигурни шта да додате?",
+	"Not sure what to write? Switch to": "Нисте сигурни шта да напишете? Пребаците се на",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
+	"Notifications": "Обавештења",
+	"November": "Новембар",
+	"October": "Октобар",
+	"Off": "Искључено",
+	"Okay, Let's Go!": "У реду, хајде да кренемо!",
+	"OLED Dark": "OLED тамна",
+	"Ollama": "Ollama",
+	"Ollama Base URL": "Основна адреса Ollama-е",
+	"Ollama Version": "Издање Ollama-е",
+	"On": "Укључено",
+	"Only": "Само",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "Само алфанумерички знакови и цртице су дозвољени у низу наредби.",
+	"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Упс! Само тренутак! Ваше датотеке се још обрађују. Припремамо их до савршенства. Молимо вас за стрпљење и обавестићемо вас када буду спремне.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Изгледа да је адреса неважећа. Молимо вас да проверите и покушате поново.",
+	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Упс! Користите неподржани метод (само фронтенд). Молимо вас да покренете WebUI са бекенда.",
+	"Open": "Отвори",
+	"Open AI": "Open AI",
+	"Open AI (Dall-E)": "Open AI (Dall-E)",
+	"Open new chat": "Покрени ново ћаскање",
+	"OpenAI": "OpenAI",
+	"OpenAI API": "OpenAI API",
+	"OpenAI API Config": "Подешавање OpenAI API-ја",
+	"OpenAI API Key is required.": "Потребан је OpenAI API кључ.",
+	"OpenAI URL/Key required.": "Потребан је OpenAI URL/кључ.",
+	"or": "или",
+	"Other": "Остало",
+	"Overview": "Преглед",
+	"Parameters": "Параметри",
+	"Password": "Лозинка",
+	"PDF document (.pdf)": "PDF документ (.pdf)",
+	"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
+	"pending": "на чекању",
+	"Permission denied when accessing microphone: {{error}}": "Приступ микрофону је одбијен: {{error}}",
+	"Personalization": "Прилагођавање",
+	"Plain text (.txt)": "Обичан текст (.txt)",
+	"Playground": "Игралиште",
+	"Positive attitude": "Позитиван став",
+	"Previous 30 days": "Претходних 30 дана",
+	"Previous 7 days": "Претходних 7 дана",
+	"Profile Image": "Слика профила",
+	"Prompt": "Упит",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Упит (нпр. „реци ми занимљивост о Римском царству“)",
+	"Prompt Content": "Садржај упита",
+	"Prompt suggestions": "Предлози упита",
+	"Prompts": "Упити",
+	"Pull \"{{searchValue}}\" from Ollama.com": "Повуците \"{{searchValue}}\" са Ollama.com",
+	"Pull a model from Ollama.com": "Повуците модел са Ollama.com",
+	"Pull Progress": "Напредак повлачења",
+	"Query Params": "Параметри упита",
+	"RAG Template": "RAG шаблон",
+	"Raw Format": "Сирови формат",
+	"Read Aloud": "Прочитај наглас",
+	"Record voice": "Сними глас",
+	"Redirecting you to OpenWebUI Community": "Преусмеравање на OpenWebUI заједницу",
+	"Refused when it shouldn't have": "Одбијено када није требало",
+	"Regenerate": "Регенериши",
+	"Release Notes": "Напомене о издању",
+	"Remove": "Уклони",
+	"Remove Model": "Уклони модел",
+	"Rename": "Преименуј",
+	"Repeat Last N": "Понови последњих N",
+	"Repeat Penalty": "Казна за понављање",
+	"Request Mode": "Режим захтева",
+	"Reranking Model": "Модел поновног рангирања",
+	"Reranking model disabled": "Модел поновног рангирања онемогућен",
+	"Reranking model set to \"{{reranking_model}}\"": "Модел поновног рангирања подешен на \"{{reranking_model}}\"",
+	"Reset Vector Storage": "Ресетуј складиште вектора",
+	"Response AutoCopy to Clipboard": "Самостално копирање одговора у оставу",
+	"Role": "Улога",
+	"Rosé Pine": "Rosé Pine",
+	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "ДНЛ",
+	"Save": "Сачувај",
+	"Save & Create": "Сачувај и направи",
+	"Save & Update": "Сачувај и ажурирај",
+	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Чување ћаскања директно у складиште вашег прегледача више није подржано. Одвојите тренутак да преузмете и избришете ваша ћаскања кликом на дугме испод. Не брините, можете лако поново увезти ваша ћаскања у бекенд кроз",
+	"Scan": "Скенирај",
+	"Scan complete!": "Скенирање завршено!",
+	"Scan for documents from {{path}}": "Скенирај документе из {{path}}",
+	"Search": "Претражи",
+	"Search a model": "Претражи модел",
+	"Search Documents": "Претражи документе",
+	"Search Prompts": "Претражи упите",
+	"Search Results": "",
+	"Searching the web for '{{searchQuery}}'": "",
+	"See readme.md for instructions": "Погледај readme.md за упутства",
+	"See what's new": "Погледај шта је ново",
+	"Seed": "Семе",
+	"Select a mode": "Изабери режим",
+	"Select a model": "Изабери модел",
+	"Select an Ollama instance": "Изабери Ollama инстанцу",
+	"Select model": "Изабери модел",
+	"Send": "Пошаљи",
+	"Send a Message": "Пошаљи поруку",
+	"Send message": "Пошаљи поруку",
+	"September": "Септембар",
+	"Server connection verified": "Веза са сервером потврђена",
+	"Set as default": "Подеси као подразумевано",
+	"Set Default Model": "Подеси као подразумевани модел",
+	"Set embedding model (e.g. {{model}})": "Подеси модел уградње (нпр. {{model}})",
+	"Set Image Size": "Подеси величину слике",
+	"Set Model": "Подеси модел",
+	"Set reranking model (e.g. {{model}})": "Подеси модел поновног рангирања (нпр. {{model}})",
+	"Set Steps": "Подеси кораке",
+	"Set Task Model": "",
+	"Set Voice": "Подеси глас",
+	"Settings": "Подешавања",
+	"Settings saved successfully!": "Подешавања успешно сачувана!",
+	"Share": "Подели",
+	"Share Chat": "Подели ћаскање",
+	"Share to OpenWebUI Community": "Подели са OpenWebUI заједницом",
+	"short-summary": "кратак сажетак",
+	"Show": "Прикажи",
+	"Show Additional Params": "Прикажи додатне параметре",
+	"Show shortcuts": "Прикажи пречице",
+	"Showcased creativity": "Приказана креативност",
+	"sidebar": "бочна трака",
+	"Sign in": "Пријави се",
+	"Sign Out": "Одјави се",
+	"Sign up": "Региструј се",
+	"Signing in": "Пријављивање",
+	"Source": "Извор",
+	"Speech recognition error: {{error}}": "Грешка у препознавању говора: {{error}}",
+	"Speech-to-Text Engine": "Мотор за говор у текст",
+	"SpeechRecognition API is not supported in this browser.": "API за препознавање говора није подржан у овом прегледачу.",
+	"Stop Sequence": "Секвенца заустављања",
+	"STT Settings": "STT подешавања",
+	"Submit": "Пошаљи",
+	"Subtitle (e.g. about the Roman Empire)": "Поднаслов (нпр. о Римском царству)",
+	"Success": "Успех",
+	"Successfully updated.": "Успешно ажурирано.",
+	"Suggested": "Предложено",
+	"Sync All": "Усклади све",
+	"System": "Систем",
+	"System Prompt": "Системски упит",
+	"Tags": "Ознаке",
+	"Tell us more:": "Реците нам више:",
+	"Temperature": "Температура",
+	"Template": "Шаблон",
+	"Text Completion": "Допуна текста",
+	"Text-to-Speech Engine": "Мотор за текст у говор",
+	"Tfs Z": "Tfs Z",
+	"Thanks for your feedback!": "Хвала на вашем коментару!",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Резултат треба да буде вредност између 0.0 (0%) и 1.0 (100%).",
+	"Theme": "Тема",
+	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ово осигурава да су ваши вредни разговори безбедно сачувани у вашој бекенд бази података. Хвала вам!",
+	"This setting does not sync across browsers or devices.": "Ово подешавање се не усклађује преко прегледача или уређаја.",
+	"Thorough explanation": "Детаљно објашњење",
+	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Савет: ажурирајте више променљивих слотова узастопно притиском на тастер Таб у уносу ћаскања након сваке замене.",
+	"Title": "Наслов",
+	"Title (e.g. Tell me a fun fact)": "Наслов (нпр. „реци ми занимљивост“)",
+	"Title Auto-Generation": "Самостално стварање наслова",
+	"Title cannot be an empty string.": "Наслов не може бити празан низ.",
+	"Title Generation Prompt": "Упит за стварање наслова",
+	"to": "до",
+	"To access the available model names for downloading,": "Да бисте приступили доступним именима модела за преузимање,",
+	"To access the GGUF models available for downloading,": "Да бисте приступили GGUF моделима доступним за преузимање,",
+	"to chat input.": "у унос ћаскања.",
+	"Today": "Данас",
+	"Toggle settings": "Пребаци подешавања",
+	"Toggle sidebar": "Пребаци бочну траку",
+	"Top K": "Топ К",
+	"Top P": "Топ П",
+	"Trouble accessing Ollama?": "Проблеми са приступом Ollama-и?",
+	"TTS Settings": "TTS подешавања",
+	"Type Hugging Face Resolve (Download) URL": "Унесите Hugging Face Resolve (Download) адресу",
+	"Uh-oh! There was an issue connecting to {{provider}}.": "Упс! Дошло је до проблема при повезивању са {{provider}}.",
+	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат тип датотеке '{{file_type}}', али прихваћен и третиран као обичан текст",
+	"Update and Copy Link": "Ажурирај и копирај везу",
+	"Update password": "Ажурирај лозинку",
+	"Upload a GGUF model": "Отпреми GGUF модел",
+	"Upload files": "Отпреми датотеке",
+	"Upload Progress": "Напредак отпремања",
+	"URL Mode": "Режим адресе",
+	"Use '#' in the prompt input to load and select your documents.": "Користи '#' у уносу упита да учитате и изаберете ваше документе.",
+	"Use Gravatar": "Користи Граватар",
+	"Use Initials": "Користи иницијале",
+	"user": "корисник",
+	"User Permissions": "Овлашћења корисника",
+	"Users": "Корисници",
+	"Utilize": "Искористи",
+	"Valid time units:": "Важеће временске јединице:",
+	"variable": "променљива",
+	"variable to have them replaced with clipboard content.": "променљива за замену са садржајем оставе.",
+	"Version": "Издање",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Упозорење: ако ажурирате или промените ваш модел уградње, мораћете поново да увезете све документе.",
+	"Web": "Веб",
+	"Web Loader Settings": "Подешавања веб учитавача",
+	"Web Params": "Веб параметри",
+	"Web Search Disabled": "",
+	"Web Search Enabled": "",
+	"Webhook URL": "Адреса веб-куке",
+	"WebUI Add-ons": "Додаци веб интерфејса",
+	"WebUI Settings": "Подешавања веб интерфејса",
+	"WebUI will make requests to": "Веб интерфејс ће слати захтеве на",
+	"What’s New in": "Шта је ново у",
+	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Када је историја искључена, нова ћаскања у овом прегледачу неће се појавити у вашој историји на било ком вашем уређају.",
+	"Whisper (Local)": "Whisper (локално)",
+	"Workspace": "Радни простор",
+	"Write a prompt suggestion (e.g. Who are you?)": "Напишите предлог упита (нпр. „ко си ти?“)",
+	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите сажетак у 50 речи који резимира [тему или кључну реч].",
+	"Yesterday": "Јуче",
+	"You": "Ти",
+	"You have no archived conversations.": "Немате архивиране разговоре.",
+	"You have shared this chat": "Поделили сте ово ћаскање",
+	"You're a helpful assistant.": "Ти си користан помоћник.",
+	"You're now logged in.": "Сада сте пријављени.",
+	"Youtube": "Јутјуб",
+	"Youtube Loader Settings": "Подешавања Јутјуб учитавача"
+}

+ 15 - 6
src/lib/i18n/locales/sv-SE/translation.json

@@ -11,14 +11,16 @@
 	"About": "Om",
 	"About": "Om",
 	"Account": "Konto",
 	"Account": "Konto",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "Lägg till en modell",
 	"Add a model": "Lägg till en modell",
 	"Add a model tag name": "Lägg till ett modellnamn",
 	"Add a model tag name": "Lägg till ett modellnamn",
 	"Add a short description about what this modelfile does": "Lägg till en kort beskrivning av vad den här modelfilen gör",
 	"Add a short description about what this modelfile does": "Lägg till en kort beskrivning av vad den här modelfilen gör",
 	"Add a short title for this prompt": "Lägg till en kort titel för denna prompt",
 	"Add a short title for this prompt": "Lägg till en kort titel för denna prompt",
 	"Add a tag": "Lägg till en tagg",
 	"Add a tag": "Lägg till en tagg",
-	"Add custom prompt": "",
+	"Add custom prompt": "Lägg till en anpassad prompt",
 	"Add Docs": "Lägg till dokument",
 	"Add Docs": "Lägg till dokument",
 	"Add Files": "Lägg till filer",
 	"Add Files": "Lägg till filer",
+	"Add Memory": "",
 	"Add message": "Lägg till meddelande",
 	"Add message": "Lägg till meddelande",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "",
 	"Add Tags": "",
@@ -48,8 +50,8 @@
 	"Archived Chats": "",
 	"Archived Chats": "",
 	"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
 	"are allowed - Activate this command by typing": "är tillåtna - Aktivera detta kommando genom att skriva",
 	"Are you sure?": "Är du säker?",
 	"Are you sure?": "Är du säker?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "Bifoga fil",
+	"Attention to detail": "Detaljerad uppmärksamhet",
 	"Audio": "Ljud",
 	"Audio": "Ljud",
 	"August": "",
 	"August": "",
 	"Auto-playback response": "Automatisk uppspelning",
 	"Auto-playback response": "Automatisk uppspelning",
@@ -68,6 +70,7 @@
 	"Change Password": "Ändra lösenord",
 	"Change Password": "Ändra lösenord",
 	"Chat": "Chatt",
 	"Chat": "Chatt",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chatthistorik",
 	"Chat History": "Chatthistorik",
 	"Chat History is off for this browser.": "Chatthistoriken är avstängd för denna webbläsare.",
 	"Chat History is off for this browser.": "Chatthistoriken är avstängd för denna webbläsare.",
 	"Chats": "Chattar",
 	"Chats": "Chattar",
@@ -169,6 +172,7 @@
 	"Enabled": "Aktiverad",
 	"Enabled": "Aktiverad",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "Skriv {{role}} meddelande här",
 	"Enter {{role}} message here": "Skriv {{role}} meddelande här",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Ange Chunk-överlappning",
 	"Enter Chunk Overlap": "Ange Chunk-överlappning",
 	"Enter Chunk Size": "Ange Chunk-storlek",
 	"Enter Chunk Size": "Ange Chunk-storlek",
 	"Enter Image Size (e.g. 512x512)": "Ange bildstorlek (t.ex. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Ange bildstorlek (t.ex. 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "Importera modelfiler",
 	"Import Modelfiles": "Importera modelfiler",
 	"Import Prompts": "Importera prompts",
 	"Import Prompts": "Importera prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inkludera `--api`-flagga när du kör stabil-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Inkludera `--api`-flagga när du kör stabil-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Indatakommandon",
 	"Interface": "Gränssnitt",
 	"Interface": "Gränssnitt",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "Ljus",
 	"Light": "Ljus",
 	"Listening...": "Lyssnar...",
 	"Listening...": "Lyssnar...",
 	"LLMs can make mistakes. Verify important information.": "LLM:er kan göra misstag. Verifiera viktig information.",
 	"LLMs can make mistakes. Verify important information.": "LLM:er kan göra misstag. Verifiera viktig information.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Skapad av OpenWebUI Community",
 	"Made by OpenWebUI Community": "Skapad av OpenWebUI Community",
 	"Make sure to enclose them with": "Se till att bifoga dem med",
 	"Make sure to enclose them with": "Se till att bifoga dem med",
 	"Manage LiteLLM Models": "Hantera LiteLLM-modeller",
 	"Manage LiteLLM Models": "Hantera LiteLLM-modeller",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Max antal tokens",
 	"Max Tokens": "Max antal tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Högst 3 modeller kan laddas ner samtidigt. Vänligen försök igen senare.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Högst 3 modeller kan laddas ner samtidigt. Vänligen försök igen senare.",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
 	"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
 	"pending": "väntande",
 	"pending": "väntande",
 	"Permission denied when accessing microphone: {{error}}": "Tillstånd nekades vid åtkomst till mikrofon: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Tillstånd nekades vid åtkomst till mikrofon: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Lekplats",
 	"Playground": "Lekplats",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Roll",
 	"Role": "Roll",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Spara",
 	"Save": "Spara",
 	"Save & Create": "Spara och skapa",
 	"Save & Create": "Spara och skapa",
 	"Save & Update": "Spara och uppdatera",
 	"Save & Update": "Spara och uppdatera",
@@ -381,7 +390,7 @@
 	"Select a mode": "Välj ett läge",
 	"Select a mode": "Välj ett läge",
 	"Select a model": "Välj en modell",
 	"Select a model": "Välj en modell",
 	"Select an Ollama instance": "Välj en Ollama-instans",
 	"Select an Ollama instance": "Välj en Ollama-instans",
-	"Select model": "",
+	"Select model": "Välj en modell",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "Skicka ett meddelande",
 	"Send a Message": "Skicka ett meddelande",
 	"Send message": "Skicka meddelande",
 	"Send message": "Skicka meddelande",

+ 10 - 1
src/lib/i18n/locales/tr-TR/translation.json

@@ -11,6 +11,7 @@
 	"About": "Hakkında",
 	"About": "Hakkında",
 	"Account": "Hesap",
 	"Account": "Hesap",
 	"Accurate information": "Doğru bilgi",
 	"Accurate information": "Doğru bilgi",
+	"Add": "",
 	"Add a model": "Bir model ekleyin",
 	"Add a model": "Bir model ekleyin",
 	"Add a model tag name": "Bir model etiket adı ekleyin",
 	"Add a model tag name": "Bir model etiket adı ekleyin",
 	"Add a short description about what this modelfile does": "Bu model dosyasının ne yaptığı hakkında kısa bir açıklama ekleyin",
 	"Add a short description about what this modelfile does": "Bu model dosyasının ne yaptığı hakkında kısa bir açıklama ekleyin",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Özel prompt ekle",
 	"Add custom prompt": "Özel prompt ekle",
 	"Add Docs": "Dökümanlar Ekle",
 	"Add Docs": "Dökümanlar Ekle",
 	"Add Files": "Dosyalar Ekle",
 	"Add Files": "Dosyalar Ekle",
+	"Add Memory": "",
 	"Add message": "Mesaj ekle",
 	"Add message": "Mesaj ekle",
 	"Add Model": "Model Ekle",
 	"Add Model": "Model Ekle",
 	"Add Tags": "Etiketler ekle",
 	"Add Tags": "Etiketler ekle",
@@ -68,6 +70,7 @@
 	"Change Password": "Parola Değiştir",
 	"Change Password": "Parola Değiştir",
 	"Chat": "Sohbet",
 	"Chat": "Sohbet",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Sohbet Geçmişi",
 	"Chat History": "Sohbet Geçmişi",
 	"Chat History is off for this browser.": "Bu tarayıcı için sohbet geçmişi kapalı.",
 	"Chat History is off for this browser.": "Bu tarayıcı için sohbet geçmişi kapalı.",
 	"Chats": "Sohbetler",
 	"Chats": "Sohbetler",
@@ -169,6 +172,7 @@
 	"Enabled": "Etkin",
 	"Enabled": "Etkin",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV dosyanızın şu sırayla 4 sütun içerdiğinden emin olun: İsim, E-posta, Şifre, Rol.",
 	"Enter {{role}} message here": "Buraya {{role}} mesajını girin",
 	"Enter {{role}} message here": "Buraya {{role}} mesajını girin",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Chunk Örtüşmesini Girin",
 	"Enter Chunk Overlap": "Chunk Örtüşmesini Girin",
 	"Enter Chunk Size": "Chunk Boyutunu Girin",
 	"Enter Chunk Size": "Chunk Boyutunu Girin",
 	"Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Açık",
 	"Light": "Açık",
 	"Listening...": "Dinleniyor...",
 	"Listening...": "Dinleniyor...",
 	"LLMs can make mistakes. Verify important information.": "LLM'ler hata yapabilir. Önemli bilgileri doğrulayın.",
 	"LLMs can make mistakes. Verify important information.": "LLM'ler hata yapabilir. Önemli bilgileri doğrulayın.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI Topluluğu tarafından yapılmıştır",
 	"Made by OpenWebUI Community": "OpenWebUI Topluluğu tarafından yapılmıştır",
 	"Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:",
 	"Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:",
 	"Manage LiteLLM Models": "LiteLLM Modellerini Yönet",
 	"Manage LiteLLM Models": "LiteLLM Modellerini Yönet",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Maksimum Token",
 	"Max Tokens": "Maksimum Token",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Aynı anda en fazla 3 model indirilebilir. Lütfen daha sonra tekrar deneyin.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Aynı anda en fazla 3 model indirilebilir. Lütfen daha sonra tekrar deneyin.",
 	"May": "Mayıs",
 	"May": "Mayıs",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "Bağlantınızı oluşturduktan sonra gönderdiğiniz mesajlar paylaşılmayacaktır. URL'ye sahip kullanıcılar paylaşılan sohbeti görüntüleyebilecektir.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Minimum Skor",
 	"Minimum Score": "Minimum Skor",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
 	"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
 	"pending": "beklemede",
 	"pending": "beklemede",
 	"Permission denied when accessing microphone: {{error}}": "Mikrofona erişim izni reddedildi: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Mikrofona erişim izni reddedildi: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Düz metin (.txt)",
 	"Plain text (.txt)": "Düz metin (.txt)",
 	"Playground": "Oyun Alanı",
 	"Playground": "Oyun Alanı",
 	"Positive attitude": "Olumlu yaklaşım",
 	"Positive attitude": "Olumlu yaklaşım",
@@ -362,6 +370,7 @@
 	"Role": "Rol",
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Kaydet",
 	"Save": "Kaydet",
 	"Save & Create": "Kaydet ve Oluştur",
 	"Save & Create": "Kaydet ve Oluştur",
 	"Save & Update": "Kaydet ve Güncelle",
 	"Save & Update": "Kaydet ve Güncelle",

+ 10 - 1
src/lib/i18n/locales/uk-UA/translation.json

@@ -11,6 +11,7 @@
 	"About": "Про програму",
 	"About": "Про програму",
 	"Account": "Обліковий запис",
 	"Account": "Обліковий запис",
 	"Accurate information": "Точна інформація",
 	"Accurate information": "Точна інформація",
+	"Add": "",
 	"Add a model": "Додати модель",
 	"Add a model": "Додати модель",
 	"Add a model tag name": "Додати ім'я тегу моделі",
 	"Add a model tag name": "Додати ім'я тегу моделі",
 	"Add a short description about what this modelfile does": "Додати короткий опис того, що робить цей файл моделі",
 	"Add a short description about what this modelfile does": "Додати короткий опис того, що робить цей файл моделі",
@@ -19,6 +20,7 @@
 	"Add custom prompt": "Додати користувацьку підказку",
 	"Add custom prompt": "Додати користувацьку підказку",
 	"Add Docs": "Додати документи",
 	"Add Docs": "Додати документи",
 	"Add Files": "Додати файли",
 	"Add Files": "Додати файли",
+	"Add Memory": "",
 	"Add message": "Додати повідомлення",
 	"Add message": "Додати повідомлення",
 	"Add Model": "Додати модель",
 	"Add Model": "Додати модель",
 	"Add Tags": "додати теги",
 	"Add Tags": "додати теги",
@@ -68,6 +70,7 @@
 	"Change Password": "Змінити пароль",
 	"Change Password": "Змінити пароль",
 	"Chat": "Чат",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Історія чату",
 	"Chat History": "Історія чату",
 	"Chat History is off for this browser.": "Історія чату вимкнена для цього браузера.",
 	"Chat History is off for this browser.": "Історія чату вимкнена для цього браузера.",
 	"Chats": "Чати",
 	"Chats": "Чати",
@@ -169,6 +172,7 @@
 	"Enabled": "Увімкнено",
 	"Enabled": "Увімкнено",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Переконайтеся, що ваш CSV-файл містить 4 колонки в такому порядку: Ім'я, Email, Пароль, Роль.",
 	"Enter {{role}} message here": "Введіть повідомлення {{role}} тут",
 	"Enter {{role}} message here": "Введіть повідомлення {{role}} тут",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Введіть перекриття фрагменту",
 	"Enter Chunk Overlap": "Введіть перекриття фрагменту",
 	"Enter Chunk Size": "Введіть розмір фрагменту",
 	"Enter Chunk Size": "Введіть розмір фрагменту",
 	"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
@@ -247,6 +251,7 @@
 	"Light": "Світла",
 	"Light": "Світла",
 	"Listening...": "Слухаю...",
 	"Listening...": "Слухаю...",
 	"LLMs can make mistakes. Verify important information.": "LLMs можуть помилятися. Перевірте важливу інформацію.",
 	"LLMs can make mistakes. Verify important information.": "LLMs можуть помилятися. Перевірте важливу інформацію.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Зроблено спільнотою OpenWebUI",
 	"Made by OpenWebUI Community": "Зроблено спільнотою OpenWebUI",
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
 	"Manage LiteLLM Models": "Керування моделями LiteLLM",
 	"Manage LiteLLM Models": "Керування моделями LiteLLM",
@@ -256,7 +261,9 @@
 	"Max Tokens": "Максимальна кількість токенів",
 	"Max Tokens": "Максимальна кількість токенів",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
 	"May": "Травень",
 	"May": "Травень",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "Повідомлення, які ви надсилаєте після створення посилання, не будуть опубліковані. Користувачі з URL-адресою зможуть переглядати спільний чат.",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "Мінімальний бал",
 	"Minimum Score": "Мінімальний бал",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
 	"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
 	"pending": "на розгляді",
 	"pending": "на розгляді",
 	"Permission denied when accessing microphone: {{error}}": "Доступ до мікрофона заборонено: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Доступ до мікрофона заборонено: {{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "Простий текст (.txt)",
 	"Plain text (.txt)": "Простий текст (.txt)",
 	"Playground": "Майданчик",
 	"Playground": "Майданчик",
 	"Positive attitude": "Позитивне ставлення",
 	"Positive attitude": "Позитивне ставлення",
@@ -362,6 +370,7 @@
 	"Role": "Роль",
 	"Role": "Роль",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Зберегти",
 	"Save": "Зберегти",
 	"Save & Create": "Зберегти та створити",
 	"Save & Create": "Зберегти та створити",
 	"Save & Update": "Зберегти та оновити",
 	"Save & Update": "Зберегти та оновити",

+ 94 - 85
src/lib/i18n/locales/vi-VN/translation.json

@@ -11,25 +11,27 @@
 	"About": "Giới thiệu",
 	"About": "Giới thiệu",
 	"Account": "Tài khoản",
 	"Account": "Tài khoản",
 	"Accurate information": "Thông tin chính xác",
 	"Accurate information": "Thông tin chính xác",
+	"Add": "",
 	"Add a model": "Thêm mô hình",
 	"Add a model": "Thêm mô hình",
 	"Add a model tag name": "Thêm tên thẻ mô hình (tag)",
 	"Add a model tag name": "Thêm tên thẻ mô hình (tag)",
 	"Add a short description about what this modelfile does": "Thêm mô tả ngắn về việc tệp mô tả mô hình (modelfile) này làm gì",
 	"Add a short description about what this modelfile does": "Thêm mô tả ngắn về việc tệp mô tả mô hình (modelfile) này làm gì",
 	"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này",
 	"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này",
 	"Add a tag": "Thêm thẻ (tag)",
 	"Add a tag": "Thêm thẻ (tag)",
-	"Add custom prompt": "",
+	"Add custom prompt": "Thêm prompt tùy chỉnh",
 	"Add Docs": "Thêm tài liệu",
 	"Add Docs": "Thêm tài liệu",
 	"Add Files": "Thêm tệp",
 	"Add Files": "Thêm tệp",
+	"Add Memory": "",
 	"Add message": "Thêm tin nhắn",
 	"Add message": "Thêm tin nhắn",
-	"Add Model": "",
+	"Add Model": "Thêm model",
 	"Add Tags": "thêm thẻ",
 	"Add Tags": "thêm thẻ",
-	"Add User": "",
+	"Add User": "Thêm người dùng",
 	"Adjusting these settings will apply changes universally to all users.": "Các thay đổi cài đặt này sẽ áp dụng cho tất cả người sử dụng.",
 	"Adjusting these settings will apply changes universally to all users.": "Các thay đổi cài đặt này sẽ áp dụng cho tất cả người sử dụng.",
 	"admin": "quản trị viên",
 	"admin": "quản trị viên",
 	"Admin Panel": "Trang Quản trị",
 	"Admin Panel": "Trang Quản trị",
 	"Admin Settings": "Cài đặt hệ thống",
 	"Admin Settings": "Cài đặt hệ thống",
 	"Advanced Parameters": "Các tham số Nâng cao",
 	"Advanced Parameters": "Các tham số Nâng cao",
 	"all": "tất cả",
 	"all": "tất cả",
-	"All Documents": "",
+	"All Documents": "Tất cả tài liệu",
 	"All Users": "Danh sách người sử dụng",
 	"All Users": "Danh sách người sử dụng",
 	"Allow": "Cho phép",
 	"Allow": "Cho phép",
 	"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
 	"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
@@ -37,29 +39,29 @@
 	"Already have an account?": "Bạn đã có tài khoản?",
 	"Already have an account?": "Bạn đã có tài khoản?",
 	"an assistant": "trợ lý",
 	"an assistant": "trợ lý",
 	"and": "và",
 	"and": "và",
-	"and create a new shared link.": "",
+	"and create a new shared link.": "và tạo một link chia sẻ mới",
 	"API Base URL": "Đường dẫn tới API (API Base URL)",
 	"API Base URL": "Đường dẫn tới API (API Base URL)",
 	"API Key": "API Key",
 	"API Key": "API Key",
 	"API Key created.": "",
 	"API Key created.": "",
 	"API keys": "",
 	"API keys": "",
 	"API RPM": "API RPM",
 	"API RPM": "API RPM",
-	"April": "",
-	"Archive": "",
+	"April": "Tháng 4",
+	"Archive": "Lưu trữ",
 	"Archived Chats": "bản ghi trò chuyện",
 	"Archived Chats": "bản ghi trò chuyện",
 	"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
 	"are allowed - Activate this command by typing": "được phép - Kích hoạt lệnh này bằng cách gõ",
 	"Are you sure?": "Bạn có chắc chắn không?",
 	"Are you sure?": "Bạn có chắc chắn không?",
-	"Attach file": "",
+	"Attach file": "Đính kèm file",
 	"Attention to detail": "Có sự chú ý đến chi tiết của vấn đề",
 	"Attention to detail": "Có sự chú ý đến chi tiết của vấn đề",
 	"Audio": "Âm thanh",
 	"Audio": "Âm thanh",
-	"August": "",
+	"August": "Tháng 8",
 	"Auto-playback response": "Tự động phát lại phản hồi (Auto-playback)",
 	"Auto-playback response": "Tự động phát lại phản hồi (Auto-playback)",
 	"Auto-send input after 3 sec.": "Tự động gửi đầu vào sau 3 giây.",
 	"Auto-send input after 3 sec.": "Tự động gửi đầu vào sau 3 giây.",
 	"AUTOMATIC1111 Base URL": "Đường dẫn kết nối tới AUTOMATIC1111 (Base URL)",
 	"AUTOMATIC1111 Base URL": "Đường dẫn kết nối tới AUTOMATIC1111 (Base URL)",
 	"AUTOMATIC1111 Base URL is required.": "Base URL của AUTOMATIC1111 là bắt buộc.",
 	"AUTOMATIC1111 Base URL is required.": "Base URL của AUTOMATIC1111 là bắt buộc.",
 	"available!": "có sẵn!",
 	"available!": "có sẵn!",
 	"Back": "Quay lại",
 	"Back": "Quay lại",
-	"Bad Response": "",
-	"before": "",
+	"Bad Response": "Trả lời KHÔNG tốt",
+	"before": "trước",
 	"Being lazy": "Lười biếng",
 	"Being lazy": "Lười biếng",
 	"Builder Mode": "Chế độ Builder",
 	"Builder Mode": "Chế độ Builder",
 	"Bypass SSL verification for Websites": "",
 	"Bypass SSL verification for Websites": "",
@@ -68,6 +70,7 @@
 	"Change Password": "Đổi Mật khẩu",
 	"Change Password": "Đổi Mật khẩu",
 	"Chat": "Trò chuyện",
 	"Chat": "Trò chuyện",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Lịch sử chat",
 	"Chat History": "Lịch sử chat",
 	"Chat History is off for this browser.": "Lịch sử chat đã tắt cho trình duyệt này.",
 	"Chat History is off for this browser.": "Lịch sử chat đã tắt cho trình duyệt này.",
 	"Chats": "Chat",
 	"Chats": "Chat",
@@ -76,14 +79,14 @@
 	"Checking for updates...": "Đang kiểm tra cập nhật...",
 	"Checking for updates...": "Đang kiểm tra cập nhật...",
 	"Choose a model before saving...": "Chọn mô hình trước khi lưu...",
 	"Choose a model before saving...": "Chọn mô hình trước khi lưu...",
 	"Chunk Overlap": "Chồng lấn (overlap)",
 	"Chunk Overlap": "Chồng lấn (overlap)",
-	"Chunk Params": "Cài đặt số lượng ký tự cho khối ký tự (chunk)",
+	"Chunk Params": "Tham số khối (chunk)",
 	"Chunk Size": "Kích thước khối (size)",
 	"Chunk Size": "Kích thước khối (size)",
 	"Citation": "Trích dẫn",
 	"Citation": "Trích dẫn",
 	"Click here for help.": "Bấm vào đây để được trợ giúp.",
 	"Click here for help.": "Bấm vào đây để được trợ giúp.",
-	"Click here to": "",
+	"Click here to": "Nhấn vào đây để",
 	"Click here to check other modelfiles.": "Bấm vào đây để kiểm tra các tệp mô tả mô hình (modelfiles) khác.",
 	"Click here to check other modelfiles.": "Bấm vào đây để kiểm tra các tệp mô tả mô hình (modelfiles) khác.",
 	"Click here to select": "Bấm vào đây để chọn",
 	"Click here to select": "Bấm vào đây để chọn",
-	"Click here to select a csv file.": "",
+	"Click here to select a csv file.": "Nhấn vào đây để chọn tệp csv",
 	"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
 	"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
 	"click here.": "bấm vào đây.",
 	"click here.": "bấm vào đây.",
 	"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
 	"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
@@ -97,21 +100,21 @@
 	"Connections": "Kết nối",
 	"Connections": "Kết nối",
 	"Content": "Nội dung",
 	"Content": "Nội dung",
 	"Context Length": "Độ dài ngữ cảnh (Context Length)",
 	"Context Length": "Độ dài ngữ cảnh (Context Length)",
-	"Continue Response": "",
+	"Continue Response": "Tiếp tục trả lời",
 	"Conversation Mode": "Chế độ hội thoại",
 	"Conversation Mode": "Chế độ hội thoại",
 	"Copied shared chat URL to clipboard!": "",
 	"Copied shared chat URL to clipboard!": "",
-	"Copy": "",
+	"Copy": "Sao chép",
 	"Copy last code block": "Sao chép khối mã cuối cùng",
 	"Copy last code block": "Sao chép khối mã cuối cùng",
 	"Copy last response": "Sao chép phản hồi cuối cùng",
 	"Copy last response": "Sao chép phản hồi cuối cùng",
-	"Copy Link": "",
+	"Copy Link": "Sao chép link",
 	"Copying to clipboard was successful!": "Sao chép vào clipboard thành công!",
 	"Copying to clipboard was successful!": "Sao chép vào clipboard thành công!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Tạo một cụm từ súc tích, 3-5 từ làm tiêu đề cho truy vấn sau, tuân thủ nghiêm ngặt giới hạn 3-5 từ và tránh sử dụng từ 'tiêu đề':",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Tạo một cụm từ súc tích, 3-5 từ làm tiêu đề cho truy vấn sau, tuân thủ nghiêm ngặt giới hạn 3-5 từ và tránh sử dụng từ 'tiêu đề':",
 	"Create a modelfile": "Tạo tệp mô tả cho mô hình",
 	"Create a modelfile": "Tạo tệp mô tả cho mô hình",
 	"Create Account": "Tạo Tài khoản",
 	"Create Account": "Tạo Tài khoản",
-	"Create new key": "",
-	"Create new secret key": "",
+	"Create new key": "Tạo key mới",
+	"Create new secret key": "Tạo key bí mật mới",
 	"Created at": "Được tạo vào lúc",
 	"Created at": "Được tạo vào lúc",
-	"Created At": "",
+	"Created At": "Tạo lúc",
 	"Current Model": "Mô hình hiện tại",
 	"Current Model": "Mô hình hiện tại",
 	"Current Password": "Mật khẩu hiện tại",
 	"Current Password": "Mật khẩu hiện tại",
 	"Custom": "Tùy chỉnh",
 	"Custom": "Tùy chỉnh",
@@ -119,7 +122,7 @@
 	"Dark": "Tối",
 	"Dark": "Tối",
 	"Dashboard": "",
 	"Dashboard": "",
 	"Database": "Cơ sở dữ liệu",
 	"Database": "Cơ sở dữ liệu",
-	"December": "",
+	"December": "Tháng 12",
 	"Default": "Mặc định",
 	"Default": "Mặc định",
 	"Default (Automatic1111)": "Mặc định (Automatic1111)",
 	"Default (Automatic1111)": "Mặc định (Automatic1111)",
 	"Default (SentenceTransformers)": "",
 	"Default (SentenceTransformers)": "",
@@ -128,15 +131,15 @@
 	"Default Prompt Suggestions": "Đề xuất prompt mặc định",
 	"Default Prompt Suggestions": "Đề xuất prompt mặc định",
 	"Default User Role": "Vai trò mặc định",
 	"Default User Role": "Vai trò mặc định",
 	"delete": "xóa",
 	"delete": "xóa",
-	"Delete": "",
+	"Delete": "Xóa",
 	"Delete a model": "Xóa mô hình",
 	"Delete a model": "Xóa mô hình",
 	"Delete chat": "Xóa nội dung chat",
 	"Delete chat": "Xóa nội dung chat",
-	"Delete Chat": "",
+	"Delete Chat": "Xóa chat",
 	"Delete Chats": "Xóa nội dung chat",
 	"Delete Chats": "Xóa nội dung chat",
-	"delete this link": "",
-	"Delete User": "",
+	"delete this link": "Xóa link này",
+	"Delete User": "Xóa người dùng",
 	"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
-	"Deleted {{tagName}}": "",
+	"Deleted {{tagName}}": "Xóa {{tagName}}",
 	"Description": "Mô tả",
 	"Description": "Mô tả",
 	"Didn't fully follow instructions": "Không tuân theo chỉ dẫn một cách đầy đủ",
 	"Didn't fully follow instructions": "Không tuân theo chỉ dẫn một cách đầy đủ",
 	"Disabled": "Đã vô hiệu hóa",
 	"Disabled": "Đã vô hiệu hóa",
@@ -152,12 +155,12 @@
 	"Don't Allow": "Không Cho phép",
 	"Don't Allow": "Không Cho phép",
 	"Don't have an account?": "Không có tài khoản?",
 	"Don't have an account?": "Không có tài khoản?",
 	"Don't like the style": "Không thích phong cách trả lời",
 	"Don't like the style": "Không thích phong cách trả lời",
-	"Download": "",
-	"Download canceled": "",
+	"Download": "Tải về",
+	"Download canceled": "Đã hủy download",
 	"Download Database": "Tải xuống Cơ sở dữ liệu",
 	"Download Database": "Tải xuống Cơ sở dữ liệu",
 	"Drop any files here to add to the conversation": "Thả bất kỳ tệp nào ở đây để thêm vào nội dung chat",
 	"Drop any files here to add to the conversation": "Thả bất kỳ tệp nào ở đây để thêm vào nội dung chat",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "vd: '30s','10m'. Đơn vị thời gian hợp lệ là 's', 'm', 'h'.",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "vd: '30s','10m'. Đơn vị thời gian hợp lệ là 's', 'm', 'h'.",
-	"Edit": "",
+	"Edit": "Chỉnh sửa",
 	"Edit Doc": "Thay đổi tài liệu",
 	"Edit Doc": "Thay đổi tài liệu",
 	"Edit User": "Thay đổi thông tin người sử dụng",
 	"Edit User": "Thay đổi thông tin người sử dụng",
 	"Email": "Email",
 	"Email": "Email",
@@ -167,8 +170,9 @@
 	"Enable Chat History": "Bật Lịch sử chat",
 	"Enable Chat History": "Bật Lịch sử chat",
 	"Enable New Sign Ups": "Cho phép đăng ký mới",
 	"Enable New Sign Ups": "Cho phép đăng ký mới",
 	"Enabled": "Đã bật",
 	"Enabled": "Đã bật",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Đảm bảo tệp CSV của bạn bao gồm 4 cột theo thứ tự sau: Name, Email, Password, Role.",
 	"Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây",
 	"Enter {{role}} message here": "Nhập yêu cầu của {{role}} ở đây",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
 	"Enter Chunk Overlap": "Nhập Chunk chồng lấn (overlap)",
 	"Enter Chunk Size": "Nhập Kích thước Chunk",
 	"Enter Chunk Size": "Nhập Kích thước Chunk",
 	"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
 	"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
@@ -180,7 +184,7 @@
 	"Enter Max Tokens (litellm_params.max_tokens)": "Nhập Số Token Tối đa (litellm_params.max_tokens)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Nhập Số Token Tối đa (litellm_params.max_tokens)",
 	"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})",
 	"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
 	"Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
-	"Enter Score": "",
+	"Enter Score": "Nhập Score",
 	"Enter stop sequence": "Nhập stop sequence",
 	"Enter stop sequence": "Nhập stop sequence",
 	"Enter Top K": "Nhập Top K",
 	"Enter Top K": "Nhập Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Nhập URL (vd: http://127.0.0.1:7860/)",
@@ -188,16 +192,16 @@
 	"Enter Your Email": "Nhập Email của bạn",
 	"Enter Your Email": "Nhập Email của bạn",
 	"Enter Your Full Name": "Nhập Họ và Tên của bạn",
 	"Enter Your Full Name": "Nhập Họ và Tên của bạn",
 	"Enter Your Password": "Nhập Mật khẩu của bạn",
 	"Enter Your Password": "Nhập Mật khẩu của bạn",
-	"Enter Your Role": "",
+	"Enter Your Role": "Nhập vai trò của bạn",
 	"Experimental": "Thử nghiệm",
 	"Experimental": "Thử nghiệm",
 	"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
 	"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
 	"Export Chats": "Tải nội dung chat về máy",
 	"Export Chats": "Tải nội dung chat về máy",
 	"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
 	"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
 	"Export Modelfiles": "Tải tệp mô tả về máy",
 	"Export Modelfiles": "Tải tệp mô tả về máy",
 	"Export Prompts": "Tải các prompt về máy",
 	"Export Prompts": "Tải các prompt về máy",
-	"Failed to create API Key.": "",
+	"Failed to create API Key.": "Lỗi khởi tạo API Key",
 	"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
 	"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
-	"February": "",
+	"February": "Tháng 2",
 	"Feel free to add specific details": "Mô tả chi tiết về chất lượng của câu hỏi và phương án trả lời",
 	"Feel free to add specific details": "Mô tả chi tiết về chất lượng của câu hỏi và phương án trả lời",
 	"File Mode": "Chế độ Tệp văn bản",
 	"File Mode": "Chế độ Tệp văn bản",
 	"File not found.": "Không tìm thấy tệp.",
 	"File not found.": "Không tìm thấy tệp.",
@@ -211,12 +215,12 @@
 	"General": "Cài đặt chung",
 	"General": "Cài đặt chung",
 	"General Settings": "Cấu hình chung",
 	"General Settings": "Cấu hình chung",
 	"Generating search query": "",
 	"Generating search query": "",
-	"Generation Info": "",
-	"Good Response": "",
+	"Generation Info": "Thông tin chung",
+	"Good Response": "Trả lời tốt",
 	"h:mm a": "",
 	"h:mm a": "",
-	"has no conversations.": "",
+	"has no conversations.": "không có hội thoại",
 	"Hello, {{name}}": "Xin chào, {{name}}",
 	"Hello, {{name}}": "Xin chào, {{name}}",
-	"Help": "",
+	"Help": "Trợ giúp",
 	"Hide": "Ẩn",
 	"Hide": "Ẩn",
 	"Hide Additional Params": "Ẩn Các tham số bổ sung",
 	"Hide Additional Params": "Ẩn Các tham số bổ sung",
 	"How can I help you today?": "Tôi có thể giúp gì cho bạn hôm nay?",
 	"How can I help you today?": "Tôi có thể giúp gì cho bạn hôm nay?",
@@ -230,34 +234,37 @@
 	"Import Modelfiles": "Nạp tệp mô tả",
 	"Import Modelfiles": "Nạp tệp mô tả",
 	"Import Prompts": "Nạp các prompt lên hệ thống",
 	"Import Prompts": "Nạp các prompt lên hệ thống",
 	"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
-	"Input commands": "",
+	"Input commands": "Nhập các câu lệnh",
 	"Interface": "Giao diện",
 	"Interface": "Giao diện",
-	"Invalid Tag": "",
-	"January": "",
+	"Invalid Tag": "Tag không hợp lệ",
+	"January": "Tháng 1",
 	"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
 	"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
 	"JSON": "JSON",
 	"JSON": "JSON",
-	"July": "",
-	"June": "",
+	"July": "Tháng 7",
+	"June": "Tháng 6",
 	"JWT Expiration": "JWT Hết hạn",
 	"JWT Expiration": "JWT Hết hạn",
 	"JWT Token": "Token JWT",
 	"JWT Token": "Token JWT",
 	"Keep Alive": "Giữ kết nối",
 	"Keep Alive": "Giữ kết nối",
 	"Keyboard shortcuts": "Phím tắt",
 	"Keyboard shortcuts": "Phím tắt",
 	"Language": "Ngôn ngữ",
 	"Language": "Ngôn ngữ",
-	"Last Active": "",
+	"Last Active": "Truy cập gần nhất",
 	"Light": "Sáng",
 	"Light": "Sáng",
 	"Listening...": "Đang nghe...",
 	"Listening...": "Đang nghe...",
 	"LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.",
 	"LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
 	"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
 	"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
 	"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
 	"Manage LiteLLM Models": "Quản lý mô hình với LiteLLM",
 	"Manage LiteLLM Models": "Quản lý mô hình với LiteLLM",
 	"Manage Models": "Quản lý mô hình",
 	"Manage Models": "Quản lý mô hình",
 	"Manage Ollama Models": "Quản lý mô hình với Ollama",
 	"Manage Ollama Models": "Quản lý mô hình với Ollama",
-	"March": "",
+	"March": "Tháng 3",
 	"Max Tokens": "Max Tokens",
 	"Max Tokens": "Max Tokens",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Tối đa 3 mô hình có thể được tải xuống cùng lúc. Vui lòng thử lại sau.",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Tối đa 3 mô hình có thể được tải xuống cùng lúc. Vui lòng thử lại sau.",
-	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
-	"Minimum Score": "",
+	"May": "Tháng 5",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
+	"Minimum Score": "Score tối thiểu",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
 	"Mirostat Tau": "Mirostat Tau",
@@ -278,23 +285,23 @@
 	"Modelfile Content": "Nội dung Tệp Mô hình",
 	"Modelfile Content": "Nội dung Tệp Mô hình",
 	"Modelfiles": "Tệp Mô hình",
 	"Modelfiles": "Tệp Mô hình",
 	"Models": "Mô hình",
 	"Models": "Mô hình",
-	"More": "",
+	"More": "Thêm",
 	"Name": "Tên",
 	"Name": "Tên",
 	"Name Tag": "Tên Thẻ",
 	"Name Tag": "Tên Thẻ",
 	"Name your modelfile": "Đặt tên cho tệp mô hình của bạn",
 	"Name your modelfile": "Đặt tên cho tệp mô hình của bạn",
 	"New Chat": "Tạo cuộc trò chuyện mới",
 	"New Chat": "Tạo cuộc trò chuyện mới",
 	"New Password": "Mật khẩu mới",
 	"New Password": "Mật khẩu mới",
-	"No results found": "",
+	"No results found": "Không tìm thấy kết quả",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
 	"No source available": "Không có nguồn",
 	"No source available": "Không có nguồn",
 	"Not factually correct": "Không chính xác so với thực tế",
 	"Not factually correct": "Không chính xác so với thực tế",
 	"Not sure what to add?": "Không chắc phải thêm gì?",
 	"Not sure what to add?": "Không chắc phải thêm gì?",
 	"Not sure what to write? Switch to": "Không chắc phải viết gì? Chuyển sang",
 	"Not sure what to write? Switch to": "Không chắc phải viết gì? Chuyển sang",
-	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.",
 	"Notifications": "Thông báo trên máy tính (Notification)",
 	"Notifications": "Thông báo trên máy tính (Notification)",
-	"November": "",
-	"October": "",
+	"November": "Tháng 11",
+	"October": "Tháng 10",
 	"Off": "Tắt",
 	"Off": "Tắt",
 	"Okay, Let's Go!": "Được rồi, Bắt đầu thôi!",
 	"Okay, Let's Go!": "Được rồi, Bắt đầu thôi!",
 	"OLED Dark": "",
 	"OLED Dark": "",
@@ -318,21 +325,22 @@
 	"OpenAI URL/Key required.": "",
 	"OpenAI URL/Key required.": "",
 	"or": "hoặc",
 	"or": "hoặc",
 	"Other": "Khác",
 	"Other": "Khác",
-	"Overview": "",
+	"Overview": "Tổng quan",
 	"Parameters": "Tham số",
 	"Parameters": "Tham số",
 	"Password": "Mật khẩu",
 	"Password": "Mật khẩu",
 	"PDF document (.pdf)": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
 	"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
 	"pending": "đang chờ phê duyệt",
 	"pending": "đang chờ phê duyệt",
 	"Permission denied when accessing microphone: {{error}}": "Quyền truy cập micrô bị từ chối: {{error}}",
 	"Permission denied when accessing microphone: {{error}}": "Quyền truy cập micrô bị từ chối: {{error}}",
+	"Personalization": "Cá nhân hóa",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "Thử nghiệm (Playground)",
 	"Playground": "Thử nghiệm (Playground)",
-	"Positive attitude": "",
-	"Previous 30 days": "",
-	"Previous 7 days": "",
-	"Profile Image": "",
+	"Positive attitude": "Thái độ tích cực",
+	"Previous 30 days": "30 ngày trước",
+	"Previous 7 days": "7 ngày trước",
+	"Profile Image": "Ảnh đại diện",
 	"Prompt": "",
 	"Prompt": "",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ví dụ: Hãy kể cho tôi một sự thật thú vị về Đế chế La Mã)",
 	"Prompt Content": "Nội dung prompt",
 	"Prompt Content": "Nội dung prompt",
 	"Prompt suggestions": "Gợi ý prompt",
 	"Prompt suggestions": "Gợi ý prompt",
 	"Prompts": "Prompt",
 	"Prompts": "Prompt",
@@ -342,15 +350,15 @@
 	"Query Params": "Tham số Truy vấn",
 	"Query Params": "Tham số Truy vấn",
 	"RAG Template": "Mẫu prompt cho RAG",
 	"RAG Template": "Mẫu prompt cho RAG",
 	"Raw Format": "Raw Format",
 	"Raw Format": "Raw Format",
-	"Read Aloud": "",
+	"Read Aloud": "Đọc ra loa",
 	"Record voice": "Ghi âm",
 	"Record voice": "Ghi âm",
 	"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
 	"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
 	"Refused when it shouldn't have": "Từ chối trả lời mà nhẽ không nên làm vậy",
 	"Refused when it shouldn't have": "Từ chối trả lời mà nhẽ không nên làm vậy",
-	"Regenerate": "",
+	"Regenerate": "Tạo sinh lại câu trả lời",
 	"Release Notes": "Mô tả những cập nhật mới",
 	"Release Notes": "Mô tả những cập nhật mới",
-	"Remove": "",
-	"Remove Model": "",
-	"Rename": "",
+	"Remove": "Xóa",
+	"Remove Model": "Xóa model",
+	"Rename": "Đổi tên",
 	"Repeat Last N": "Repeat Last N",
 	"Repeat Last N": "Repeat Last N",
 	"Repeat Penalty": "Repeat Penalty",
 	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "Request Mode",
 	"Request Mode": "Request Mode",
@@ -362,6 +370,7 @@
 	"Role": "Vai trò",
 	"Role": "Vai trò",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Lưu",
 	"Save": "Lưu",
 	"Save & Create": "Lưu & Tạo",
 	"Save & Create": "Lưu & Tạo",
 	"Save & Update": "Lưu & Cập nhật",
 	"Save & Update": "Lưu & Cập nhật",
@@ -370,7 +379,7 @@
 	"Scan complete!": "Quét hoàn tất!",
 	"Scan complete!": "Quét hoàn tất!",
 	"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
 	"Scan for documents from {{path}}": "Quét tài liệu từ đường dẫn: {{path}}",
 	"Search": "Tìm kiếm",
 	"Search": "Tìm kiếm",
-	"Search a model": "",
+	"Search a model": "Tìm model",
 	"Search Documents": "Tìm tài liệu",
 	"Search Documents": "Tìm tài liệu",
 	"Search Prompts": "Tìm prompt",
 	"Search Prompts": "Tìm prompt",
 	"Search Results": "",
 	"Search Results": "",
@@ -381,11 +390,11 @@
 	"Select a mode": "Chọn một chế độ",
 	"Select a mode": "Chọn một chế độ",
 	"Select a model": "Chọn mô hình",
 	"Select a model": "Chọn mô hình",
 	"Select an Ollama instance": "Chọn một thực thể Ollama",
 	"Select an Ollama instance": "Chọn một thực thể Ollama",
-	"Select model": "",
-	"Send": "",
+	"Select model": "Chọn model",
+	"Send": "Gửi",
 	"Send a Message": "Gửi yêu cầu",
 	"Send a Message": "Gửi yêu cầu",
 	"Send message": "Gửi yêu cầu",
 	"Send message": "Gửi yêu cầu",
-	"September": "",
+	"September": "Tháng 9",
 	"Server connection verified": "Kết nối máy chủ đã được xác minh",
 	"Server connection verified": "Kết nối máy chủ đã được xác minh",
 	"Set as default": "Đặt làm mặc định",
 	"Set as default": "Đặt làm mặc định",
 	"Set Default Model": "Đặt Mô hình Mặc định",
 	"Set Default Model": "Đặt Mô hình Mặc định",
@@ -398,8 +407,8 @@
 	"Set Voice": "Đặt Giọng nói",
 	"Set Voice": "Đặt Giọng nói",
 	"Settings": "Cài đặt",
 	"Settings": "Cài đặt",
 	"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
 	"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
-	"Share": "",
-	"Share Chat": "",
+	"Share": "Chia sẻ",
+	"Share Chat": "Chia sẻ Chat",
 	"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
 	"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
 	"short-summary": "tóm tắt ngắn",
 	"short-summary": "tóm tắt ngắn",
 	"Show": "Hiển thị",
 	"Show": "Hiển thị",
@@ -421,7 +430,7 @@
 	"Subtitle (e.g. about the Roman Empire)": "",
 	"Subtitle (e.g. about the Roman Empire)": "",
 	"Success": "Thành công",
 	"Success": "Thành công",
 	"Successfully updated.": "Đã cập nhật thành công.",
 	"Successfully updated.": "Đã cập nhật thành công.",
-	"Suggested": "",
+	"Suggested": "Gợi ý một số mẫu prompt",
 	"Sync All": "Đồng bộ hóa Tất cả",
 	"Sync All": "Đồng bộ hóa Tất cả",
 	"System": "Hệ thống",
 	"System": "Hệ thống",
 	"System Prompt": "Prompt Hệ thống (System Prompt)",
 	"System Prompt": "Prompt Hệ thống (System Prompt)",
@@ -433,22 +442,22 @@
 	"Text-to-Speech Engine": "Công cụ Chuyển Văn bản thành Giọng nói",
 	"Text-to-Speech Engine": "Công cụ Chuyển Văn bản thành Giọng nói",
 	"Tfs Z": "Tfs Z",
 	"Tfs Z": "Tfs Z",
 	"Thanks for your feedback!": "Cám ơn bạn đã gửi phản hồi!",
 	"Thanks for your feedback!": "Cám ơn bạn đã gửi phản hồi!",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Điểm (score) phải có giá trị từ 0,0 (0%) đến 1,0 (100%).",
 	"Theme": "Chủ đề",
 	"Theme": "Chủ đề",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Điều này đảm bảo rằng các nội dung chat có giá trị của bạn được lưu an toàn vào cơ sở dữ liệu backend của bạn. Cảm ơn bạn!",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Điều này đảm bảo rằng các nội dung chat có giá trị của bạn được lưu an toàn vào cơ sở dữ liệu backend của bạn. Cảm ơn bạn!",
 	"This setting does not sync across browsers or devices.": "Cài đặt này không đồng bộ hóa trên các trình duyệt hoặc thiết bị.",
 	"This setting does not sync across browsers or devices.": "Cài đặt này không đồng bộ hóa trên các trình duyệt hoặc thiết bị.",
 	"Thorough explanation": "Giải thích kỹ lưỡng",
 	"Thorough explanation": "Giải thích kỹ lưỡng",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Mẹo: Cập nhật nhiều khe biến liên tiếp bằng cách nhấn phím tab trong đầu vào trò chuyện sau mỗi việc thay thế.",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Mẹo: Cập nhật nhiều khe biến liên tiếp bằng cách nhấn phím tab trong đầu vào trò chuyện sau mỗi việc thay thế.",
 	"Title": "Tiêu đề",
 	"Title": "Tiêu đề",
-	"Title (e.g. Tell me a fun fact)": "",
+	"Title (e.g. Tell me a fun fact)": "Tiêu đề (ví dụ: Hãy kể cho tôi một sự thật thú vị về...)",
 	"Title Auto-Generation": "Tự động Tạo Tiêu đề",
 	"Title Auto-Generation": "Tự động Tạo Tiêu đề",
-	"Title cannot be an empty string.": "",
+	"Title cannot be an empty string.": "Tiêu đề không được phép bỏ trống",
 	"Title Generation Prompt": "Prompt tạo tiêu đề",
 	"Title Generation Prompt": "Prompt tạo tiêu đề",
-	"to": "đến",
+	"to": " - ",
 	"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
 	"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
 	"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
 	"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
 	"to chat input.": "đến đầu vào trò chuyện.",
 	"to chat input.": "đến đầu vào trò chuyện.",
-	"Today": "",
+	"Today": "Hôm nay",
 	"Toggle settings": "Bật/tắt cài đặt",
 	"Toggle settings": "Bật/tắt cài đặt",
 	"Toggle sidebar": "Bật/tắt thanh bên",
 	"Toggle sidebar": "Bật/tắt thanh bên",
 	"Top K": "Top K",
 	"Top K": "Top K",
@@ -458,7 +467,7 @@
 	"Type Hugging Face Resolve (Download) URL": "Nhập URL Hugging Face Resolve (Tải xuống)",
 	"Type Hugging Face Resolve (Download) URL": "Nhập URL Hugging Face Resolve (Tải xuống)",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Ồ! Đã xảy ra sự cố khi kết nối với {{provider}}.",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "Ồ! Đã xảy ra sự cố khi kết nối với {{provider}}.",
 	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Loại Tệp Không xác định '{{file_type}}', nhưng đang chấp nhận và xử lý như văn bản thô",
 	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Loại Tệp Không xác định '{{file_type}}', nhưng đang chấp nhận và xử lý như văn bản thô",
-	"Update and Copy Link": "",
+	"Update and Copy Link": "Cập nhật và sao chép link",
 	"Update password": "Cập nhật mật khẩu",
 	"Update password": "Cập nhật mật khẩu",
 	"Upload a GGUF model": "Tải lên mô hình GGUF",
 	"Upload a GGUF model": "Tải lên mô hình GGUF",
 	"Upload files": "Tải tệp lên hệ thống",
 	"Upload files": "Tải tệp lên hệ thống",
@@ -466,7 +475,7 @@
 	"URL Mode": "Chế độ URL",
 	"URL Mode": "Chế độ URL",
 	"Use '#' in the prompt input to load and select your documents.": "Sử dụng '#' trong đầu vào của prompt để tải về và lựa chọn tài liệu của bạn cần truy vấn.",
 	"Use '#' in the prompt input to load and select your documents.": "Sử dụng '#' trong đầu vào của prompt để tải về và lựa chọn tài liệu của bạn cần truy vấn.",
 	"Use Gravatar": "Sử dụng Gravatar",
 	"Use Gravatar": "Sử dụng Gravatar",
-	"Use Initials": "",
+	"Use Initials": "Sử dụng tên viết tắt",
 	"user": "Người sử dụng",
 	"user": "Người sử dụng",
 	"User Permissions": "Phân quyền sử dụng",
 	"User Permissions": "Phân quyền sử dụng",
 	"Users": "người sử dụng",
 	"Users": "người sử dụng",
@@ -475,9 +484,9 @@
 	"variable": "biến",
 	"variable": "biến",
 	"variable to have them replaced with clipboard content.": "biến để có chúng được thay thế bằng nội dung clipboard.",
 	"variable to have them replaced with clipboard content.": "biến để có chúng được thay thế bằng nội dung clipboard.",
 	"Version": "Version",
 	"Version": "Version",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Cảnh báo: Nếu cập nhật hoặc thay đổi embedding model, bạn sẽ cần cập nhật lại tất cả tài liệu.",
 	"Web": "Web",
 	"Web": "Web",
-	"Web Loader Settings": "",
+	"Web Loader Settings": "Cài đặt Web Loader",
 	"Web Params": "",
 	"Web Params": "",
 	"Web Search Disabled": "",
 	"Web Search Disabled": "",
 	"Web Search Enabled": "",
 	"Web Search Enabled": "",
@@ -491,12 +500,12 @@
 	"Workspace": "",
 	"Workspace": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
 	"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
-	"Yesterday": "",
-	"You": "",
-	"You have no archived conversations.": "",
-	"You have shared this chat": "",
+	"Yesterday": "Hôm qua",
+	"You": "Bạn",
+	"You have no archived conversations.": "Bạn chưa lưu trữ một nội dung chat nào",
+	"You have shared this chat": "Bạn vừa chia sẻ chat này",
 	"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",
 	"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",
 	"You're now logged in.": "Bạn đã đăng nhập.",
 	"You're now logged in.": "Bạn đã đăng nhập.",
 	"Youtube": "",
 	"Youtube": "",
-	"Youtube Loader Settings": ""
+	"Youtube Loader Settings": "Cài đặt Youtube Loader"
 }
 }

+ 114 - 105
src/lib/i18n/locales/zh-CN/translation.json

@@ -2,34 +2,36 @@
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间。",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间。",
 	"(Beta)": "(测试版)",
 	"(Beta)": "(测试版)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
-	"(latest)": "",
+	"(latest)": "(最新版)",
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
-	"{{user}}'s Chats": "",
+	"{{user}}'s Chats": "{{user}} 的聊天记录",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 后端",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 后端",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "",
 	"a user": "用户",
 	"a user": "用户",
 	"About": "关于",
 	"About": "关于",
 	"Account": "账户",
 	"Account": "账户",
-	"Accurate information": "",
+	"Accurate information": "准确信息",
+	"Add": "",
 	"Add a model": "添加模型",
 	"Add a model": "添加模型",
 	"Add a model tag name": "添加模型标签名称",
 	"Add a model tag name": "添加模型标签名称",
 	"Add a short description about what this modelfile does": "为这个模型文件添加一段简短的描述",
 	"Add a short description about what this modelfile does": "为这个模型文件添加一段简短的描述",
 	"Add a short title for this prompt": "为这个提示词添加一个简短的标题",
 	"Add a short title for this prompt": "为这个提示词添加一个简短的标题",
 	"Add a tag": "添加标签",
 	"Add a tag": "添加标签",
-	"Add custom prompt": "",
+	"Add custom prompt": "添加自定义提示词",
 	"Add Docs": "添加文档",
 	"Add Docs": "添加文档",
 	"Add Files": "添加文件",
 	"Add Files": "添加文件",
+	"Add Memory": "",
 	"Add message": "添加消息",
 	"Add message": "添加消息",
-	"Add Model": "",
+	"Add Model": "添加模型",
 	"Add Tags": "添加标签",
 	"Add Tags": "添加标签",
-	"Add User": "",
+	"Add User": "添加用户",
 	"Adjusting these settings will apply changes universally to all users.": "调整这些设置将会对所有用户应用更改。",
 	"Adjusting these settings will apply changes universally to all users.": "调整这些设置将会对所有用户应用更改。",
 	"admin": "管理员",
 	"admin": "管理员",
 	"Admin Panel": "管理员面板",
 	"Admin Panel": "管理员面板",
 	"Admin Settings": "管理员设置",
 	"Admin Settings": "管理员设置",
 	"Advanced Parameters": "高级参数",
 	"Advanced Parameters": "高级参数",
 	"all": "所有",
 	"all": "所有",
-	"All Documents": "",
+	"All Documents": "所有文档",
 	"All Users": "所有用户",
 	"All Users": "所有用户",
 	"Allow": "允许",
 	"Allow": "允许",
 	"Allow Chat Deletion": "允许删除聊天记录",
 	"Allow Chat Deletion": "允许删除聊天记录",
@@ -37,37 +39,38 @@
 	"Already have an account?": "已经有账户了吗?",
 	"Already have an account?": "已经有账户了吗?",
 	"an assistant": "助手",
 	"an assistant": "助手",
 	"and": "和",
 	"and": "和",
-	"and create a new shared link.": "",
+	"and create a new shared link.": "创建一个新的共享链接。",
 	"API Base URL": "API 基础 URL",
 	"API Base URL": "API 基础 URL",
 	"API Key": "API 密钥",
 	"API Key": "API 密钥",
-	"API Key created.": "",
-	"API keys": "",
+	"API Key created.": "API 密钥已创建。",
+	"API keys": "API 密钥",
 	"API RPM": "API RPM",
 	"API RPM": "API RPM",
-	"April": "",
+	"April": "四月",
 	"Archive": "存档",
 	"Archive": "存档",
 	"Archived Chats": "聊天记录存档",
 	"Archived Chats": "聊天记录存档",
 	"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
 	"are allowed - Activate this command by typing": "允许 - 通过输入来激活这个命令",
 	"Are you sure?": "你确定吗?",
 	"Are you sure?": "你确定吗?",
-	"Attach file": "",
-	"Attention to detail": "",
+	"Attach file": "添加文件",
+	"Attention to detail": "注重细节",
 	"Audio": "音频",
 	"Audio": "音频",
-	"August": "",
+	"August": "八月",
 	"Auto-playback response": "自动播放回应",
 	"Auto-playback response": "自动播放回应",
 	"Auto-send input after 3 sec.": "3 秒后自动发送输入",
 	"Auto-send input after 3 sec.": "3 秒后自动发送输入",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础 URL",
 	"AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础 URL",
 	"AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 基础 URL。",
 	"AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 基础 URL。",
 	"available!": "可用!",
 	"available!": "可用!",
 	"Back": "返回",
 	"Back": "返回",
-	"Bad Response": "",
-	"before": "",
-	"Being lazy": "",
+	"Bad Response": "不良响应",
+	"before": "之前",
+	"Being lazy": "懒惰",
 	"Builder Mode": "构建模式",
 	"Builder Mode": "构建模式",
-	"Bypass SSL verification for Websites": "",
+	"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
 	"Cancel": "取消",
 	"Cancel": "取消",
 	"Categories": "分类",
 	"Categories": "分类",
 	"Change Password": "更改密码",
 	"Change Password": "更改密码",
 	"Chat": "聊天",
 	"Chat": "聊天",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "聊天历史",
 	"Chat History": "聊天历史",
 	"Chat History is off for this browser.": "此浏览器已关闭聊天历史功能。",
 	"Chat History is off for this browser.": "此浏览器已关闭聊天历史功能。",
 	"Chats": "聊天",
 	"Chats": "聊天",
@@ -80,24 +83,24 @@
 	"Chunk Size": "块大小 (Chunk Size)",
 	"Chunk Size": "块大小 (Chunk Size)",
 	"Citation": "引文",
 	"Citation": "引文",
 	"Click here for help.": "点击这里获取帮助。",
 	"Click here for help.": "点击这里获取帮助。",
-	"Click here to": "",
+	"Click here to": "单击此处",
 	"Click here to check other modelfiles.": "点击这里检查其他模型文件。",
 	"Click here to check other modelfiles.": "点击这里检查其他模型文件。",
 	"Click here to select": "点击这里选择",
 	"Click here to select": "点击这里选择",
-	"Click here to select a csv file.": "",
+	"Click here to select a csv file.": "单击此处选择 csv 文件。",
 	"Click here to select documents.": "点击这里选择文档。",
 	"Click here to select documents.": "点击这里选择文档。",
 	"click here.": "点击这里。",
 	"click here.": "点击这里。",
 	"Click on the user role button to change a user's role.": "点击用户角色按钮以更改用户的角色。",
 	"Click on the user role button to change a user's role.": "点击用户角色按钮以更改用户的角色。",
 	"Close": "关闭",
 	"Close": "关闭",
 	"Collection": "收藏",
 	"Collection": "收藏",
-	"ComfyUI": "",
-	"ComfyUI Base URL": "",
-	"ComfyUI Base URL is required.": "",
+	"ComfyUI": "ComfyUI",
+	"ComfyUI Base URL": "ComfyUI Base URL",
+	"ComfyUI Base URL is required.": "ComfyUI Base URL 是必需的。",
 	"Command": "命令",
 	"Command": "命令",
 	"Confirm Password": "确认密码",
 	"Confirm Password": "确认密码",
 	"Connections": "连接",
 	"Connections": "连接",
 	"Content": "内容",
 	"Content": "内容",
 	"Context Length": "上下文长度",
 	"Context Length": "上下文长度",
-	"Continue Response": "",
+	"Continue Response": "继续回复",
 	"Conversation Mode": "对话模式",
 	"Conversation Mode": "对话模式",
 	"Copied shared chat URL to clipboard!": "已复制共享聊天 URL 到剪贴板!",
 	"Copied shared chat URL to clipboard!": "已复制共享聊天 URL 到剪贴板!",
 	"Copy": "复制",
 	"Copy": "复制",
@@ -108,21 +111,21 @@
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "为以下查询创建一个简洁的、3-5 个词的短语作为标题,严格遵守 3-5 个词的限制并避免使用“标题”一词:",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "为以下查询创建一个简洁的、3-5 个词的短语作为标题,严格遵守 3-5 个词的限制并避免使用“标题”一词:",
 	"Create a modelfile": "创建模型文件",
 	"Create a modelfile": "创建模型文件",
 	"Create Account": "创建账户",
 	"Create Account": "创建账户",
-	"Create new key": "",
-	"Create new secret key": "",
+	"Create new key": "创建新密钥",
+	"Create new secret key": "创建新安全密钥",
 	"Created at": "创建于",
 	"Created at": "创建于",
-	"Created At": "",
+	"Created At": "创建于",
 	"Current Model": "当前模型",
 	"Current Model": "当前模型",
 	"Current Password": "当前密码",
 	"Current Password": "当前密码",
 	"Custom": "自定义",
 	"Custom": "自定义",
 	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
 	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
 	"Dark": "暗色",
 	"Dark": "暗色",
-	"Dashboard": "",
+	"Dashboard": "仪表盘",
 	"Database": "数据库",
 	"Database": "数据库",
-	"December": "",
+	"December": "十二月",
 	"Default": "默认",
 	"Default": "默认",
 	"Default (Automatic1111)": "默认(Automatic1111)",
 	"Default (Automatic1111)": "默认(Automatic1111)",
-	"Default (SentenceTransformers)": "",
+	"Default (SentenceTransformers)": "默认(SentenceTransformers)",
 	"Default (Web API)": "默认(Web API)",
 	"Default (Web API)": "默认(Web API)",
 	"Default model updated": "默认模型已更新",
 	"Default model updated": "默认模型已更新",
 	"Default Prompt Suggestions": "默认提示词建议",
 	"Default Prompt Suggestions": "默认提示词建议",
@@ -133,12 +136,12 @@
 	"Delete chat": "删除聊天",
 	"Delete chat": "删除聊天",
 	"Delete Chat": "删除聊天",
 	"Delete Chat": "删除聊天",
 	"Delete Chats": "删除聊天记录",
 	"Delete Chats": "删除聊天记录",
-	"delete this link": "",
+	"delete this link": "删除这个链接",
 	"Delete User": "删除用户",
 	"Delete User": "删除用户",
 	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
 	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
-	"Deleted {{tagName}}": "",
+	"Deleted {{tagName}}": "已删除 {{tagName}}",
 	"Description": "描述",
 	"Description": "描述",
-	"Didn't fully follow instructions": "",
+	"Didn't fully follow instructions": "没有完全遵循指示",
 	"Disabled": "禁用",
 	"Disabled": "禁用",
 	"Discover a modelfile": "探索模型文件",
 	"Discover a modelfile": "探索模型文件",
 	"Discover a prompt": "探索提示词",
 	"Discover a prompt": "探索提示词",
@@ -161,18 +164,19 @@
 	"Edit Doc": "编辑文档",
 	"Edit Doc": "编辑文档",
 	"Edit User": "编辑用户",
 	"Edit User": "编辑用户",
 	"Email": "电子邮件",
 	"Email": "电子邮件",
-	"Embedding Model": "",
-	"Embedding Model Engine": "",
-	"Embedding model set to \"{{embedding_model}}\"": "",
+	"Embedding Model": "嵌入模型",
+	"Embedding Model Engine": "嵌入模型引擎",
+	"Embedding model set to \"{{embedding_model}}\"": "嵌入模型设置为 \"{{embedding_model}}\"",
 	"Enable Chat History": "启用聊天历史",
 	"Enable Chat History": "启用聊天历史",
 	"Enable New Sign Ups": "启用新注册",
 	"Enable New Sign Ups": "启用新注册",
 	"Enabled": "启用",
 	"Enabled": "启用",
-	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
+	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮件、密码、角色。",
 	"Enter {{role}} message here": "在此处输入 {{role}} 信息",
 	"Enter {{role}} message here": "在此处输入 {{role}} 信息",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter Image Size (e.g. 512x512)": "输入图片大小 (例如 512x512)",
 	"Enter Image Size (e.g. 512x512)": "输入图片大小 (例如 512x512)",
-	"Enter language codes": "",
+	"Enter language codes": "输入语言代码",
 	"Enter LiteLLM API Base URL (litellm_params.api_base)": "输入 LiteLLM API 基本 URL (litellm_params.api_base)",
 	"Enter LiteLLM API Base URL (litellm_params.api_base)": "输入 LiteLLM API 基本 URL (litellm_params.api_base)",
 	"Enter LiteLLM API Key (litellm_params.api_key)": "输入 LiteLLM API 密匙 (litellm_params.api_key)",
 	"Enter LiteLLM API Key (litellm_params.api_key)": "输入 LiteLLM API 密匙 (litellm_params.api_key)",
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "输入 LiteLLM API 速率限制 (litellm_params.rpm)",
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "输入 LiteLLM API 速率限制 (litellm_params.rpm)",
@@ -180,11 +184,11 @@
 	"Enter Max Tokens (litellm_params.max_tokens)": "输入模型的 Max Tokens (litellm_params.max_tokens)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "输入模型的 Max Tokens (litellm_params.max_tokens)",
 	"Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如{{modelTag}})",
 	"Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如{{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "输入步数 (例如 50)",
 	"Enter Number of Steps (e.g. 50)": "输入步数 (例如 50)",
-	"Enter Score": "",
+	"Enter Score": "输入分",
 	"Enter stop sequence": "输入停止序列",
 	"Enter stop sequence": "输入停止序列",
 	"Enter Top K": "输入 Top K",
 	"Enter Top K": "输入 Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "输入 URL (例如 http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "输入 URL (例如 http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "",
+	"Enter URL (e.g. http://localhost:11434)": "输入 URL (例如 http://localhost:11434)",
 	"Enter Your Email": "输入您的电子邮件",
 	"Enter Your Email": "输入您的电子邮件",
 	"Enter Your Full Name": "输入您的全名",
 	"Enter Your Full Name": "输入您的全名",
 	"Enter Your Password": "输入您的密码",
 	"Enter Your Password": "输入您的密码",
@@ -197,14 +201,14 @@
 	"Export Prompts": "导出提示词",
 	"Export Prompts": "导出提示词",
 	"Failed to create API Key.": "无法创建 API 密钥。",
 	"Failed to create API Key.": "无法创建 API 密钥。",
 	"Failed to read clipboard contents": "无法读取剪贴板内容",
 	"Failed to read clipboard contents": "无法读取剪贴板内容",
-	"February": "",
+	"February": "二月",
 	"Feel free to add specific details": "请随意添加具体细节",
 	"Feel free to add specific details": "请随意添加具体细节",
 	"File Mode": "文件模式",
 	"File Mode": "文件模式",
 	"File not found.": "文件未找到。",
 	"File not found.": "文件未找到。",
-	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "",
+	"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "检测到指纹欺骗: 无法使用姓名缩写作为头像。默认使用默认个人形象。",
 	"Fluidly stream large external response chunks": "流畅地传输大型外部响应块",
 	"Fluidly stream large external response chunks": "流畅地传输大型外部响应块",
 	"Focus chat input": "聚焦聊天输入",
 	"Focus chat input": "聚焦聊天输入",
-	"Followed instructions perfectly": "",
+	"Followed instructions perfectly": "完全遵循说明",
 	"Format your variables using square brackets like this:": "使用这样的方括号格式化你的变量:",
 	"Format your variables using square brackets like this:": "使用这样的方括号格式化你的变量:",
 	"From (Base Model)": "来自(基础模型)",
 	"From (Base Model)": "来自(基础模型)",
 	"Full Screen Mode": "全屏模式",
 	"Full Screen Mode": "全屏模式",
@@ -212,15 +216,15 @@
 	"General Settings": "通用设置",
 	"General Settings": "通用设置",
 	"Generating search query": "",
 	"Generating search query": "",
 	"Generation Info": "生成信息",
 	"Generation Info": "生成信息",
-	"Good Response": "",
-	"h:mm a": "",
-	"has no conversations.": "",
+	"Good Response": "反应良好",
+	"h:mm a": "h:mm a",
+	"has no conversations.": "没有对话。",
 	"Hello, {{name}}": "你好,{{name}}",
 	"Hello, {{name}}": "你好,{{name}}",
 	"Help": "帮助",
 	"Help": "帮助",
 	"Hide": "隐藏",
 	"Hide": "隐藏",
 	"Hide Additional Params": "隐藏额外参数",
 	"Hide Additional Params": "隐藏额外参数",
 	"How can I help you today?": "我今天能帮你做什么?",
 	"How can I help you today?": "我今天能帮你做什么?",
-	"Hybrid Search": "",
+	"Hybrid Search": "混合搜索",
 	"Image Generation (Experimental)": "图像生成(实验性)",
 	"Image Generation (Experimental)": "图像生成(实验性)",
 	"Image Generation Engine": "图像生成引擎",
 	"Image Generation Engine": "图像生成引擎",
 	"Image Settings": "图像设置",
 	"Image Settings": "图像设置",
@@ -233,11 +237,11 @@
 	"Input commands": "输入命令",
 	"Input commands": "输入命令",
 	"Interface": "界面",
 	"Interface": "界面",
 	"Invalid Tag": "无效标签",
 	"Invalid Tag": "无效标签",
-	"January": "",
+	"January": "一月",
 	"join our Discord for help.": "加入我们的 Discord 寻求帮助。",
 	"join our Discord for help.": "加入我们的 Discord 寻求帮助。",
 	"JSON": "JSON",
 	"JSON": "JSON",
-	"July": "",
-	"June": "",
+	"July": "七月",
+	"June": "六月",
 	"JWT Expiration": "JWT 过期",
 	"JWT Expiration": "JWT 过期",
 	"JWT Token": "JWT 令牌",
 	"JWT Token": "JWT 令牌",
 	"Keep Alive": "保持活动",
 	"Keep Alive": "保持活动",
@@ -247,27 +251,30 @@
 	"Light": "浅色",
 	"Light": "浅色",
 	"Listening...": "监听中...",
 	"Listening...": "监听中...",
 	"LLMs can make mistakes. Verify important information.": "LLM 可能会生成错误信息,请验证重要信息。",
 	"LLMs can make mistakes. Verify important information.": "LLM 可能会生成错误信息,请验证重要信息。",
+	"LTR": "",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社区制作",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社区制作",
 	"Make sure to enclose them with": "确保将它们包含在内",
 	"Make sure to enclose them with": "确保将它们包含在内",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
 	"Manage Models": "管理模型",
 	"Manage Models": "管理模型",
 	"Manage Ollama Models": "管理 Ollama 模型",
 	"Manage Ollama Models": "管理 Ollama 模型",
-	"March": "",
+	"March": "三月",
 	"Max Tokens": "最大令牌数",
 	"Max Tokens": "最大令牌数",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
-	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
-	"Minimum Score": "",
+	"May": "五月",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
+	"Minimum Score": "最低分",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
 	"Mirostat Tau": "Mirostat Tau",
 	"MMMM DD, YYYY": "MMMM DD, YYYY",
 	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "",
+	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
 	"Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载。",
 	"Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载。",
 	"Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中。",
 	"Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中。",
 	"Model {{modelId}} not found": "未找到模型{{modelId}}",
 	"Model {{modelId}} not found": "未找到模型{{modelId}}",
 	"Model {{modelName}} already exists.": "模型{{modelName}}已存在。",
 	"Model {{modelName}} already exists.": "模型{{modelName}}已存在。",
-	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型文件系统路径。模型简名是更新所必需的,无法继续。",
 	"Model Name": "模型名称",
 	"Model Name": "模型名称",
 	"Model not selected": "未选择模型",
 	"Model not selected": "未选择模型",
 	"Model Tag Name": "模型标签名称",
 	"Model Tag Name": "模型标签名称",
@@ -278,27 +285,27 @@
 	"Modelfile Content": "模型文件内容",
 	"Modelfile Content": "模型文件内容",
 	"Modelfiles": "模型文件",
 	"Modelfiles": "模型文件",
 	"Models": "模型",
 	"Models": "模型",
-	"More": "",
+	"More": "更多",
 	"Name": "名称",
 	"Name": "名称",
 	"Name Tag": "名称标签",
 	"Name Tag": "名称标签",
 	"Name your modelfile": "命名你的模型文件",
 	"Name your modelfile": "命名你的模型文件",
 	"New Chat": "新聊天",
 	"New Chat": "新聊天",
 	"New Password": "新密码",
 	"New Password": "新密码",
-	"No results found": "",
+	"No results found": "未找到结果",
 	"No search query generated": "",
 	"No search query generated": "",
 	"No search results found": "",
 	"No search results found": "",
 	"No source available": "没有可用来源",
 	"No source available": "没有可用来源",
-	"Not factually correct": "",
+	"Not factually correct": "与事实不符",
 	"Not sure what to add?": "不确定要添加什么?",
 	"Not sure what to add?": "不确定要添加什么?",
 	"Not sure what to write? Switch to": "不确定写什么?切换到",
 	"Not sure what to write? Switch to": "不确定写什么?切换到",
-	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
+	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。",
 	"Notifications": "桌面通知",
 	"Notifications": "桌面通知",
-	"November": "",
-	"October": "",
+	"November": "十一月",
+	"October": "十月",
 	"Off": "关闭",
 	"Off": "关闭",
 	"Okay, Let's Go!": "好的,我们开始吧!",
 	"Okay, Let's Go!": "好的,我们开始吧!",
 	"OLED Dark": "暗黑色",
 	"OLED Dark": "暗黑色",
-	"Ollama": "",
+	"Ollama": "Ollama",
 	"Ollama Base URL": "Ollama 基础 URL",
 	"Ollama Base URL": "Ollama 基础 URL",
 	"Ollama Version": "Ollama 版本",
 	"Ollama Version": "Ollama 版本",
 	"On": "开",
 	"On": "开",
@@ -311,57 +318,59 @@
 	"Open AI": "Open AI",
 	"Open AI": "Open AI",
 	"Open AI (Dall-E)": "Open AI (Dall-E)",
 	"Open AI (Dall-E)": "Open AI (Dall-E)",
 	"Open new chat": "打开新聊天",
 	"Open new chat": "打开新聊天",
-	"OpenAI": "",
+	"OpenAI": "OpenAI",
 	"OpenAI API": "OpenAI API",
 	"OpenAI API": "OpenAI API",
-	"OpenAI API Config": "",
+	"OpenAI API Config": "OpenAI API 配置",
 	"OpenAI API Key is required.": "需要 OpenAI API 密钥。",
 	"OpenAI API Key is required.": "需要 OpenAI API 密钥。",
-	"OpenAI URL/Key required.": "",
+	"OpenAI URL/Key required.": "需要 OpenAI URL/Key",
 	"or": "或",
 	"or": "或",
-	"Other": "",
-	"Overview": "",
+	"Other": "其他",
+	"Overview": "概述",
 	"Parameters": "参数",
 	"Parameters": "参数",
 	"Password": "密码",
 	"Password": "密码",
-	"PDF document (.pdf)": "",
+	"PDF document (.pdf)": "PDF 文档 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
 	"pending": "待定",
 	"pending": "待定",
 	"Permission denied when accessing microphone: {{error}}": "访问麦克风时权限被拒绝:{{error}}",
 	"Permission denied when accessing microphone: {{error}}": "访问麦克风时权限被拒绝:{{error}}",
-	"Plain text (.txt)": "",
+	"Personalization": "",
+	"Plain text (.txt)": "PDF 文档 (.pdf)",
 	"Playground": "AI 对话游乐场",
 	"Playground": "AI 对话游乐场",
 	"Positive attitude": "积极态度",
 	"Positive attitude": "积极态度",
-	"Previous 30 days": "",
-	"Previous 7 days": "",
+	"Previous 30 days": "过去 30 天",
+	"Previous 7 days": "过去 7 天",
 	"Profile Image": "用户头像",
 	"Profile Image": "用户头像",
-	"Prompt": "",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "",
+	"Prompt": "提示词",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示(例如:告诉我一个关于罗马帝国的有趣事实)",
 	"Prompt Content": "提示词内容",
 	"Prompt Content": "提示词内容",
 	"Prompt suggestions": "提示词建议",
 	"Prompt suggestions": "提示词建议",
 	"Prompts": "提示词",
 	"Prompts": "提示词",
-	"Pull \"{{searchValue}}\" from Ollama.com": "",
+	"Pull \"{{searchValue}}\" from Ollama.com": "从 Ollama.com 拉取 \"{{searchValue}}\"",
 	"Pull a model from Ollama.com": "从 Ollama.com 拉取一个模型",
 	"Pull a model from Ollama.com": "从 Ollama.com 拉取一个模型",
 	"Pull Progress": "拉取进度",
 	"Pull Progress": "拉取进度",
 	"Query Params": "查询参数",
 	"Query Params": "查询参数",
 	"RAG Template": "RAG 模板",
 	"RAG Template": "RAG 模板",
 	"Raw Format": "原始格式",
 	"Raw Format": "原始格式",
-	"Read Aloud": "",
+	"Read Aloud": "朗读",
 	"Record voice": "录音",
 	"Record voice": "录音",
 	"Redirecting you to OpenWebUI Community": "正在将您重定向到 OpenWebUI 社区",
 	"Redirecting you to OpenWebUI Community": "正在将您重定向到 OpenWebUI 社区",
-	"Refused when it shouldn't have": "",
+	"Refused when it shouldn't have": "在不该拒绝时拒绝",
 	"Regenerate": "重新生成",
 	"Regenerate": "重新生成",
 	"Release Notes": "发布说明",
 	"Release Notes": "发布说明",
 	"Remove": "移除",
 	"Remove": "移除",
-	"Remove Model": "",
-	"Rename": "",
+	"Remove Model": "移除模型",
+	"Rename": "重命名",
 	"Repeat Last N": "重复最后 N 次",
 	"Repeat Last N": "重复最后 N 次",
 	"Repeat Penalty": "重复惩罚",
 	"Repeat Penalty": "重复惩罚",
 	"Request Mode": "请求模式",
 	"Request Mode": "请求模式",
-	"Reranking Model": "",
-	"Reranking model disabled": "",
-	"Reranking model set to \"{{reranking_model}}\"": "",
+	"Reranking Model": "重排模型",
+	"Reranking model disabled": "重排模型已禁用",
+	"Reranking model set to \"{{reranking_model}}\"": "重排模型设置为 \"{{reranking_model}}\"",
 	"Reset Vector Storage": "重置向量存储",
 	"Reset Vector Storage": "重置向量存储",
 	"Response AutoCopy to Clipboard": "自动复制回答到剪贴板",
 	"Response AutoCopy to Clipboard": "自动复制回答到剪贴板",
 	"Role": "角色",
 	"Role": "角色",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "保存",
 	"Save": "保存",
 	"Save & Create": "保存并创建",
 	"Save & Create": "保存并创建",
 	"Save & Update": "保存并更新",
 	"Save & Update": "保存并更新",
@@ -370,7 +379,7 @@
 	"Scan complete!": "扫描完成!",
 	"Scan complete!": "扫描完成!",
 	"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
 	"Scan for documents from {{path}}": "从 {{path}} 扫描文档",
 	"Search": "搜索",
 	"Search": "搜索",
-	"Search a model": "",
+	"Search a model": "搜索模型",
 	"Search Documents": "搜索文档",
 	"Search Documents": "搜索文档",
 	"Search Prompts": "搜索提示词",
 	"Search Prompts": "搜索提示词",
 	"Search Results": "",
 	"Search Results": "",
@@ -381,18 +390,18 @@
 	"Select a mode": "选择一个模式",
 	"Select a mode": "选择一个模式",
 	"Select a model": "选择一个模型",
 	"Select a model": "选择一个模型",
 	"Select an Ollama instance": "选择一个 Ollama 实例",
 	"Select an Ollama instance": "选择一个 Ollama 实例",
-	"Select model": "",
-	"Send": "",
+	"Select model": "选择模型",
+	"Send": "发送",
 	"Send a Message": "发送消息",
 	"Send a Message": "发送消息",
 	"Send message": "发送消息",
 	"Send message": "发送消息",
-	"September": "",
+	"September": "九月",
 	"Server connection verified": "已验证服务器连接",
 	"Server connection verified": "已验证服务器连接",
 	"Set as default": "设为默认",
 	"Set as default": "设为默认",
 	"Set Default Model": "设置默认模型",
 	"Set Default Model": "设置默认模型",
-	"Set embedding model (e.g. {{model}})": "",
+	"Set embedding model (e.g. {{model}})": "设置嵌入模型(例如 {{model}})",
 	"Set Image Size": "设置图片大小",
 	"Set Image Size": "设置图片大小",
 	"Set Model": "设置模型",
 	"Set Model": "设置模型",
-	"Set reranking model (e.g. {{model}})": "",
+	"Set reranking model (e.g. {{model}})": "设置重排模型(例如 {{model}})",
 	"Set Steps": "设置步骤",
 	"Set Steps": "设置步骤",
 	"Set Task Model": "",
 	"Set Task Model": "",
 	"Set Voice": "设置声音",
 	"Set Voice": "设置声音",
@@ -405,7 +414,7 @@
 	"Show": "显示",
 	"Show": "显示",
 	"Show Additional Params": "显示额外参数",
 	"Show Additional Params": "显示额外参数",
 	"Show shortcuts": "显示快捷方式",
 	"Show shortcuts": "显示快捷方式",
-	"Showcased creativity": "",
+	"Showcased creativity": "展示创意",
 	"sidebar": "侧边栏",
 	"sidebar": "侧边栏",
 	"Sign in": "登录",
 	"Sign in": "登录",
 	"Sign Out": "登出",
 	"Sign Out": "登出",
@@ -418,37 +427,37 @@
 	"Stop Sequence": "停止序列",
 	"Stop Sequence": "停止序列",
 	"STT Settings": "语音转文字设置",
 	"STT Settings": "语音转文字设置",
 	"Submit": "提交",
 	"Submit": "提交",
-	"Subtitle (e.g. about the Roman Empire)": "",
+	"Subtitle (e.g. about the Roman Empire)": "副标题(如关于罗马帝国的副标题)",
 	"Success": "成功",
 	"Success": "成功",
 	"Successfully updated.": "成功更新。",
 	"Successfully updated.": "成功更新。",
-	"Suggested": "",
+	"Suggested": "建议",
 	"Sync All": "同步所有",
 	"Sync All": "同步所有",
 	"System": "系统",
 	"System": "系统",
 	"System Prompt": "系统提示",
 	"System Prompt": "系统提示",
 	"Tags": "标签",
 	"Tags": "标签",
-	"Tell us more:": "",
+	"Tell us more:": "告诉我们更多信息",
 	"Temperature": "温度",
 	"Temperature": "温度",
 	"Template": "模板",
 	"Template": "模板",
 	"Text Completion": "文本完成",
 	"Text Completion": "文本完成",
 	"Text-to-Speech Engine": "文本转语音引擎",
 	"Text-to-Speech Engine": "文本转语音引擎",
 	"Tfs Z": "Tfs Z",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "",
-	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "",
+	"Thanks for your feedback!": "感谢你的反馈!",
+	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "分值应介于 0.0(0%)和 1.0(100%)之间。",
 	"Theme": "主题",
 	"Theme": "主题",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "这确保了您宝贵的对话被安全保存到后端数据库中。谢谢!",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "这确保了您宝贵的对话被安全保存到后端数据库中。谢谢!",
 	"This setting does not sync across browsers or devices.": "此设置不会在浏览器或设备之间同步。",
 	"This setting does not sync across browsers or devices.": "此设置不会在浏览器或设备之间同步。",
-	"Thorough explanation": "",
+	"Thorough explanation": "详尽的解释",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:在每次替换后,在聊天输入中按 Tab 键可以连续更新多个变量。",
 	"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:在每次替换后,在聊天输入中按 Tab 键可以连续更新多个变量。",
 	"Title": "标题",
 	"Title": "标题",
-	"Title (e.g. Tell me a fun fact)": "",
+	"Title (e.g. Tell me a fun fact)": "标题(例如 告诉我一个有趣的事实)",
 	"Title Auto-Generation": "标题自动生成",
 	"Title Auto-Generation": "标题自动生成",
-	"Title cannot be an empty string.": "",
+	"Title cannot be an empty string.": "标题不能为空字符串。",
 	"Title Generation Prompt": "自动生成标题的提示词",
 	"Title Generation Prompt": "自动生成标题的提示词",
 	"to": "到",
 	"to": "到",
 	"To access the available model names for downloading,": "要访问可下载的模型名称,",
 	"To access the available model names for downloading,": "要访问可下载的模型名称,",
 	"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
 	"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
 	"to chat input.": "到聊天输入。",
 	"to chat input.": "到聊天输入。",
-	"Today": "",
+	"Today": "今天",
 	"Toggle settings": "切换设置",
 	"Toggle settings": "切换设置",
 	"Toggle sidebar": "切换侧边栏",
 	"Toggle sidebar": "切换侧边栏",
 	"Top K": "Top K",
 	"Top K": "Top K",
@@ -458,7 +467,7 @@
 	"Type Hugging Face Resolve (Download) URL": "输入 Hugging Face 解析(下载)URL",
 	"Type Hugging Face Resolve (Download) URL": "输入 Hugging Face 解析(下载)URL",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!连接到{{provider}}时出现问题。",
 	"Uh-oh! There was an issue connecting to {{provider}}.": "哎呀!连接到{{provider}}时出现问题。",
 	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "未知文件类型'{{file_type}}',将视为纯文本进行处理",
 	"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "未知文件类型'{{file_type}}',将视为纯文本进行处理",
-	"Update and Copy Link": "",
+	"Update and Copy Link": "更新和复制链接",
 	"Update password": "更新密码",
 	"Update password": "更新密码",
 	"Upload a GGUF model": "上传一个 GGUF 模型",
 	"Upload a GGUF model": "上传一个 GGUF 模型",
 	"Upload files": "上传文件",
 	"Upload files": "上传文件",
@@ -466,7 +475,7 @@
 	"URL Mode": "URL 模式",
 	"URL Mode": "URL 模式",
 	"Use '#' in the prompt input to load and select your documents.": "在提示输入中使用'#'来加载和选择你的文档。",
 	"Use '#' in the prompt input to load and select your documents.": "在提示输入中使用'#'来加载和选择你的文档。",
 	"Use Gravatar": "使用 Gravatar",
 	"Use Gravatar": "使用 Gravatar",
-	"Use Initials": "",
+	"Use Initials": "使用首字母缩写",
 	"user": "用户",
 	"user": "用户",
 	"User Permissions": "用户权限",
 	"User Permissions": "用户权限",
 	"Users": "用户",
 	"Users": "用户",
@@ -475,7 +484,7 @@
 	"variable": "变量",
 	"variable": "变量",
 	"variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换。",
 	"variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换。",
 	"Version": "版本",
 	"Version": "版本",
-	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "",
+	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告: 如果更新或更改 embedding 模型,则需要重新导入所有文档。",
 	"Web": "网页",
 	"Web": "网页",
 	"Web Loader Settings": "Web 加载器设置",
 	"Web Loader Settings": "Web 加载器设置",
 	"Web Params": "Web 参数",
 	"Web Params": "Web 参数",
@@ -488,15 +497,15 @@
 	"What’s New in": "最新变化",
 	"What’s New in": "最新变化",
 	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "当历史记录被关闭时,这个浏览器上的新聊天不会出现在你任何设备的历史记录中。",
 	"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "当历史记录被关闭时,这个浏览器上的新聊天不会出现在你任何设备的历史记录中。",
 	"Whisper (Local)": "Whisper(本地)",
 	"Whisper (Local)": "Whisper(本地)",
-	"Workspace": "",
+	"Workspace": "工作空间",
 	"Write a prompt suggestion (e.g. Who are you?)": "写一个提示建议(例如:你是谁?)",
 	"Write a prompt suggestion (e.g. Who are you?)": "写一个提示建议(例如:你是谁?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。",
-	"Yesterday": "",
+	"Yesterday": "昨天",
 	"You": "",
 	"You": "",
 	"You have no archived conversations.": "你没有存档的对话。",
 	"You have no archived conversations.": "你没有存档的对话。",
-	"You have shared this chat": "",
+	"You have shared this chat": "你分享了这次聊天",
 	"You're a helpful assistant.": "你是一个有帮助的助手。",
 	"You're a helpful assistant.": "你是一个有帮助的助手。",
 	"You're now logged in.": "已登录。",
 	"You're now logged in.": "已登录。",
-	"Youtube": "",
+	"Youtube": "Youtube",
 	"Youtube Loader Settings": "Youtube 加载器设置"
 	"Youtube Loader Settings": "Youtube 加载器设置"
 }
 }

+ 14 - 5
src/lib/i18n/locales/zh-TW/translation.json

@@ -11,14 +11,16 @@
 	"About": "關於",
 	"About": "關於",
 	"Account": "帳號",
 	"Account": "帳號",
 	"Accurate information": "",
 	"Accurate information": "",
+	"Add": "",
 	"Add a model": "新增模型",
 	"Add a model": "新增模型",
 	"Add a model tag name": "新增模型標籤",
 	"Add a model tag name": "新增模型標籤",
 	"Add a short description about what this modelfile does": "為這個 Modelfile 添加一段簡短的描述",
 	"Add a short description about what this modelfile does": "為這個 Modelfile 添加一段簡短的描述",
 	"Add a short title for this prompt": "為這個提示詞添加一個簡短的標題",
 	"Add a short title for this prompt": "為這個提示詞添加一個簡短的標題",
 	"Add a tag": "新增標籤",
 	"Add a tag": "新增標籤",
-	"Add custom prompt": "",
+	"Add custom prompt": "新增自定義提示詞",
 	"Add Docs": "新增文件",
 	"Add Docs": "新增文件",
 	"Add Files": "新增檔案",
 	"Add Files": "新增檔案",
+	"Add Memory": "",
 	"Add message": "新增訊息",
 	"Add message": "新增訊息",
 	"Add Model": "",
 	"Add Model": "",
 	"Add Tags": "新增標籤",
 	"Add Tags": "新增標籤",
@@ -48,7 +50,7 @@
 	"Archived Chats": "聊天記錄存檔",
 	"Archived Chats": "聊天記錄存檔",
 	"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
 	"are allowed - Activate this command by typing": "是允許的 - 透過輸入",
 	"Are you sure?": "你確定嗎?",
 	"Are you sure?": "你確定嗎?",
-	"Attach file": "",
+	"Attach file": "附加檔案",
 	"Attention to detail": "",
 	"Attention to detail": "",
 	"Audio": "音訊",
 	"Audio": "音訊",
 	"August": "",
 	"August": "",
@@ -68,6 +70,7 @@
 	"Change Password": "修改密碼",
 	"Change Password": "修改密碼",
 	"Chat": "聊天",
 	"Chat": "聊天",
 	"Chat Bubble UI": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "聊天紀錄功能",
 	"Chat History": "聊天紀錄功能",
 	"Chat History is off for this browser.": "此瀏覽器已關閉聊天紀錄功能。",
 	"Chat History is off for this browser.": "此瀏覽器已關閉聊天紀錄功能。",
 	"Chats": "聊天",
 	"Chats": "聊天",
@@ -169,6 +172,7 @@
 	"Enabled": "已啟用",
 	"Enabled": "已啟用",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "",
 	"Enter {{role}} message here": "在這裡輸入 {{role}} 訊息",
 	"Enter {{role}} message here": "在這裡輸入 {{role}} 訊息",
+	"Enter a detail about yourself for your LLMs to recall": "",
 	"Enter Chunk Overlap": "輸入 Chunk Overlap",
 	"Enter Chunk Overlap": "輸入 Chunk Overlap",
 	"Enter Chunk Size": "輸入 Chunk 大小",
 	"Enter Chunk Size": "輸入 Chunk 大小",
 	"Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512)",
 	"Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512)",
@@ -230,7 +234,7 @@
 	"Import Modelfiles": "匯入 Modelfiles",
 	"Import Modelfiles": "匯入 Modelfiles",
 	"Import Prompts": "匯入提示詞",
 	"Import Prompts": "匯入提示詞",
 	"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
 	"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
-	"Input commands": "",
+	"Input commands": "輸入命令",
 	"Interface": "介面",
 	"Interface": "介面",
 	"Invalid Tag": "",
 	"Invalid Tag": "",
 	"January": "",
 	"January": "",
@@ -247,6 +251,7 @@
 	"Light": "亮色",
 	"Light": "亮色",
 	"Listening...": "正在聽取...",
 	"Listening...": "正在聽取...",
 	"LLMs can make mistakes. Verify important information.": "LLM 可能會產生錯誤。請驗證重要資訊。",
 	"LLMs can make mistakes. Verify important information.": "LLM 可能會產生錯誤。請驗證重要資訊。",
+	"LTR": "",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
 	"Make sure to enclose them with": "請確保變數有被以下符號框住:",
 	"Make sure to enclose them with": "請確保變數有被以下符號框住:",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
@@ -256,7 +261,9 @@
 	"Max Tokens": "最大 Token 數",
 	"Max Tokens": "最大 Token 數",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
 	"May": "",
 	"May": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "",
+	"Memories accessible by LLMs will be shown here.": "",
+	"Memory": "",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "",
 	"Minimum Score": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Eta": "Mirostat Eta",
@@ -325,6 +332,7 @@
 	"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
 	"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
 	"pending": "待審查",
 	"pending": "待審查",
 	"Permission denied when accessing microphone: {{error}}": "存取麥克風時被拒絕權限:{{error}}",
 	"Permission denied when accessing microphone: {{error}}": "存取麥克風時被拒絕權限:{{error}}",
+	"Personalization": "",
 	"Plain text (.txt)": "",
 	"Plain text (.txt)": "",
 	"Playground": "AI 對話遊樂場",
 	"Playground": "AI 對話遊樂場",
 	"Positive attitude": "",
 	"Positive attitude": "",
@@ -362,6 +370,7 @@
 	"Role": "Role",
 	"Role": "Role",
 	"Rosé Pine": "玫瑰松",
 	"Rosé Pine": "玫瑰松",
 	"Rosé Pine Dawn": "黎明玫瑰松",
 	"Rosé Pine Dawn": "黎明玫瑰松",
+	"RTL": "",
 	"Save": "儲存",
 	"Save": "儲存",
 	"Save & Create": "儲存並建立",
 	"Save & Create": "儲存並建立",
 	"Save & Update": "儲存並更新",
 	"Save & Update": "儲存並更新",
@@ -381,7 +390,7 @@
 	"Select a mode": "選擇模式",
 	"Select a mode": "選擇模式",
 	"Select a model": "選擇一個模型",
 	"Select a model": "選擇一個模型",
 	"Select an Ollama instance": "選擇 Ollama 實例",
 	"Select an Ollama instance": "選擇 Ollama 實例",
-	"Select model": "",
+	"Select model": "選擇模型",
 	"Send": "",
 	"Send": "",
 	"Send a Message": "傳送訊息",
 	"Send a Message": "傳送訊息",
 	"Send message": "傳送訊息",
 	"Send message": "傳送訊息",

+ 1 - 0
src/lib/stores/index.ts

@@ -84,6 +84,7 @@ type Settings = {
 	notificationEnabled?: boolean;
 	notificationEnabled?: boolean;
 	title?: TitleSettings;
 	title?: TitleSettings;
 	splitLargeDeltas?: boolean;
 	splitLargeDeltas?: boolean;
+	chatDirection: 'LTR' | 'RTL';
 
 
 	system?: string;
 	system?: string;
 	requestFormat?: string;
 	requestFormat?: string;

+ 3 - 3
src/lib/utils/index.ts

@@ -6,15 +6,15 @@ import { getLiteLLMModels } from '$lib/apis/litellm';
 
 
 export const getModels = async (token: string) => {
 export const getModels = async (token: string) => {
 	let models = await Promise.all([
 	let models = await Promise.all([
-		await getOllamaModels(token).catch((error) => {
+		getOllamaModels(token).catch((error) => {
 			console.log(error);
 			console.log(error);
 			return null;
 			return null;
 		}),
 		}),
-		await getOpenAIModels(token).catch((error) => {
+		getOpenAIModels(token).catch((error) => {
 			console.log(error);
 			console.log(error);
 			return null;
 			return null;
 		}),
 		}),
-		await getLiteLLMModels(token).catch((error) => {
+		getLiteLLMModels(token).catch((error) => {
 			console.log(error);
 			console.log(error);
 			return null;
 			return null;
 		})
 		})

+ 70 - 0
src/lib/workers/pyodide.worker.ts

@@ -0,0 +1,70 @@
+import { loadPyodide, type PyodideInterface } from 'pyodide';
+
+declare global {
+	interface Window {
+		stdout: string | null;
+		stderr: string | null;
+		// eslint-disable-next-line @typescript-eslint/no-explicit-any
+		result: any;
+		pyodide: PyodideInterface;
+		packages: string[];
+		// eslint-disable-next-line @typescript-eslint/no-explicit-any
+		[key: string]: any;
+	}
+}
+
+async function loadPyodideAndPackages(packages: string[] = []) {
+	self.stdout = null;
+	self.stderr = null;
+	self.result = null;
+
+	self.pyodide = await loadPyodide({
+		indexURL: '/pyodide/',
+		stdout: (text) => {
+			console.log('Python output:', text);
+
+			if (self.stdout) {
+				self.stdout += `${text}\n`;
+			} else {
+				self.stdout = `${text}\n`;
+			}
+		},
+		stderr: (text) => {
+			console.log('An error occurred:', text);
+			if (self.stderr) {
+				self.stderr += `${text}\n`;
+			} else {
+				self.stderr = `${text}\n`;
+			}
+		},
+		packages: ['micropip']
+	});
+
+	const micropip = self.pyodide.pyimport('micropip');
+
+	await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
+	await micropip.install(packages);
+}
+
+self.onmessage = async (event) => {
+	const { id, code, ...context } = event.data;
+
+	console.log(event.data);
+
+	// The worker copies the context in its own "memory" (an object mapping name to values)
+	for (const key of Object.keys(context)) {
+		self[key] = context[key];
+	}
+
+	// make sure loading is done
+	await loadPyodideAndPackages(self.packages);
+
+	try {
+		self.result = await self.pyodide.runPythonAsync(code);
+	} catch (error) {
+		self.stderr = error.toString();
+	}
+	self.postMessage({ id, result: self.result, stdout: self.stdout, stderr: self.stderr });
+};
+
+export default {};

+ 85 - 50
src/routes/(app)/+page.svelte

@@ -45,6 +45,7 @@
 	import { LITELLM_API_BASE_URL, OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL } from '$lib/constants';
 	import { LITELLM_API_BASE_URL, OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL } from '$lib/constants';
 	import { WEBUI_BASE_URL } from '$lib/constants';
 	import { WEBUI_BASE_URL } from '$lib/constants';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
+	import { queryMemory } from '$lib/apis/memories';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -208,6 +209,7 @@
 				user: _user ?? undefined,
 				user: _user ?? undefined,
 				content: userPrompt,
 				content: userPrompt,
 				files: files.length > 0 ? files : undefined,
 				files: files.length > 0 ? files : undefined,
+				models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx),
 				timestamp: Math.floor(Date.now() / 1000) // Unix epoch
 				timestamp: Math.floor(Date.now() / 1000) // Unix epoch
 			};
 			};
 
 
@@ -256,52 +258,77 @@
 		}
 		}
 	};
 	};
 
 
-	const sendPrompt = async (prompt, parentId) => {
+	const sendPrompt = async (prompt, parentId, modelId = null) => {
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 
 
+		let userContext = null;
+
+		if ($settings?.memory ?? false) {
+			const res = await queryMemory(localStorage.token, prompt).catch((error) => {
+				toast.error(error);
+				return null;
+			});
+
+			if (res) {
+				if (res.documents[0].length > 0) {
+					userContext = res.documents.reduce((acc, doc, index) => {
+						const createdAtTimestamp = res.metadatas[index][0].created_at;
+						const createdAtDate = new Date(createdAtTimestamp * 1000).toISOString().split('T')[0];
+						acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
+						return acc;
+					}, []);
+				}
+
+				console.log(userContext);
+			}
+		}
+
 		await Promise.all(
 		await Promise.all(
-			(atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(async (modelId) => {
-				console.log('modelId', modelId);
-				const model = $models.filter((m) => m.id === modelId).at(0);
-
-				if (model) {
-					// Create response message
-					let responseMessageId = uuidv4();
-					let responseMessage = {
-						parentId: parentId,
-						id: responseMessageId,
-						childrenIds: [],
-						role: 'assistant',
-						content: '',
-						model: model.id,
-						timestamp: Math.floor(Date.now() / 1000) // Unix epoch
-					};
-
-					// Add message to history and Set currentId to messageId
-					history.messages[responseMessageId] = responseMessage;
-					history.currentId = responseMessageId;
-
-					// Append messageId to childrenIds of parent message
-					if (parentId !== null) {
-						history.messages[parentId].childrenIds = [
-							...history.messages[parentId].childrenIds,
-							responseMessageId
-						];
-					}
+			(modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(
+				async (modelId) => {
+					console.log('modelId', modelId);
+					const model = $models.filter((m) => m.id === modelId).at(0);
+
+					if (model) {
+						// Create response message
+						let responseMessageId = uuidv4();
+						let responseMessage = {
+							parentId: parentId,
+							id: responseMessageId,
+							childrenIds: [],
+							role: 'assistant',
+							content: '',
+							model: model.id,
+							userContext: userContext,
+							timestamp: Math.floor(Date.now() / 1000) // Unix epoch
+						};
+
+						// Add message to history and Set currentId to messageId
+						history.messages[responseMessageId] = responseMessage;
+						history.currentId = responseMessageId;
+
+						// Append messageId to childrenIds of parent message
+						if (parentId !== null) {
+							history.messages[parentId].childrenIds = [
+								...history.messages[parentId].childrenIds,
+								responseMessageId
+							];
+						}
 
 
-					if (useWebSearch) {
-						await runWebSearchForPrompt(parentId, responseMessageId);
-					}
+						if (useWebSearch) {
+							await runWebSearchForPrompt(parentId, responseMessageId);
+						}
 
 
-					if (model?.external) {
-						await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
-					} else if (model) {
-						await sendPromptOllama(model, prompt, responseMessageId, _chatId);
+						if (model?.external) {
+							await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
+						} else if (model) {
+							await sendPromptOllama(model, prompt, responseMessageId, _chatId);
+						}
+					} else {
+						toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
 					}
 					}
-				} else {
-					toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
 				}
 				}
-			})
+			)
 		);
 		);
 
 
 		await chats.set(await getChatList(localStorage.token));
 		await chats.set(await getChatList(localStorage.token));
@@ -336,7 +363,7 @@
 			type: 'websearch',
 			type: 'websearch',
 			upload_status: true,
 			upload_status: true,
 			error: '',
 			error: '',
-			urls: searchDocument.filenames,
+			urls: searchDocument.filenames
 		});
 		});
 		responseMessage.progress = undefined;
 		responseMessage.progress = undefined;
 		messages = messages;
 		messages = messages;
@@ -353,10 +380,13 @@
 		scrollToBottom();
 		scrollToBottom();
 
 
 		const messagesBody = [
 		const messagesBody = [
-			$settings.system
+			$settings.system || (responseMessage?.userContext ?? null)
 				? {
 				? {
 						role: 'system',
 						role: 'system',
-						content: $settings.system
+						content:
+							$settings.system + (responseMessage?.userContext ?? null)
+								? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+								: ''
 				  }
 				  }
 				: undefined,
 				: undefined,
 			...messages
 			...messages
@@ -609,10 +639,13 @@
 					model: model.id,
 					model: model.id,
 					stream: true,
 					stream: true,
 					messages: [
 					messages: [
-						$settings.system
+						$settings.system || (responseMessage?.userContext ?? null)
 							? {
 							? {
 									role: 'system',
 									role: 'system',
-									content: $settings.system
+									content:
+										$settings.system + (responseMessage?.userContext ?? null)
+											? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+											: ''
 							  }
 							  }
 							: undefined,
 							: undefined,
 						...messages
 						...messages
@@ -801,16 +834,18 @@
 		console.log('stopResponse');
 		console.log('stopResponse');
 	};
 	};
 
 
-	const regenerateResponse = async () => {
+	const regenerateResponse = async (message) => {
 		console.log('regenerateResponse');
 		console.log('regenerateResponse');
-		if (messages.length != 0 && messages.at(-1).done == true) {
-			messages.splice(messages.length - 1, 1);
-			messages = messages;
 
 
-			let userMessage = messages.at(-1);
+		if (messages.length != 0) {
+			let userMessage = history.messages[message.parentId];
 			let userPrompt = userMessage.content;
 			let userPrompt = userMessage.content;
 
 
-			await sendPrompt(userPrompt, userMessage.id);
+			if ((userMessage?.models ?? [...selectedModels]).length == 1) {
+				await sendPrompt(userPrompt, userMessage.id);
+			} else {
+				await sendPrompt(userPrompt, userMessage.id, message.model);
+			}
 		}
 		}
 	};
 	};
 
 

+ 7 - 3
src/routes/(app)/admin/+page.svelte

@@ -1,5 +1,5 @@
 <script>
 <script>
-	import { WEBUI_API_BASE_URL } from '$lib/constants';
+	import { WEBUI_BASE_URL } from '$lib/constants';
 	import { WEBUI_NAME, config, user, showSidebar } from '$lib/stores';
 	import { WEBUI_NAME, config, user, showSidebar } from '$lib/stores';
 	import { goto } from '$app/navigation';
 	import { goto } from '$app/navigation';
 	import { onMount, getContext } from 'svelte';
 	import { onMount, getContext } from 'svelte';
@@ -147,7 +147,7 @@
 
 
 		<div class="px-6">
 		<div class="px-6">
 			<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
 			<div class="mt-0.5 mb-3 gap-1 flex flex-col md:flex-row justify-between">
-				<div class="flex self-center text-lg font-medium px-0.5">
+				<div class="flex md:self-center text-lg font-medium px-0.5">
 					{$i18n.t('All Users')}
 					{$i18n.t('All Users')}
 					<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
 					<div class="flex self-center w-[1px] h-6 mx-2.5 bg-gray-200 dark:bg-gray-700" />
 					<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
 					<span class="text-lg font-medium text-gray-500 dark:text-gray-300">{users.length}</span>
@@ -264,7 +264,11 @@
 									<div class="flex flex-row w-max">
 									<div class="flex flex-row w-max">
 										<img
 										<img
 											class=" rounded-full w-6 h-6 object-cover mr-2.5"
 											class=" rounded-full w-6 h-6 object-cover mr-2.5"
-											src={user.profile_image_url}
+											src={user.profile_image_url.startsWith(WEBUI_BASE_URL) ||
+											user.profile_image_url.startsWith('https://www.gravatar.com/avatar/') ||
+											user.profile_image_url.startsWith('data:')
+												? user.profile_image_url
+												: `/user.png`}
 											alt="user"
 											alt="user"
 										/>
 										/>
 
 

+ 88 - 51
src/routes/(app)/c/[id]/+page.svelte

@@ -48,6 +48,7 @@
 	} from '$lib/constants';
 	} from '$lib/constants';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
 	import { createOpenAITextStream } from '$lib/apis/streaming';
 	import { runWebSearch } from '$lib/apis/rag';
 	import { runWebSearch } from '$lib/apis/rag';
+	import { queryMemory } from '$lib/apis/memories';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -217,7 +218,8 @@
 				user: _user ?? undefined,
 				user: _user ?? undefined,
 				content: userPrompt,
 				content: userPrompt,
 				files: files.length > 0 ? files : undefined,
 				files: files.length > 0 ? files : undefined,
-				timestamp: Math.floor(Date.now() / 1000) // Unix epoch
+				timestamp: Math.floor(Date.now() / 1000), // Unix epoch
+				models: selectedModels
 			};
 			};
 
 
 			// Add message to history and Set currentId to messageId
 			// Add message to history and Set currentId to messageId
@@ -262,51 +264,77 @@
 			await sendPrompt(userPrompt, userMessageId);
 			await sendPrompt(userPrompt, userMessageId);
 		}
 		}
 	};
 	};
-	const sendPrompt = async (prompt, parentId) => {
+
+	const sendPrompt = async (prompt, parentId, modelId = null) => {
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 
 
+		let userContext = null;
+
+		if ($settings?.memory ?? false) {
+			const res = await queryMemory(localStorage.token, prompt).catch((error) => {
+				toast.error(error);
+				return null;
+			});
+
+			if (res) {
+				if (res.documents[0].length > 0) {
+					userContext = res.documents.reduce((acc, doc, index) => {
+						const createdAtTimestamp = res.metadatas[index][0].created_at;
+						const createdAtDate = new Date(createdAtTimestamp * 1000).toISOString().split('T')[0];
+						acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
+						return acc;
+					}, []);
+				}
+
+				console.log(userContext);
+			}
+		}
+
 		await Promise.all(
 		await Promise.all(
-			(atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(async (modelId) => {
-				const model = $models.filter((m) => m.id === modelId).at(0);
-
-				if (model) {
-					// Create response message
-					let responseMessageId = uuidv4();
-					let responseMessage = {
-						parentId: parentId,
-						id: responseMessageId,
-						childrenIds: [],
-						role: 'assistant',
-						content: '',
-						model: model.id,
-						timestamp: Math.floor(Date.now() / 1000) // Unix epoch
-					};
-
-					// Add message to history and Set currentId to messageId
-					history.messages[responseMessageId] = responseMessage;
-					history.currentId = responseMessageId;
-
-					// Append messageId to childrenIds of parent message
-					if (parentId !== null) {
-						history.messages[parentId].childrenIds = [
-							...history.messages[parentId].childrenIds,
-							responseMessageId
-						];
-					}
+			(modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(
+				async (modelId) => {
+					console.log('modelId', modelId);
+					const model = $models.filter((m) => m.id === modelId).at(0);
+
+					if (model) {
+						// Create response message
+						let responseMessageId = uuidv4();
+						let responseMessage = {
+							parentId: parentId,
+							id: responseMessageId,
+							childrenIds: [],
+							role: 'assistant',
+							content: '',
+							model: model.id,
+							userContext: userContext,
+							timestamp: Math.floor(Date.now() / 1000) // Unix epoch
+						};
+
+						// Add message to history and Set currentId to messageId
+						history.messages[responseMessageId] = responseMessage;
+						history.currentId = responseMessageId;
+
+						// Append messageId to childrenIds of parent message
+						if (parentId !== null) {
+							history.messages[parentId].childrenIds = [
+								...history.messages[parentId].childrenIds,
+								responseMessageId
+							];
+						}
 
 
-					if (useWebSearch) {
-						await runWebSearchForPrompt(parentId, responseMessageId);
-					}
+						if (useWebSearch) {
+							await runWebSearchForPrompt(parentId, responseMessageId);
+						}
 
 
-					if (model?.external) {
-						await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
-					} else if (model) {
-						await sendPromptOllama(model, prompt, responseMessageId, _chatId);
+						if (model?.external) {
+							await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
+						} else if (model) {
+							await sendPromptOllama(model, prompt, responseMessageId, _chatId);
+						}
+					} else {
+						toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
 					}
 					}
-				} else {
-					toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
-				}
-			})
+				})
 		);
 		);
 
 
 		await chats.set(await getChatList(localStorage.token));
 		await chats.set(await getChatList(localStorage.token));
@@ -358,10 +386,13 @@
 		scrollToBottom();
 		scrollToBottom();
 
 
 		const messagesBody = [
 		const messagesBody = [
-			$settings.system
+			$settings.system || (responseMessage?.userContext ?? null)
 				? {
 				? {
 						role: 'system',
 						role: 'system',
-						content: $settings.system
+						content:
+							$settings.system + (responseMessage?.userContext ?? null)
+								? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+								: ''
 				  }
 				  }
 				: undefined,
 				: undefined,
 			...messages
 			...messages
@@ -614,10 +645,13 @@
 					model: model.id,
 					model: model.id,
 					stream: true,
 					stream: true,
 					messages: [
 					messages: [
-						$settings.system
+						$settings.system || (responseMessage?.userContext ?? null)
 							? {
 							? {
 									role: 'system',
 									role: 'system',
-									content: $settings.system
+									content:
+										$settings.system + (responseMessage?.userContext ?? null)
+											? `\n\nUser Context:\n${responseMessage.userContext.join('\n')}`
+											: ''
 							  }
 							  }
 							: undefined,
 							: undefined,
 						...messages
 						...messages
@@ -746,6 +780,7 @@
 		} catch (error) {
 		} catch (error) {
 			await handleOpenAIError(error, null, model, responseMessage);
 			await handleOpenAIError(error, null, model, responseMessage);
 		}
 		}
+		messages = messages;
 
 
 		stopResponseFlag = false;
 		stopResponseFlag = false;
 		await tick();
 		await tick();
@@ -805,16 +840,18 @@
 		console.log('stopResponse');
 		console.log('stopResponse');
 	};
 	};
 
 
-	const regenerateResponse = async () => {
+	const regenerateResponse = async (message) => {
 		console.log('regenerateResponse');
 		console.log('regenerateResponse');
-		if (messages.length != 0 && messages.at(-1).done == true) {
-			messages.splice(messages.length - 1, 1);
-			messages = messages;
 
 
-			let userMessage = messages.at(-1);
+		if (messages.length != 0) {
+			let userMessage = history.messages[message.parentId];
 			let userPrompt = userMessage.content;
 			let userPrompt = userMessage.content;
 
 
-			await sendPrompt(userPrompt, userMessage.id);
+			if ((userMessage?.models ?? [...selectedModels]).length == 1) {
+				await sendPrompt(userPrompt, userMessage.id);
+			} else {
+				await sendPrompt(userPrompt, userMessage.id, message.model);
+			}
 		}
 		}
 	};
 	};
 
 
@@ -1006,6 +1043,7 @@
 						bind:history
 						bind:history
 						bind:messages
 						bind:messages
 						bind:autoScroll
 						bind:autoScroll
+						bind:prompt
 						bottomPadding={files.length > 0}
 						bottomPadding={files.length > 0}
 						{sendPrompt}
 						{sendPrompt}
 						{continueGeneration}
 						{continueGeneration}
@@ -1022,7 +1060,6 @@
 		bind:autoScroll
 		bind:autoScroll
 		bind:selectedModel={atSelectedModel}
 		bind:selectedModel={atSelectedModel}
 		bind:useWebSearch
 		bind:useWebSearch
-		suggestionPrompts={selectedModelfile?.suggestionPrompts ?? $config.default_prompt_suggestions}
 		{messages}
 		{messages}
 		{submitPrompt}
 		{submitPrompt}
 		{stopResponse}
 		{stopResponse}

+ 1 - 1
src/routes/(app)/workspace/modelfiles/create/+page.svelte

@@ -339,7 +339,7 @@ SYSTEM """${system}"""`.replace(/^\s*\n/gm, '');
 			if (
 			if (
 				inputFiles &&
 				inputFiles &&
 				inputFiles.length > 0 &&
 				inputFiles.length > 0 &&
-				['image/gif', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
+				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
 			) {
 			) {
 				reader.readAsDataURL(inputFiles[0]);
 				reader.readAsDataURL(inputFiles[0]);
 			} else {
 			} else {

+ 1 - 1
src/routes/(app)/workspace/modelfiles/edit/+page.svelte

@@ -238,7 +238,7 @@
 			if (
 			if (
 				inputFiles &&
 				inputFiles &&
 				inputFiles.length > 0 &&
 				inputFiles.length > 0 &&
-				['image/gif', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
+				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
 			) {
 			) {
 				reader.readAsDataURL(inputFiles[0]);
 				reader.readAsDataURL(inputFiles[0]);
 			} else {
 			} else {

+ 1 - 1
src/routes/+layout.svelte

@@ -89,7 +89,7 @@
 
 
 <svelte:head>
 <svelte:head>
 	<title>{$WEBUI_NAME}</title>
 	<title>{$WEBUI_NAME}</title>
-	<link rel="icon" href="{WEBUI_BASE_URL}/static/favicon.png" />
+	<link crossorigin="anonymous" rel="icon" href="{WEBUI_BASE_URL}/static/favicon.png" />
 
 
 	<!-- rosepine themes have been disabled as it's not up to date with our latest version. -->
 	<!-- rosepine themes have been disabled as it's not up to date with our latest version. -->
 	<!-- feel free to make a PR to fix if anyone wants to see it return -->
 	<!-- feel free to make a PR to fix if anyone wants to see it return -->

+ 6 - 1
src/routes/auth/+page.svelte

@@ -76,7 +76,12 @@
 	<div class="fixed m-10 z-50">
 	<div class="fixed m-10 z-50">
 		<div class="flex space-x-2">
 		<div class="flex space-x-2">
 			<div class=" self-center">
 			<div class=" self-center">
-				<img src="{WEBUI_BASE_URL}/static/favicon.png" class=" w-8 rounded-full" alt="logo" />
+				<img
+					crossorigin="anonymous"
+					src="{WEBUI_BASE_URL}/static/favicon.png"
+					class=" w-8 rounded-full"
+					alt="logo"
+				/>
 			</div>
 			</div>
 		</div>
 		</div>
 	</div>
 	</div>

+ 9 - 0
src/routes/s/[id]/+page.svelte

@@ -12,6 +12,8 @@
 
 
 	import Messages from '$lib/components/chat/Messages.svelte';
 	import Messages from '$lib/components/chat/Messages.svelte';
 	import Navbar from '$lib/components/layout/Navbar.svelte';
 	import Navbar from '$lib/components/layout/Navbar.svelte';
+	import { getUserById } from '$lib/apis/users';
+	import { error } from '@sveltejs/kit';
 
 
 	const i18n = getContext('i18n');
 	const i18n = getContext('i18n');
 
 
@@ -37,6 +39,7 @@
 	}, {});
 	}, {});
 
 
 	let chat = null;
 	let chat = null;
+	let user = null;
 
 
 	let title = '';
 	let title = '';
 	let files = [];
 	let files = [];
@@ -88,6 +91,11 @@
 		});
 		});
 
 
 		if (chat) {
 		if (chat) {
+			user = await getUserById(localStorage.token, chat.user_id).catch((error) => {
+				console.error(error);
+				return null;
+			});
+
 			const chatContent = chat.chat;
 			const chatContent = chat.chat;
 
 
 			if (chatContent) {
 			if (chatContent) {
@@ -156,6 +164,7 @@
 				<div class=" h-full w-full flex flex-col py-4">
 				<div class=" h-full w-full flex flex-col py-4">
 					<div class="py-2">
 					<div class="py-2">
 						<Messages
 						<Messages
+							{user}
 							chatId={$chatId}
 							chatId={$chatId}
 							readOnly={true}
 							readOnly={true}
 							{selectedModels}
 							{selectedModels}

Some files were not shown because too many files changed in this diff