Browse Source

Merge branch 'dev' into feat/model-config

Jun Siang Cheah 11 months ago
parent
commit
1bacd5d93f
81 changed files with 2629 additions and 146 deletions
  1. 14 6
      .github/pull_request_template.md
  2. 4 0
      .gitignore
  3. 4 0
      .prettierignore
  4. 22 5
      Dockerfile
  5. 1 1
      backend/apps/images/main.py
  6. 4 4
      backend/apps/litellm/main.py
  7. 10 7
      backend/apps/ollama/main.py
  8. 32 9
      backend/apps/openai/main.py
  9. 2 2
      backend/apps/rag/main.py
  10. 37 1
      backend/apps/web/routers/users.py
  11. 8 0
      backend/config.py
  12. 18 6
      backend/main.py
  13. 143 2
      package-lock.json
  14. 6 3
      package.json
  15. 38 0
      scripts/prepare-pyodide.js
  16. 1 0
      src/app.html
  17. 67 0
      src/lib/apis/openai/index.ts
  18. 27 0
      src/lib/apis/users/index.ts
  19. 4 3
      src/lib/components/chat/MessageInput.svelte
  20. 4 3
      src/lib/components/chat/Messages.svelte
  21. 299 5
      src/lib/components/chat/Messages/CodeBlock.svelte
  22. 1 1
      src/lib/components/chat/Messages/Name.svelte
  23. 2 0
      src/lib/components/chat/Messages/Placeholder.svelte
  24. 15 2
      src/lib/components/chat/Messages/ProfileImage.svelte
  25. 8 3
      src/lib/components/chat/Messages/ResponseMessage.svelte
  26. 6 4
      src/lib/components/chat/Messages/UserMessage.svelte
  27. 1 1
      src/lib/components/chat/ModelSelector/Selector.svelte
  28. 18 13
      src/lib/components/chat/Settings/Connections.svelte
  29. 46 19
      src/lib/components/chat/Settings/Interface.svelte
  30. 1 1
      src/lib/components/chat/Settings/Personalization.svelte
  31. 1 1
      src/lib/components/chat/ShareChatModal.svelte
  32. 1 1
      src/lib/components/common/Modal.svelte
  33. 1 1
      src/lib/components/common/Selector.svelte
  34. 1 1
      src/lib/components/common/Switch.svelte
  35. 3 2
      src/lib/components/layout/Navbar.svelte
  36. 1 0
      src/lib/components/layout/Sidebar.svelte
  37. 4 1
      src/lib/i18n/locales/ar-BH/translation.json
  38. 4 1
      src/lib/i18n/locales/bg-BG/translation.json
  39. 4 1
      src/lib/i18n/locales/bn-BD/translation.json
  40. 4 1
      src/lib/i18n/locales/ca-ES/translation.json
  41. 4 1
      src/lib/i18n/locales/de-DE/translation.json
  42. 4 1
      src/lib/i18n/locales/dg-DG/translation.json
  43. 4 1
      src/lib/i18n/locales/en-GB/translation.json
  44. 4 1
      src/lib/i18n/locales/en-US/translation.json
  45. 4 1
      src/lib/i18n/locales/es-ES/translation.json
  46. 4 1
      src/lib/i18n/locales/fa-IR/translation.json
  47. 4 1
      src/lib/i18n/locales/fi-FI/translation.json
  48. 4 1
      src/lib/i18n/locales/fr-CA/translation.json
  49. 4 1
      src/lib/i18n/locales/fr-FR/translation.json
  50. 4 1
      src/lib/i18n/locales/he-IL/translation.json
  51. 4 1
      src/lib/i18n/locales/hi-IN/translation.json
  52. 512 0
      src/lib/i18n/locales/hr-HR/translation.json
  53. 4 1
      src/lib/i18n/locales/it-IT/translation.json
  54. 4 1
      src/lib/i18n/locales/ja-JP/translation.json
  55. 4 1
      src/lib/i18n/locales/ka-GE/translation.json
  56. 4 1
      src/lib/i18n/locales/ko-KR/translation.json
  57. 12 0
      src/lib/i18n/locales/languages.json
  58. 4 1
      src/lib/i18n/locales/nl-NL/translation.json
  59. 512 0
      src/lib/i18n/locales/pa-IN/translation.json
  60. 4 1
      src/lib/i18n/locales/pl-PL/translation.json
  61. 4 1
      src/lib/i18n/locales/pt-BR/translation.json
  62. 4 1
      src/lib/i18n/locales/pt-PT/translation.json
  63. 4 1
      src/lib/i18n/locales/ru-RU/translation.json
  64. 512 0
      src/lib/i18n/locales/sr-RS/translation.json
  65. 4 1
      src/lib/i18n/locales/sv-SE/translation.json
  66. 4 1
      src/lib/i18n/locales/tr-TR/translation.json
  67. 4 1
      src/lib/i18n/locales/uk-UA/translation.json
  68. 4 1
      src/lib/i18n/locales/vi-VN/translation.json
  69. 4 1
      src/lib/i18n/locales/zh-CN/translation.json
  70. 4 1
      src/lib/i18n/locales/zh-TW/translation.json
  71. 1 0
      src/lib/stores/index.ts
  72. 3 3
      src/lib/utils/index.ts
  73. 66 0
      src/lib/workers/pyodide.worker.ts
  74. 6 2
      src/routes/(app)/admin/+page.svelte
  75. 1 1
      src/routes/(app)/c/[id]/+page.svelte
  76. 1 1
      src/routes/+layout.svelte
  77. 6 1
      src/routes/auth/+page.svelte
  78. 9 0
      src/routes/s/[id]/+page.svelte
  79. 0 0
      static/pyodide/pyodide-lock.json
  80. 0 1
      svelte.config.js
  81. 17 0
      vite.config.ts

+ 14 - 6
.github/pull_request_template.md

@@ -1,13 +1,17 @@
 # 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.
 - [ ] **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?
-- [ ] **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
   - **build**: Changes that affect the build system or external dependencies
   - **ci**: Changes to our continuous integration processes or workflows
@@ -26,7 +30,7 @@
 
 ### 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
 
@@ -62,3 +66,7 @@
 
 - [Insert any additional context, notes, or explanations for the changes]
   - [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
 *.so
 
+# Pyodide distribution
+static/pyodide/*
+!static/pyodide/pyodide-lock.json
+
 # Distribution / packaging
 .Python
 build/

+ 4 - 0
.prettierignore

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

+ 22 - 5
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.
 ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2
 ARG USE_RERANKING_MODEL=""
+# Override at your own risk - non-root configurations are untested
+ARG UID=0
+ARG GID=0
 
 ######## WebUI frontend ########
 FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build
@@ -32,6 +35,8 @@ ARG USE_OLLAMA
 ARG USE_CUDA_VER
 ARG USE_EMBEDDING_MODEL
 ARG USE_RERANKING_MODEL
+ARG UID
+ARG GID
 
 ## Basis ##
 ENV ENV=prod \
@@ -76,9 +81,20 @@ ENV HF_HOME="/app/backend/data/cache/embedding/models"
 WORKDIR /app/backend
 
 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 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 \
     apt-get update && \
     # Install pandoc and netcat
@@ -102,7 +118,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
     fi
 
 # install python dependencies
-COPY ./backend/requirements.txt ./requirements.txt
+COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt
 
 RUN pip3 install uv && \
     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 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 .
+COPY --chown=$UID:$GID ./backend .
 
 EXPOSE 8080
 
 HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1
 
+USER $UID:$GID
 
 CMD [ "bash", "start.sh"]

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

@@ -397,7 +397,7 @@ def generate_image(
     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
     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)
 
 
+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.CONFIG = litellm_config
 app.state.MODEL_CONFIG = MODEL_CONFIG.value.get("litellm", [])
@@ -152,10 +156,6 @@ async def shutdown_litellm_background():
         background_process = None
 
 
-app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
-app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST
-
-
 @app.get("/")
 async def get_status():
     return {"status": True}

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

@@ -65,8 +65,8 @@ app.add_middleware(
 
 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.MODEL_CONFIG = MODEL_CONFIG.value.get("ollama", [])
 
 app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
@@ -126,8 +126,9 @@ async def cancel_ollama_request(request_id: str, user=Depends(get_current_user))
 
 
 async def fetch_url(url):
+    timeout = aiohttp.ClientTimeout(total=5)
     try:
-        async with aiohttp.ClientSession() as session:
+        async with aiohttp.ClientSession(timeout=timeout) as session:
             async with session.get(url) as response:
                 return await response.json()
     except Exception as e:
@@ -190,11 +191,12 @@ async def get_ollama_tags(
     if url_idx == None:
         models = await get_all_models()
 
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
                 models["models"] = list(
                     filter(
-                        lambda model: model["name"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["name"]
+                        in app.state.config.MODEL_FILTER_LIST,
                         models["models"],
                     )
                 )
@@ -1058,11 +1060,12 @@ async def get_openai_models(
     if url_idx == None:
         models = await get_all_models()
 
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
                 models["models"] = list(
                     filter(
-                        lambda model: model["name"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["name"]
+                        in app.state.config.MODEL_FILTER_LIST,
                         models["models"],
                     )
                 )

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

@@ -21,6 +21,7 @@ from utils.utils import (
 )
 from config import (
     SRC_LOG_LEVELS,
+    ENABLE_OPENAI_API,
     OPENAI_API_BASE_URLS,
     OPENAI_API_KEYS,
     CACHE_DIR,
@@ -47,12 +48,15 @@ app.add_middleware(
     allow_headers=["*"],
 )
 
+
 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.MODEL_CONFIG = MODEL_CONFIG.value.get("openai", [])
 
+
+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_KEYS = OPENAI_API_KEYS
 
@@ -70,6 +74,21 @@ async def check_url(request: Request, call_next):
     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):
     urls: List[str]
 
@@ -166,11 +185,15 @@ async def speech(request: Request, user=Depends(get_verified_user)):
 
 
 async def fetch_url(url, key):
+    timeout = aiohttp.ClientTimeout(total=5)
     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:
         # Handle connection error here
         log.error(f"Connection error: {e}")
@@ -202,7 +225,7 @@ async def get_all_models():
     if (
         len(app.state.config.OPENAI_API_KEYS) == 1
         and app.state.config.OPENAI_API_KEYS[0] == ""
-    ):
+    ) or not app.state.config.ENABLE_OPENAI_API:
         models = {"data": []}
     else:
         tasks = [
@@ -248,11 +271,11 @@ def add_custom_info_to_model(model: dict):
 async def get_models(url_idx: Optional[int] = None, user=Depends(get_current_user)):
     if url_idx == None:
         models = await get_all_models()
-        if app.state.ENABLE_MODEL_FILTER:
+        if app.state.config.ENABLE_MODEL_FILTER:
             if user.role == "user":
                 models["data"] = list(
                     filter(
-                        lambda model: model["id"] in app.state.MODEL_FILTER_LIST,
+                        lambda model: model["id"] in app.state.config.MODEL_FILTER_LIST,
                         models["data"],
                     )
                 )

+ 2 - 2
backend/apps/rag/main.py

@@ -433,12 +433,12 @@ async def update_query_settings(
     form_data: QuerySettingsForm, user=Depends(get_admin_user)
 ):
     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.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0
     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 {
         "status": True,

+ 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.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 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
 ############################

+ 8 - 0
backend/config.py

@@ -417,6 +417,14 @@ OLLAMA_BASE_URLS = PersistentConfig(
 # 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_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
 

+ 18 - 6
backend/main.py

@@ -120,6 +120,18 @@ app.state.config.WEBHOOK_URL = WEBHOOK_URL
 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):
     async def dispatch(self, request: Request, call_next):
         return_citations = False
@@ -280,14 +292,14 @@ class ModelFilterConfigForm(BaseModel):
 async def update_model_filter_config(
     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.MODEL_FILTER_LIST = app.state.config.MODEL_FILTER_LIST

+ 143 - 2
package-lock.json

@@ -8,6 +8,7 @@
 			"name": "open-webui",
 			"version": "0.1.124",
 			"dependencies": {
+				"@pyscript/core": "^0.4.32",
 				"@sveltejs/adapter-node": "^1.3.1",
 				"async": "^3.2.5",
 				"bits-ui": "^0.19.7",
@@ -22,6 +23,7 @@
 				"js-sha256": "^0.10.1",
 				"katex": "^0.16.9",
 				"marked": "^9.1.0",
+				"pyodide": "^0.26.0-alpha.4",
 				"svelte-sonner": "^0.3.19",
 				"tippy.js": "^6.3.7",
 				"uuid": "^9.0.1"
@@ -890,6 +892,19 @@
 				"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": {
 			"version": "25.0.7",
 			"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz",
@@ -1605,8 +1620,12 @@
 		"node_modules/@ungap/structured-clone": {
 			"version": "1.2.0",
 			"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": {
 			"version": "1.6.0",
@@ -1713,6 +1732,11 @@
 				"@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": {
 			"version": "8.11.3",
 			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
@@ -2027,6 +2051,11 @@
 			"dev": 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": {
 			"version": "1.5.1",
 			"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": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -2661,6 +2695,28 @@
 				"@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": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -4001,6 +4057,11 @@
 				"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": {
 			"version": "2.0.2",
 			"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
@@ -4328,6 +4389,11 @@
 				"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": {
 			"version": "8.0.2",
 			"resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
@@ -5838,6 +5904,29 @@
 				"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": {
 			"version": "8.4.38",
 			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -6151,6 +6240,11 @@
 			"integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
 			"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": {
 			"version": "1.9.0",
 			"resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
@@ -6176,6 +6270,18 @@
 				"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": {
 			"version": "6.10.4",
 			"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz",
@@ -6858,6 +6964,11 @@
 			"integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==",
 			"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": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
@@ -7520,6 +7631,11 @@
 				"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": {
 			"version": "5.0.1",
 			"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -7629,6 +7745,11 @@
 				"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": {
 			"version": "4.0.8",
 			"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",
 			"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": {
 			"version": "4.0.2",
 			"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",

+ 6 - 3
package.json

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

+ 38 - 0
scripts/prepare-pyodide.js

@@ -0,0 +1,38 @@
+const packages = [
+	'requests',
+	'beautifulsoup4',
+	'numpy',
+	'pandas',
+	'matplotlib',
+	'scikit-learn',
+	'scipy',
+	'regex'
+];
+
+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"
 			href="/opensearch.xml"
 		/>
+
 		<script>
 			// On page load or when changing themes, best to add inline in `head` to avoid FOUC
 			(() => {

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

@@ -1,6 +1,73 @@
 import { OPENAI_API_BASE_URL } from '$lib/constants';
 import { promptTemplate } from '$lib/utils';
 
+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 = '') => {
 	let error = null;
 

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

@@ -115,6 +115,33 @@ export const getUsers = async (token: string) => {
 	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) => {
 	let error = null;
 

+ 4 - 3
src/lib/components/chat/MessageInput.svelte

@@ -327,7 +327,6 @@
 	};
 
 	onMount(() => {
-		console.log(document.getElementById('sidebar'));
 		window.setTimeout(() => chatTextAreaElement?.focus(), 0);
 
 		const dropZone = document.querySelector('body');
@@ -512,6 +511,7 @@
 						>
 							<div class="flex items-center gap-2 text-sm dark:text-gray-500">
 								<img
+									crossorigin="anonymous"
 									alt="model profile"
 									class="size-5 max-w-[28px] object-cover rounded-full"
 									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedModel.id)
@@ -600,7 +600,8 @@
 						}}
 					/>
 					<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}
+						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={() => {
 							submitPrompt(prompt, user);
 						}}
@@ -770,7 +771,7 @@
 							<textarea
 								id="chat-textarea"
 								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]"
 								placeholder={chatInputPlaceholder !== ''

+ 4 - 3
src/lib/components/chat/Messages.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 	import { v4 as uuidv4 } from 'uuid';
 
-	import { chats, config, modelfiles, settings, user } from '$lib/stores';
+	import { chats, config, modelfiles, settings, user as _user } from '$lib/stores';
 	import { tick, getContext } from 'svelte';
 
 	import { toast } from 'svelte-sonner';
@@ -22,8 +22,9 @@
 	export let continueGeneration: Function;
 	export let regenerateResponse: Function;
 
+	export let user = $_user;
 	export let prompt;
-	export let suggestionPrompts;
+	export let suggestionPrompts = [];
 	export let processing = '';
 	export let bottomPadding = false;
 	export let autoScroll;
@@ -294,7 +295,7 @@
 							{#if message.role === 'user'}
 								<UserMessage
 									on:delete={() => messageDeleteHandler(message.id)}
-									user={$user}
+									{user}
 									{readOnly}
 									{message}
 									isFirstMessage={messageIdx === 0}

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

@@ -1,11 +1,23 @@
 <script lang="ts">
+	import Spinner from '$lib/components/common/Spinner.svelte';
 	import { copyToClipboard } from '$lib/utils';
 	import hljs from 'highlight.js';
 	import 'highlight.js/styles/github-dark.min.css';
+	import { loadPyodide } from 'pyodide';
+	import { tick } from 'svelte';
+	import PyodideWorker from '../../../workers/pyodide.worker?worker';
+
+	export let id = '';
 
 	export let lang = '';
 	export let code = '';
 
+	let executing = false;
+
+	let stdout = null;
+	let stderr = null;
+	let result = null;
+
 	let copied = false;
 
 	const copyCode = async () => {
@@ -17,24 +29,306 @@
 		}, 1000);
 	};
 
+	const checkPythonCode = (str) => {
+		// Check if the string contains typical Python keywords, syntax, or functions
+		const pythonKeywords = [
+			'def',
+			'class',
+			'import',
+			'from',
+			'if',
+			'else',
+			'elif',
+			'for',
+			'while',
+			'try',
+			'except',
+			'finally',
+			'return',
+			'yield',
+			'lambda',
+			'assert',
+			'pass',
+			'break',
+			'continue',
+			'global',
+			'nonlocal',
+			'del',
+			'True',
+			'False',
+			'None',
+			'and',
+			'or',
+			'not',
+			'in',
+			'is',
+			'as',
+			'with'
+		];
+
+		for (let keyword of pythonKeywords) {
+			if (str.includes(keyword)) {
+				return true;
+			}
+		}
+
+		// Check if the string contains typical Python syntax characters
+		const pythonSyntax = [
+			'def ',
+			'class ',
+			'import ',
+			'from ',
+			'if ',
+			'else:',
+			'elif ',
+			'for ',
+			'while ',
+			'try:',
+			'except:',
+			'finally:',
+			'return ',
+			'yield ',
+			'lambda ',
+			'assert ',
+			'pass',
+			'break',
+			'continue',
+			'global ',
+			'nonlocal ',
+			'del ',
+			'True',
+			'False',
+			'None',
+			' and ',
+			' or ',
+			' not ',
+			' in ',
+			' is ',
+			' as ',
+			' 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
+				].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
+		].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 : '';
 </script>
 
 {#if code}
-	<div class="mb-4">
+	<div class="mb-4" dir="ltr">
 		<div
 			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>
-			<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 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>
 
 		<pre
 			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
 			></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>
 {/if}

+ 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 />
 </div>

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

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

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

@@ -1,7 +1,20 @@
 <script lang="ts">
+	import { settings } from '$lib/stores';
+	import { WEBUI_BASE_URL } from '$lib/constants';
+
 	export let src = '/user.png';
 </script>
 
-<div class=" mr-3">
-	<img {src} class=" w-8 object-cover rounded-full" alt="profile" draggable="false" />
+<div class={$settings?.chatDirection === '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>

+ 8 - 3
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -332,7 +332,11 @@
 <CitationsModal bind:show={showCitationModal} citation={selectedCitation} />
 
 {#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
 			src={modelfiles[message.model]?.imageUrl ??
 				($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
@@ -434,9 +438,10 @@
 							{:else if message.content === ''}
 								<Skeleton />
 							{:else}
-								{#each tokens as token}
+								{#each tokens as token, tokenIdx}
 									{#if token.type === 'code'}
 										<CodeBlock
+											id={`${message.id}-${tokenIdx}`}
 											lang={token.lang}
 											code={revertSanitizedResponseContent(token.text)}
 										/>
@@ -494,7 +499,7 @@
 									class=" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500"
 								>
 									{#if siblings.length > 1}
-										<div class="flex self-center">
+										<div class="flex self-center" dir="ltr">
 											<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"
 												on:click={() => {

+ 6 - 4
src/lib/components/chat/Messages/UserMessage.svelte

@@ -7,6 +7,8 @@
 	import { modelfiles, settings } from '$lib/stores';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
+	import { user as _user } from '$lib/stores';
+
 	const i18n = getContext('i18n');
 
 	const dispatch = createEventDispatcher();
@@ -54,7 +56,7 @@
 	};
 </script>
 
-<div class=" flex w-full user-message">
+<div class=" flex w-full user-message" dir={$settings.chatDirection}>
 	{#if !($settings?.chatBubble ?? true)}
 		<ProfileImage
 			src={message.user
@@ -74,7 +76,7 @@
 							{$i18n.t('You')}
 							<span class=" text-gray-500 text-sm font-medium">{message?.user ?? ''}</span>
 						{/if}
-					{:else if $settings.showUsername}
+					{:else if $settings.showUsername || $_user.name !== user.name}
 						{user.name}
 					{:else}
 						{$i18n.t('You')}
@@ -239,7 +241,7 @@
 					>
 						{#if !($settings?.chatBubble ?? true)}
 							{#if siblings.length > 1}
-								<div class="flex self-center">
+								<div class="flex self-center" dir="ltr">
 									<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"
 										on:click={() => {
@@ -368,7 +370,7 @@
 
 						{#if $settings?.chatBubble ?? true}
 							{#if siblings.length > 1}
-								<div class="flex self-center">
+								<div class="flex self-center" dir="ltr">
 									<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"
 										on:click={() => {

+ 1 - 1
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -36,7 +36,7 @@
 	let ollamaVersion = null;
 
 	$: filteredItems = searchValue
-		? items.filter((item) => item.value.includes(searchValue.toLowerCase()))
+		? items.filter((item) => item.value.toLowerCase().includes(searchValue.toLowerCase()))
 		: items;
 
 	const pullModelHandler = async () => {

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

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

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

@@ -23,6 +23,7 @@
 	let promptSuggestions = [];
 	let showUsername = false;
 	let chatBubble = true;
+	let chatDirection: 'LTR' | 'RTL' = 'LTR';
 
 	const toggleSplitLargeChunks = async () => {
 		splitLargeChunks = !splitLargeChunks;
@@ -76,6 +77,11 @@
 		}
 	};
 
+	const toggleChangeChatDirection = async () => {
+		chatDirection = chatDirection === 'LTR' ? 'RTL' : 'LTR';
+		saveSettings({ chatDirection });
+	};
+
 	const updateInterfaceHandler = async () => {
 		if ($user.role === 'admin') {
 			promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions);
@@ -114,6 +120,7 @@
 		chatBubble = settings.chatBubble ?? true;
 		fullScreenMode = settings.fullScreenMode ?? false;
 		splitLargeChunks = settings.splitLargeChunks ?? false;
+		chatDirection = settings.chatDirection ?? 'LTR';
 	});
 </script>
 
@@ -210,27 +217,29 @@
 				</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>
+			{/if}
 
 			<div>
 				<div class=" py-0.5 flex w-full justify-between">
@@ -255,6 +264,24 @@
 			</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" />
 
 		<div>

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

@@ -63,7 +63,7 @@
 		<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-gray-300 dark:outline-gray-800 rounded-3xl"
+				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"
 			>
 				Manage
 			</button>

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

@@ -128,7 +128,7 @@
 						{$i18n.t('and create a new shared link.')}
 					{:else}
 						{$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}
 				</div>

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

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

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

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

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

@@ -14,7 +14,7 @@
 	}}
 	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-gray-100 dark:outline-gray-800"
+		: '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 "

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

@@ -141,14 +141,15 @@
 						}}
 					>
 						<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"
 						>
 							<div class=" self-center">
 								<img
 									src={$user.profile_image_url}
-									class=" size-6 object-cover rounded-full"
+									class="size-6 object-cover rounded-full"
 									alt="User profile"
+									draggable="false"
 								/>
 							</div>
 						</button>

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

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

+ 4 - 1
src/lib/i18n/locales/ar-BH/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "تغير الباسورد",
 	"Chat": "المحادثة",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "تاريخ المحادثة",
 	"Chat History is off for this browser.": "سجل الدردشة معطل لهذا المتصفح",
 	"Chats": "المحادثات",
@@ -249,6 +250,7 @@
 	"Light": "فاتح",
 	"Listening...": "جاري الاستماع",
 	"LLMs can make mistakes. Verify important information.": "يمكن أن تصدر بعض الأخطاء. لذلك يجب التحقق من المعلومات المهمة",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
 	"Make sure to enclose them with": "تأكد من إرفاقها",
 	"Manage LiteLLM Models": "LiteLLM إدارة نماذج ",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
 	"May": "",
 	"Memory": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "لن تتم مشاركة الرسائل التي ترسلها بعد إنشاء الرابط الخاص بك. سيتمكن المستخدمون الذين لديهم عنوان URL من عرض الدردشة المشتركة.",
+	"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 Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "منصب",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "حفظ",
 	"Save & Create": "حفظ وإنشاء",
 	"Save & Update": "حفظ وتحديث",

+ 4 - 1
src/lib/i18n/locales/bg-BG/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Промяна на Парола",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Чат История",
 	"Chat History is off for this browser.": "Чат История е изключен за този браузър.",
 	"Chats": "Чатове",
@@ -249,6 +250,7 @@
 	"Light": "Светъл",
 	"Listening...": "Слушам...",
 	"LLMs can make mistakes. Verify important information.": "LLMs могат да правят грешки. Проверете важните данни.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
 	"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Роля",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Запис",
 	"Save & Create": "Запис & Създаване",
 	"Save & Update": "Запис & Актуализиране",

+ 4 - 1
src/lib/i18n/locales/bn-BD/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
 	"Chat": "চ্যাট",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "চ্যাট হিস্টোরি",
 	"Chat History is off for this browser.": "এই ব্রাউজারের জন্য চ্যাট হিস্টোরি বন্ধ আছে",
 	"Chats": "চ্যাটসমূহ",
@@ -249,6 +250,7 @@
 	"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 মডেল ব্যবস্থাপনা করুন",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "পদবি",
 	"Rosé Pine": "রোজ পাইন",
 	"Rosé Pine Dawn": "ভোরের রোজ পাইন",
+	"RTL": "",
 	"Save": "সংরক্ষণ",
 	"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
 	"Save & Update": "সংরক্ষণ এবং আপডেট করুন",

+ 4 - 1
src/lib/i18n/locales/ca-ES/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Canvia la Contrasenya",
 	"Chat": "Xat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Històric del Xat",
 	"Chat History is off for this browser.": "L'historial de xat està desactivat per a aquest navegador.",
 	"Chats": "Xats",
@@ -249,6 +250,7 @@
 	"Light": "Clar",
 	"Listening...": "Escoltant...",
 	"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",
 	"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
 	"Manage LiteLLM Models": "Gestiona Models LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Eta de Mirostat",
@@ -371,6 +373,7 @@
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Albada Rosé Pine",
+	"RTL": "",
 	"Save": "Guarda",
 	"Save & Create": "Guarda i Crea",
 	"Save & Update": "Guarda i Actualitza",

+ 4 - 1
src/lib/i18n/locales/de-DE/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Passwort ändern",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat Verlauf",
 	"Chat History is off for this browser.": "Chat Verlauf ist für diesen Browser ausgeschaltet.",
 	"Chats": "Chats",
@@ -249,6 +250,7 @@
 	"Light": "Hell",
 	"Listening...": "Hören...",
 	"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",
 	"Make sure to enclose them with": "Formatiere deine Variablen mit:",
 	"Manage LiteLLM Models": "LiteLLM-Modelle verwalten",
@@ -260,7 +262,7 @@
 	"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",
 	"Memory": "",
-	"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.",
+	"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",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rolle",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Speichern",
 	"Save & Create": "Speichern und erstellen",
 	"Save & Update": "Speichern und aktualisieren",

+ 4 - 1
src/lib/i18n/locales/dg-DG/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Change Password",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat History",
 	"Chat History is off for this browser.": "Chat History off for this browser. Such sadness.",
 	"Chats": "Chats",
@@ -249,6 +250,7 @@
 	"Light": "Light",
 	"Listening...": "Listening...",
 	"LLMs can make mistakes. Verify important information.": "LLMs can make borks. Verify important info.",
+	"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",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Role",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Save much wow",
 	"Save & Create": "Save & Create much create",
 	"Save & Update": "Save & Update much update",

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

@@ -68,6 +68,7 @@
 	"Change Password": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "",
 	"Chat History is off for this browser.": "",
 	"Chats": "",
@@ -249,6 +250,7 @@
 	"Light": "",
 	"Listening...": "",
 	"LLMs can make mistakes. Verify important information.": "",
+	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
@@ -371,6 +373,7 @@
 	"Role": "",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "",
 	"Save & Create": "",
 	"Save & Update": "",

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

@@ -68,6 +68,7 @@
 	"Change Password": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "",
 	"Chat History is off for this browser.": "",
 	"Chats": "",
@@ -249,6 +250,7 @@
 	"Light": "",
 	"Listening...": "",
 	"LLMs can make mistakes. Verify important information.": "",
+	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "",
 	"Mirostat Eta": "",
@@ -371,6 +373,7 @@
 	"Role": "",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "",
 	"Save & Create": "",
 	"Save & Update": "",

+ 4 - 1
src/lib/i18n/locales/es-ES/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Cambia la Contraseña",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historial del Chat",
 	"Chat History is off for this browser.": "El Historial del Chat está apagado para este navegador.",
 	"Chats": "Chats",
@@ -249,6 +250,7 @@
 	"Light": "Claro",
 	"Listening...": "Escuchando...",
 	"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",
 	"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
 	"Manage LiteLLM Models": "Administrar Modelos LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Guardar",
 	"Save & Create": "Guardar y Crear",
 	"Save & Update": "Guardar y Actualizar",

+ 4 - 1
src/lib/i18n/locales/fa-IR/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "تغییر رمز عبور",
 	"Chat": "گپ",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "تاریخچه\u200cی گفتگو",
 	"Chat History is off for this browser.": "سابقه گپ برای این مرورگر خاموش است.",
 	"Chats": "گپ\u200cها",
@@ -249,6 +250,7 @@
 	"Light": "روشن",
 	"Listening...": "در حال گوش دادن...",
 	"LLMs can make mistakes. Verify important information.": "مدل\u200cهای زبانی بزرگ می\u200cتوانند اشتباه کنند. اطلاعات مهم را راستی\u200cآزمایی کنید.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
 	"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "نقش",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "ذخیره",
 	"Save & Create": "ذخیره و ایجاد",
 	"Save & Update": "ذخیره و به\u200cروزرسانی",

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

@@ -68,6 +68,7 @@
 	"Change Password": "Vaihda salasana",
 	"Chat": "Keskustelu",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Keskusteluhistoria",
 	"Chat History is off for this browser.": "Keskusteluhistoria on pois päältä tällä selaimella.",
 	"Chats": "Keskustelut",
@@ -249,6 +250,7 @@
 	"Light": "Vaalea",
 	"Listening...": "Kuunnellaan...",
 	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Varmista tärkeät tiedot.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
 	"Manage LiteLLM Models": "Hallitse LiteLLM-malleja",
@@ -260,7 +262,7 @@
 	"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",
 	"Memory": "",
-	"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.",
+	"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",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rooli",
 	"Rosé Pine": "Rosee-mänty",
 	"Rosé Pine Dawn": "Aamuinen Rosee-mänty",
+	"RTL": "",
 	"Save": "Tallenna",
 	"Save & Create": "Tallenna ja luo",
 	"Save & Update": "Tallenna ja päivitä",

+ 4 - 1
src/lib/i18n/locales/fr-CA/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Discussion",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historique des discussions",
 	"Chat History is off for this browser.": "L'historique des discussions est désactivé pour ce navigateur.",
 	"Chats": "Discussions",
@@ -249,6 +250,7 @@
 	"Light": "Lumière",
 	"Listening...": "Écoute...",
 	"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",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rôle",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
+	"RTL": "",
 	"Save": "Enregistrer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Update": "Enregistrer & Mettre à jour",

+ 4 - 1
src/lib/i18n/locales/fr-FR/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historique du chat",
 	"Chat History is off for this browser.": "L'historique du chat est désactivé pour ce navigateur.",
 	"Chats": "Chats",
@@ -249,6 +250,7 @@
 	"Light": "Clair",
 	"Listening...": "Écoute...",
 	"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",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rôle",
 	"Rosé Pine": "Pin Rosé",
 	"Rosé Pine Dawn": "Aube Pin Rosé",
+	"RTL": "",
 	"Save": "Enregistrer",
 	"Save & Create": "Enregistrer & Créer",
 	"Save & Update": "Enregistrer & Mettre à jour",

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

@@ -68,6 +68,7 @@
 	"Change Password": "שנה סיסמה",
 	"Chat": "צ'אט",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "היסטוריית צ'אט",
 	"Chat History is off for this browser.": "היסטוריית הצ'אט כבויה לדפדפן זה.",
 	"Chats": "צ'אטים",
@@ -249,6 +250,7 @@
 	"Light": "בהיר",
 	"Listening...": "מאזין...",
 	"LLMs can make mistakes. Verify important information.": "מודלים בשפה טבעית יכולים לטעות. אמת מידע חשוב.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
 	"Make sure to enclose them with": "ודא להקיף אותם עם",
 	"Manage LiteLLM Models": "נהל מודלים של LiteLLM",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
 	"May": "מאי",
 	"Memory": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "הודעות שתשלח לאחר יצירת הקישור שלך לא ישותפו. משתמשים עם הכתובת URL יוכלו לצפות בצ'אט המשותף.",
+	"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 Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "תפקיד",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "שמור",
 	"Save & Create": "שמור וצור",
 	"Save & Update": "שמור ועדכן",

+ 4 - 1
src/lib/i18n/locales/hi-IN/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "पासवर्ड बदलें",
 	"Chat": "चैट करें",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "चैट का इतिहास",
 	"Chat History is off for this browser.": "इस ब्राउज़र के लिए चैट इतिहास बंद है।",
 	"Chats": "सभी चैट",
@@ -249,6 +250,7 @@
 	"Light": "",
 	"Listening...": "सुन रहा हूँ...",
 	"LLMs can make mistakes. Verify important information.": "एलएलएम गलतियाँ कर सकते हैं। महत्वपूर्ण जानकारी सत्यापित करें.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
 	"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
 	"Manage LiteLLM Models": "LiteLLM मॉडल प्रबंधित करें",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "न्यूनतम स्कोर",
 	"Mirostat": "",
 	"Mirostat Eta": "",
@@ -371,6 +373,7 @@
 	"Role": "भूमिका",
 	"Rosé Pine": "",
 	"Rosé Pine Dawn": "",
+	"RTL": "",
 	"Save": "सहेजें",
 	"Save & Create": "सहेजें और बनाएं",
 	"Save & Update": "सहेजें और अपडेट करें",

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

@@ -0,0 +1,512 @@
+{
+	"'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 user": "korisnik",
+	"About": "O",
+	"Account": "Račun",
+	"Accurate information": "Točne informacije",
+	"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 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",
+	"Beta": "",
+	"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 Models": "",
+	"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 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 Display Name": "",
+	"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",
+	"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",
+	"Is Model Vision Capable": "",
+	"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 Model Information": "",
+	"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",
+	"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 {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
+	"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 info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
+	"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": "",
+	"No results found": "Nema rezultata",
+	"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",
+	"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",
+	"Selected model does not support image inputs.": "",
+	"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 Title Auto-Generation Model": "Postavi model za automatsko generiranje naslova",
+	"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",
+	"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č].",
+	"Yes": "",
+	"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"
+}

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

@@ -68,6 +68,7 @@
 	"Change Password": "Cambia password",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Cronologia chat",
 	"Chat History is off for this browser.": "La cronologia chat è disattivata per questo browser.",
 	"Chats": "Chat",
@@ -249,6 +250,7 @@
 	"Light": "Chiaro",
 	"Listening...": "Ascolto...",
 	"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",
 	"Make sure to enclose them with": "Assicurati di racchiuderli con",
 	"Manage LiteLLM Models": "Gestisci modelli LiteLLM",
@@ -260,7 +262,7 @@
 	"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",
 	"Memory": "",
-	"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.",
+	"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",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Ruolo",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salva",
 	"Save & Create": "Salva e crea",
 	"Save & Update": "Salva e aggiorna",

+ 4 - 1
src/lib/i18n/locales/ja-JP/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "パスワードを変更",
 	"Chat": "チャット",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "チャット履歴",
 	"Chat History is off for this browser.": "このブラウザではチャット履歴が無効になっています。",
 	"Chats": "チャット",
@@ -249,6 +250,7 @@
 	"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 モデルを管理",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "ミロスタット",
 	"Mirostat Eta": "ミロスタット Eta",
@@ -371,6 +373,7 @@
 	"Role": "役割",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "保存",
 	"Save & Create": "保存して作成",
 	"Save & Update": "保存して更新",

+ 4 - 1
src/lib/i18n/locales/ka-GE/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "პაროლის შეცვლა",
 	"Chat": "მიმოწერა",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "მიმოწერის ისტორია",
 	"Chat History is off for this browser.": "მიმოწერის ისტორია ამ ბრაუზერისთვის გათიშულია",
 	"Chats": "მიმოწერები",
@@ -249,6 +250,7 @@
 	"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 მოდელების მართვა",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "მიროსტატი",
 	"Mirostat Eta": "მიროსტატი ეტა",
@@ -371,6 +373,7 @@
 	"Role": "როლი",
 	"Rosé Pine": "ვარდისფერი ფიჭვის ხე",
 	"Rosé Pine Dawn": "ვარდისფერი ფიჭვის გარიჟრაჟი",
+	"RTL": "",
 	"Save": "შენახვა",
 	"Save & Create": "დამახსოვრება და შექმნა",
 	"Save & Update": "დამახსოვრება და განახლება",

+ 4 - 1
src/lib/i18n/locales/ko-KR/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "비밀번호 변경",
 	"Chat": "채팅",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "채팅 기록",
 	"Chat History is off for this browser.": "이 브라우저에서 채팅 기록이 꺼져 있습니다.",
 	"Chats": "채팅",
@@ -249,6 +250,7 @@
 	"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 모델 관리",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "역할",
 	"Rosé Pine": "로제 파인",
 	"Rosé Pine Dawn": "로제 파인 던",
+	"RTL": "",
 	"Save": "저장",
 	"Save & Create": "저장 및 생성",
 	"Save & Update": "저장 및 업데이트",

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

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

+ 4 - 1
src/lib/i18n/locales/nl-NL/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Wijzig Wachtwoord",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chat Geschiedenis",
 	"Chat History is off for this browser.": "Chat Geschiedenis is uitgeschakeld voor deze browser.",
 	"Chats": "Chats",
@@ -249,6 +250,7 @@
 	"Light": "Licht",
 	"Listening...": "Luisteren...",
 	"LLMs can make mistakes. Verify important information.": "LLMs kunnen fouten maken. Verifieer belangrijke informatie.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
 	"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
 	"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Opslaan",
 	"Save & Create": "Opslaan & Creëren",
 	"Save & Update": "Opslaan & Bijwerken",

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

@@ -0,0 +1,512 @@
+{
+	"'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 user": "ਇੱਕ ਉਪਭੋਗਤਾ",
+	"About": "ਬਾਰੇ",
+	"Account": "ਖਾਤਾ",
+	"Accurate information": "ਸਹੀ ਜਾਣਕਾਰੀ",
+	"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 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": "ਆਲਸੀ ਹੋਣਾ",
+	"Beta": "",
+	"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 Models": "",
+	"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 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 Display Name": "",
+	"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": "ਆਮ ਸੈਟਿੰਗਾਂ",
+	"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": "ਗਲਤ ਟੈਗ",
+	"Is Model Vision Capable": "",
+	"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 Model Information": "",
+	"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"March": "ਮਾਰਚ",
+	"Max Tokens": "ਅਧਿਕਤਮ ਟੋਕਨ",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ 3 ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
+	"May": "ਮਈ",
+	"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 {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "ਮਾਡਲ ਫਾਈਲਸਿਸਟਮ ਪੱਥ ਪਾਇਆ ਗਿਆ। ਅੱਪਡੇਟ ਲਈ ਮਾਡਲ ਸ਼ੌਰਟਨੇਮ ਦੀ ਲੋੜ ਹੈ, ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦੇ।",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
+	"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": "",
+	"No 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": "ਪ੍ਰੰਪਟ ਖੋਜੋ",
+	"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
+	"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
+	"Seed": "ਬੀਜ",
+	"Select a mode": "ਇੱਕ ਮੋਡ ਚੁਣੋ",
+	"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
+	"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
+	"Select model": "ਮਾਡਲ ਚੁਣੋ",
+	"Selected model does not support image inputs.": "",
+	"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 Title Auto-Generation 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": "ਵੈਬ ਪੈਰਾਮੀਟਰ",
+	"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 ਸ਼ਬਦਾਂ ਵਿੱਚ ਇੱਕ ਸੰਖੇਪ ਲਿਖੋ ਜੋ [ਵਿਸ਼ਾ ਜਾਂ ਕੁੰਜੀ ਸ਼ਬਦ] ਨੂੰ ਸੰਖੇਪ ਕਰਦਾ ਹੈ।",
+	"Yes": "",
+	"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": "ਯੂਟਿਊਬ ਲੋਡਰ ਸੈਟਿੰਗਾਂ"
+}

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

@@ -68,6 +68,7 @@
 	"Change Password": "Zmień hasło",
 	"Chat": "Czat",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Historia czatu",
 	"Chat History is off for this browser.": "Historia czatu jest wyłączona dla tej przeglądarki.",
 	"Chats": "Czaty",
@@ -249,6 +250,7 @@
 	"Light": "Jasny",
 	"Listening...": "Nasłuchiwanie...",
 	"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",
 	"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
 	"Manage LiteLLM Models": "Zarządzaj modelami LiteLLM",
@@ -260,7 +262,7 @@
 	"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",
 	"Memory": "",
-	"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.",
+	"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",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rola",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Zapisz",
 	"Save & Create": "Zapisz i utwórz",
 	"Save & Update": "Zapisz i zaktualizuj",

+ 4 - 1
src/lib/i18n/locales/pt-BR/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"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.",
 	"Chats": "Bate-papos",
@@ -249,6 +250,7 @@
 	"Light": "Claro",
 	"Listening...": "Ouvindo...",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Função",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salvar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Update": "Salvar e Atualizar",

+ 4 - 1
src/lib/i18n/locales/pt-PT/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"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.",
 	"Chats": "Bate-papos",
@@ -249,6 +250,7 @@
 	"Light": "Claro",
 	"Listening...": "Ouvindo...",
 	"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Função",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Salvar",
 	"Save & Create": "Salvar e Criar",
 	"Save & Update": "Salvar e Atualizar",

+ 4 - 1
src/lib/i18n/locales/ru-RU/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Изменить пароль",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "История чат",
 	"Chat History is off for this browser.": "История чат отключен для этого браузера.",
 	"Chats": "Чаты",
@@ -249,6 +250,7 @@
 	"Light": "Светлый",
 	"Listening...": "Слушаю...",
 	"LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
 	"Make sure to enclose them with": "Убедитесь, что они заключены в",
 	"Manage LiteLLM Models": "Управление моделями LiteLLM",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимальное количество моделей для загрузки одновременно - 3. Пожалуйста, попробуйте позже.",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Роль",
 	"Rosé Pine": "Розовое сосновое дерево",
 	"Rosé Pine Dawn": "Розовое сосновое дерево рассвет",
+	"RTL": "",
 	"Save": "Сохранить",
 	"Save & Create": "Сохранить и создать",
 	"Save & Update": "Сохранить и обновить",

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

@@ -0,0 +1,512 @@
+{
+	"'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 user": "корисник",
+	"About": "О нама",
+	"Account": "Налог",
+	"Accurate information": "Прецизне информације",
+	"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 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": "Бити лењ",
+	"Beta": "",
+	"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 Models": "",
+	"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 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 Display Name": "",
+	"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": "Општа подешавања",
+	"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` заставицу при покретању stable-diffusion-webui",
+	"Input commands": "Унеси наредбе",
+	"Interface": "Изглед",
+	"Invalid Tag": "Неисправна ознака",
+	"Is Model Vision Capable": "",
+	"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 Model Information": "",
+	"Manage Models": "Управљај моделима",
+	"Manage Ollama Models": "Управљај Ollama моделима",
+	"March": "Март",
+	"Max Tokens": "Највише жетона",
+	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Највише 3 модела могу бити преузета истовремено. Покушајте поново касније.",
+	"May": "Мај",
+	"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 {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
+	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Откривена путања система датотека модела. За ажурирање је потребан кратак назив модела, не може се наставити.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
+	"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": "",
+	"No 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": "Претражи упите",
+	"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": "Изабери модел",
+	"Selected model does not support image inputs.": "",
+	"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 Title Auto-Generation 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": "Веб параметри",
+	"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 речи који резимира [тему или кључну реч].",
+	"Yes": "",
+	"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": "Подешавања Јутјуб учитавача"
+}

+ 4 - 1
src/lib/i18n/locales/sv-SE/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Ändra lösenord",
 	"Chat": "Chatt",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Chatthistorik",
 	"Chat History is off for this browser.": "Chatthistoriken är avstängd för denna webbläsare.",
 	"Chats": "Chattar",
@@ -249,6 +250,7 @@
 	"Light": "Ljus",
 	"Listening...": "Lyssnar...",
 	"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",
 	"Make sure to enclose them with": "Se till att bifoga dem med",
 	"Manage LiteLLM Models": "Hantera LiteLLM-modeller",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Roll",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Spara",
 	"Save & Create": "Spara och skapa",
 	"Save & Update": "Spara och uppdatera",

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

@@ -68,6 +68,7 @@
 	"Change Password": "Parola Değiştir",
 	"Chat": "Sohbet",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Sohbet Geçmişi",
 	"Chat History is off for this browser.": "Bu tarayıcı için sohbet geçmişi kapalı.",
 	"Chats": "Sohbetler",
@@ -249,6 +250,7 @@
 	"Light": "Açık",
 	"Listening...": "Dinleniyor...",
 	"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",
 	"Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:",
 	"Manage LiteLLM Models": "LiteLLM Modellerini Yönet",
@@ -260,7 +262,7 @@
 	"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",
 	"Memory": "",
-	"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.",
+	"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",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Rol",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Kaydet",
 	"Save & Create": "Kaydet ve Oluştur",
 	"Save & Update": "Kaydet ve Güncelle",

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

@@ -68,6 +68,7 @@
 	"Change Password": "Змінити пароль",
 	"Chat": "Чат",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "Історія чату",
 	"Chat History is off for this browser.": "Історія чату вимкнена для цього браузера.",
 	"Chats": "Чати",
@@ -249,6 +250,7 @@
 	"Light": "Світла",
 	"Listening...": "Слухаю...",
 	"LLMs can make mistakes. Verify important information.": "LLMs можуть помилятися. Перевірте важливу інформацію.",
+	"LTR": "",
 	"Made by OpenWebUI Community": "Зроблено спільнотою OpenWebUI",
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
 	"Manage LiteLLM Models": "Керування моделями LiteLLM",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
 	"May": "Травень",
 	"Memory": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "Повідомлення, які ви надсилаєте після створення посилання, не будуть опубліковані. Користувачі з URL-адресою зможуть переглядати спільний чат.",
+	"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 Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Роль",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Зберегти",
 	"Save & Create": "Зберегти та створити",
 	"Save & Update": "Зберегти та оновити",

+ 4 - 1
src/lib/i18n/locales/vi-VN/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "Đổi Mật khẩu",
 	"Chat": "Trò chuyện",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"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.",
 	"Chats": "Chat",
@@ -249,6 +250,7 @@
 	"Light": "Sáng",
 	"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.",
+	"LTR": "",
 	"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",
 	"Manage LiteLLM Models": "Quản lý mô hình với LiteLLM",
@@ -260,7 +262,7 @@
 	"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": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Vai trò",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "Lưu",
 	"Save & Create": "Lưu & Tạo",
 	"Save & Update": "Lưu & Cập nhật",

+ 4 - 1
src/lib/i18n/locales/zh-CN/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "更改密码",
 	"Chat": "聊天",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "聊天历史",
 	"Chat History is off for this browser.": "此浏览器已关闭聊天历史功能。",
 	"Chats": "聊天",
@@ -249,6 +250,7 @@
 	"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 模型",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
 	"May": "五月",
 	"Memory": "",
-	"Messages you send after creating your link won't be shared. Users with the URL will beable to view the shared chat.": "创建链接后发送的信息不会被共享。拥有 URL 的用户可以查看共享的聊天内容。",
+	"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 Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "角色",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
+	"RTL": "",
 	"Save": "保存",
 	"Save & Create": "保存并创建",
 	"Save & Update": "保存并更新",

+ 4 - 1
src/lib/i18n/locales/zh-TW/translation.json

@@ -68,6 +68,7 @@
 	"Change Password": "修改密碼",
 	"Chat": "聊天",
 	"Chat Bubble UI": "",
+	"Chat direction": "",
 	"Chat History": "聊天紀錄功能",
 	"Chat History is off for this browser.": "此瀏覽器已關閉聊天紀錄功能。",
 	"Chats": "聊天",
@@ -249,6 +250,7 @@
 	"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 模型",
@@ -260,7 +262,7 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
 	"May": "",
 	"Memory": "",
-	"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.": "",
 	"Minimum Score": "",
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
@@ -371,6 +373,7 @@
 	"Role": "Role",
 	"Rosé Pine": "玫瑰松",
 	"Rosé Pine Dawn": "黎明玫瑰松",
+	"RTL": "",
 	"Save": "儲存",
 	"Save & Create": "儲存並建立",
 	"Save & Update": "儲存並更新",

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

@@ -91,6 +91,7 @@ type Settings = {
 	notificationEnabled?: boolean;
 	title?: TitleSettings;
 	splitLargeDeltas?: boolean;
+	chatDirection: 'LTR' | 'RTL';
 
 	system?: 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) => {
 	let models = await Promise.all([
-		await getOllamaModels(token).catch((error) => {
+		getOllamaModels(token).catch((error) => {
 			console.log(error);
 			return null;
 		}),
-		await getOpenAIModels(token).catch((error) => {
+		getOpenAIModels(token).catch((error) => {
 			console.log(error);
 			return null;
 		}),
-		await getLiteLLMModels(token).catch((error) => {
+		getLiteLLMModels(token).catch((error) => {
 			console.log(error);
 			return null;
 		})

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

@@ -0,0 +1,66 @@
+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);
+
+	self.result = await self.pyodide.runPythonAsync(code);
+	self.postMessage({ id, result: self.result, stdout: self.stdout, stderr: self.stderr });
+};
+
+export default {};

+ 6 - 2
src/routes/(app)/admin/+page.svelte

@@ -1,5 +1,5 @@
 <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 { goto } from '$app/navigation';
 	import { onMount, getContext } from 'svelte';
@@ -264,7 +264,11 @@
 									<div class="flex flex-row w-max">
 										<img
 											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"
 										/>
 

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

@@ -947,6 +947,7 @@
 						bind:history
 						bind:messages
 						bind:autoScroll
+						bind:prompt
 						bottomPadding={files.length > 0}
 						{sendPrompt}
 						{continueGeneration}
@@ -962,7 +963,6 @@
 		bind:prompt
 		bind:autoScroll
 		bind:selectedModel={atSelectedModel}
-		suggestionPrompts={selectedModelfile?.suggestionPrompts ?? $config.default_prompt_suggestions}
 		{messages}
 		{submitPrompt}
 		{stopResponse}

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

@@ -89,7 +89,7 @@
 
 <svelte:head>
 	<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. -->
 	<!-- 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="flex space-x-2">
 			<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>

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

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

File diff suppressed because it is too large
+ 0 - 0
static/pyodide/pyodide-lock.json


+ 0 - 1
svelte.config.js

@@ -6,7 +6,6 @@ const config = {
 	// Consult https://kit.svelte.dev/docs/integrations#preprocessors
 	// for more information about preprocessors
 	preprocess: vitePreprocess(),
-
 	kit: {
 		// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
 		// If your environment is not supported or you settled on a specific environment, switch out the adapter.

+ 17 - 0
vite.config.ts

@@ -1,9 +1,26 @@
 import { sveltekit } from '@sveltejs/kit/vite';
 import { defineConfig } from 'vite';
 
+// /** @type {import('vite').Plugin} */
+// const viteServerConfig = {
+// 	name: 'log-request-middleware',
+// 	configureServer(server) {
+// 		server.middlewares.use((req, res, next) => {
+// 			res.setHeader('Access-Control-Allow-Origin', '*');
+// 			res.setHeader('Access-Control-Allow-Methods', 'GET');
+// 			res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
+// 			res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+// 			next();
+// 		});
+// 	}
+// };
+
 export default defineConfig({
 	plugins: [sveltekit()],
 	define: {
 		APP_VERSION: JSON.stringify(process.env.npm_package_version)
+	},
+	worker: {
+		format: 'es'
 	}
 });

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