mirror of
https://github.com/open-webui/open-webui.git
synced 2026-11-14 09:21:22 +00:00
Merge 6b826c7585 into c38885a1a7
This commit is contained in:
commit
e456c37484
145 changed files with 10205 additions and 8116 deletions
|
|
@ -19,6 +19,9 @@ OPENAI_API_KEY=''
|
|||
# CORS_ALLOW_ORIGIN='http://localhost:5173;http://localhost:8080'
|
||||
CORS_ALLOW_ORIGIN='*'
|
||||
|
||||
# Renewable sessions expire after this period without a refresh.
|
||||
# SESSION_EXPIRES_IN='90d'
|
||||
|
||||
# MFA defaults; saved settings take precedence once persistent config is seeded.
|
||||
ENABLE_MFA=false
|
||||
MFA_ALLOW_OAUTH_BYPASS=false
|
||||
|
|
|
|||
112
.github/workflows/actions.lock
vendored
Normal file
112
.github/workflows/actions.lock
vendored
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
# This file is machine-generated by `gh actions-lock`.
|
||||
# Do not edit by hand; run `gh actions-lock` to update.
|
||||
# Docs: https://gh.io/actions-lockfile
|
||||
version: 'v0.0.3'
|
||||
workflows:
|
||||
'.github/workflows/backend.yaml':
|
||||
- 'actions/checkout@v5.1.0'
|
||||
- 'actions/setup-python@v6.3.0'
|
||||
'.github/workflows/docker.yaml':
|
||||
- 'actions/checkout@v5.1.0'
|
||||
- 'actions/create-github-app-token@v2.2.2'
|
||||
- 'actions/download-artifact@v5.0.0'
|
||||
- 'actions/github-script@v8.0.0'
|
||||
- 'actions/upload-artifact@v4.6.2'
|
||||
- 'docker/build-push-action@v5.4.0'
|
||||
- 'docker/login-action@v3.7.0'
|
||||
- 'docker/metadata-action@v5.10.0'
|
||||
- 'docker/setup-buildx-action@v3.12.0'
|
||||
- 'docker/setup-qemu-action@v3.7.0'
|
||||
'.github/workflows/frontend.yaml':
|
||||
- 'actions/checkout@v5.1.0'
|
||||
- 'actions/setup-node@v5.0.0'
|
||||
'.github/workflows/issue-label.yaml':
|
||||
- 'actions/github-script@v7.1.0'
|
||||
'.github/workflows/regression.yaml': []
|
||||
'.github/workflows/release-pypi.yml':
|
||||
- 'actions/checkout@v5.1.0'
|
||||
- 'actions/setup-node@v5.0.0'
|
||||
- 'actions/setup-python@v6.3.0'
|
||||
- 'pypa/gh-action-pypi-publish@release/v1'
|
||||
'.github/workflows/release.yml':
|
||||
- 'actions/checkout@v5.1.0'
|
||||
- 'actions/github-script@v8.0.0'
|
||||
- 'actions/upload-artifact@v4.6.2'
|
||||
dependencies:
|
||||
'actions/checkout@v5.1.0':
|
||||
ref: 'v5.1.0'
|
||||
commit: 'sha1-fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09'
|
||||
owner_id: 44036562
|
||||
repo_id: 197814629
|
||||
'actions/create-github-app-token@v2.2.2':
|
||||
ref: 'v2.2.2'
|
||||
commit: 'sha1-fee1f7d63c2ff003460e3d139729b119787bc349'
|
||||
owner_id: 44036562
|
||||
repo_id: 642580244
|
||||
'actions/download-artifact@v5.0.0':
|
||||
ref: 'v5.0.0'
|
||||
commit: 'sha1-634f93cb2916e3fdff6788551b99b062d0335ce0'
|
||||
owner_id: 44036562
|
||||
repo_id: 192626254
|
||||
'actions/github-script@v7.1.0':
|
||||
ref: 'v7.1.0'
|
||||
commit: 'sha1-f28e40c7f34bde8b3046d885e986cb6290c5673b'
|
||||
owner_id: 44036562
|
||||
repo_id: 205262760
|
||||
'actions/github-script@v8.0.0':
|
||||
ref: 'v8.0.0'
|
||||
commit: 'sha1-ed597411d8f924073f98dfc5c65a23a2325f34cd'
|
||||
owner_id: 44036562
|
||||
repo_id: 205262760
|
||||
'actions/setup-node@v5.0.0':
|
||||
ref: 'v5.0.0'
|
||||
commit: 'sha1-a0853c24544627f65ddf259abe73b1d18a591444'
|
||||
owner_id: 44036562
|
||||
repo_id: 189476904
|
||||
'actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405':
|
||||
ref: 'v6.2.0'
|
||||
commit: 'sha1-a309ff8b426b58ec0e2a45f0f869d46889d02405'
|
||||
owner_id: 44036562
|
||||
repo_id: 192625525
|
||||
'actions/setup-python@v6.3.0':
|
||||
ref: 'v6.3.0'
|
||||
commit: 'sha1-ece7cb06caefa5fff74198d8649806c4678c61a1'
|
||||
owner_id: 44036562
|
||||
repo_id: 192625525
|
||||
'actions/upload-artifact@v4.6.2':
|
||||
ref: 'v4.6.2'
|
||||
commit: 'sha1-ea165f8d65b6e75b540449e92b4886f43607fa02'
|
||||
owner_id: 44036562
|
||||
repo_id: 192625955
|
||||
'docker/build-push-action@v5.4.0':
|
||||
ref: 'v5.4.0'
|
||||
commit: 'sha1-ca052bb54ab0790a636c9b5f226502c73d547a25'
|
||||
owner_id: 5429470
|
||||
repo_id: 241092383
|
||||
'docker/login-action@v3.7.0':
|
||||
ref: 'v3.7.0'
|
||||
commit: 'sha1-c94ce9fb468520275223c153574b00df6fe4bcc9'
|
||||
owner_id: 5429470
|
||||
repo_id: 287743349
|
||||
'docker/metadata-action@v5.10.0':
|
||||
ref: 'v5.10.0'
|
||||
commit: 'sha1-c299e40c65443455700f0fdfc63efafe5b349051'
|
||||
owner_id: 5429470
|
||||
repo_id: 306769011
|
||||
'docker/setup-buildx-action@v3.12.0':
|
||||
ref: 'v3.12.0'
|
||||
commit: 'sha1-8d2750c68a42422c14e847fe6c8ac0403b4cbd6f'
|
||||
owner_id: 5429470
|
||||
repo_id: 288485773
|
||||
'docker/setup-qemu-action@v3.7.0':
|
||||
ref: 'v3.7.0'
|
||||
commit: 'sha1-c7c53464625b32c7a7e944ae62b3e17d2b600130'
|
||||
owner_id: 5429470
|
||||
repo_id: 288487894
|
||||
'pypa/gh-action-pypi-publish@release/v1':
|
||||
ref: 'release/v1'
|
||||
commit: 'sha1-7245906fb61fa33a13554f9d5fb856fe61758086'
|
||||
owner_id: 647025
|
||||
repo_id: 178055147
|
||||
uses:
|
||||
- 'actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405'
|
||||
4
.github/workflows/backend.yaml
vendored
4
.github/workflows/backend.yaml
vendored
|
|
@ -27,9 +27,9 @@ jobs:
|
|||
matrix:
|
||||
python-version: ['3.11', '3.12']
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v5.1.0
|
||||
|
||||
- uses: actions/setup-python@v6
|
||||
- uses: actions/setup-python@v6.3.0
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
|
|
|
|||
36
.github/workflows/docker.yaml
vendored
36
.github/workflows/docker.yaml
vendored
|
|
@ -67,13 +67,13 @@ jobs:
|
|||
run: rm -rf /opt/hostedtoolcache
|
||||
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v5.1.0
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
uses: docker/setup-qemu-action@v3.7.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v3.12.0
|
||||
|
||||
- name: Prepare CI Dockerfile
|
||||
run: |
|
||||
|
|
@ -87,7 +87,7 @@ jobs:
|
|||
' Dockerfile > "${RUNNER_TEMP}/Dockerfile"
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v3.7.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
|
|
@ -95,7 +95,7 @@ jobs:
|
|||
|
||||
- name: Extract metadata for Docker images
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v5.10.0
|
||||
with:
|
||||
images: ${{ env.FULL_IMAGE_NAME }}
|
||||
tags: |
|
||||
|
|
@ -111,7 +111,7 @@ jobs:
|
|||
|
||||
- name: Extract metadata for Docker cache
|
||||
id: cache-meta
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v5.10.0
|
||||
with:
|
||||
images: ${{ env.FULL_IMAGE_NAME }}
|
||||
tags: |
|
||||
|
|
@ -122,7 +122,7 @@ jobs:
|
|||
latest=false
|
||||
|
||||
- name: Build Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
uses: docker/build-push-action@v5.4.0
|
||||
id: build
|
||||
with:
|
||||
context: .
|
||||
|
|
@ -146,7 +146,7 @@ jobs:
|
|||
touch "/tmp/digests/${digest#sha256:}"
|
||||
|
||||
- name: Upload digest
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v4.6.2
|
||||
with:
|
||||
name: digests-${{ matrix.variant.name }}-${{ env.PLATFORM_PAIR }}
|
||||
path: /tmp/digests/*
|
||||
|
|
@ -183,7 +183,7 @@ jobs:
|
|||
|
||||
- name: Download digests
|
||||
id: download
|
||||
uses: actions/download-artifact@v5
|
||||
uses: actions/download-artifact@v5.0.0
|
||||
with:
|
||||
pattern: digests-${{ matrix.variant.name }}-*
|
||||
path: /tmp/digests
|
||||
|
|
@ -204,11 +204,11 @@ jobs:
|
|||
|
||||
- name: Set up Docker Buildx
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v3.12.0
|
||||
|
||||
- name: Log in to the Container registry
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v3.7.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
|
|
@ -217,7 +217,7 @@ jobs:
|
|||
- name: Extract metadata for Docker images
|
||||
if: steps.check.outputs.skip != 'true'
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
uses: docker/metadata-action@v5.10.0
|
||||
with:
|
||||
images: ${{ env.FULL_IMAGE_NAME }}
|
||||
tags: |
|
||||
|
|
@ -251,7 +251,7 @@ jobs:
|
|||
steps:
|
||||
- name: Create Helm charts app token
|
||||
id: helm-app-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
uses: actions/create-github-app-token@v2.2.2
|
||||
with:
|
||||
app-id: ${{ secrets.HELM_CHARTS_APP_ID }}
|
||||
private-key: ${{ secrets.HELM_CHARTS_APP_PRIVATE_KEY }}
|
||||
|
|
@ -259,7 +259,7 @@ jobs:
|
|||
repositories: helm-charts
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v3.12.0
|
||||
|
||||
- name: Verify published Open WebUI image
|
||||
id: image
|
||||
|
|
@ -279,7 +279,7 @@ jobs:
|
|||
echo "tag=${image_tag}" >> "${GITHUB_OUTPUT}"
|
||||
|
||||
- name: Dispatch Helm chart automation
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v8.0.0
|
||||
with:
|
||||
github-token: ${{ steps.helm-app-token.outputs.token }}
|
||||
script: |
|
||||
|
|
@ -334,17 +334,17 @@ jobs:
|
|||
echo "FULL_IMAGE_NAME=${REGISTRY}/${GITHUB_REPOSITORY,,}" >> ${GITHUB_ENV}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
uses: docker/setup-buildx-action@v3.12.0
|
||||
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v3.7.0
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
uses: docker/login-action@v3.7.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
|
|
|||
8
.github/workflows/frontend.yaml
vendored
8
.github/workflows/frontend.yaml
vendored
|
|
@ -23,9 +23,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v5.1.0
|
||||
|
||||
- uses: actions/setup-node@v5
|
||||
- uses: actions/setup-node@v5.0.0
|
||||
with:
|
||||
node-version: '22'
|
||||
|
||||
|
|
@ -52,9 +52,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v5.1.0
|
||||
|
||||
- uses: actions/setup-node@v5
|
||||
- uses: actions/setup-node@v5.0.0
|
||||
with:
|
||||
node-version: '22'
|
||||
|
||||
|
|
|
|||
4
.github/workflows/issue-label.yaml
vendored
4
.github/workflows/issue-label.yaml
vendored
|
|
@ -12,7 +12,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add "bug" label to unlabeled bug reports
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v7.1.0
|
||||
with:
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
|
|
@ -72,7 +72,7 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Add "enhancement" label to unlabeled feature requests
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v7.1.0
|
||||
with:
|
||||
script: |
|
||||
const issue = context.payload.issue;
|
||||
|
|
|
|||
6
.github/workflows/release-pypi.yml
vendored
6
.github/workflows/release-pypi.yml
vendored
|
|
@ -16,15 +16,15 @@ jobs:
|
|||
id-token: write
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5
|
||||
uses: actions/checkout@v5.1.0
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install Git
|
||||
run: sudo apt-get update && sudo apt-get install -y git
|
||||
- uses: actions/setup-node@v5
|
||||
- uses: actions/setup-node@v5.0.0
|
||||
with:
|
||||
node-version: 22
|
||||
- uses: actions/setup-python@v6
|
||||
- uses: actions/setup-python@v6.3.0
|
||||
with:
|
||||
python-version: 3.12
|
||||
- name: Build
|
||||
|
|
|
|||
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
|
|
@ -21,7 +21,7 @@ jobs:
|
|||
contents: write
|
||||
actions: write
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
- uses: actions/checkout@v5.1.0
|
||||
|
||||
- name: Abort if package.json unchanged
|
||||
run: |
|
||||
|
|
@ -65,7 +65,7 @@ jobs:
|
|||
fi
|
||||
|
||||
- name: Archive source
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v4.6.2
|
||||
with:
|
||||
name: release-archive
|
||||
path: |
|
||||
|
|
@ -75,7 +75,7 @@ jobs:
|
|||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Trigger Docker build
|
||||
uses: actions/github-script@v8
|
||||
uses: actions/github-script@v8.0.0
|
||||
with:
|
||||
script: |
|
||||
github.rest.actions.createWorkflowDispatch({
|
||||
|
|
|
|||
|
|
@ -43,9 +43,11 @@
|
|||
|
||||
#### Python
|
||||
|
||||
Requires Python 3.12.
|
||||
|
||||
```bash
|
||||
# With uv installed (macOS/Linux)
|
||||
DATA_DIR=~/.open-webui uvx --python 3.12 open-webui@latest serve
|
||||
|
||||
# Or install and run with pip (Python 3.12)
|
||||
pip install open-webui
|
||||
open-webui serve
|
||||
```
|
||||
|
|
|
|||
|
|
@ -2549,6 +2549,7 @@ ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS = (
|
|||
API_KEYS_ALLOWED_ENDPOINTS = os.getenv('API_KEYS_ALLOWED_ENDPOINTS', os.getenv('API_KEY_ALLOWED_ENDPOINTS', ''))
|
||||
|
||||
JWT_EXPIRES_IN = os.getenv('JWT_EXPIRES_IN', '4w')
|
||||
SESSION_EXPIRES_IN = os.getenv('SESSION_EXPIRES_IN', '90d')
|
||||
|
||||
if JWT_EXPIRES_IN == '-1':
|
||||
log.warning(
|
||||
|
|
@ -3292,6 +3293,7 @@ DEFAULT_CONFIG = {
|
|||
'auth.api_key.endpoint_restrictions': ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS,
|
||||
'auth.api_key.allowed_endpoints': API_KEYS_ALLOWED_ENDPOINTS,
|
||||
'auth.jwt_expiry': JWT_EXPIRES_IN,
|
||||
'auth.session_expiry': SESSION_EXPIRES_IN,
|
||||
'auth.mfa.enable': ENABLE_MFA,
|
||||
'auth.mfa.allow_oauth_bypass': MFA_ALLOW_OAUTH_BYPASS,
|
||||
'auth.mfa.allow_trusted_header_bypass': MFA_ALLOW_TRUSTED_HEADER_BYPASS,
|
||||
|
|
|
|||
|
|
@ -827,6 +827,9 @@ app.include_router(retrieval.router, prefix='/api/v1/retrieval', tags=['retrieva
|
|||
|
||||
app.include_router(configs.router, prefix='/api/v1/configs', tags=['configs'])
|
||||
|
||||
from open_webui.env import UVICORN_WORKERS, REDIS_URL
|
||||
from open_webui.routers import tether
|
||||
app.include_router(tether.router, prefix='/api/v1/tether', tags=['tether'])
|
||||
app.include_router(auths.router, prefix='/api/v1/auths', tags=['auths'])
|
||||
app.include_router(mfa.router, prefix='/api/v1/auths/mfa', tags=['auths'])
|
||||
app.include_router(users.router, prefix='/api/v1/users', tags=['users'])
|
||||
|
|
@ -1506,7 +1509,7 @@ async def chat_completion(
|
|||
|
||||
asyncio.create_task(run_initial_title_generation())
|
||||
else:
|
||||
chat = await Chats.get_accessible_chat_by_id(chat_id, user, permission='write')
|
||||
chat = await Chats.get_accessible_chat_by_id(chat_id, user, permission='write', chat=existing_chat)
|
||||
if not chat:
|
||||
raise HTTPException(status_code=404, detail=ERROR_MESSAGES.NOT_FOUND)
|
||||
|
||||
|
|
@ -2387,6 +2390,8 @@ async def get_app_config(request: Request):
|
|||
},
|
||||
'features': {
|
||||
'slim': USE_SLIM,
|
||||
'auth_sessions': True,
|
||||
'tether': ENABLE_WEBSOCKET_SUPPORT and (UVICORN_WORKERS == 1 or bool(REDIS_URL)),
|
||||
# Public: required by login/signup page pre-auth
|
||||
'auth': WEBUI_AUTH,
|
||||
'auth_trusted_header': bool(WEBUI_AUTH_TRUSTED_EMAIL_HEADER),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
"""Add renewable authentication sessions."""
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
revision = '8bc7e5a902d1'
|
||||
down_revision = 'e42c8f710a36'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
op.create_table(
|
||||
'auth_session',
|
||||
sa.Column('id', sa.Text(), primary_key=True),
|
||||
sa.Column('user_id', sa.Text(), nullable=True),
|
||||
sa.Column('refresh_token_id', sa.Text(), nullable=True),
|
||||
sa.Column('data', sa.JSON(), nullable=False),
|
||||
*[sa.Column(key, sa.BigInteger(), nullable=False) for key in ('created_at', 'updated_at', 'expires_at')],
|
||||
)
|
||||
op.create_index('idx_auth_session_user', 'auth_session', ['user_id'])
|
||||
op.create_index('idx_auth_session_expires', 'auth_session', ['expires_at'])
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_table('auth_session')
|
||||
98
backend/open_webui/models/auth_sessions.py
Normal file
98
backend/open_webui/models/auth_sessions.py
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
"""Renewable human sessions. Pending browser logins become the same session row."""
|
||||
|
||||
import time
|
||||
from uuid import uuid4
|
||||
|
||||
from open_webui.internal.db import Base, get_async_db
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from sqlalchemy import JSON, BigInteger, Column, Index, Text, delete, select, update
|
||||
|
||||
|
||||
class AuthSession(Base):
|
||||
__tablename__ = 'auth_session'
|
||||
|
||||
id = Column(Text, primary_key=True)
|
||||
user_id = Column(Text, nullable=True)
|
||||
refresh_token_id = Column(Text, nullable=True)
|
||||
data = Column(JSON, nullable=False)
|
||||
created_at = Column(BigInteger, nullable=False)
|
||||
updated_at = Column(BigInteger, nullable=False)
|
||||
expires_at = Column(BigInteger, nullable=False)
|
||||
|
||||
__table_args__ = (
|
||||
Index('idx_auth_session_user', 'user_id'),
|
||||
Index('idx_auth_session_expires', 'expires_at'),
|
||||
)
|
||||
|
||||
|
||||
class AuthSessionModel(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: str
|
||||
user_id: str | None
|
||||
refresh_token_id: str | None = None
|
||||
data: dict
|
||||
created_at: int
|
||||
updated_at: int
|
||||
expires_at: int
|
||||
|
||||
|
||||
class AuthSessionsTable:
|
||||
async def get(self, session_id: str) -> AuthSessionModel | None:
|
||||
async with get_async_db() as db:
|
||||
row = await db.get(AuthSession, session_id)
|
||||
return AuthSessionModel.model_validate(row) if row else None
|
||||
|
||||
async def create(self, **values) -> AuthSessionModel:
|
||||
now = int(time.time())
|
||||
row = AuthSession(id=str(uuid4()), created_at=now, updated_at=now, **values)
|
||||
async with get_async_db() as db:
|
||||
await db.execute(delete(AuthSession).where(AuthSession.expires_at <= now))
|
||||
db.add(row)
|
||||
await db.flush()
|
||||
result = AuthSessionModel.model_validate(row)
|
||||
await db.commit()
|
||||
return result
|
||||
|
||||
async def change(self, session_id: str, conditions: list, **values) -> bool:
|
||||
async with get_async_db() as db:
|
||||
result = await db.execute(
|
||||
update(AuthSession)
|
||||
.where(AuthSession.id == session_id, *conditions)
|
||||
.values(updated_at=int(time.time()), **values)
|
||||
.execution_options(synchronize_session=False)
|
||||
)
|
||||
await db.commit()
|
||||
return result.rowcount == 1
|
||||
|
||||
async def revoke(self, session_id: str, user_id: str) -> bool:
|
||||
async with get_async_db() as db:
|
||||
result = await db.execute(
|
||||
delete(AuthSession).where(AuthSession.id == session_id, AuthSession.user_id == user_id)
|
||||
)
|
||||
await db.commit()
|
||||
return result.rowcount == 1
|
||||
|
||||
async def list(self, user_id: str) -> list[dict]:
|
||||
async with get_async_db() as db:
|
||||
rows = (
|
||||
await db.execute(
|
||||
select(AuthSession)
|
||||
.where(
|
||||
AuthSession.user_id == user_id,
|
||||
AuthSession.refresh_token_id.is_not(None),
|
||||
AuthSession.expires_at > int(time.time()),
|
||||
)
|
||||
.order_by(AuthSession.created_at.desc())
|
||||
)
|
||||
).scalars()
|
||||
return [
|
||||
{
|
||||
**{key: getattr(row, key) for key in ('id', 'created_at', 'updated_at', 'expires_at')},
|
||||
'name': row.data['name'],
|
||||
}
|
||||
for row in rows
|
||||
]
|
||||
|
||||
|
||||
AuthSessions = AuthSessionsTable()
|
||||
|
|
@ -613,6 +613,33 @@ class ChannelTable:
|
|||
memberships = result.scalars().all()
|
||||
return [ChannelMemberModel.model_validate(membership) for membership in memberships]
|
||||
|
||||
async def get_members_by_user_id_and_channel_ids(
|
||||
self, user_id: str, channel_ids: list[str], db: Optional[AsyncSession] = None
|
||||
) -> dict[str, ChannelMemberModel]:
|
||||
async with get_async_db_context(db) as db:
|
||||
result = await db.execute(
|
||||
select(ChannelMember).filter(
|
||||
ChannelMember.channel_id.in_(channel_ids),
|
||||
ChannelMember.user_id == user_id,
|
||||
)
|
||||
)
|
||||
return {
|
||||
membership.channel_id: ChannelMemberModel.model_validate(membership)
|
||||
for membership in result.scalars().all()
|
||||
}
|
||||
|
||||
async def get_members_by_channel_ids(
|
||||
self, channel_ids: list[str], db: Optional[AsyncSession] = None
|
||||
) -> list[ChannelMemberModel]:
|
||||
async with get_async_db_context(db) as db:
|
||||
result = await db.execute(
|
||||
select(ChannelMember).filter(
|
||||
ChannelMember.channel_id.in_(channel_ids), ChannelMember.user_id.is_not(None)
|
||||
)
|
||||
)
|
||||
memberships = result.scalars().all()
|
||||
return [ChannelMemberModel.model_validate(membership) for membership in memberships]
|
||||
|
||||
async def pin_channel(
|
||||
self,
|
||||
channel_id: str,
|
||||
|
|
|
|||
|
|
@ -1308,7 +1308,7 @@ class ChatTable:
|
|||
async def insert_chat_turn(self, chat_id, user, user_message, message_ids):
|
||||
from fastapi import HTTPException
|
||||
|
||||
if not await self.get_accessible_chat_by_id(chat_id, user, permission='write'):
|
||||
if not await self.has_chat_access(chat_id, user, permission='write'):
|
||||
raise HTTPException(403, 'Chat continuation is not allowed.')
|
||||
async with self._chat_transaction(chat_id) as (db, chat):
|
||||
if not chat:
|
||||
|
|
@ -1997,15 +1997,34 @@ class ChatTable:
|
|||
if user.role not in {'user', 'admin'}:
|
||||
return None
|
||||
chat = chat if chat is not None else await self.get_chat_by_id(id, db=db)
|
||||
if chat and await self.has_chat_access(id, user, db=db, permission=permission, chat=chat):
|
||||
return ChatModel.model_validate(chat)
|
||||
return None
|
||||
|
||||
async def has_chat_access(
|
||||
self,
|
||||
id: str,
|
||||
user,
|
||||
db: AsyncSession | None = None,
|
||||
*,
|
||||
permission: Literal['read', 'write'] = 'read',
|
||||
chat: Chat | ChatModel | None = None,
|
||||
) -> bool:
|
||||
if user.role not in {'user', 'admin'}:
|
||||
return False
|
||||
if chat is None:
|
||||
async with get_async_db_context(db) as session:
|
||||
result = await session.execute(select(Chat.user_id, Chat.meta, Chat.folder_id).filter_by(id=id))
|
||||
chat = result.first()
|
||||
if not chat:
|
||||
return None
|
||||
return False
|
||||
if (
|
||||
chat.user_id == user.id
|
||||
or user.role == 'admin'
|
||||
and permission == 'read'
|
||||
and (ENABLE_ADMIN_CHAT_ACCESS or is_internal_chat(chat.meta))
|
||||
):
|
||||
return ChatModel.model_validate(chat)
|
||||
return True
|
||||
from open_webui.models.shared_chats import SharedChats
|
||||
|
||||
shared = await SharedChats.get_by_chat_id(id, db=db)
|
||||
|
|
@ -2016,7 +2035,7 @@ class ChatTable:
|
|||
user_id=user.id, resource_type='shared_chat', resource_id=id, permission='read', db=db
|
||||
)
|
||||
):
|
||||
return ChatModel.model_validate(chat)
|
||||
return True
|
||||
if chat.folder_id:
|
||||
from open_webui.utils.access_control.folders import has_folder_access
|
||||
|
||||
|
|
@ -2026,8 +2045,8 @@ class ChatTable:
|
|||
and (permission == 'read' or (folder.data or {}).get('share_mode') == 'continue')
|
||||
and await has_folder_access(user.id, folder, 'read', db)
|
||||
):
|
||||
return ChatModel.model_validate(chat)
|
||||
return None
|
||||
return True
|
||||
return False
|
||||
|
||||
async def filter_task_ids_by_user_id(self, chat, user_id: str, task_ids: list[str]) -> list[str]:
|
||||
if not task_ids:
|
||||
|
|
|
|||
|
|
@ -412,14 +412,11 @@ class MessageTable:
|
|||
)
|
||||
all_messages = result.scalars().all()
|
||||
|
||||
reply_to_messages = await self._get_reply_to_messages(all_messages, db)
|
||||
|
||||
messages = []
|
||||
for message in all_messages:
|
||||
reply_to_message = (
|
||||
await self.get_message_by_id(message.reply_to_id, include_thread_replies=False, db=db)
|
||||
if message.reply_to_id
|
||||
else None
|
||||
)
|
||||
|
||||
reply_to_message = reply_to_messages.get(message.reply_to_id)
|
||||
user_info = await self._resolve_user_info(message, db)
|
||||
|
||||
messages.append(
|
||||
|
|
@ -427,12 +424,33 @@ class MessageTable:
|
|||
{
|
||||
**MessageModel.model_validate(message).model_dump(),
|
||||
'user': user_info,
|
||||
'reply_to_message': (reply_to_message.model_dump() if reply_to_message else None),
|
||||
'reply_to_message': reply_to_message,
|
||||
}
|
||||
)
|
||||
)
|
||||
return messages
|
||||
|
||||
async def _get_reply_to_messages(self, messages: list[Message], db: AsyncSession) -> dict[str, dict]:
|
||||
"""Fetch every reply target of the given messages in a fixed number of queries, keyed by message id."""
|
||||
reply_to_ids = {message.reply_to_id for message in messages if message.reply_to_id}
|
||||
if not reply_to_ids:
|
||||
return {}
|
||||
|
||||
result = await db.execute(select(Message).filter(Message.id.in_(reply_to_ids)))
|
||||
targets = {message.id: message for message in result.scalars().all()}
|
||||
|
||||
user_infos = {target_id: await self._resolve_user_info(target, db) for target_id, target in targets.items()}
|
||||
author_ids = [target.user_id for target_id, target in targets.items() if user_infos[target_id] is None]
|
||||
authors = {user.id: user for user in await Users.get_users_by_user_ids(author_ids, db=db)}
|
||||
|
||||
reply_to_messages = {}
|
||||
for target_id, target in targets.items():
|
||||
user_info = user_infos[target_id]
|
||||
if user_info is None and target.user_id in authors:
|
||||
user_info = authors[target.user_id].model_dump()
|
||||
reply_to_messages[target_id] = {**MessageModel.model_validate(target).model_dump(), 'user': user_info}
|
||||
return reply_to_messages
|
||||
|
||||
async def get_messages_by_parent_id(
|
||||
self,
|
||||
channel_id: str,
|
||||
|
|
@ -513,15 +531,36 @@ class MessageTable:
|
|||
)
|
||||
return messages
|
||||
|
||||
async def get_last_message_by_channel_id(
|
||||
self, channel_id: str, db: Optional[AsyncSession] = None
|
||||
) -> Optional[MessageModel]:
|
||||
async def get_last_message_times_by_channel_ids(
|
||||
self, channel_ids: list[str], db: Optional[AsyncSession] = None
|
||||
) -> dict[str, int]:
|
||||
async with get_async_db_context(db) as db:
|
||||
result = await db.execute(
|
||||
select(Message).filter_by(channel_id=channel_id).order_by(Message.created_at.desc()).limit(1)
|
||||
select(Message.channel_id, func.max(Message.created_at))
|
||||
.filter(Message.channel_id.in_(channel_ids))
|
||||
.group_by(Message.channel_id)
|
||||
)
|
||||
message = result.scalars().first()
|
||||
return MessageModel.model_validate(message) if message else None
|
||||
return dict(result.all())
|
||||
|
||||
async def get_unread_message_counts_by_user_id(
|
||||
self, user_id: str, channel_ids: list[str], db: Optional[AsyncSession] = None
|
||||
) -> dict[str, int]:
|
||||
async with get_async_db_context(db) as db:
|
||||
result = await db.execute(
|
||||
select(Message.channel_id, func.count(Message.id))
|
||||
.join(
|
||||
ChannelMember,
|
||||
and_(ChannelMember.channel_id == Message.channel_id, ChannelMember.user_id == user_id),
|
||||
)
|
||||
.filter(
|
||||
Message.channel_id.in_(channel_ids),
|
||||
Message.parent_id == None, # only count top-level messages
|
||||
Message.created_at > func.coalesce(ChannelMember.last_read_at, 0),
|
||||
or_(Message.user_id != user_id, Message.user_id.is_(None)),
|
||||
)
|
||||
.group_by(Message.channel_id)
|
||||
)
|
||||
return dict(result.all())
|
||||
|
||||
async def get_pinned_messages_by_channel_id(
|
||||
self,
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ from open_webui.models.access_grants import AccessGrant, AccessGrantModel, Acces
|
|||
from open_webui.models.groups import Groups
|
||||
from open_webui.models.model_history import ModelHistories, ModelHistory, model_snapshot
|
||||
from open_webui.models.users import User, UserModel, UserResponse, Users
|
||||
from open_webui.utils.chat_variables import is_nested_too_deep
|
||||
from open_webui.utils.misc import json_text_variants
|
||||
from open_webui.utils.validate import validate_image_url
|
||||
from pydantic import BaseModel, ConfigDict, Field, JsonValue, ValidationInfo, field_validator, model_validator
|
||||
|
|
@ -279,6 +280,8 @@ class ModelsTable:
|
|||
async def _write_model(self, session, form, user_id, current=None, production_version_id=None):
|
||||
"""Write configuration, history, and grants in the caller's transaction."""
|
||||
data = form.model_dump(exclude={'access_grants', 'commit_message'})
|
||||
if is_nested_too_deep(data['meta']) or is_nested_too_deep(data['params']):
|
||||
raise HTTPException(400, 'Model meta and params are nested too deeply')
|
||||
data['meta'].pop('chat_variables_schema', None)
|
||||
snapshot = model_snapshot(data)
|
||||
if current is None:
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import asyncio
|
|||
import logging
|
||||
import re
|
||||
import time
|
||||
from itertools import zip_longest
|
||||
from typing import Any, Optional
|
||||
|
||||
from open_webui.models.config import Config
|
||||
|
|
@ -325,42 +326,26 @@ async def retrieve_external_knowledge_for_connection(
|
|||
chunks = []
|
||||
provider = (connection.get('provider') or '').lower()
|
||||
|
||||
for query in queries:
|
||||
if provider == 'qdrant':
|
||||
chunks.extend(
|
||||
await _retrieve_qdrant(
|
||||
connection,
|
||||
auth_config,
|
||||
knowledge,
|
||||
query,
|
||||
count,
|
||||
getattr(request.app.state, 'EMBEDDING_FUNCTION', None),
|
||||
)
|
||||
)
|
||||
elif provider == 'milvus':
|
||||
chunks.extend(
|
||||
await _retrieve_milvus(
|
||||
connection,
|
||||
auth_config,
|
||||
knowledge,
|
||||
query,
|
||||
count,
|
||||
getattr(request.app.state, 'EMBEDDING_FUNCTION', None),
|
||||
)
|
||||
)
|
||||
elif provider == 'pgvector':
|
||||
chunks.extend(
|
||||
await _retrieve_pgvector(
|
||||
connection,
|
||||
auth_config,
|
||||
knowledge,
|
||||
query,
|
||||
count,
|
||||
getattr(request.app.state, 'EMBEDDING_FUNCTION', None),
|
||||
)
|
||||
)
|
||||
else:
|
||||
raise RuntimeError(f'Unsupported external knowledge provider: {connection.get("provider")}')
|
||||
retrieve = {
|
||||
'qdrant': _retrieve_qdrant,
|
||||
'milvus': _retrieve_milvus,
|
||||
'pgvector': _retrieve_pgvector,
|
||||
}.get(provider)
|
||||
if not retrieve:
|
||||
raise RuntimeError(f'Unsupported external knowledge provider: {connection.get("provider")}')
|
||||
|
||||
embedding_function = getattr(request.app.state, 'EMBEDDING_FUNCTION', None)
|
||||
query_chunks = await asyncio.gather(
|
||||
*(retrieve(connection, auth_config, knowledge, query, count, embedding_function) for query in queries)
|
||||
)
|
||||
|
||||
# Score direction differs per provider and metric, so merge by rank
|
||||
seen_contents = set()
|
||||
for chunks_at_rank in zip_longest(*query_chunks):
|
||||
for chunk in chunks_at_rank:
|
||||
if chunk and chunk['content'] not in seen_contents:
|
||||
seen_contents.add(chunk['content'])
|
||||
chunks.append(chunk)
|
||||
|
||||
chunks = chunks[:count]
|
||||
log.info(
|
||||
|
|
|
|||
|
|
@ -69,6 +69,8 @@ class MinerULoader:
|
|||
try:
|
||||
if self.api_mode == 'cloud':
|
||||
return self._load_cloud_api()
|
||||
elif self._is_tasks_api():
|
||||
return self._load_tasks_api()
|
||||
elif self._is_v1_api():
|
||||
return self._load_v1_api()
|
||||
else:
|
||||
|
|
@ -192,6 +194,13 @@ class MinerULoader:
|
|||
except requests.RequestException:
|
||||
return False
|
||||
|
||||
def _is_tasks_api(self) -> bool:
|
||||
"""Detect MinerU 4.1, whose Tasks API replaced the upload and parse job routes of 4.0."""
|
||||
try:
|
||||
return 'task_output_formats' in requests.get(f'{self.api_url}/v1/health', timeout=10).json()['features']
|
||||
except (requests.RequestException, ValueError, KeyError):
|
||||
return False
|
||||
|
||||
def _load_v1_api(self) -> List[Document]:
|
||||
"""
|
||||
Load document using the MinerU 4.x V1 API (asynchronous).
|
||||
|
|
@ -269,16 +278,75 @@ class MinerULoader:
|
|||
|
||||
return [Document(page_content=markdown_content, metadata=metadata)]
|
||||
|
||||
def _request_v1_api(self, method: str, path: str, **kwargs) -> requests.Response:
|
||||
def _load_tasks_api(self) -> List[Document]:
|
||||
"""Load document using the MinerU 4.1 Tasks API (asynchronous)."""
|
||||
log.info('Using MinerU Tasks API at %s', self.api_url)
|
||||
|
||||
filename = os.path.basename(self.file_path)
|
||||
|
||||
file_entry = {'file_name': filename, 'bytes': os.path.getsize(self.file_path)}
|
||||
if self.page_ranges and filename.lower().endswith('.pdf'):
|
||||
file_entry['page_range'] = self.page_ranges
|
||||
|
||||
task = self._request_v1_api(
|
||||
'POST',
|
||||
'/v1/tasks',
|
||||
json={
|
||||
'files': [file_entry],
|
||||
'tier': self.tier,
|
||||
'ocr_mode': 'ocr' if self.enable_ocr else 'auto',
|
||||
},
|
||||
).json()
|
||||
|
||||
upload = task['files'][0]['upload']
|
||||
with open(self.file_path, 'rb') as f:
|
||||
self._request_v1_api('PUT', upload['url'], headers=upload['headers'], data=f)
|
||||
|
||||
log.info('Polling MinerU task: %s', task['task_id'])
|
||||
deadline = time.monotonic() + self.timeout if self.timeout else None
|
||||
while True:
|
||||
task = self._request_v1_api('GET', f'/v1/tasks/{task["task_id"]}').json()
|
||||
if task['status'] not in ['waiting-file', 'pending', 'running']:
|
||||
break
|
||||
if deadline and time.monotonic() > deadline:
|
||||
raise HTTPException(
|
||||
status.HTTP_504_GATEWAY_TIMEOUT,
|
||||
detail=f'MinerU processing timed out after {self.timeout} seconds',
|
||||
)
|
||||
time.sleep(2)
|
||||
|
||||
file_result = task['files'][0]
|
||||
if task['status'] != 'completed':
|
||||
error = file_result.get('error') or task.get('error') or {}
|
||||
raise HTTPException(
|
||||
status.HTTP_400_BAD_REQUEST,
|
||||
detail=f'MinerU processing {task["status"]}: {error.get("message", "Unknown error")}',
|
||||
)
|
||||
|
||||
markdown_content = self._download_and_extract_zip(file_result['result_url'], filename)
|
||||
|
||||
log.info('Successfully parsed document with MinerU Tasks API: %s', filename)
|
||||
|
||||
metadata = {
|
||||
'source': filename,
|
||||
'api_mode': 'local',
|
||||
'tier': file_result['parse']['tier'],
|
||||
'version': file_result['parse'].get('parser_version', 'unknown'),
|
||||
}
|
||||
|
||||
return [Document(page_content=markdown_content, metadata=metadata)]
|
||||
|
||||
def _request_v1_api(self, method: str, path: str, headers: Optional[dict] = None, **kwargs) -> requests.Response:
|
||||
"""
|
||||
Send one request to the MinerU V1 API and raise an HTTPException on failure.
|
||||
"""
|
||||
url = path if path.startswith('http') else f'{self.api_url}{path}'
|
||||
# A 4.x server started with --api-key rejects every V1 request without it
|
||||
headers = {'Authorization': f'Bearer {self.api_key}'} if self.api_key else None
|
||||
# The key stays off storage URLs returned by the server
|
||||
if self.api_key and url.startswith(f'{self.api_url}/'):
|
||||
headers = {**(headers or {}), 'Authorization': f'Bearer {self.api_key}'}
|
||||
try:
|
||||
response = requests.request(
|
||||
method, f'{self.api_url}{path}', headers=headers, timeout=self.timeout, **kwargs
|
||||
)
|
||||
response = requests.request(method, url, headers=headers, timeout=self.timeout, **kwargs)
|
||||
response.raise_for_status()
|
||||
except requests.Timeout:
|
||||
raise HTTPException(
|
||||
|
|
@ -546,7 +614,12 @@ class MinerULoader:
|
|||
log.info('Downloading results from: %s', zip_url)
|
||||
|
||||
try:
|
||||
response = requests.get(zip_url, timeout=60)
|
||||
headers = (
|
||||
{'Authorization': f'Bearer {self.api_key}'}
|
||||
if self.api_key and zip_url.startswith(f'{self.api_url}/')
|
||||
else None
|
||||
)
|
||||
response = requests.get(zip_url, headers=headers, timeout=60)
|
||||
response.raise_for_status()
|
||||
except requests.HTTPError as e:
|
||||
raise HTTPException(
|
||||
|
|
|
|||
|
|
@ -36,7 +36,6 @@ class ExternalReranker(BaseReranker):
|
|||
|
||||
try:
|
||||
log.info('ExternalReranker:predict:model %s', self.model)
|
||||
log.info('ExternalReranker:predict:query %s', query)
|
||||
|
||||
headers = {
|
||||
'Content-Type': 'application/json',
|
||||
|
|
@ -65,5 +64,5 @@ class ExternalReranker(BaseReranker):
|
|||
return None
|
||||
|
||||
except Exception as e:
|
||||
log.exception(f'Error in external reranking: {e}')
|
||||
log.error('Error in external reranking: %s', type(e).__name__)
|
||||
return None
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ def search_exa(
|
|||
filter_list (list[str] | None): List of domains to filter results by
|
||||
max_content_length (int | None): Maximum characters per result; None leaves text unlimited.
|
||||
"""
|
||||
log.info('Searching with Exa for query: %s', query)
|
||||
log.info('Searching with Exa')
|
||||
|
||||
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ def search_ollama_cloud(
|
|||
count (int): Number of results to return
|
||||
filter_list (Optional[list[str]]): List of domains to filter results by
|
||||
"""
|
||||
log.info('Searching with Ollama for query: %s', query)
|
||||
log.info('Searching with Ollama')
|
||||
|
||||
headers = {'Authorization': f'Bearer {api_key}', 'Content-Type': 'application/json'}
|
||||
payload = {'query': query, 'max_results': count}
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ import uuid
|
|||
from ssl import CERT_NONE, CERT_REQUIRED, PROTOCOL_TLS
|
||||
|
||||
import jwt
|
||||
from aiohttp import BasicAuth, ClientSession
|
||||
from aiohttp import ClientSession, encode_basic_auth
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request, status
|
||||
from fastapi.responses import JSONResponse, Response
|
||||
from ldap3 import NONE, Connection, Server, Tls
|
||||
|
|
@ -87,7 +87,10 @@ from pydantic import BaseModel, Field, StrictStr, field_validator
|
|||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from open_webui.routers import sessions
|
||||
|
||||
router = APIRouter(route_class=MfaRoute)
|
||||
router.include_router(sessions.router, prefix='/sessions')
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
@ -918,6 +921,9 @@ async def signout(request: Request, response: Response, db: AsyncSession = Depen
|
|||
data = decode_token(token)
|
||||
if data and data.get('id'):
|
||||
actor = await Users.get_user_by_id(data['id'], db=db)
|
||||
if data and data.get('typ', 'session') == 'session' and data.get('sid') and data.get('id'):
|
||||
from open_webui.models.auth_sessions import AuthSessions
|
||||
await AuthSessions.revoke(data['sid'], data['id'])
|
||||
await invalidate_token(request, token)
|
||||
await publish_event(
|
||||
request,
|
||||
|
|
@ -1571,7 +1577,9 @@ async def get_token_client_id(client, token: str) -> str | None:
|
|||
async with session.post(
|
||||
introspection_endpoint,
|
||||
data={'token': token, 'token_type_hint': 'access_token'},
|
||||
auth=BasicAuth(client.client_id, client.client_secret or ''),
|
||||
headers={
|
||||
'Authorization': encode_basic_auth(client.client_id, client.client_secret or '', encoding='latin1')
|
||||
},
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
) as r:
|
||||
if r.status != 200:
|
||||
|
|
|
|||
|
|
@ -193,40 +193,46 @@ async def get_channels(
|
|||
await check_channels_access(request, user)
|
||||
|
||||
channels = await Channels.get_channels_by_user_id(user.id, db=db)
|
||||
channel_ids = [channel.id for channel in channels]
|
||||
dm_channel_ids = [channel.id for channel in channels if channel.type == 'dm']
|
||||
|
||||
channel_members = await Channels.get_members_by_user_id_and_channel_ids(user.id, channel_ids, db=db)
|
||||
last_message_times = await Messages.get_last_message_times_by_channel_ids(channel_ids, db=db)
|
||||
unread_counts = await Messages.get_unread_message_counts_by_user_id(user.id, channel_ids, db=db)
|
||||
|
||||
dm_member_user_ids = {channel_id: set() for channel_id in dm_channel_ids}
|
||||
for member in await Channels.get_members_by_channel_ids(dm_channel_ids, db=db):
|
||||
dm_member_user_ids[member.channel_id].add(member.user_id)
|
||||
all_dm_users = await Users.get_users_by_user_ids(
|
||||
list({user_id for user_ids in dm_member_user_ids.values() for user_id in user_ids}), db=db
|
||||
)
|
||||
|
||||
channel_list = []
|
||||
for channel in channels:
|
||||
last_message = await Messages.get_last_message_by_channel_id(channel.id, db=db)
|
||||
last_message_at = last_message.created_at if last_message else None
|
||||
|
||||
channel_member = await Channels.get_member_by_channel_and_user_id(channel.id, user.id, db=db)
|
||||
unread_count = (
|
||||
await Messages.get_unread_message_count(channel.id, user.id, channel_member.last_read_at, db=db)
|
||||
if channel_member
|
||||
else 0
|
||||
)
|
||||
channel_member = channel_members.get(channel.id)
|
||||
|
||||
user_ids = None
|
||||
users = None
|
||||
if channel.type == 'dm':
|
||||
member_user_ids = [member.user_id for member in await Channels.get_members_by_channel_id(channel.id, db=db)]
|
||||
users = [
|
||||
UserIdNameStatusResponse(
|
||||
**{
|
||||
**u.model_dump(),
|
||||
'is_active': Users.is_active(u),
|
||||
**dm_user.model_dump(),
|
||||
'is_active': Users.is_active(dm_user),
|
||||
}
|
||||
)
|
||||
for u in await Users.get_users_by_user_ids(member_user_ids, db=db)
|
||||
for dm_user in all_dm_users
|
||||
if dm_user.id in dm_member_user_ids[channel.id]
|
||||
]
|
||||
user_ids = [u.id for u in users]
|
||||
user_ids = [dm_user.id for dm_user in users]
|
||||
|
||||
channel_list.append(
|
||||
ChannelListItemResponse(
|
||||
**channel.model_dump(),
|
||||
user_ids=user_ids,
|
||||
users=users,
|
||||
last_message_at=last_message_at,
|
||||
unread_count=unread_count,
|
||||
last_message_at=last_message_times.get(channel.id),
|
||||
unread_count=unread_counts.get(channel.id, 0) if channel_member else 0,
|
||||
is_channel_muted=channel_member.is_channel_muted if channel_member else False,
|
||||
)
|
||||
)
|
||||
|
|
@ -1109,6 +1115,17 @@ async def send_notification(request, channel, message, active_user_ids, db=None)
|
|||
member = members.get(u.id)
|
||||
if member and member.is_channel_muted and u.id not in mentioned_user_ids:
|
||||
continue
|
||||
if member and u.id != message.user_id:
|
||||
from open_webui.utils.tether import notify
|
||||
from urllib.parse import quote
|
||||
|
||||
try:
|
||||
await notify(
|
||||
u.id, f'channel:{channel.id}:{message.id}', f'{channel.name} / Open WebUI',
|
||||
message.content, '/channels/' + quote(channel.id, safe=''),
|
||||
)
|
||||
except Exception:
|
||||
log.exception('Tether channel notification failed')
|
||||
if (u.id not in active_user_ids) and member:
|
||||
if enable_user_webhooks and u.settings:
|
||||
await publish_event(
|
||||
|
|
|
|||
|
|
@ -1215,7 +1215,7 @@ async def get_shared_chat_by_id(
|
|||
live = (
|
||||
shared.chat.get('share_mode') == 'continue'
|
||||
and user is not None
|
||||
and await Chats.get_accessible_chat_by_id(shared.chat_id, user, db=db, permission='write') is not None
|
||||
and await Chats.has_chat_access(shared.chat_id, user, db=db, permission='write')
|
||||
)
|
||||
chat = (
|
||||
await Chats.get_chat_by_id(shared.chat_id, db=db)
|
||||
|
|
@ -1239,9 +1239,7 @@ async def get_shared_chat_by_id(
|
|||
if chat:
|
||||
data = await shared_chat_response(chat, user, db=db)
|
||||
data['chat']['share_mode'] = (
|
||||
'continue'
|
||||
if await Chats.get_accessible_chat_by_id(chat.id, user, db=db, permission='write', chat=chat)
|
||||
else None
|
||||
'continue' if await Chats.has_chat_access(chat.id, user, db=db, permission='write', chat=chat) else None
|
||||
)
|
||||
return data
|
||||
|
||||
|
|
@ -1347,9 +1345,7 @@ async def get_chat_by_id(
|
|||
if chat:
|
||||
data = await shared_chat_response(chat, user, db=db)
|
||||
data['chat']['share_mode'] = (
|
||||
'continue'
|
||||
if await Chats.get_accessible_chat_by_id(id, user, db=db, permission='write', chat=chat)
|
||||
else None
|
||||
'continue' if await Chats.has_chat_access(id, user, db=db, permission='write', chat=chat) else None
|
||||
)
|
||||
data = overlay_response_streams(
|
||||
data,
|
||||
|
|
|
|||
|
|
@ -385,7 +385,7 @@ async def verify_terminal_server_connection(
|
|||
raise HTTPException(status_code=400, detail='Terminal server URL is required')
|
||||
|
||||
headers = {}
|
||||
if form_data.auth_type == 'bearer' and form_data.key:
|
||||
if form_data.auth_type in ('bearer', 'session') and form_data.key:
|
||||
headers.update(bearer_auth_header(form_data.key))
|
||||
|
||||
try:
|
||||
|
|
@ -458,7 +458,7 @@ async def put_terminal_server_policy(
|
|||
raise HTTPException(status_code=400, detail='Terminal server URL is required')
|
||||
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
if form_data.auth_type == 'bearer' and form_data.key:
|
||||
if form_data.auth_type in ('bearer', 'session') and form_data.key:
|
||||
headers.update(bearer_auth_header(form_data.key))
|
||||
|
||||
try:
|
||||
|
|
@ -498,7 +498,7 @@ async def put_terminal_server_lifecycle(
|
|||
raise HTTPException(status_code=400, detail='Terminal server URL is required')
|
||||
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
if form_data.auth_type == 'bearer' and form_data.key:
|
||||
if form_data.auth_type in ('bearer', 'session') and form_data.key:
|
||||
headers.update(bearer_auth_header(form_data.key))
|
||||
|
||||
try:
|
||||
|
|
@ -540,7 +540,7 @@ async def refresh_terminal_server_terminals(
|
|||
raise HTTPException(status_code=400, detail='Terminal server URL is required')
|
||||
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
if form_data.auth_type == 'bearer' and form_data.key:
|
||||
if form_data.auth_type in ('bearer', 'session') and form_data.key:
|
||||
headers.update(bearer_auth_header(form_data.key))
|
||||
|
||||
body = {
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ async def set_image_model(request: Request, model: str):
|
|||
async def get_image_model(request):
|
||||
image_config = await get_image_config()
|
||||
if image_config.IMAGE_GENERATION_ENGINE == 'openai':
|
||||
return image_config.IMAGE_GENERATION_MODEL if image_config.IMAGE_GENERATION_MODEL else 'dall-e-2'
|
||||
return image_config.IMAGE_GENERATION_MODEL if image_config.IMAGE_GENERATION_MODEL else 'gpt-image-2'
|
||||
elif image_config.IMAGE_GENERATION_ENGINE == 'gemini':
|
||||
return image_config.IMAGE_GENERATION_MODEL if image_config.IMAGE_GENERATION_MODEL else 'imagen-3.0-generate-002'
|
||||
elif image_config.IMAGE_GENERATION_ENGINE == 'comfyui':
|
||||
|
|
@ -366,10 +366,9 @@ async def get_models(request: Request, user=Depends(get_verified_user)):
|
|||
try:
|
||||
if image_config.IMAGE_GENERATION_ENGINE == 'openai':
|
||||
return [
|
||||
{'id': 'dall-e-2', 'name': 'DALL·E 2'},
|
||||
{'id': 'dall-e-3', 'name': 'DALL·E 3'},
|
||||
{'id': 'gpt-image-1', 'name': 'GPT-IMAGE 1'},
|
||||
{'id': 'gpt-image-1.5', 'name': 'GPT-IMAGE 1.5'},
|
||||
{'id': 'gpt-image-2', 'name': 'GPT-IMAGE 2'},
|
||||
]
|
||||
elif image_config.IMAGE_GENERATION_ENGINE == 'gemini':
|
||||
return [
|
||||
|
|
|
|||
|
|
@ -1559,8 +1559,14 @@ async def generate_chat_completion(
|
|||
if not is_responses and 'messages' in payload:
|
||||
for message in payload['messages']:
|
||||
if message.get('role') == 'tool' and isinstance(message.get('content'), list):
|
||||
message['content'] = ''.join(
|
||||
part.get('text', '') for part in message['content'] if part.get('type') in ('input_text', 'text')
|
||||
parts = message['content']
|
||||
text = ''.join(part.get('text', '') for part in parts if part.get('type') in ('input_text', 'text'))
|
||||
cache_control = next(
|
||||
(part['cache_control'] for part in reversed(parts) if part.get('cache_control')), None
|
||||
)
|
||||
# Prompt-cache markers only work on a content block, so keep the text as one
|
||||
message['content'] = (
|
||||
[{'type': 'text', 'text': text, 'cache_control': cache_control}] if cache_control and text else text
|
||||
)
|
||||
|
||||
is_streaming_request = bool(payload.get('stream', False))
|
||||
|
|
|
|||
314
backend/open_webui/routers/sessions.py
Normal file
314
backend/open_webui/routers/sessions.py
Normal file
|
|
@ -0,0 +1,314 @@
|
|||
"""Persistent sessions for native clients, using existing human authentication."""
|
||||
|
||||
import base64
|
||||
import hashlib
|
||||
import hmac
|
||||
import time
|
||||
from datetime import timedelta
|
||||
from urllib.parse import urlencode, urlsplit, urlunsplit
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
import jwt
|
||||
from fastapi import APIRouter, Depends, HTTPException, Request
|
||||
from open_webui.models.auth_sessions import AuthSession, AuthSessions
|
||||
from open_webui.models.config import Config
|
||||
from open_webui.models.users import Users
|
||||
from open_webui.routers.mfa import MfaRoute
|
||||
from open_webui.utils.auth import (
|
||||
ALGORITHM,
|
||||
SESSION_SECRET,
|
||||
create_token,
|
||||
decode_token,
|
||||
get_human_user,
|
||||
is_valid_token,
|
||||
)
|
||||
from open_webui.utils.misc import parse_duration
|
||||
from open_webui.utils.rate_limit import RateLimiter
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
|
||||
router = APIRouter(route_class=MfaRoute)
|
||||
limiter = RateLimiter(limit=30, window=60)
|
||||
PROOF_KEYS = ('auth_time', 'auth_method', 'session_stamp', 'mfa_verified')
|
||||
|
||||
|
||||
class SessionForm(BaseModel):
|
||||
model_config = ConfigDict(extra='forbid', str_strip_whitespace=True)
|
||||
name: str = Field(min_length=1, max_length=100)
|
||||
|
||||
|
||||
class AuthorizationRequest(SessionForm):
|
||||
redirect_uri: str = Field(max_length=2048)
|
||||
state: str = Field(min_length=32, max_length=256, pattern=r'^[A-Za-z0-9_-]+$')
|
||||
code_challenge: str = Field(min_length=43, max_length=43, pattern=r'^[A-Za-z0-9_-]+$')
|
||||
|
||||
@field_validator('redirect_uri')
|
||||
@classmethod
|
||||
def loopback(cls, value):
|
||||
parsed = urlsplit(value)
|
||||
try:
|
||||
port = parsed.port
|
||||
except ValueError:
|
||||
raise ValueError('Invalid callback port') from None
|
||||
if (
|
||||
parsed.scheme != 'http'
|
||||
or parsed.hostname != '127.0.0.1'
|
||||
or not port
|
||||
or parsed.username
|
||||
or parsed.password
|
||||
or parsed.query
|
||||
or parsed.fragment
|
||||
):
|
||||
raise ValueError('A loopback callback is required')
|
||||
return value
|
||||
|
||||
|
||||
class ExchangeForm(BaseModel):
|
||||
session_id: UUID
|
||||
code: str = Field(max_length=8192)
|
||||
code_verifier: str = Field(min_length=43, max_length=128, pattern=r'^[A-Za-z0-9._~-]+$')
|
||||
redirect_uri: str = Field(max_length=2048)
|
||||
|
||||
|
||||
class RefreshForm(BaseModel):
|
||||
refresh_token: str = Field(max_length=8192)
|
||||
request_id: UUID | None = None
|
||||
|
||||
|
||||
def digest(value: str) -> str:
|
||||
return hashlib.sha256(value.encode()).hexdigest()
|
||||
|
||||
|
||||
def challenge(verifier: str) -> str:
|
||||
return base64.urlsafe_b64encode(hashlib.sha256(verifier.encode()).digest()).rstrip(b'=').decode()
|
||||
|
||||
|
||||
async def throttle(request):
|
||||
ip = request.client.host if request.client else 'unknown'
|
||||
if await limiter.is_limited(getattr(request.app.state, 'redis', None), 'sessions:' + digest(ip)):
|
||||
raise HTTPException(429, 'Too many login attempts. Try again shortly.')
|
||||
|
||||
|
||||
async def idle_expiry():
|
||||
duration = parse_duration(await Config.get('auth.session_expiry'))
|
||||
if duration is None or duration.total_seconds() < 1:
|
||||
raise ValueError('SESSION_EXPIRES_IN must be at least 1 second')
|
||||
return int(time.time()) + int(duration.total_seconds())
|
||||
|
||||
|
||||
async def verify_proof(claims, request):
|
||||
# Codes and refresh tokens are never passed to ordinary API authentication.
|
||||
proof = {key: claims.get(key) for key in PROOF_KEYS}
|
||||
user_id = claims.get('id')
|
||||
if not user_id or not isinstance(proof['auth_time'], int) or not proof['auth_method']:
|
||||
raise HTTPException(401, 'Sign in again.')
|
||||
if not await is_valid_token(
|
||||
{'id': user_id, 'typ': 'session', 'iat': claims.get('iat'), **proof}, getattr(request.app.state, 'redis', None)
|
||||
):
|
||||
raise HTTPException(401, 'Sign in again.')
|
||||
user = await Users.get_user_by_id(user_id)
|
||||
if not user or user.role not in ('user', 'admin'):
|
||||
raise HTTPException(403, 'Account approval is required.')
|
||||
return proof
|
||||
|
||||
|
||||
def credentials(row, proof, refresh_issued_at=None):
|
||||
now = int(time.time())
|
||||
access_expiry = min(now + 900, row.expires_at)
|
||||
access = create_token(
|
||||
{'id': row.user_id, 'sid': row.id, 'typ': 'session', **proof},
|
||||
timedelta(seconds=access_expiry - now),
|
||||
)
|
||||
refresh = jwt.encode(
|
||||
{
|
||||
'id': row.user_id,
|
||||
'sid': row.id,
|
||||
'typ': 'refresh',
|
||||
**proof,
|
||||
'jti': row.refresh_token_id,
|
||||
'iat': now if refresh_issued_at is None else refresh_issued_at,
|
||||
'exp': row.expires_at,
|
||||
},
|
||||
SESSION_SECRET,
|
||||
algorithm=ALGORITHM,
|
||||
)
|
||||
return {
|
||||
'session_id': row.id,
|
||||
'token': access,
|
||||
'token_type': 'Bearer',
|
||||
'expires_at': access_expiry,
|
||||
'refresh_token': refresh,
|
||||
'refresh_expires_at': row.expires_at,
|
||||
}
|
||||
|
||||
|
||||
@router.post('')
|
||||
async def create_session(form: SessionForm, request: Request, user=Depends(get_human_user)):
|
||||
await throttle(request)
|
||||
proof = await verify_proof(request.state.claims, request)
|
||||
row = await AuthSessions.create(
|
||||
user_id=user.id,
|
||||
data={'name': form.name},
|
||||
expires_at=await idle_expiry(),
|
||||
refresh_token_id=str(uuid4()),
|
||||
)
|
||||
return credentials(row, proof)
|
||||
|
||||
|
||||
@router.post('/requests')
|
||||
async def authorization_request(form: AuthorizationRequest, request: Request):
|
||||
await throttle(request)
|
||||
row = await AuthSessions.create(
|
||||
data={
|
||||
'name': form.name,
|
||||
'authorization': {
|
||||
'redirect_uri': form.redirect_uri,
|
||||
'state': form.state,
|
||||
'code_challenge': form.code_challenge,
|
||||
},
|
||||
},
|
||||
expires_at=int(time.time()) + 600,
|
||||
)
|
||||
return {'session_id': row.id}
|
||||
|
||||
|
||||
@router.post('/exchange')
|
||||
async def exchange(form: ExchangeForm, request: Request):
|
||||
await throttle(request)
|
||||
claims = decode_token(form.code)
|
||||
row = await AuthSessions.get(str(form.session_id))
|
||||
authorization = row.data.get('authorization', {}) if row else {}
|
||||
if (
|
||||
not claims
|
||||
or claims.get('typ') != 'session_code'
|
||||
or claims.get('sid') != str(form.session_id)
|
||||
or not row
|
||||
or row.refresh_token_id is not None
|
||||
or row.expires_at <= time.time()
|
||||
or claims.get('id') != row.user_id
|
||||
or not authorization.get('code_hash')
|
||||
or not hmac.compare_digest(authorization['code_hash'], digest(form.code))
|
||||
or authorization.get('redirect_uri') != form.redirect_uri
|
||||
or not hmac.compare_digest(authorization.get('code_challenge', ''), challenge(form.code_verifier))
|
||||
):
|
||||
raise HTTPException(401, 'Invalid or expired login code.')
|
||||
proof = await verify_proof(claims, request)
|
||||
values = dict(
|
||||
refresh_token_id=str(uuid4()),
|
||||
expires_at=await idle_expiry(),
|
||||
data={key: value for key, value in row.data.items() if key != 'authorization'},
|
||||
)
|
||||
if not await AuthSessions.change(
|
||||
row.id,
|
||||
[
|
||||
AuthSession.refresh_token_id.is_(None),
|
||||
AuthSession.user_id == row.user_id,
|
||||
AuthSession.data['authorization']['code_hash'].as_string() == authorization['code_hash'],
|
||||
AuthSession.expires_at > int(time.time()),
|
||||
],
|
||||
**values,
|
||||
):
|
||||
raise HTTPException(401, 'Login code has already been consumed.')
|
||||
return credentials(row.model_copy(update=values), proof)
|
||||
|
||||
|
||||
@router.post('/refresh')
|
||||
async def refresh(form: RefreshForm, request: Request):
|
||||
await throttle(request)
|
||||
claims = decode_token(form.refresh_token)
|
||||
if not claims or claims.get('typ') != 'refresh' or not claims.get('jti') or not claims.get('sid'):
|
||||
raise HTTPException(401, 'Invalid refresh token.')
|
||||
proof = await verify_proof(claims, request)
|
||||
session_id, token_id = claims['sid'], claims['jti']
|
||||
row = await AuthSessions.get(session_id)
|
||||
if not row or row.user_id != claims.get('id') or row.expires_at <= time.time():
|
||||
raise HTTPException(401, 'Session expired or revoked.')
|
||||
if row.refresh_token_id == token_id:
|
||||
issued_at = int(time.time())
|
||||
data = {key: value for key, value in row.data.items() if key != 'refresh_retry'}
|
||||
if form.request_id:
|
||||
data['refresh_retry'] = {
|
||||
'token_hash': digest(form.refresh_token),
|
||||
'request_hash': digest(str(form.request_id)),
|
||||
'issued_at': issued_at,
|
||||
}
|
||||
values = dict(refresh_token_id=str(uuid4()), expires_at=await idle_expiry(), data=data)
|
||||
if await AuthSessions.change(
|
||||
row.id,
|
||||
[
|
||||
AuthSession.user_id == claims['id'],
|
||||
AuthSession.refresh_token_id == token_id,
|
||||
AuthSession.expires_at > int(time.time()),
|
||||
],
|
||||
**values,
|
||||
):
|
||||
return credentials(row.model_copy(update=values), proof, issued_at)
|
||||
# Another worker may have completed the same request while we were rotating.
|
||||
row = await AuthSessions.get(session_id)
|
||||
|
||||
retry = row.data.get('refresh_retry', {}) if row else {}
|
||||
if (
|
||||
row
|
||||
and row.user_id == claims['id']
|
||||
and row.refresh_token_id is not None
|
||||
and row.expires_at > time.time()
|
||||
and form.request_id
|
||||
and hmac.compare_digest(retry.get('token_hash', ''), digest(form.refresh_token))
|
||||
and hmac.compare_digest(retry.get('request_hash', ''), digest(str(form.request_id)))
|
||||
):
|
||||
# Only the last rotation is recoverable; token verification still enforces its original expiry.
|
||||
return credentials(row, proof, retry['issued_at'])
|
||||
raise HTTPException(401, 'Invalid refresh token. Sign in again.')
|
||||
|
||||
|
||||
@router.get('')
|
||||
async def list_sessions(user=Depends(get_human_user)):
|
||||
return await AuthSessions.list(user.id)
|
||||
|
||||
|
||||
@router.get('/{session_id}/request')
|
||||
async def request_info(session_id: UUID, user=Depends(get_human_user)):
|
||||
row = await AuthSessions.get(str(session_id))
|
||||
if not row or row.refresh_token_id is not None or row.expires_at <= time.time():
|
||||
raise HTTPException(404, 'Login request expired.')
|
||||
return {'name': row.data['name'], 'expires_at': row.expires_at}
|
||||
|
||||
|
||||
@router.post('/{session_id}/authorize')
|
||||
async def authorize(session_id: UUID, request: Request, user=Depends(get_human_user)):
|
||||
await throttle(request)
|
||||
proof = await verify_proof(request.state.claims, request)
|
||||
row = await AuthSessions.get(str(session_id))
|
||||
authorization = row.data.get('authorization', {}) if row else {}
|
||||
if (
|
||||
not row
|
||||
or row.refresh_token_id is not None
|
||||
or row.user_id is not None
|
||||
or row.expires_at <= time.time()
|
||||
or not authorization
|
||||
or authorization.get('code_hash')
|
||||
):
|
||||
raise HTTPException(409, 'Login request expired or already authorized.')
|
||||
code = create_token({'typ': 'session_code', 'id': user.id, 'sid': row.id, **proof}, timedelta(seconds=60))
|
||||
if not await AuthSessions.change(
|
||||
row.id,
|
||||
[
|
||||
AuthSession.refresh_token_id.is_(None),
|
||||
AuthSession.user_id.is_(None),
|
||||
AuthSession.data['authorization']['code_hash'].as_string().is_(None),
|
||||
AuthSession.expires_at > int(time.time()),
|
||||
],
|
||||
user_id=user.id,
|
||||
data={**row.data, 'authorization': {**authorization, 'code_hash': digest(code)}},
|
||||
):
|
||||
raise HTTPException(409, 'Login request changed.')
|
||||
callback = urlsplit(authorization['redirect_uri'])
|
||||
return {
|
||||
'redirect_uri': urlunsplit(callback._replace(query=urlencode({'code': code, 'state': authorization['state']})))
|
||||
}
|
||||
|
||||
|
||||
@router.delete('/{session_id}')
|
||||
async def revoke(session_id: UUID, user=Depends(get_human_user)):
|
||||
if not await AuthSessions.revoke(str(session_id), user.id):
|
||||
raise HTTPException(404, 'Session not found.')
|
||||
return {'status': True}
|
||||
|
|
@ -419,7 +419,7 @@ async def generate_queries(request: Request, form_data: dict, user=Depends(get_v
|
|||
)
|
||||
|
||||
if getattr(request.state, 'cached_queries', None):
|
||||
log.info('Reusing cached queries: %s', request.state.cached_queries)
|
||||
log.info('Reusing cached queries')
|
||||
return request.state.cached_queries
|
||||
|
||||
if getattr(request.state, 'direct', False) and hasattr(request.state, 'model'):
|
||||
|
|
|
|||
|
|
@ -20,11 +20,11 @@ from fastapi.responses import JSONResponse, StreamingResponse
|
|||
from open_webui.config import TERMINAL_PROXY_HEADERS
|
||||
from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL, ENABLE_TOOL_SERVERS
|
||||
from open_webui.events import EVENTS, publish_event
|
||||
from open_webui.models.config import Config
|
||||
from open_webui.models.groups import Groups
|
||||
from open_webui.utils.access_control import has_connection_access
|
||||
from open_webui.utils.auth import get_verified_user, get_verified_user_by_token
|
||||
from open_webui.utils.browser import browser_access, browser_ticket
|
||||
from open_webui.utils.tether import RelayInterrupted, get_terminal_connections, get_terminal_client
|
||||
from open_webui.utils.headers import bearer_auth_header, normalize_bearer_token
|
||||
from open_webui.utils.json_codec import JSONCodec
|
||||
from open_webui.utils.terminals import (
|
||||
|
|
@ -195,7 +195,7 @@ async def watch_access(server_id, sid, ticket):
|
|||
while True:
|
||||
await asyncio.sleep(10)
|
||||
current_user, _ = await browser_access(server_id, sid, ticket)
|
||||
latest = await Config.get('terminal_server.connections', []) or []
|
||||
latest = await get_terminal_connections(current_user)
|
||||
current = next((c for c in latest if c.get('id') == server_id), None)
|
||||
if (
|
||||
not current
|
||||
|
|
@ -211,7 +211,7 @@ async def watch_access(server_id, sid, ticket):
|
|||
async def browser_ws(ws: WebSocket, server_id: str, sid: str, ticket: str, kind: str):
|
||||
try:
|
||||
user, data = await browser_access(server_id, sid, ticket)
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
connection = next((c for c in connections if c.get('id') == server_id), None)
|
||||
if (
|
||||
kind not in ('ws', 'stream', 'vnc')
|
||||
|
|
@ -239,7 +239,7 @@ async def browser_ws(ws: WebSocket, server_id: str, sid: str, ticket: str, kind:
|
|||
headers['Authorization'] = data['relay']['authorization']
|
||||
tasks = []
|
||||
try:
|
||||
async with aiohttp.ClientSession(cookies=data['relay'].get('cookies', {}), trust_env=True) as client:
|
||||
async with get_terminal_client(base, user.id, cookies=data['relay'].get('cookies', {}), trust_env=True) as client:
|
||||
async with client.ws_connect(
|
||||
url,
|
||||
headers=headers,
|
||||
|
|
@ -270,13 +270,13 @@ async def list_terminal_servers(request: Request, user=Depends(get_verified_user
|
|||
if not ENABLE_TOOL_SERVERS:
|
||||
return []
|
||||
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
user_group_ids = {group.id for group in await Groups.get_groups_by_member_id(user.id, include_inherited=True)}
|
||||
|
||||
return [
|
||||
{
|
||||
'id': connection.get('id', ''),
|
||||
'url': connection.get('url', ''),
|
||||
'url': '' if connection.get('owner_id') else connection.get('url', ''),
|
||||
'name': connection.get('name', ''),
|
||||
'contexts': terminal_contexts(connection),
|
||||
'config': {'chat_uploads': terminal_chat_uploads(connection)},
|
||||
|
|
@ -302,7 +302,7 @@ async def proxy_terminal(
|
|||
if not ENABLE_TOOL_SERVERS:
|
||||
return JSONResponse({'error': 'Tool servers are disabled'}, status_code=403)
|
||||
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
connection = next((c for c in connections if c.get('id') == server_id), None)
|
||||
|
||||
if connection is None:
|
||||
|
|
@ -392,13 +392,13 @@ async def proxy_terminal(
|
|||
if content_type:
|
||||
headers['Content-Type'] = content_type
|
||||
|
||||
session = aiohttp.ClientSession(
|
||||
session = get_terminal_client(base_url, user.id,
|
||||
timeout=aiohttp.ClientTimeout(total=300, connect=10),
|
||||
trust_env=True,
|
||||
)
|
||||
|
||||
try:
|
||||
body = await request.body()
|
||||
body = request.stream()
|
||||
|
||||
upstream_response = await session.request(
|
||||
method=request.method,
|
||||
|
|
@ -476,6 +476,9 @@ async def proxy_terminal(
|
|||
except ClientDisconnect:
|
||||
await session.close()
|
||||
return Response(status_code=499)
|
||||
except RelayInterrupted as error:
|
||||
await session.close()
|
||||
return JSONResponse(error.result(), status_code=502)
|
||||
except (aiohttp.ClientConnectionError, TimeoutError) as error:
|
||||
await session.close()
|
||||
log.error('Terminal proxy error: %s', str(error) or type(error).__name__)
|
||||
|
|
@ -517,6 +520,7 @@ async def _resolve_authenticated_connection(ws: WebSocket, server_id: str):
|
|||
if result is None:
|
||||
return None
|
||||
user, connection = result
|
||||
ws.scope['terminal_resume'] = {key: payload[key] for key in ('resume', 'cursor') if key in payload}
|
||||
chat_id = payload.get('chat_id', '')
|
||||
return user, connection, chat_id if isinstance(chat_id, str) else '', token
|
||||
|
||||
|
|
@ -537,11 +541,14 @@ async def _resolve_terminal_access(ws: WebSocket, server_id: str, token: str):
|
|||
return None
|
||||
|
||||
# Resolve terminal server
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
connection = next((c for c in connections if c.get('id') == server_id), None)
|
||||
|
||||
if connection is None:
|
||||
await ws.close(code=4004, reason='Terminal server not found')
|
||||
if server_id.startswith('tether:'):
|
||||
await ws.close(code=1013, reason='Tether is offline. Reconnecting.')
|
||||
else:
|
||||
await ws.close(code=4004, reason='Terminal server not found')
|
||||
return None
|
||||
|
||||
if not connection.get('enabled', True):
|
||||
|
|
@ -645,7 +652,7 @@ async def _proxy_terminal_websocket(
|
|||
|
||||
request = Request({**ws.scope, 'type': 'http', 'method': 'GET'})
|
||||
opened = False
|
||||
session = aiohttp.ClientSession()
|
||||
session = get_terminal_client(base_url, user.id)
|
||||
try:
|
||||
async with session.ws_connect(
|
||||
upstream_url,
|
||||
|
|
@ -658,11 +665,11 @@ async def _proxy_terminal_websocket(
|
|||
auth_type = connection.get('auth_type', 'bearer')
|
||||
if auth_type == 'bearer':
|
||||
key = normalize_bearer_token(connection.get('key', ''))
|
||||
await upstream.send_str(_json.dumps({'type': 'auth', 'token': key}))
|
||||
await upstream.send_str(_json.dumps({'type': 'auth', 'token': key, **ws.scope.get('terminal_resume', {})}))
|
||||
elif auth_type == 'session' and is_terminal_orchestrator(connection):
|
||||
await upstream.send_str(_json.dumps({'type': 'auth', 'token': token}))
|
||||
else:
|
||||
await upstream.send_str(_json.dumps({'type': 'auth', 'token': ''}))
|
||||
await upstream.send_str(_json.dumps({'type': 'auth', 'token': '', **ws.scope.get('terminal_resume', {})}))
|
||||
|
||||
if session_id is not None:
|
||||
await publish_event(
|
||||
|
|
@ -687,7 +694,8 @@ async def _proxy_terminal_websocket(
|
|||
elif 'text' in msg and msg['text']:
|
||||
await upstream.send_str(msg['text'])
|
||||
except Exception:
|
||||
pass
|
||||
with suppress(Exception):
|
||||
await ws.close(code=1011, reason='Terminal connection interrupted. Reconnecting.')
|
||||
|
||||
async def _upstream_to_client():
|
||||
"""Forward upstream → client."""
|
||||
|
|
@ -702,11 +710,11 @@ async def _proxy_terminal_websocket(
|
|||
aiohttp.WSMsgType.ERROR,
|
||||
):
|
||||
break
|
||||
if session_id is None:
|
||||
code = upstream.close_code or 1011
|
||||
await ws.close(code=1011 if code in (1005, 1006, 1015) else code)
|
||||
code = upstream.close_code or 1011
|
||||
await ws.close(code=1011 if code in (1005, 1006, 1015) else code)
|
||||
except Exception:
|
||||
pass
|
||||
with suppress(Exception):
|
||||
await ws.close(code=1011, reason='Terminal connection interrupted. Reconnecting.')
|
||||
|
||||
async def _watch_access():
|
||||
try:
|
||||
|
|
@ -717,6 +725,8 @@ async def _proxy_terminal_websocket(
|
|||
return
|
||||
except Exception:
|
||||
log.exception('Terminal access recheck failed')
|
||||
with suppress(Exception):
|
||||
await ws.close(code=1011, reason='Terminal access check unavailable. Reconnecting.')
|
||||
|
||||
# End the proxy as soon as any task finishes (e.g. a
|
||||
# graceful upstream CLOSE) and cancel the rest, which would
|
||||
|
|
@ -734,13 +744,10 @@ async def _proxy_terminal_websocket(
|
|||
await asyncio.gather(*tasks, return_exceptions=True)
|
||||
except Exception as e:
|
||||
log.exception('Terminal WebSocket proxy error: %s', e)
|
||||
if session_id is None:
|
||||
status = getattr(e, 'status', None)
|
||||
code = {401: 4001, 403: 4003, 404: 4004}.get(status, 1011)
|
||||
try:
|
||||
await ws.close(code=code)
|
||||
except Exception:
|
||||
pass
|
||||
status = getattr(e, 'status', getattr(e, 'status_code', None))
|
||||
code = {401: 4001, 403: 4003, 404: 4004}.get(status, 1011)
|
||||
with suppress(Exception):
|
||||
await ws.close(code=code)
|
||||
finally:
|
||||
await session.close()
|
||||
if opened:
|
||||
|
|
|
|||
175
backend/open_webui/routers/tether.py
Normal file
175
backend/open_webui/routers/tether.py
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
"""Authenticated outbound connections from Tether."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
from contextlib import suppress
|
||||
from types import SimpleNamespace
|
||||
from uuid import UUID, uuid4
|
||||
|
||||
from fastapi import APIRouter, WebSocket
|
||||
from open_webui.models.auth_sessions import AuthSessions
|
||||
from open_webui.utils.auth import decode_token, get_verified_user_by_token
|
||||
from open_webui.utils.tether import hub, encode, decode, get_services
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.websocket('/connect')
|
||||
async def connect(ws: WebSocket):
|
||||
await ws.accept()
|
||||
connection = None
|
||||
watcher = None
|
||||
try:
|
||||
hello = json.loads(await asyncio.wait_for(ws.receive_text(), 10))
|
||||
if hello.get('type') != 'hello' or hello.get('version') not in (1, 2):
|
||||
raise ValueError('Unsupported Tether handshake')
|
||||
token = hello.get('token', '')
|
||||
user = await get_verified_user_by_token(token, getattr(ws.app.state, 'redis', None))
|
||||
claims = decode_token(token)
|
||||
if not user or not claims or not claims.get('sid') or claims.get('typ') != 'session':
|
||||
raise ValueError('A renewable human session is required')
|
||||
row = await AuthSessions.get(claims['sid'])
|
||||
if not row or row.user_id != user.id or row.refresh_token_id is None:
|
||||
raise ValueError('Invalid session')
|
||||
connection_id = str(UUID(hello['connection_id']))
|
||||
name = hello.get('name')
|
||||
if not isinstance(name, str) or not 1 <= len(name.strip()) <= 100:
|
||||
raise ValueError('A connection name of 1–100 characters is required')
|
||||
await hub.start()
|
||||
presence = {
|
||||
'connection': str(uuid4()),
|
||||
'worker': hub.worker,
|
||||
'session': row.id,
|
||||
'user': user.id,
|
||||
'connection_id': connection_id,
|
||||
'name': name.strip(),
|
||||
'notifications': hello.get('notifications') is True,
|
||||
'services': get_services(hello.get('services', ['open_terminal'] if hello['version'] == 1 else None)),
|
||||
}
|
||||
connection = SimpleNamespace(ws=ws, presence=presence, routes={}, lock=asyncio.Lock())
|
||||
|
||||
async def send(header, data):
|
||||
async with connection.lock:
|
||||
await asyncio.wait_for(ws.send_bytes(encode(header, data)), 10)
|
||||
|
||||
connection.send = send
|
||||
# A reconnect replaces the previous connection, including on another worker.
|
||||
for old in list(hub.connections.values()):
|
||||
if old.presence['user'] == user.id and old.presence['connection_id'] == connection_id:
|
||||
await old.ws.close(code=1000)
|
||||
hub.connections[presence['connection']] = connection
|
||||
key = hub.key(user.id, connection_id)
|
||||
record = json.dumps(presence)
|
||||
presence_lock = asyncio.Lock()
|
||||
if hub.redis:
|
||||
await hub.redis.set(key, record, ex=60)
|
||||
await ws.send_json({'type': 'ready', 'notifications': True})
|
||||
|
||||
async def watch():
|
||||
while True:
|
||||
await asyncio.sleep(15)
|
||||
current = await get_verified_user_by_token(token, getattr(ws.app.state, 'redis', None))
|
||||
if not current or current.id != user.id:
|
||||
await ws.close(code=4001)
|
||||
return
|
||||
async with presence_lock:
|
||||
if hub.redis:
|
||||
refreshed = await hub.redis.eval(
|
||||
"if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('expire', KEYS[1], 60) else return 0 end",
|
||||
1,
|
||||
key,
|
||||
record,
|
||||
)
|
||||
if not refreshed:
|
||||
await ws.close(code=1000)
|
||||
return
|
||||
|
||||
async def guarded_watch():
|
||||
try:
|
||||
await watch()
|
||||
except Exception:
|
||||
with suppress(Exception):
|
||||
await ws.close(code=4001)
|
||||
|
||||
watcher = asyncio.create_task(guarded_watch())
|
||||
while True:
|
||||
message = await ws.receive()
|
||||
if message['type'] == 'websocket.disconnect':
|
||||
break
|
||||
if message.get('bytes') is not None:
|
||||
header, data = decode(message['bytes'])
|
||||
await hub.returned(connection, header, data)
|
||||
elif message.get('text') is not None:
|
||||
update = json.loads(message['text'])
|
||||
if update.get('type') == 'services':
|
||||
services = get_services(update.get('services'))
|
||||
name = update.get('name', presence['name'])
|
||||
if not isinstance(name, str) or not 1 <= len(name.strip()) <= 100:
|
||||
raise ValueError('A device name of 1–100 characters is required')
|
||||
async with presence_lock:
|
||||
updated_record = json.dumps({**presence, 'services': services, 'name': name.strip()})
|
||||
if hub.redis:
|
||||
replaced = await hub.redis.eval(
|
||||
"if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('set', KEYS[1], ARGV[2], 'EX', 60); return 1 else return 0 end",
|
||||
1, key, record, updated_record,
|
||||
)
|
||||
if not replaced:
|
||||
raise ValueError('Tether connection was replaced')
|
||||
presence['services'] = services
|
||||
presence['name'] = name.strip()
|
||||
record = updated_record
|
||||
continue
|
||||
updated = decode_token(update.get('token', ''))
|
||||
current = await get_verified_user_by_token(
|
||||
update.get('token', ''), getattr(ws.app.state, 'redis', None)
|
||||
)
|
||||
if (
|
||||
update.get('type') != 'auth'
|
||||
or not current
|
||||
or current.id != user.id
|
||||
or not updated
|
||||
or updated.get('sid') != row.id
|
||||
or updated.get('typ') != 'session'
|
||||
):
|
||||
raise ValueError('Cannot change relay identity')
|
||||
token = update['token']
|
||||
except Exception:
|
||||
with suppress(Exception):
|
||||
await ws.close(code=4001)
|
||||
finally:
|
||||
if watcher:
|
||||
watcher.cancel()
|
||||
await asyncio.gather(watcher, return_exceptions=True)
|
||||
if connection:
|
||||
hub.connections.pop(connection.presence['connection'], None)
|
||||
if hub.redis:
|
||||
with suppress(Exception):
|
||||
await hub.redis.eval(
|
||||
"if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end",
|
||||
1,
|
||||
key,
|
||||
record,
|
||||
)
|
||||
for stream_id in list(connection.routes):
|
||||
stream = hub.streams.get(stream_id)
|
||||
if stream:
|
||||
stream.fail('Tether disconnected; operation completion may be unknown')
|
||||
else:
|
||||
worker = connection.routes[stream_id]
|
||||
if hub.redis:
|
||||
# An explicit failure is terminal even if a preceding frame was lost.
|
||||
with suppress(Exception):
|
||||
await hub.redis.publish(
|
||||
hub.channel(worker),
|
||||
encode(
|
||||
{
|
||||
'type': 'error',
|
||||
'stream': stream_id,
|
||||
'sequence': 0,
|
||||
'route': 'stream',
|
||||
'connection': connection.presence['connection'],
|
||||
'message': 'Tether disconnected',
|
||||
},
|
||||
b'',
|
||||
),
|
||||
)
|
||||
|
|
@ -658,6 +658,11 @@ async def user_join(sid, data):
|
|||
if not user:
|
||||
return
|
||||
|
||||
previous = await sio.get_session(sid)
|
||||
if previous.get('user', {}).get('id') not in (None, user.id):
|
||||
await sio.disconnect(sid)
|
||||
return
|
||||
|
||||
socket_user = {
|
||||
**user.model_dump(
|
||||
exclude=[
|
||||
|
|
@ -711,7 +716,7 @@ async def refresh_chat_access(chat_id=None):
|
|||
key = (cid, session['id'])
|
||||
if key not in access:
|
||||
user = await Users.get_user_by_id(session['id'])
|
||||
access[key] = bool(user and await Chats.get_accessible_chat_by_id(cid, user))
|
||||
access[key] = bool(user and await Chats.has_chat_access(cid, user))
|
||||
if not access[key]:
|
||||
await sio.leave_room(sid, f'chat:{cid}')
|
||||
chat_ids.add(cid)
|
||||
|
|
@ -891,7 +896,7 @@ async def chat_events(sid, data):
|
|||
if sid not in (get_room_sid_map(sio.manager, '/', room) or {}):
|
||||
return False
|
||||
sender = await Users.get_user_by_id(user['id'])
|
||||
if not sender or not await Chats.get_accessible_chat_by_id(chat_id, sender, permission='write'):
|
||||
if not sender or not await Chats.has_chat_access(chat_id, sender, permission='write'):
|
||||
return False
|
||||
await sio.emit(
|
||||
'events',
|
||||
|
|
@ -916,7 +921,7 @@ async def chat_events(sid, data):
|
|||
await sio.leave_room(sid, f'chat:{chat_id}')
|
||||
else:
|
||||
reader = await Users.get_user_by_id(user['id'])
|
||||
if not reader or not await Chats.get_accessible_chat_by_id(chat_id, reader):
|
||||
if not reader or not await Chats.has_chat_access(chat_id, reader):
|
||||
return False
|
||||
await sio.enter_room(sid, f'chat:{chat_id}')
|
||||
session = SESSION_POOL.get(sid)
|
||||
|
|
@ -1040,6 +1045,9 @@ async def ydoc_document_join(sid, data):
|
|||
):
|
||||
log.error(f'User {user.get("id")} does not have access to note {note_id}')
|
||||
return
|
||||
else:
|
||||
# Only notes have access checks, so no other document gets a room.
|
||||
return
|
||||
|
||||
user_id = user['id']
|
||||
user_name = user.get('name', '')
|
||||
|
|
|
|||
|
|
@ -214,12 +214,14 @@ class CachedRedisDict(RedisDict):
|
|||
super().__init__(name, redis_url, redis_sentinels, redis_cluster, cache_set_signature=True)
|
||||
self._cache: dict = {}
|
||||
self._cached_signature: str | None = None
|
||||
self._cached_values: list | None = None
|
||||
|
||||
def _refresh_cache(self) -> dict:
|
||||
stored_signature = self.redis.get(self._signature_name)
|
||||
if stored_signature is None or stored_signature != self._cached_signature:
|
||||
self._cache = self.redis.hgetall(self.name)
|
||||
self._cached_signature = stored_signature
|
||||
self._cached_values = None
|
||||
return self._cache
|
||||
|
||||
def __getitem__(self, key):
|
||||
|
|
@ -238,7 +240,11 @@ class CachedRedisDict(RedisDict):
|
|||
return list(self._refresh_cache().keys())
|
||||
|
||||
def values(self):
|
||||
return [JSONCodec.loads(v) for v in self._refresh_cache().values()]
|
||||
cache = self._refresh_cache()
|
||||
# Decoded once per signature; callers share these dicts read-only.
|
||||
if self._cached_values is None:
|
||||
self._cached_values = [JSONCodec.loads(v) for v in cache.values()]
|
||||
return list(self._cached_values)
|
||||
|
||||
def items(self):
|
||||
return [(k, JSONCodec.loads(v)) for k, v in self._refresh_cache().items()]
|
||||
|
|
|
|||
|
|
@ -2840,6 +2840,21 @@ async def grep_knowledge_files(
|
|||
return JSONCodec.dumps({'error': str(e)})
|
||||
|
||||
|
||||
def _numbered_lines_within_cap(all_lines: list[str], start: int, end: int) -> tuple[str, int]:
|
||||
"""Number lines start..end, stopping at the last whole line that fits VIEW_FILE_MAX_CHARS."""
|
||||
numbered_lines = []
|
||||
used_chars = 0
|
||||
for line_index in range(start, end):
|
||||
numbered_line = f'{line_index + 1}: {all_lines[line_index]}'
|
||||
if used_chars + len(numbered_line) > VIEW_FILE_MAX_CHARS:
|
||||
if numbered_lines:
|
||||
return '\n'.join(numbered_lines), line_index
|
||||
return numbered_line[:VIEW_FILE_MAX_CHARS], line_index + 1
|
||||
numbered_lines.append(numbered_line)
|
||||
used_chars += len(numbered_line) + 1
|
||||
return '\n'.join(numbered_lines), end
|
||||
|
||||
|
||||
async def view_file(
|
||||
file_id: str,
|
||||
offset: int = 0,
|
||||
|
|
@ -2904,11 +2919,10 @@ async def view_file(
|
|||
if start_line is not None or end_line is not None:
|
||||
all_lines = content.split('\n')
|
||||
total_lines = len(all_lines)
|
||||
s = max(1, int(start_line or 1)) - 1 # 1-indexed to 0-indexed
|
||||
e = min(total_lines, int(end_line) if end_line else s + 100)
|
||||
selected = all_lines[s:e]
|
||||
sliced = '\n'.join(f'{s + i + 1}: {line}' for i, line in enumerate(selected))
|
||||
is_truncated = e < total_lines
|
||||
start_index = max(1, int(start_line or 1)) - 1 # 1-indexed to 0-indexed
|
||||
end_index = min(total_lines, int(end_line) if end_line else start_index + 100)
|
||||
sliced, end_index = _numbered_lines_within_cap(all_lines, start_index, end_index)
|
||||
is_truncated = end_index < total_lines
|
||||
result = {
|
||||
'id': file.id,
|
||||
'filename': file.filename,
|
||||
|
|
@ -2916,11 +2930,11 @@ async def view_file(
|
|||
'updated_at': file.updated_at,
|
||||
'created_at': file.created_at,
|
||||
'total_lines': total_lines,
|
||||
'showing_lines': f'{s + 1}-{e}',
|
||||
'showing_lines': f'{start_index + 1}-{end_index}',
|
||||
}
|
||||
if is_truncated:
|
||||
result['truncated'] = True
|
||||
result['next_start_line'] = e + 1
|
||||
result['next_start_line'] = end_index + 1
|
||||
return JSONCodec.dumps(result, ensure_ascii=False)
|
||||
|
||||
sliced = content[offset : offset + max_chars]
|
||||
|
|
@ -3045,11 +3059,10 @@ async def view_knowledge_file(
|
|||
if start_line is not None or end_line is not None:
|
||||
all_lines = content.split('\n')
|
||||
total_lines = len(all_lines)
|
||||
s = max(1, int(start_line or 1)) - 1
|
||||
e = min(total_lines, int(end_line) if end_line else s + 100)
|
||||
selected = all_lines[s:e]
|
||||
sliced = '\n'.join(f'{s + i + 1}: {line}' for i, line in enumerate(selected))
|
||||
is_truncated = e < total_lines
|
||||
start_index = max(1, int(start_line or 1)) - 1
|
||||
end_index = min(total_lines, int(end_line) if end_line else start_index + 100)
|
||||
sliced, end_index = _numbered_lines_within_cap(all_lines, start_index, end_index)
|
||||
is_truncated = end_index < total_lines
|
||||
result = {
|
||||
'id': file.id,
|
||||
'filename': file.filename,
|
||||
|
|
@ -3057,14 +3070,14 @@ async def view_knowledge_file(
|
|||
'updated_at': file.updated_at,
|
||||
'created_at': file.created_at,
|
||||
'total_lines': total_lines,
|
||||
'showing_lines': f'{s + 1}-{e}',
|
||||
'showing_lines': f'{start_index + 1}-{end_index}',
|
||||
}
|
||||
if knowledge_info:
|
||||
result['knowledge_id'] = knowledge_info['id']
|
||||
result['knowledge_name'] = knowledge_info['name']
|
||||
if is_truncated:
|
||||
result['truncated'] = True
|
||||
result['next_start_line'] = e + 1
|
||||
result['next_start_line'] = end_index + 1
|
||||
return JSONCodec.dumps(result, ensure_ascii=False)
|
||||
|
||||
sliced = content[offset : offset + max_chars]
|
||||
|
|
@ -4221,12 +4234,12 @@ async def create_automation(
|
|||
The automation will use the current chat model.
|
||||
|
||||
The rrule parameter must be a valid iCalendar RRULE string. Common examples:
|
||||
- Every day at 9am: "DTSTART:20250101T090000\\nRRULE:FREQ=DAILY"
|
||||
- Every Monday at 8am: "DTSTART:20250106T080000\\nRRULE:FREQ=WEEKLY;BYDAY=MO"
|
||||
- Every day at 9am: "DTSTART:20250101T090000\nRRULE:FREQ=DAILY"
|
||||
- Every Monday at 8am: "DTSTART:20250106T080000\nRRULE:FREQ=WEEKLY;BYDAY=MO"
|
||||
- Every hour: "RRULE:FREQ=HOURLY;INTERVAL=1"
|
||||
- Every 30 minutes: "RRULE:FREQ=MINUTELY;INTERVAL=30"
|
||||
- Once at a specific time: "DTSTART:20250415T140000\\nRRULE:FREQ=DAILY;COUNT=1"
|
||||
- First day of every month: "DTSTART:20250101T090000\\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1"
|
||||
- Once at a specific time: "DTSTART:20250415T140000\nRRULE:FREQ=DAILY;COUNT=1"
|
||||
- First day of every month: "DTSTART:20250101T090000\nRRULE:FREQ=MONTHLY;BYMONTHDAY=1"
|
||||
|
||||
The DTSTART time should reflect the desired execution time. Use COUNT=1 for one-time automations.
|
||||
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@ async def has_access_to_file(
|
|||
if accessible_ids:
|
||||
return True
|
||||
for chat_id in shared_chat_ids:
|
||||
if await Chats.get_accessible_chat_by_id(chat_id, user, db=db):
|
||||
if await Chats.has_chat_access(chat_id, user, db=db):
|
||||
return True
|
||||
|
||||
# Note attachment JSON is user-controlled, so only the file owner's notes can grant access.
|
||||
|
|
|
|||
|
|
@ -141,11 +141,11 @@ def log_model_usage(request: Request, user: UserModel, model_id: str, usage: Opt
|
|||
logger.error('Failed to log model usage: {}', e)
|
||||
|
||||
|
||||
def redact_passwords(body: str) -> str:
|
||||
if 'password' not in body.lower():
|
||||
return body
|
||||
def redact_secrets(body: str) -> str:
|
||||
# Secrets cut off by the size limit have no closing quote.
|
||||
quoted = r'"(?:[^"\\]|\\.)*\\?(?:"|$)'
|
||||
return re.sub(
|
||||
r'"(\w*password)"\s*:\s*"(?:[^"\\]|\\.)*"',
|
||||
rf'"(\w*(?:password|secret|token|key|authorization)s?)"\s*:\s*(?:{quoted}|\[(?:{quoted}|[^\]"])*(?:\]|$))',
|
||||
r'"\1": "********"',
|
||||
body,
|
||||
flags=re.IGNORECASE,
|
||||
|
|
@ -330,8 +330,8 @@ class AuditLoggingMiddleware:
|
|||
response_body = context.response_body.decode('utf-8', errors='replace')
|
||||
|
||||
# Redact sensitive information
|
||||
request_body = redact_passwords(request_body)
|
||||
response_body = redact_passwords(response_body)
|
||||
request_body = redact_secrets(request_body)
|
||||
response_body = redact_secrets(response_body)
|
||||
|
||||
entry = AuditLogEntry(
|
||||
id=request.state.audit_request_id,
|
||||
|
|
|
|||
|
|
@ -279,6 +279,18 @@ async def is_valid_token(decoded, redis=None) -> bool:
|
|||
token_type = decoded.get('typ', 'session')
|
||||
if token_type not in {'session', 'automation', 'subagent'}:
|
||||
return False
|
||||
if decoded.get('sid'):
|
||||
from open_webui.models.auth_sessions import AuthSessions
|
||||
import time
|
||||
|
||||
session = await AuthSessions.get(decoded['sid'])
|
||||
if (
|
||||
not session
|
||||
or session.user_id != decoded.get('id')
|
||||
or session.refresh_token_id is None
|
||||
or session.expires_at <= int(time.time())
|
||||
):
|
||||
return False
|
||||
if token_type == 'session':
|
||||
config = await get_mfa_config()
|
||||
if is_mfa_required(decoded.get('auth_method', ''), config):
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ from open_webui.utils.recurrence import (
|
|||
validate_rrule,
|
||||
)
|
||||
from open_webui.utils.task import prompt_template
|
||||
from open_webui.utils.tether import get_terminal_connections, get_terminal_client
|
||||
from open_webui.utils.terminals import get_terminal_server_url
|
||||
from starlette.datastructures import Headers
|
||||
|
||||
|
|
@ -206,10 +207,7 @@ async def _set_terminal_cwd(app, server_id: str, user, cwd: str, chat_id: str) -
|
|||
import aiohttp
|
||||
from open_webui.env import AIOHTTP_CLIENT_SESSION_SSL
|
||||
|
||||
connections = getattr(getattr(app, 'state', None), 'config', None)
|
||||
if connections is None:
|
||||
return
|
||||
connections = getattr(connections, 'TERMINAL_SERVER_CONNECTIONS', None) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
connection = next((c for c in connections if c.get('id') == server_id), None)
|
||||
if connection is None:
|
||||
log.warning(f'Terminal server {server_id} not found for CWD set')
|
||||
|
|
@ -230,7 +228,7 @@ async def _set_terminal_cwd(app, server_id: str, user, cwd: str, chat_id: str) -
|
|||
headers['Authorization'] = f'Bearer {connection.get("key", "")}'
|
||||
|
||||
try:
|
||||
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10)) as session:
|
||||
async with get_terminal_client(base_url, user.id, timeout=aiohttp.ClientTimeout(total=10)) as session:
|
||||
async with session.post(
|
||||
target_url,
|
||||
json={'path': cwd},
|
||||
|
|
|
|||
|
|
@ -63,10 +63,11 @@ def is_nested_too_deep(value: Any) -> bool:
|
|||
stack = [(value, 1)]
|
||||
while stack:
|
||||
item, depth = stack.pop()
|
||||
if isinstance(item, list):
|
||||
if isinstance(item, (list, dict)):
|
||||
if depth > MAX_JSON_VALUE_DEPTH:
|
||||
return True
|
||||
stack.extend((child, depth + 1) for child in item)
|
||||
children = item.values() if isinstance(item, dict) else item
|
||||
stack.extend((child, depth + 1) for child in children)
|
||||
return False
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ async def comment_resource(resource_type, resource_id, user, db, *, lock=False,
|
|||
if resource_type == 'chat':
|
||||
from open_webui.models.chats import Chats
|
||||
|
||||
allowed = await Chats.get_accessible_chat_by_id(resource_id, user, db=db, chat=resource) is not None
|
||||
allowed = await Chats.has_chat_access(resource_id, user, db=db, chat=resource)
|
||||
else:
|
||||
if resource_type == 'note':
|
||||
if not await Config.get('notes.enable') or (
|
||||
|
|
|
|||
|
|
@ -458,9 +458,6 @@ async def _generate_summary(
|
|||
if not isinstance(task_model_params, dict):
|
||||
task_model_params = {}
|
||||
task_model_params = {key: value for key, value in task_model_params.items() if value is not None and value != ''}
|
||||
task_model_params = task_model_params or {
|
||||
'max_tokens': models[task_model_id].get('info', {}).get('params', {}).get('max_tokens', 1000)
|
||||
}
|
||||
|
||||
metadata = {
|
||||
**(request.state.metadata if hasattr(request.state, 'metadata') else {}),
|
||||
|
|
|
|||
|
|
@ -152,6 +152,7 @@ from open_webui.utils.task import (
|
|||
rag_template,
|
||||
tools_function_calling_generation_template,
|
||||
)
|
||||
from open_webui.utils.tether import get_terminal_connections
|
||||
from open_webui.utils.terminals import filter_user_terminal_tools, upload_files_to_terminal
|
||||
from open_webui.utils.tool_approval import complete_tool_call, pending_tool_calls
|
||||
from open_webui.utils.tool_search import apply_tool_search, resolve_tool_call
|
||||
|
|
@ -2778,7 +2779,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
|
|||
# so system terminals work even when no other tools are selected)
|
||||
terminal_capability = (model.get('info', {}).get('meta', {}).get('capabilities') or {}).get('terminal', True)
|
||||
terminal_connection_ids = {
|
||||
connection.get('id') for connection in await Config.get('terminal_server.connections', []) or []
|
||||
connection.get('id') for connection in await get_terminal_connections(user)
|
||||
}
|
||||
if terminal_id and terminal_capability and terminal_id in terminal_connection_ids:
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -927,26 +927,38 @@ def _strip_null_bytes_deep(obj):
|
|||
return obj
|
||||
|
||||
|
||||
def _has_null_bytes_or_surrogates(obj) -> bool:
|
||||
"""True if any string, key or value, has a null byte or surrogate."""
|
||||
if isinstance(obj, str):
|
||||
if '\x00' in obj:
|
||||
return True
|
||||
# O(1) in CPython, so ASCII strings such as base64 images skip the surrogate scan.
|
||||
if obj.isascii():
|
||||
return False
|
||||
try:
|
||||
obj.encode('utf-8')
|
||||
return False
|
||||
except UnicodeEncodeError:
|
||||
return True
|
||||
elif isinstance(obj, dict):
|
||||
return any(_has_null_bytes_or_surrogates(k) or _has_null_bytes_or_surrogates(v) for k, v in obj.items())
|
||||
elif isinstance(obj, list):
|
||||
return any(_has_null_bytes_or_surrogates(v) for v in obj)
|
||||
return False
|
||||
|
||||
|
||||
def sanitize_data_for_db(obj):
|
||||
"""Recursively sanitize all strings in a data structure for database storage.
|
||||
|
||||
Performs a fast pre-check: serializes the structure once and scans for
|
||||
Performs a fast pre-check: scans every string once for
|
||||
null bytes or invalid UTF-8 surrogates. If none are found, the
|
||||
original object is returned immediately, skipping the expensive
|
||||
recursive walk.
|
||||
"""
|
||||
if isinstance(obj, str):
|
||||
return sanitize_text_for_db(obj)
|
||||
# Fast path: check for null bytes and surrogate code points in the serialized form.
|
||||
# json.dumps is implemented in C and much faster than a Python-level
|
||||
# recursive walk over every leaf string.
|
||||
try:
|
||||
serialized = JSONCodec.dumps(obj, ensure_ascii=False)
|
||||
if '\\u0000' not in serialized:
|
||||
serialized.encode('utf-8')
|
||||
return obj
|
||||
except (TypeError, ValueError, UnicodeEncodeError):
|
||||
pass
|
||||
if not _has_null_bytes_or_surrogates(obj):
|
||||
return obj
|
||||
return _strip_null_bytes_deep(obj)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import logging
|
|||
import re
|
||||
import time
|
||||
from typing import Any
|
||||
from urllib.parse import urlparse
|
||||
from urllib.parse import urlparse, quote
|
||||
|
||||
from open_webui.events import EVENT_DEFINITIONS_BY_NAME, NOTIFICATION_EVENTS
|
||||
from open_webui.models.config import Config
|
||||
|
|
@ -387,7 +387,26 @@ async def notify_target(
|
|||
|
||||
|
||||
async def dispatch_notification_event(app: Any, event: Any) -> None:
|
||||
if event.event not in VALID_EVENTS or not await Config.get('ui.enable_user_webhooks'):
|
||||
if event.event not in VALID_EVENTS:
|
||||
return
|
||||
|
||||
# Tether delivery is independent of webhooks and of whether a WebUI page is loaded.
|
||||
if event.event in {CHAT_FINISHED_EVENT, CHAT_FAILED_EVENT, CALENDAR_ALERT_EVENT}:
|
||||
from open_webui.utils.tether import notify
|
||||
|
||||
data = event.data or {}
|
||||
chat_id = data.get('chat_id') or (event.subject or {}).get('id')
|
||||
if event.event == CALENDAR_ALERT_EVENT or (chat_id and not str(chat_id).startswith('local:')):
|
||||
path = '/calendar' if event.event == CALENDAR_ALERT_EVENT else '/c/' + quote(str(chat_id), safe='')
|
||||
title = str(data.get('title') or event.message or 'Open WebUI')
|
||||
body = str(data.get('message') or '')
|
||||
body = re.sub(r'<details\b[^>]*>.*?</details>', '', body, flags=re.DOTALL | re.IGNORECASE)
|
||||
try:
|
||||
await notify(data.get('user_id'), event.id, f'{title} / Open WebUI', body, path)
|
||||
except Exception:
|
||||
log.exception('Tether notification delivery failed for event %s', event.id)
|
||||
|
||||
if not await Config.get('ui.enable_user_webhooks'):
|
||||
return
|
||||
|
||||
from open_webui.events import event_user_ids
|
||||
|
|
|
|||
|
|
@ -1100,7 +1100,7 @@ class OAuthClientManager:
|
|||
# Get the OAuth session
|
||||
session = await OAuthSessions.get_session_by_provider_and_user_id(client_id, user_id)
|
||||
if not session:
|
||||
log.warning(f'No OAuth session found for user {user_id}, client_id {client_id}')
|
||||
log.debug('No OAuth session found for user %s, client_id %s', user_id, client_id)
|
||||
return None
|
||||
|
||||
if (
|
||||
|
|
@ -1191,10 +1191,12 @@ class OAuthClientManager:
|
|||
if should_send_oauth_resource(client_info):
|
||||
refresh_data['resource'] = client_info.resource
|
||||
|
||||
client_auth = None
|
||||
refresh_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
if hasattr(client, 'client_secret') and client.client_secret:
|
||||
if client.client_kwargs.get('token_endpoint_auth_method') == 'client_secret_basic':
|
||||
client_auth = aiohttp.BasicAuth(client.client_id, client.client_secret)
|
||||
refresh_headers['Authorization'] = aiohttp.encode_basic_auth(
|
||||
client.client_id, client.client_secret, encoding='latin1'
|
||||
)
|
||||
# Some providers reject a body client_id next to Basic as a second credential (#19415)
|
||||
del refresh_data['client_id']
|
||||
else:
|
||||
|
|
@ -1213,8 +1215,7 @@ class OAuthClientManager:
|
|||
async with session_http.post(
|
||||
token_endpoint,
|
||||
data=refresh_data,
|
||||
auth=client_auth,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
headers=refresh_headers,
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
) as r:
|
||||
if r.status == 200:
|
||||
|
|
@ -1559,11 +1560,13 @@ class OAuthManager:
|
|||
'refresh_token': token_data['refresh_token'],
|
||||
'client_id': client.client_id,
|
||||
}
|
||||
client_auth = None
|
||||
refresh_headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
# Add client_secret if available (some providers require it)
|
||||
if hasattr(client, 'client_secret') and client.client_secret:
|
||||
if client.client_kwargs.get('token_endpoint_auth_method') == 'client_secret_basic':
|
||||
client_auth = aiohttp.BasicAuth(client.client_id, client.client_secret)
|
||||
refresh_headers['Authorization'] = aiohttp.encode_basic_auth(
|
||||
client.client_id, client.client_secret, encoding='latin1'
|
||||
)
|
||||
if not OAUTH_ACCESS_TOKEN_REQUEST_INCLUDE_CLIENT_ID:
|
||||
del refresh_data['client_id']
|
||||
else:
|
||||
|
|
@ -1582,8 +1585,7 @@ class OAuthManager:
|
|||
async with session_http.post(
|
||||
token_endpoint,
|
||||
data=refresh_data,
|
||||
auth=client_auth,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'},
|
||||
headers=refresh_headers,
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
) as r:
|
||||
if r.status == 200:
|
||||
|
|
|
|||
|
|
@ -140,15 +140,15 @@ async def get_terminal_json(
|
|||
return None
|
||||
|
||||
import aiohttp
|
||||
from open_webui.utils.tether import get_terminal_connections, get_terminal_client
|
||||
from open_webui.env import AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL
|
||||
from open_webui.models.config import Config
|
||||
from open_webui.models.groups import Groups
|
||||
from open_webui.models.users import UserModel
|
||||
from open_webui.utils.access_control import has_connection_access
|
||||
from open_webui.utils.tools import build_tool_server_headers
|
||||
|
||||
user_model = user if isinstance(user, UserModel) else UserModel(**user)
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user_model)
|
||||
connection = next((item for item in connections if item.get('id') == terminal_id), None)
|
||||
|
||||
if connection:
|
||||
|
|
@ -191,14 +191,14 @@ async def get_terminal_json(
|
|||
body = aiohttp.FormData()
|
||||
body.add_field(
|
||||
'file',
|
||||
await asyncio.to_thread(Path(local_path).read_bytes),
|
||||
open(local_path, 'rb'),
|
||||
filename=file['name'],
|
||||
content_type=(source.meta or {}).get('content_type') or 'application/octet-stream',
|
||||
)
|
||||
headers = {key: value for key, value in headers.items() if key.lower() != 'content-type'}
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_TERMINAL)
|
||||
try:
|
||||
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
|
||||
async with get_terminal_client(get_terminal_server_url(connection), user_model.id, timeout=timeout, trust_env=True) as session:
|
||||
async with session.request(
|
||||
'POST' if file else 'GET',
|
||||
f'{get_terminal_server_url(connection)}{path}',
|
||||
|
|
|
|||
582
backend/open_webui/utils/tether.py
Normal file
582
backend/open_webui/utils/tether.py
Normal file
|
|
@ -0,0 +1,582 @@
|
|||
"""Ephemeral reverse connections and streaming service transport."""
|
||||
|
||||
import asyncio
|
||||
import json
|
||||
import re
|
||||
import struct
|
||||
import time
|
||||
from contextlib import suppress
|
||||
from types import SimpleNamespace
|
||||
from urllib.parse import urlsplit, urlencode
|
||||
from uuid import uuid4
|
||||
|
||||
import aiohttp
|
||||
from multidict import CIMultiDict
|
||||
from fastapi import HTTPException
|
||||
from open_webui.env import REDIS_KEY_PREFIX, UVICORN_WORKERS
|
||||
from open_webui.models.auth_sessions import AuthSessions
|
||||
from open_webui.models.config import Config
|
||||
|
||||
CHUNK = 65536
|
||||
WINDOW = 262144
|
||||
MAX_MESSAGE = 16 * 1024 * 1024
|
||||
|
||||
|
||||
class RelayInterrupted(ConnectionError):
|
||||
def __init__(self, reason='Connection lost'):
|
||||
super().__init__(
|
||||
f'Tether connection interrupted: {reason}. '
|
||||
'The operation may have completed. Check its result before trying again; do not automatically repeat it.'
|
||||
)
|
||||
|
||||
def result(self):
|
||||
return {'error': str(self), 'code': 'tether_interrupted', 'outcome': 'unknown', 'retryable': False}
|
||||
|
||||
|
||||
def get_services(value):
|
||||
if (
|
||||
not isinstance(value, list)
|
||||
or len(value) > 16
|
||||
or any(not isinstance(name, str) or not re.fullmatch(r'[a-z][a-z0-9_]{0,31}', name) for name in value)
|
||||
):
|
||||
raise ValueError('Invalid Tether services')
|
||||
return list(dict.fromkeys(value))
|
||||
|
||||
|
||||
def encode(header, data=b''):
|
||||
raw = json.dumps(header, separators=(',', ':')).encode()
|
||||
if len(raw) > 4096 or len(data) > CHUNK:
|
||||
raise ValueError('Relay packet too large')
|
||||
return struct.pack('!I', len(raw)) + raw + data
|
||||
|
||||
|
||||
def decode(raw):
|
||||
if len(raw) < 4 or len(raw) > CHUNK + 4100:
|
||||
raise ValueError('Invalid relay packet')
|
||||
length = struct.unpack('!I', raw[:4])[0]
|
||||
if length > 4096 or length > len(raw) - 4:
|
||||
raise ValueError('Invalid relay header')
|
||||
header = json.loads(raw[4 : 4 + length])
|
||||
if (
|
||||
not isinstance(header, dict)
|
||||
or not isinstance(header.get('stream'), str)
|
||||
or len(header['stream']) != 36
|
||||
or type(header.get('sequence')) is not int
|
||||
or header['sequence'] < 0
|
||||
):
|
||||
raise ValueError('Invalid relay header')
|
||||
return header, raw[4 + length :]
|
||||
|
||||
|
||||
class Stream:
|
||||
def __init__(self, owner, presence):
|
||||
self.id = str(uuid4())
|
||||
self.owner, self.presence = owner, presence
|
||||
self.sequence = self.incoming = 0
|
||||
self.credit = self.receive_credit = WINDOW
|
||||
self.wake = asyncio.Event()
|
||||
self.queue = asyncio.Queue(maxsize=32)
|
||||
self.closed = False
|
||||
self.lock = asyncio.Lock()
|
||||
self.error = None
|
||||
|
||||
async def send(self, operation, data=b'', **fields):
|
||||
while len(data) > self.credit and not self.closed:
|
||||
self.wake.clear()
|
||||
try:
|
||||
await asyncio.wait_for(self.wake.wait(), 300)
|
||||
except TimeoutError as error:
|
||||
self.fail('Send timed out')
|
||||
raise self.error from error
|
||||
if self.closed:
|
||||
raise self.error or RelayInterrupted('Stream closed')
|
||||
self.credit -= len(data)
|
||||
async with self.lock:
|
||||
header = dict(fields, type=operation, stream=self.id, sequence=self.sequence)
|
||||
self.sequence += 1
|
||||
try:
|
||||
await self.owner.send(self.presence, header, data)
|
||||
except (OSError, TimeoutError) as error:
|
||||
self.fail(str(error) or 'Send failed')
|
||||
raise self.error from error
|
||||
|
||||
def feed(self, header, data):
|
||||
if self.closed:
|
||||
return
|
||||
if header['sequence'] != self.incoming:
|
||||
self.fail('Missing relay packet')
|
||||
return
|
||||
self.incoming += 1
|
||||
if header['type'] == 'window':
|
||||
count = header.get('bytes')
|
||||
if type(count) is not int or count <= 0 or self.credit + count > WINDOW:
|
||||
self.fail('Invalid relay window')
|
||||
else:
|
||||
self.credit += count
|
||||
self.wake.set()
|
||||
return
|
||||
if len(data) > self.receive_credit:
|
||||
self.fail('Receive window exceeded')
|
||||
return
|
||||
self.receive_credit -= len(data)
|
||||
try:
|
||||
self.queue.put_nowait((header, data))
|
||||
except asyncio.QueueFull:
|
||||
self.fail('Relay consumer too slow')
|
||||
|
||||
def fail(self, message):
|
||||
self.error = RelayInterrupted(message)
|
||||
self.closed = True
|
||||
self.wake.set()
|
||||
while not self.queue.empty():
|
||||
self.queue.get_nowait()
|
||||
self.queue.put_nowait(({'type': 'error', 'message': message}, b''))
|
||||
|
||||
async def receive(self):
|
||||
if self.error:
|
||||
raise self.error
|
||||
try:
|
||||
header, data = await asyncio.wait_for(self.queue.get(), 300)
|
||||
except TimeoutError as error:
|
||||
self.fail('Response timed out')
|
||||
raise self.error from error
|
||||
if header['type'] == 'error':
|
||||
self.fail(header.get('message', 'Response interrupted'))
|
||||
raise self.error
|
||||
return header, data
|
||||
|
||||
async def consumed(self, count):
|
||||
if count and not self.closed:
|
||||
self.receive_credit += count
|
||||
await self.send('window', bytes=count)
|
||||
|
||||
async def close(self):
|
||||
if not self.closed:
|
||||
with suppress(Exception):
|
||||
await self.send('cancel')
|
||||
self.closed = True
|
||||
self.wake.set()
|
||||
self.owner.streams.pop(self.id, None)
|
||||
|
||||
|
||||
class Hub:
|
||||
def __init__(self):
|
||||
self.worker = str(uuid4())
|
||||
self.connections = {}
|
||||
self.streams = {}
|
||||
self.redis = None
|
||||
self.listener = None
|
||||
self.lock = asyncio.Lock()
|
||||
|
||||
def channel(self, worker):
|
||||
return f'{REDIS_KEY_PREFIX}:tether:worker:{worker}'
|
||||
|
||||
def key(self, user, connection_id):
|
||||
return f'{REDIS_KEY_PREFIX}:tether:presence:{user}:{connection_id}'
|
||||
|
||||
async def start(self):
|
||||
async with self.lock:
|
||||
if self.listener and not self.listener.done():
|
||||
return
|
||||
from open_webui.env import REDIS_URL, REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT, REDIS_CLUSTER
|
||||
from open_webui.utils.redis import get_redis_connection, get_sentinels_from_env
|
||||
|
||||
sentinels = get_sentinels_from_env(REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT)
|
||||
if not REDIS_URL and not sentinels:
|
||||
if UVICORN_WORKERS > 1:
|
||||
raise HTTPException(503, 'Tether requires Redis with multiple WebUI workers.')
|
||||
return
|
||||
self.redis = get_redis_connection(
|
||||
REDIS_URL,
|
||||
redis_sentinels=sentinels,
|
||||
redis_cluster=REDIS_CLUSTER,
|
||||
async_mode=True,
|
||||
decode_responses=False,
|
||||
)
|
||||
pubsub = self.redis.pubsub()
|
||||
await pubsub.subscribe(self.channel(self.worker))
|
||||
self.listener = asyncio.create_task(self.listen(pubsub))
|
||||
|
||||
async def listen(self, pubsub):
|
||||
try:
|
||||
async for message in pubsub.listen():
|
||||
if message['type'] != 'message':
|
||||
continue
|
||||
header, data = decode(message['data'])
|
||||
if header.pop('route', None) == 'connection':
|
||||
connection = self.connections.get(header.pop('connection', ''))
|
||||
if not connection:
|
||||
continue
|
||||
if header['type'] == 'notification':
|
||||
await connection.send(header, data)
|
||||
continue
|
||||
reply = header.pop('reply', '')
|
||||
if header['type'] in ('http-open', 'ws-open'):
|
||||
if len(connection.routes) >= 16:
|
||||
continue
|
||||
connection.routes[header['stream']] = reply
|
||||
elif connection.routes.get(header['stream']) != reply:
|
||||
continue
|
||||
await connection.send(header, data)
|
||||
if header['type'] == 'cancel':
|
||||
connection.routes.pop(header['stream'], None)
|
||||
else:
|
||||
stream = self.streams.get(header['stream'])
|
||||
if stream and header.pop('connection', None) == stream.presence['connection']:
|
||||
stream.feed(header, data)
|
||||
except Exception:
|
||||
for stream in list(self.streams.values()):
|
||||
stream.fail('Tether coordination disconnected')
|
||||
for connection in list(self.connections.values()):
|
||||
with suppress(Exception):
|
||||
await connection.ws.close(code=1011)
|
||||
finally:
|
||||
await pubsub.aclose()
|
||||
|
||||
async def presence(self, user_id, connection_id):
|
||||
await self.start()
|
||||
if self.redis:
|
||||
raw = await self.redis.get(self.key(user_id, connection_id))
|
||||
return json.loads(raw) if raw else None
|
||||
return next(
|
||||
(
|
||||
c.presence
|
||||
for c in self.connections.values()
|
||||
if c.presence['user'] == user_id and c.presence['connection_id'] == connection_id
|
||||
),
|
||||
None,
|
||||
)
|
||||
|
||||
async def presences(self, user_id):
|
||||
await self.start()
|
||||
if self.redis:
|
||||
records = []
|
||||
async for key in self.redis.scan_iter(match=self.key(user_id, '*'), count=100):
|
||||
raw = await self.redis.get(key)
|
||||
if raw:
|
||||
records.append(json.loads(raw))
|
||||
else:
|
||||
records = [connection.presence for connection in self.connections.values()]
|
||||
# SCAN may return a key more than once while connections are changing.
|
||||
return list({record['connection_id']: record for record in records if record['user'] == user_id}.values())
|
||||
|
||||
async def open(self, user_id, connection_id, service):
|
||||
presence = await self.presence(user_id, connection_id)
|
||||
if not presence or presence['user'] != user_id or presence['connection_id'] != connection_id:
|
||||
raise HTTPException(503, 'Tether is offline.')
|
||||
row = await AuthSessions.get(presence['session'])
|
||||
if not row or row.user_id != user_id or row.refresh_token_id is None or row.expires_at <= time.time():
|
||||
raise HTTPException(403, 'Tether session is no longer available.')
|
||||
if service not in presence.get('services', []):
|
||||
raise HTTPException(503, 'Tether service is unavailable.')
|
||||
if sum(s.presence['connection'] == presence['connection'] for s in self.streams.values()) >= 16:
|
||||
raise HTTPException(429, 'Tether has too many active operations.')
|
||||
stream = Stream(self, presence)
|
||||
self.streams[stream.id] = stream
|
||||
return stream
|
||||
|
||||
async def send(self, presence, header, data):
|
||||
connection = self.connections.get(presence['connection'])
|
||||
if presence['worker'] == self.worker:
|
||||
if not connection:
|
||||
raise ConnectionError('Tether disconnected')
|
||||
if header['type'] in ('http-open', 'ws-open'):
|
||||
if len(connection.routes) >= 16:
|
||||
raise HTTPException(429, 'Tether has too many active operations.')
|
||||
connection.routes[header['stream']] = self.worker
|
||||
await connection.send(header, data)
|
||||
if header['type'] == 'cancel':
|
||||
connection.routes.pop(header['stream'], None)
|
||||
else:
|
||||
packet = encode(
|
||||
dict(header, route='connection', connection=presence['connection'], reply=self.worker), data
|
||||
)
|
||||
if not await self.redis.publish(self.channel(presence['worker']), packet):
|
||||
raise ConnectionError('Tether worker is unavailable')
|
||||
|
||||
async def returned(self, connection, header, data):
|
||||
worker = connection.routes.get(header['stream'])
|
||||
if worker == self.worker:
|
||||
stream = self.streams.get(header['stream'])
|
||||
if stream:
|
||||
stream.feed(header, data)
|
||||
elif worker:
|
||||
await self.redis.publish(
|
||||
self.channel(worker),
|
||||
encode(dict(header, route='stream', connection=connection.presence['connection']), data),
|
||||
)
|
||||
if header['type'] in ('end', 'error'):
|
||||
connection.routes.pop(header['stream'], None)
|
||||
|
||||
|
||||
hub = Hub()
|
||||
|
||||
|
||||
async def notify(user_id, notification_id, title, body, path):
|
||||
"""Deliver only to authenticated background clients that opted into notifications."""
|
||||
from open_webui.models.users import Users
|
||||
|
||||
if not user_id:
|
||||
return
|
||||
presences = [p for p in await hub.presences(user_id) if p.get('notifications')]
|
||||
if not presences:
|
||||
return
|
||||
user = await Users.get_user_by_id(user_id)
|
||||
if not user or user.role == 'pending' or not user.settings or not (user.settings.ui or {}).get('notificationEnabled', False):
|
||||
return
|
||||
payload = json.dumps({
|
||||
'id': str(notification_id)[:200], 'user_id': user_id,
|
||||
'title': str(title)[:256], 'body': str(body)[:4096], 'path': path,
|
||||
}).encode()
|
||||
for presence in presences:
|
||||
row = await AuthSessions.get(presence['session'])
|
||||
if not row or row.user_id != user_id or row.refresh_token_id is None or row.expires_at <= time.time():
|
||||
continue
|
||||
with suppress(Exception):
|
||||
await asyncio.wait_for(hub.send(presence, {
|
||||
'type': 'notification', 'stream': str(uuid4()), 'sequence': 0,
|
||||
}, payload), 10)
|
||||
|
||||
|
||||
async def get_terminal_connections(user):
|
||||
"""Resolve personal targets alongside existing configured servers."""
|
||||
user_id = user['id'] if isinstance(user, dict) else user.id
|
||||
connections = list(await Config.get('terminal_server.connections', []) or [])
|
||||
for presence in await hub.presences(user_id):
|
||||
if 'open_terminal' not in presence.get('services', []):
|
||||
continue
|
||||
row = await AuthSessions.get(presence['session'])
|
||||
if not row or row.user_id != user_id or row.refresh_token_id is None or row.expires_at <= time.time():
|
||||
continue
|
||||
connection_id = presence['connection_id']
|
||||
connections.append(
|
||||
{
|
||||
'id': 'tether:' + connection_id,
|
||||
'name': presence['name'],
|
||||
'url': 'tether://' + connection_id,
|
||||
'auth_type': 'none',
|
||||
'enabled': True,
|
||||
'owner_id': user_id,
|
||||
'config': {
|
||||
'access_grants': [{'principal_type': 'user', 'principal_id': user_id, 'permission': 'read'}]
|
||||
},
|
||||
}
|
||||
)
|
||||
return connections
|
||||
|
||||
|
||||
class Operation:
|
||||
def __init__(self, coroutine):
|
||||
self.coroutine, self.value = coroutine, None
|
||||
|
||||
def __await__(self):
|
||||
return self.coroutine.__await__()
|
||||
|
||||
async def __aenter__(self):
|
||||
self.value = await self.coroutine
|
||||
return self.value
|
||||
|
||||
async def __aexit__(self, *_):
|
||||
if self.value:
|
||||
await self.value.close()
|
||||
|
||||
|
||||
class RelayResponse:
|
||||
def __init__(self, stream, header, upload):
|
||||
self.stream, self.upload = stream, upload
|
||||
self.status = header['status']
|
||||
self.headers = CIMultiDict({k: str(v) for k, v in header.get('headers', {}).items()})
|
||||
self.content_type = self.headers.get('Content-Type', '').split(';')[0]
|
||||
self.content = self
|
||||
self.cached = None
|
||||
|
||||
async def iter_any(self):
|
||||
while True:
|
||||
header, data = await self.stream.receive()
|
||||
if header['type'] == 'end':
|
||||
return
|
||||
if header['type'] != 'data':
|
||||
raise RelayInterrupted('Unexpected response')
|
||||
yield data
|
||||
await self.stream.consumed(len(data))
|
||||
|
||||
def iter_chunked(self, size):
|
||||
return self.iter_any()
|
||||
|
||||
async def read(self):
|
||||
if self.cached is None:
|
||||
parts, size = [], 0
|
||||
async for data in self.iter_any():
|
||||
size += len(data)
|
||||
if size > MAX_MESSAGE:
|
||||
await self.close()
|
||||
raise HTTPException(413, 'Response too large to buffer; use streaming.')
|
||||
parts.append(data)
|
||||
self.cached = b''.join(parts)
|
||||
return self.cached
|
||||
|
||||
async def text(self):
|
||||
return (await self.read()).decode('utf-8', errors='replace')
|
||||
|
||||
async def json(self):
|
||||
return json.loads(await self.read())
|
||||
|
||||
async def close(self):
|
||||
self.upload.cancel()
|
||||
await asyncio.gather(self.upload, return_exceptions=True)
|
||||
await self.stream.close()
|
||||
|
||||
release = close
|
||||
|
||||
|
||||
class RelaySocket:
|
||||
close_code = 1000
|
||||
|
||||
def __init__(self, stream):
|
||||
self.stream = stream
|
||||
|
||||
async def send_bytes(self, value):
|
||||
await self.send(value, 'binary')
|
||||
|
||||
async def send_str(self, value):
|
||||
await self.send(value.encode(), 'text')
|
||||
|
||||
async def send(self, value, kind):
|
||||
if len(value) > MAX_MESSAGE:
|
||||
raise ValueError('WebSocket message too large')
|
||||
for offset in range(0, max(1, len(value)), CHUNK):
|
||||
await self.stream.send(
|
||||
'data', value[offset : offset + CHUNK], kind=kind, final=offset + CHUNK >= len(value)
|
||||
)
|
||||
|
||||
def __aiter__(self):
|
||||
return self
|
||||
|
||||
async def __anext__(self):
|
||||
parts, size = [], 0
|
||||
while True:
|
||||
header, data = await self.stream.receive()
|
||||
if header['type'] == 'end':
|
||||
self.close_code = header.get('code', 1000)
|
||||
raise StopAsyncIteration
|
||||
if header['type'] != 'data':
|
||||
raise ConnectionError('Invalid WebSocket relay message')
|
||||
size += len(data)
|
||||
if size > MAX_MESSAGE:
|
||||
raise ValueError('WebSocket message too large')
|
||||
parts.append(data)
|
||||
await self.stream.consumed(len(data))
|
||||
if header.get('final'):
|
||||
value = b''.join(parts)
|
||||
binary = header.get('kind') != 'text'
|
||||
return SimpleNamespace(
|
||||
type=aiohttp.WSMsgType.BINARY if binary else aiohttp.WSMsgType.TEXT,
|
||||
data=value if binary else value.decode(),
|
||||
)
|
||||
|
||||
async def close(self, **kwargs):
|
||||
await self.stream.close()
|
||||
|
||||
|
||||
class RelayClient:
|
||||
def __init__(self, user_id, service):
|
||||
if not user_id:
|
||||
raise HTTPException(403, 'A user is required for Tether.')
|
||||
self.user_id = user_id
|
||||
self.service = get_services([service])[0]
|
||||
self.operations = []
|
||||
|
||||
async def __aenter__(self):
|
||||
return self
|
||||
|
||||
async def __aexit__(self, *_):
|
||||
await self.close()
|
||||
|
||||
async def close(self):
|
||||
await asyncio.gather(*(operation.close() for operation in self.operations), return_exceptions=True)
|
||||
|
||||
def request(self, method, url, **kwargs):
|
||||
return Operation(self._request(method, url, **kwargs))
|
||||
|
||||
def ws_connect(self, url, **kwargs):
|
||||
return Operation(self._request(None, url, **kwargs))
|
||||
|
||||
def __getattr__(self, name):
|
||||
if name in ('get', 'post', 'put', 'patch', 'delete', 'head', 'options'):
|
||||
return lambda url, **kwargs: self.request(name.upper(), url, **kwargs)
|
||||
raise AttributeError(name)
|
||||
|
||||
async def _request(self, method, url, **kwargs):
|
||||
parsed = urlsplit(str(url))
|
||||
if parsed.scheme != 'tether' or not parsed.hostname:
|
||||
raise ValueError('Invalid Tether URL')
|
||||
headers = dict(kwargs.get('headers') or {})
|
||||
headers['X-User-Id'] = self.user_id
|
||||
query = parsed.query
|
||||
if kwargs.get('params'):
|
||||
query += ('&' if query else '') + urlencode(kwargs['params'], doseq=True)
|
||||
stream = await hub.open(self.user_id, parsed.hostname, self.service)
|
||||
body = kwargs.get('data')
|
||||
if 'json' in kwargs:
|
||||
body = json.dumps(kwargs['json']).encode()
|
||||
headers['Content-Type'] = 'application/json'
|
||||
if isinstance(body, aiohttp.FormData):
|
||||
body = body()
|
||||
headers['Content-Type'] = body.headers['Content-Type']
|
||||
upload = None
|
||||
try:
|
||||
await stream.send(
|
||||
'http-open' if method else 'ws-open',
|
||||
service=self.service,
|
||||
method=method,
|
||||
path=parsed.path or '/',
|
||||
query=query,
|
||||
headers=headers,
|
||||
)
|
||||
if method:
|
||||
|
||||
async def write(data):
|
||||
for offset in range(0, len(data), CHUNK):
|
||||
await stream.send('data', data[offset : offset + CHUNK])
|
||||
|
||||
async def upload_body():
|
||||
try:
|
||||
if isinstance(body, str):
|
||||
await write(body.encode())
|
||||
elif isinstance(body, (bytes, bytearray)):
|
||||
await write(body)
|
||||
elif isinstance(body, aiohttp.payload.Payload):
|
||||
await body.write(SimpleNamespace(write=write))
|
||||
elif body is not None:
|
||||
async for data in body:
|
||||
await write(data)
|
||||
await stream.send('end')
|
||||
except asyncio.CancelledError:
|
||||
raise
|
||||
except Exception:
|
||||
stream.fail('Upload interrupted; completion may be unknown')
|
||||
|
||||
upload = asyncio.create_task(upload_body())
|
||||
header, _ = await asyncio.wait_for(stream.receive(), 30)
|
||||
if method and header['type'] == 'http-response':
|
||||
result = RelayResponse(stream, header, upload)
|
||||
elif not method and header['type'] == 'ws-ready':
|
||||
result = RelaySocket(stream)
|
||||
else:
|
||||
raise ConnectionError('Unexpected relay handshake')
|
||||
self.operations.append(result)
|
||||
return result
|
||||
except BaseException as error:
|
||||
if upload:
|
||||
upload.cancel()
|
||||
await asyncio.gather(upload, return_exceptions=True)
|
||||
await stream.close()
|
||||
if isinstance(error, (OSError, TimeoutError)) and not isinstance(error, RelayInterrupted):
|
||||
raise RelayInterrupted(str(error) or 'Response timed out') from error
|
||||
raise
|
||||
|
||||
|
||||
def get_terminal_client(url, user_id=None, **kwargs):
|
||||
if str(url).startswith('tether://'):
|
||||
return RelayClient(user_id, service='open_terminal')
|
||||
return aiohttp.ClientSession(**kwargs)
|
||||
|
|
@ -125,6 +125,7 @@ from open_webui.utils.plugin import (
|
|||
load_tool_module_by_id,
|
||||
set_tool_module_in_cache,
|
||||
)
|
||||
from open_webui.utils.tether import RelayInterrupted, get_terminal_connections, get_terminal_client
|
||||
from open_webui.utils.terminals import (
|
||||
TERMINAL_CONTEXT_HEADER,
|
||||
get_terminal_server_url,
|
||||
|
|
@ -1370,7 +1371,7 @@ async def get_terminal_cwd(
|
|||
"""Fetch the current working directory from a terminal server."""
|
||||
try:
|
||||
cwd_url = f'{base_url.rstrip("/")}/files/cwd'
|
||||
async with aiohttp.ClientSession(
|
||||
async with get_terminal_client(base_url, headers.get('X-User-Id'),
|
||||
timeout=aiohttp.ClientTimeout(total=5),
|
||||
trust_env=True,
|
||||
) as session:
|
||||
|
|
@ -1398,7 +1399,7 @@ async def get_terminal_system_prompt(
|
|||
"""
|
||||
base = base_url.rstrip('/')
|
||||
try:
|
||||
async with aiohttp.ClientSession(
|
||||
async with get_terminal_client(base_url, headers.get('X-User-Id'),
|
||||
timeout=aiohttp.ClientTimeout(total=3),
|
||||
trust_env=True,
|
||||
) as session:
|
||||
|
|
@ -1442,11 +1443,16 @@ async def set_terminal_servers(request: Request):
|
|||
|
||||
base_url = get_terminal_server_url(connection)
|
||||
|
||||
# Spec discovery has no user, so Session connections use the orchestrator key
|
||||
auth_type = connection.get('auth_type', 'bearer')
|
||||
if auth_type == 'session':
|
||||
auth_type = 'bearer'
|
||||
|
||||
server_configs.append(
|
||||
{
|
||||
'url': base_url,
|
||||
'key': normalize_bearer_token(connection.get('key', '')),
|
||||
'auth_type': connection.get('auth_type', 'bearer'),
|
||||
'auth_type': auth_type,
|
||||
'path': connection.get('path', '/openapi.json'),
|
||||
'spec_type': 'url',
|
||||
# get_tool_servers_data reads config.enable to filter active servers
|
||||
|
|
@ -1532,7 +1538,7 @@ async def get_terminal_tools(
|
|||
if not ENABLE_TOOL_SERVERS:
|
||||
return {}
|
||||
|
||||
connections = await Config.get('terminal_server.connections', []) or []
|
||||
connections = await get_terminal_connections(user)
|
||||
connection = next(
|
||||
(terminal_connection for terminal_connection in connections if terminal_connection.get('id') == terminal_id),
|
||||
None,
|
||||
|
|
@ -1547,8 +1553,14 @@ async def get_terminal_tools(
|
|||
raise RuntimeError(f'Access denied to terminal {terminal_id}')
|
||||
|
||||
# Find the cached spec data for this terminal
|
||||
terminal_servers = await get_terminal_servers(request)
|
||||
server_data = next((server for server in terminal_servers if server.get('id') == terminal_id), None)
|
||||
if connection.get('owner_id') == user.id:
|
||||
url = connection['url']
|
||||
openapi = await get_tool_server_data(url + '/openapi.json', {'X-User-Id': user.id})
|
||||
server_data = {'id': terminal_id, 'url': url, 'openapi': openapi,
|
||||
'specs': convert_openapi_to_tool_payload(openapi)}
|
||||
else:
|
||||
terminal_servers = await get_terminal_servers(request)
|
||||
server_data = next((server for server in terminal_servers if server.get('id') == terminal_id), None)
|
||||
if server_data is None:
|
||||
raise RuntimeError(f"Terminal server '{terminal_id}' is unavailable")
|
||||
|
||||
|
|
@ -1658,7 +1670,7 @@ async def get_tool_server_data(url: str, headers: dict | None) -> dict[str, Any]
|
|||
error = None
|
||||
try:
|
||||
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA)
|
||||
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
|
||||
async with get_terminal_client(url, _headers.get('X-User-Id'), timeout=timeout, trust_env=True) as session:
|
||||
async with session.get(url, headers=_headers, ssl=AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL) as response:
|
||||
if response.status != 200:
|
||||
error_body = await response.json()
|
||||
|
|
@ -1899,7 +1911,7 @@ async def execute_tool_server(
|
|||
else:
|
||||
body_params = params
|
||||
|
||||
async with aiohttp.ClientSession(
|
||||
async with get_terminal_client(url, (headers or {}).get('X-User-Id'),
|
||||
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER)
|
||||
) as session:
|
||||
request_method = getattr(session, http_method.lower())
|
||||
|
|
@ -1956,6 +1968,8 @@ async def execute_tool_server(
|
|||
response_headers = response.headers
|
||||
return (response_data, response_headers)
|
||||
|
||||
except RelayInterrupted as err:
|
||||
return (err.result(), None)
|
||||
except Exception as err:
|
||||
error = str(err)
|
||||
log.warning(f'API Request Error: {error}')
|
||||
|
|
|
|||
12
package-lock.json
generated
12
package-lock.json
generated
|
|
@ -105,7 +105,7 @@
|
|||
"svelte-sonner": "^0.3.19",
|
||||
"three": "0.186.1",
|
||||
"tippy.js": "^6.3.7",
|
||||
"turndown": "^7.2.0",
|
||||
"turndown": "^7.2.5",
|
||||
"turndown-plugin-gfm": "^1.0.2",
|
||||
"undici": "^7.28.0",
|
||||
"uuid": "^11.1.1",
|
||||
|
|
@ -14715,12 +14715,16 @@
|
|||
}
|
||||
},
|
||||
"node_modules/turndown": {
|
||||
"version": "7.2.2",
|
||||
"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz",
|
||||
"integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==",
|
||||
"version": "7.2.5",
|
||||
"resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.5.tgz",
|
||||
"integrity": "sha512-EKZvCCFHh8sWttpAMs10U6niZFJ2cpz8LkCPlylxoG4JcHF50J7EHnnBW3AY1qXtUMu7kDjCp7dnggB1sIbqEQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@mixmark-io/domino": "^2.2.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=18",
|
||||
"npm": ">=9"
|
||||
}
|
||||
},
|
||||
"node_modules/turndown-plugin-gfm": {
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@
|
|||
"svelte-sonner": "^0.3.19",
|
||||
"three": "0.186.1",
|
||||
"tippy.js": "^6.3.7",
|
||||
"turndown": "^7.2.0",
|
||||
"turndown": "^7.2.5",
|
||||
"turndown-plugin-gfm": "^1.0.2",
|
||||
"undici": "^7.28.0",
|
||||
"uuid": "^11.1.1",
|
||||
|
|
|
|||
21
src/app.d.ts
vendored
21
src/app.d.ts
vendored
|
|
@ -1,6 +1,27 @@
|
|||
// See https://kit.svelte.dev/docs/types#app
|
||||
// for information about these interfaces
|
||||
declare global {
|
||||
interface Window {
|
||||
tether?: {
|
||||
version: 1;
|
||||
isFocused?(): Promise<boolean>;
|
||||
focus?(): Promise<void>;
|
||||
onEvent?(
|
||||
callback: (
|
||||
event:
|
||||
| import('$lib/stores').TetherEvent
|
||||
| { type: 'theme:update'; data: { theme: 'system' | 'light' | 'dark' } }
|
||||
) => Promise<void>
|
||||
): () => void;
|
||||
signedIn(token: string): Promise<{ token: string; expiresAt: number | null }>;
|
||||
refresh(force?: boolean): Promise<{ token: string; expiresAt: number | null } | null>;
|
||||
signedOut(): Promise<void>;
|
||||
onToken(
|
||||
callback: (access: { token: string; expiresAt: number | null } | null) => void
|
||||
): () => void;
|
||||
};
|
||||
}
|
||||
|
||||
class AudioWorkletProcessor {
|
||||
readonly port: MessagePort;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -380,12 +380,16 @@ export const userSignUp = async (
|
|||
};
|
||||
|
||||
export const userSignOut = async () => {
|
||||
const token = localStorage.getItem('token');
|
||||
// Stop local access even if the hosted server cannot be reached.
|
||||
await window.tether?.signedOut();
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/auths/signout`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
'Content-Type': 'application/json',
|
||||
...(token ? { Authorization: `Bearer ${token}` } : {})
|
||||
},
|
||||
credentials: 'include'
|
||||
})
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ export function openTerminalSocket(
|
|||
connection: TerminalConnection,
|
||||
chatId: string | null,
|
||||
path: string,
|
||||
onOpen?: (socket: WebSocket) => void
|
||||
onOpen?: (socket: WebSocket) => void,
|
||||
resume?: { resume: true; cursor: number }
|
||||
) {
|
||||
const url = new URL(`${connection.baseUrl.replace(/\/$/, '')}${path}`, location.href);
|
||||
url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
||||
|
|
@ -47,7 +48,12 @@ export function openTerminalSocket(
|
|||
socket.binaryType = 'arraybuffer';
|
||||
socket.onopen = () => {
|
||||
socket.send(
|
||||
JSON.stringify({ type: 'auth', token: connection.key.trim(), chat_id: chatId ?? '' })
|
||||
JSON.stringify({
|
||||
...resume,
|
||||
type: 'auth',
|
||||
token: connection.key.trim(),
|
||||
chat_id: chatId ?? ''
|
||||
})
|
||||
);
|
||||
onOpen?.(socket);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1061,20 +1061,23 @@
|
|||
</div>
|
||||
|
||||
<div class="flex flex-1 items-center">
|
||||
{#if auth_type === 'bearer'}
|
||||
<SensitiveInput
|
||||
bind:value={key}
|
||||
placeholder={$i18n.t('API Key')}
|
||||
required={false}
|
||||
/>
|
||||
{#if auth_type === 'bearer' || auth_type === 'session'}
|
||||
<div class="flex flex-col w-full gap-1">
|
||||
<SensitiveInput
|
||||
bind:value={key}
|
||||
placeholder={$i18n.t('API Key')}
|
||||
required={false}
|
||||
/>
|
||||
{#if auth_type === 'session'}
|
||||
<div class={`text-xs text-gray-500`}>
|
||||
{$i18n.t('Forwards system user session credentials to authenticate')}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{:else if auth_type === 'none'}
|
||||
<div class={`text-xs self-center translate-y-[1px] text-gray-500`}>
|
||||
{$i18n.t('No authentication')}
|
||||
</div>
|
||||
{:else if auth_type === 'session'}
|
||||
<div class={`text-xs self-center translate-y-[1px] text-gray-500`}>
|
||||
{$i18n.t('Forwards system user session credentials to authenticate')}
|
||||
</div>
|
||||
{:else if auth_type === 'system_oauth'}
|
||||
<div class={`text-xs self-center translate-y-[1px] text-gray-500`}>
|
||||
{$i18n.t('Forwards system user OAuth access token to authenticate')}
|
||||
|
|
|
|||
|
|
@ -224,6 +224,7 @@
|
|||
};
|
||||
|
||||
const sttModelUpdateHandler = async () => {
|
||||
if (STT_WHISPER_MODEL_LOADING) return;
|
||||
STT_WHISPER_MODEL_LOADING = true;
|
||||
await updateConfigHandler();
|
||||
STT_WHISPER_MODEL_LOADING = false;
|
||||
|
|
@ -652,12 +653,12 @@
|
|||
bind:value={STT_WHISPER_MODEL}
|
||||
/>
|
||||
<button
|
||||
class="flex h-7 w-7 shrink-0 items-center justify-center rounded-lg text-gray-500 transition-colors hover:bg-black/5 hover:text-gray-900 disabled:opacity-50 dark:text-gray-500 dark:hover:bg-white/5 dark:hover:text-white"
|
||||
class="flex h-7 w-7 shrink-0 items-center justify-center rounded-lg text-gray-500 transition-colors hover:bg-black/5 hover:text-gray-900 aria-disabled:opacity-50 dark:text-gray-500 dark:hover:bg-white/5 dark:hover:text-white"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
sttModelUpdateHandler();
|
||||
}}
|
||||
disabled={STT_WHISPER_MODEL_LOADING}
|
||||
aria-disabled={STT_WHISPER_MODEL_LOADING}
|
||||
aria-label={$i18n.t('settings.admin.audio.updateModel.label')}
|
||||
>
|
||||
{#if STT_WHISPER_MODEL_LOADING}
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@
|
|||
'w-full rounded-lg border border-gray-100/50 bg-gray-50/40 px-2 py-1.5 text-xs text-gray-700 outline-hidden transition-colors placeholder:text-gray-300 focus:border-blue-400 dark:border-white/[0.04] dark:bg-white/[0.03] dark:text-gray-300 dark:placeholder:text-gray-700 dark:focus:border-blue-500';
|
||||
|
||||
const embeddingModelUpdateHandler = async () => {
|
||||
if (updateEmbeddingModelLoading) return;
|
||||
if (RAG_EMBEDDING_ENGINE === '' && RAG_EMBEDDING_MODEL.split('/').length - 1 > 1) {
|
||||
toast.error(
|
||||
$i18n.t(
|
||||
|
|
@ -1250,7 +1251,7 @@
|
|||
on:click={() => {
|
||||
embeddingModelUpdateHandler();
|
||||
}}
|
||||
disabled={updateEmbeddingModelLoading}
|
||||
aria-disabled={updateEmbeddingModelLoading}
|
||||
aria-label={$i18n.t('settings.admin.documents.updateEmbeddingModel.label')}
|
||||
>
|
||||
{#if updateEmbeddingModelLoading}
|
||||
|
|
|
|||
|
|
@ -232,7 +232,8 @@
|
|||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full text-sm bg-transparent disabled:text-gray-500 dark:disabled:text-gray-500 outline-hidden"
|
||||
type="email"
|
||||
type="text"
|
||||
inputmode="email"
|
||||
bind:value={_user.email}
|
||||
aria-label={$i18n.t('Email')}
|
||||
placeholder={$i18n.t('Enter Your Email')}
|
||||
|
|
|
|||
|
|
@ -240,7 +240,8 @@
|
|||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full text-sm bg-transparent disabled:text-gray-500 dark:disabled:text-gray-500 outline-hidden"
|
||||
type="email"
|
||||
type="text"
|
||||
inputmode="email"
|
||||
bind:value={_user.email}
|
||||
aria-label={$i18n.t('Email')}
|
||||
placeholder={$i18n.t('Enter Your Email')}
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@
|
|||
};
|
||||
|
||||
const runNowHandler = async () => {
|
||||
if (loading) return;
|
||||
loading = true;
|
||||
const res = await runAutomationById(localStorage.token, automation.id).catch((err) => {
|
||||
toast.error(`${err}`);
|
||||
|
|
|
|||
|
|
@ -32,10 +32,10 @@
|
|||
|
||||
<Tooltip content={$i18n.t('Run now')}>
|
||||
<button
|
||||
class="flex size-7 items-center justify-center text-gray-400 transition disabled:opacity-60"
|
||||
class="flex size-7 items-center justify-center text-gray-400 transition aria-disabled:opacity-60"
|
||||
on:click={runNowHandler}
|
||||
type="button"
|
||||
disabled={loading}
|
||||
aria-disabled={loading}
|
||||
aria-label={$i18n.t('Run now')}
|
||||
>
|
||||
{#if loading}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
import { toast } from 'svelte-sonner';
|
||||
|
||||
import { onDestroy, onMount, tick } from 'svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import { goto, onNavigate } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import type { Socket } from 'socket.io-client';
|
||||
|
|
@ -98,6 +98,13 @@
|
|||
let replyToMessage = null;
|
||||
let threadId: any = null;
|
||||
|
||||
onNavigate(({ from, to }) => {
|
||||
if (from?.url.pathname !== to.url.pathname) {
|
||||
threadId = null;
|
||||
return tick();
|
||||
}
|
||||
});
|
||||
|
||||
let typingUsers = [];
|
||||
let typingUsersTimeout = {};
|
||||
|
||||
|
|
@ -180,12 +187,14 @@
|
|||
typingUsers = [];
|
||||
typingUsersTimeout = {};
|
||||
|
||||
const messagesRequest = getChannelMessages(localStorage.token, id, 0).catch(() => null);
|
||||
|
||||
channel = await getChannelById(localStorage.token, id).catch((error) => {
|
||||
return null;
|
||||
});
|
||||
|
||||
if (channel) {
|
||||
messages = await getChannelMessages(localStorage.token, id, 0);
|
||||
messages = await messagesRequest;
|
||||
|
||||
if (messages) {
|
||||
scrollToBottom();
|
||||
|
|
|
|||
|
|
@ -96,8 +96,8 @@
|
|||
type="button"
|
||||
role="menuitemradio"
|
||||
aria-checked={!isMuted}
|
||||
disabled={saving}
|
||||
class="disabled:opacity-50"
|
||||
aria-disabled={saving}
|
||||
class="aria-disabled:opacity-50"
|
||||
on:click={() => setMuted(false)}
|
||||
>
|
||||
<AppNotification className="size-3.5 shrink-0" />
|
||||
|
|
@ -110,8 +110,8 @@
|
|||
type="button"
|
||||
role="menuitemradio"
|
||||
aria-checked={isMuted}
|
||||
disabled={saving}
|
||||
class="disabled:opacity-50"
|
||||
aria-disabled={saving}
|
||||
class="aria-disabled:opacity-50"
|
||||
on:click={() => setMuted(true)}
|
||||
>
|
||||
<BellSlash className="size-3.5 shrink-0" />
|
||||
|
|
|
|||
|
|
@ -1153,9 +1153,7 @@
|
|||
isTerminalAvailable(terminalId) &&
|
||||
currentModels.every((model) => model.info?.meta?.terminalId === terminalId)
|
||||
? terminalId
|
||||
: preserveSelections
|
||||
? null
|
||||
: $selectedTerminalId
|
||||
: $selectedTerminalId
|
||||
};
|
||||
|
||||
if (preserveSelections) {
|
||||
|
|
@ -1168,7 +1166,10 @@
|
|||
codeInterpreterEnabled,
|
||||
terminalId: $selectedTerminalId
|
||||
};
|
||||
modelDefaults ??= structuredClone(defaults);
|
||||
if (!modelDefaults) {
|
||||
modelDefaults = structuredClone(defaults);
|
||||
defaultsModelIds = modelIds;
|
||||
}
|
||||
for (const key of Object.keys(defaults)) {
|
||||
const previous = modelDefaults[key];
|
||||
if (Array.isArray(previous)) {
|
||||
|
|
@ -1181,7 +1182,10 @@
|
|||
defaults[key] = [
|
||||
...new Set([...defaults[key].filter((id: string) => !removed.includes(id)), ...added])
|
||||
];
|
||||
} else if (current[key] !== previous) {
|
||||
} else if (
|
||||
(key !== 'terminalId' || equal(modelIds, defaultsModelIds)) &&
|
||||
current[key] !== previous
|
||||
) {
|
||||
defaults[key] = current[key];
|
||||
} else {
|
||||
modelDefaults[key] = defaults[key];
|
||||
|
|
@ -2874,36 +2878,38 @@
|
|||
if (chatInputPrompt !== null) messageInput?.setText(chatInputPrompt);
|
||||
if (modelSearch) await openModelSelectorWithSearch(modelSearch);
|
||||
|
||||
// Consume one-shot desktop event (e.g. Spotlight query, call shortcut)
|
||||
if ($desktopEvent) {
|
||||
// Consume call requests or the acknowledged Tether handoff.
|
||||
if ($desktopEvent && (!$desktopEvent.handoff || !embedded)) {
|
||||
const event = $desktopEvent;
|
||||
desktopEvent.set(null);
|
||||
|
||||
if (event.type === 'call') {
|
||||
if (event.handoff && !event.handoff.isCurrent()) {
|
||||
event.handoff.complete('The signed-in account changed. Try again from Tether.');
|
||||
} else if (event.type === 'call' || event.type === 'voice') {
|
||||
openCallOverlay();
|
||||
event.handoff?.complete(
|
||||
$showCallOverlay
|
||||
? undefined
|
||||
: 'Voice mode is unavailable. Check your model, permissions and voice settings in WebUI.'
|
||||
);
|
||||
} else if (event.type === 'query') {
|
||||
const query = event.data?.query;
|
||||
const eventFiles = event.data?.files;
|
||||
|
||||
// Attach screenshot images from desktop (e.g. Spotlight region capture)
|
||||
if (eventFiles?.length) {
|
||||
for (const ef of eventFiles) {
|
||||
files = [
|
||||
...files,
|
||||
{
|
||||
type: 'image',
|
||||
url: ef.dataUrl,
|
||||
name: ef.name
|
||||
}
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (query) {
|
||||
messageInput?.setTextHandler(query, () => submitHandler(prompt));
|
||||
} else if (eventFiles?.length) {
|
||||
if (!messageInput) {
|
||||
event.handoff.complete('The WebUI composer is not ready. Send again from Spotlight.');
|
||||
} else {
|
||||
// Replace the restored new-chat draft; do not mix in its old attachments.
|
||||
files = event.data.files.map((file) => ({
|
||||
type: 'image',
|
||||
url: file.dataUrl,
|
||||
name: file.name
|
||||
}));
|
||||
messageInput.setText(event.data.query ?? '');
|
||||
await tick();
|
||||
submitHandler('');
|
||||
if (event.handoff.isCurrent()) {
|
||||
event.handoff.complete();
|
||||
void submitHandler(event.data.query ?? '');
|
||||
} else {
|
||||
event.handoff.complete('The handoff expired. Send again from Spotlight.');
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if ($page.url.searchParams.get('q')) {
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@
|
|||
$: mainChatActive = fullWidth && tabs.activeId === mainChatTabId;
|
||||
$: if (fullWidth !== tabs.tabs.some((tab) => tab.id === mainChatTabId)) {
|
||||
tabs = setFullWidthTabs(tabs, fullWidth, title);
|
||||
if (fullWidth) void tick().then(() => document.getElementById(domId(mainChatTabId))?.focus());
|
||||
if (fullWidth) void tick().then(() => document.getElementById(domId(tabs.activeId))?.focus());
|
||||
}
|
||||
const toggleLayout = async () => {
|
||||
if (panelTarget) releasePanel(panelTarget);
|
||||
|
|
@ -648,6 +648,7 @@
|
|||
];
|
||||
if (terminalFilesAvailable || (!hasOpenedTabs && showFilesTab)) openFiles();
|
||||
else if (options.length === 1) options[0]();
|
||||
else if (!options.length) showTabs.set(false);
|
||||
hasOpenedTabs = true;
|
||||
}
|
||||
$: if (
|
||||
|
|
|
|||
|
|
@ -181,10 +181,13 @@
|
|||
}
|
||||
};
|
||||
socket.onmessage = async (event) => {
|
||||
if (disposed || socket !== channel) return;
|
||||
try {
|
||||
if (event.data instanceof ArrayBuffer) {
|
||||
// A frame can arrive before navigation state is available.
|
||||
transport = 'frames';
|
||||
await tick();
|
||||
if (disposed || socket !== channel) return;
|
||||
if (disposed || socket !== channel || transport !== 'frames') return;
|
||||
await frames.draw(event.data);
|
||||
if (disposed || socket !== channel) return;
|
||||
command('frameAck');
|
||||
|
|
|
|||
|
|
@ -358,7 +358,7 @@
|
|||
|
||||
{#if status?.is_repo}
|
||||
<section
|
||||
class="git-panel relative shrink-0 border-t border-gray-100/50 dark:border-white/2"
|
||||
class="git-panel relative shrink-0 border-t border-gray-50 dark:border-gray-850/30"
|
||||
aria-label={$i18n.t('Git')}
|
||||
>
|
||||
{#if expanded}
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ export function setFullWidthTabs(state: PanelTabs, fullWidth: boolean, label = '
|
|||
if (state.tabs.some((tab) => tab.id === mainChatTabId)) return state;
|
||||
return activateTab(
|
||||
{ ...state, tabs: [{ id: mainChatTabId, kind: 'chat', label }, ...state.tabs] },
|
||||
mainChatTabId
|
||||
state.activeId || mainChatTabId
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@
|
|||
|
||||
// Directory and preview state belong to this tab, including its terminal connection.
|
||||
let savedPath = '/';
|
||||
// savedPath is only a placeholder until a directory has loaded.
|
||||
let savedPathLoaded = false;
|
||||
let savedFileRoot: TerminalFileRoot | null = null;
|
||||
const treeExpandedCache = new Map<string, string[]>();
|
||||
const treeContentsCache = new Map<string, [string, FileEntry[]][]>();
|
||||
|
|
@ -706,7 +708,7 @@
|
|||
}
|
||||
// Chat just got created (null → real ID): persist the current
|
||||
// browsed path as the new session's cwd — don't re-fetch.
|
||||
setCwd(terminal.url, terminal.key, savedPath, chatId);
|
||||
if (savedPathLoaded) setCwd(terminal.url, terminal.key, savedPath, chatId);
|
||||
} else if (terminalChanged || chatChanged) {
|
||||
++loadGeneration;
|
||||
openedFile = null;
|
||||
|
|
@ -1032,6 +1034,7 @@
|
|||
}
|
||||
currentPath = directory;
|
||||
savedPath = directory;
|
||||
savedPathLoaded = true;
|
||||
pushNavHistory(directory);
|
||||
|
||||
const result = await listFiles(terminal.url, terminal.key, directory, chatId ?? undefined);
|
||||
|
|
|
|||
|
|
@ -266,6 +266,39 @@
|
|||
|
||||
let showTerminalMenu = false;
|
||||
|
||||
function fitControlLabels(controls: HTMLElement) {
|
||||
let frame: number;
|
||||
const scheduleMeasure = () => {
|
||||
cancelAnimationFrame(frame);
|
||||
frame = requestAnimationFrame(() => {
|
||||
const labels = controls.querySelectorAll<HTMLElement>('[data-input-label]');
|
||||
// Measure all labels together so separate controls cannot compete for the same space.
|
||||
for (const label of labels) label.style.display = '';
|
||||
if (controls.scrollWidth > controls.clientWidth) {
|
||||
for (const label of labels) label.style.display = 'none';
|
||||
}
|
||||
});
|
||||
};
|
||||
const observer = new ResizeObserver(scheduleMeasure);
|
||||
const observeControls = () => {
|
||||
observer.disconnect();
|
||||
observer.observe(controls);
|
||||
for (const child of controls.children) observer.observe(child);
|
||||
scheduleMeasure();
|
||||
};
|
||||
const mutations = new MutationObserver(observeControls);
|
||||
mutations.observe(controls, { childList: true, subtree: true, characterData: true });
|
||||
observeControls();
|
||||
|
||||
return {
|
||||
destroy() {
|
||||
cancelAnimationFrame(frame);
|
||||
observer.disconnect();
|
||||
mutations.disconnect();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export let messageQueue: { id: string; prompt: string; files: any[]; error?: string }[] = [];
|
||||
export let onQueueSendNow: (id: string) => void = () => {};
|
||||
export let onQueueEdit: (id: string) => void = () => {};
|
||||
|
|
@ -2607,7 +2640,10 @@
|
|||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-1 items-center min-w-0 overflow-x-auto scrollbar-none">
|
||||
<div
|
||||
use:fitControlLabels
|
||||
class="flex flex-1 items-center min-w-0 overflow-x-auto scrollbar-none"
|
||||
>
|
||||
{#if selectedModelIds.length === 1 && $models.find((m) => m.id === selectedModelIds[0])?.has_user_valves && ($_user?.role === 'admin' || ($_user?.permissions?.chat?.valves ?? true))}
|
||||
<div class="ml-1 flex gap-1.5 shrink-0">
|
||||
<Tooltip content={$i18n.t('Valves')} placement="top">
|
||||
|
|
@ -2645,7 +2681,7 @@
|
|||
>
|
||||
<Wrench className="size-4" strokeWidth="1.75" />
|
||||
|
||||
<span class="text-sm">
|
||||
<span data-input-label class="text-sm">
|
||||
{(selectedToolIds ?? []).length}
|
||||
</span>
|
||||
</button>
|
||||
|
|
@ -2668,7 +2704,7 @@
|
|||
>
|
||||
<Cube className="size-4" strokeWidth="1.75" />
|
||||
|
||||
<span class="text-sm">
|
||||
<span data-input-label class="text-sm">
|
||||
{(selectedSkillIds ?? []).length}
|
||||
</span>
|
||||
</button>
|
||||
|
|
@ -2759,9 +2795,6 @@
|
|||
: 'bg-transparent text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 '}"
|
||||
>
|
||||
<GlobeAlt className="size-4" strokeWidth="1.75" />
|
||||
<div class="hidden group-hover:block">
|
||||
<XMark className="size-4" strokeWidth="1.75" />
|
||||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
|
@ -2779,9 +2812,6 @@
|
|||
: 'bg-transparent text-gray-600 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 '}"
|
||||
>
|
||||
<Photo className="size-4" strokeWidth="1.75" />
|
||||
<div class="hidden group-hover:block">
|
||||
<XMark className="size-4" strokeWidth="1.75" />
|
||||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
|
@ -2804,10 +2834,6 @@
|
|||
: 'focus:outline-hidden rounded-full'}"
|
||||
>
|
||||
<Terminal className="size-3.5" strokeWidth="2" />
|
||||
|
||||
<div class="hidden group-hover:block">
|
||||
<XMark className="size-4" strokeWidth="1.75" />
|
||||
</div>
|
||||
</button>
|
||||
</Tooltip>
|
||||
{/if}
|
||||
|
|
|
|||
|
|
@ -135,18 +135,18 @@
|
|||
|
||||
<div class="flex items-center translate-x-0.5">
|
||||
{#if disabled}
|
||||
<Tooltip content={$i18n.t('Terminal')} placement="top">
|
||||
<Tooltip content={selectedLabel} placement="top">
|
||||
<button
|
||||
type="button"
|
||||
disabled
|
||||
aria-disabled="true"
|
||||
aria-label={$selectedTerminalId && selectedLabel ? undefined : $i18n.t('Terminal')}
|
||||
aria-label={selectedLabel}
|
||||
class={triggerClass}
|
||||
>
|
||||
<Cloud className="size-3.5" strokeWidth="2" />
|
||||
|
||||
{#if $selectedTerminalId && selectedLabel}
|
||||
<span class="truncate text-[0.8125rem] max-w-[6.25rem] sm:max-w-[9.375rem]"
|
||||
<span data-input-label class="truncate text-[0.8125rem] max-w-[9.375rem]"
|
||||
>{selectedLabel}</span
|
||||
>
|
||||
{/if}
|
||||
|
|
@ -154,16 +154,12 @@
|
|||
</Tooltip>
|
||||
{:else}
|
||||
<Dropdown bind:show align="start">
|
||||
<Tooltip content={$i18n.t('Terminal')} placement="top">
|
||||
<button
|
||||
type="button"
|
||||
aria-label={$selectedTerminalId && selectedLabel ? undefined : $i18n.t('Terminal')}
|
||||
class={triggerClass}
|
||||
>
|
||||
<Tooltip content={selectedLabel} placement="top">
|
||||
<button type="button" aria-label={selectedLabel} class={triggerClass}>
|
||||
<Cloud className="size-3.5" strokeWidth="2" />
|
||||
|
||||
{#if $selectedTerminalId && selectedLabel}
|
||||
<span class="truncate text-[0.8125rem] max-w-[6.25rem] sm:max-w-[9.375rem]"
|
||||
<span data-input-label class="truncate text-[0.8125rem] max-w-[9.375rem]"
|
||||
>{selectedLabel}</span
|
||||
>
|
||||
{/if}
|
||||
|
|
|
|||
|
|
@ -251,8 +251,11 @@
|
|||
};
|
||||
|
||||
const showPreviousMessage = async (message) => {
|
||||
const refocus = document.activeElement?.classList.contains('previous-message-button');
|
||||
let messageId = message.id;
|
||||
|
||||
if (message.parentId !== null) {
|
||||
let messageId =
|
||||
messageId =
|
||||
history.messages[message.parentId].childrenIds[
|
||||
Math.max(history.messages[message.parentId].childrenIds.indexOf(message.id) - 1, 0)
|
||||
];
|
||||
|
|
@ -264,7 +267,7 @@
|
|||
let childrenIds = Object.values(history.messages)
|
||||
.filter((message) => message.parentId === null)
|
||||
.map((message) => message.id);
|
||||
let messageId = childrenIds[Math.max(childrenIds.indexOf(message.id) - 1, 0)];
|
||||
messageId = childrenIds[Math.max(childrenIds.indexOf(message.id) - 1, 0)];
|
||||
|
||||
if (message.id !== messageId) {
|
||||
history.currentId = getDeepestChildId(history, messageId);
|
||||
|
|
@ -273,6 +276,12 @@
|
|||
|
||||
await tick();
|
||||
|
||||
if (refocus) {
|
||||
document
|
||||
.querySelector<HTMLElement>(`#message-${messageId} .previous-message-button`)
|
||||
?.focus();
|
||||
}
|
||||
|
||||
if ($settings?.scrollOnBranchChange ?? true) {
|
||||
const element = getMessagesContainer();
|
||||
autoScroll = element
|
||||
|
|
@ -286,8 +295,11 @@
|
|||
};
|
||||
|
||||
const showNextMessage = async (message) => {
|
||||
const refocus = document.activeElement?.classList.contains('next-message-button');
|
||||
let messageId = message.id;
|
||||
|
||||
if (message.parentId !== null) {
|
||||
let messageId =
|
||||
messageId =
|
||||
history.messages[message.parentId].childrenIds[
|
||||
Math.min(
|
||||
history.messages[message.parentId].childrenIds.indexOf(message.id) + 1,
|
||||
|
|
@ -302,7 +314,7 @@
|
|||
let childrenIds = Object.values(history.messages)
|
||||
.filter((message) => message.parentId === null)
|
||||
.map((message) => message.id);
|
||||
let messageId =
|
||||
messageId =
|
||||
childrenIds[Math.min(childrenIds.indexOf(message.id) + 1, childrenIds.length - 1)];
|
||||
|
||||
if (message.id !== messageId) {
|
||||
|
|
@ -312,6 +324,10 @@
|
|||
|
||||
await tick();
|
||||
|
||||
if (refocus) {
|
||||
document.querySelector<HTMLElement>(`#message-${messageId} .next-message-button`)?.focus();
|
||||
}
|
||||
|
||||
if ($settings?.scrollOnBranchChange ?? true) {
|
||||
const element = getMessagesContainer();
|
||||
autoScroll = element
|
||||
|
|
|
|||
|
|
@ -315,7 +315,7 @@
|
|||
{#each allEmbeds as embedItem, idx}
|
||||
<div id={`${id}-embed-${idx}`}>
|
||||
{#if typeof embedItem.embed === 'object' && embedItem.embed?.type === 'mcp_app'}
|
||||
{#key embedItem.embed}<MCPApp app={embedItem.embed} />{/key}
|
||||
{#key JSON.stringify(embedItem.embed)}<MCPApp app={embedItem.embed} />{/key}
|
||||
{:else if typeof embedItem.embed === 'string'}
|
||||
<FullHeightIframe
|
||||
src={embedItem.embed}
|
||||
|
|
|
|||
|
|
@ -210,6 +210,7 @@
|
|||
$: hasResponseContent = Boolean((message.content ?? '').trim() || message.output?.length);
|
||||
|
||||
let edit = false;
|
||||
let editButtonElement: HTMLButtonElement;
|
||||
let editedContent = '';
|
||||
let editedOutput: any[] | null = null;
|
||||
let editTextAreaElement: HTMLTextAreaElement;
|
||||
|
|
@ -476,11 +477,13 @@
|
|||
editedContent = '';
|
||||
editedOutput = null;
|
||||
await tick();
|
||||
editButtonElement?.focus();
|
||||
};
|
||||
|
||||
let feedbackLoading = false;
|
||||
|
||||
const feedbackHandler = async (rating: number | null = null, details: object | null = null) => {
|
||||
if (feedbackLoading && rating !== null) return;
|
||||
feedbackLoading = true;
|
||||
console.log('Feedback', rating, details);
|
||||
|
||||
|
|
@ -761,7 +764,7 @@
|
|||
{#each message.embeds as embed, idx}
|
||||
<div class="my-2 w-full" id={`${message.id}-embeds-${idx}`}>
|
||||
{#if typeof embed === 'object' && embed?.type === 'mcp_app'}
|
||||
{#key embed}<MCPApp app={embed} />{/key}
|
||||
{#key JSON.stringify(embed)}<MCPApp app={embed} />{/key}
|
||||
{:else if typeof embed === 'string'}
|
||||
<FullHeightIframe
|
||||
src={embed}
|
||||
|
|
@ -1022,7 +1025,7 @@
|
|||
<div class="flex self-center min-w-fit" dir="ltr">
|
||||
<button
|
||||
aria-label={$i18n.t('Previous message')}
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition previous-message-button"
|
||||
on:click={() => {
|
||||
showPreviousMessage(message);
|
||||
}}
|
||||
|
|
@ -1077,7 +1080,7 @@
|
|||
{/if}
|
||||
|
||||
<button
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition next-message-button"
|
||||
on:click={() => {
|
||||
showNextMessage(message);
|
||||
}}
|
||||
|
|
@ -1094,6 +1097,7 @@
|
|||
<Tooltip content={$i18n.t('Edit')} placement="bottom">
|
||||
<button
|
||||
aria-label={$i18n.t('Edit')}
|
||||
bind:this={editButtonElement}
|
||||
class="{isLastMessage || ($settings?.highContrastMode ?? false)
|
||||
? 'visible'
|
||||
: 'hover-reveal'} inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-gray-400 hover:text-gray-600 transition"
|
||||
|
|
@ -1333,8 +1337,8 @@
|
|||
message?.annotation?.rating ?? ''
|
||||
).toString() === '1'
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-gray-400 hover:text-gray-600 transition disabled:cursor-progress disabled:hover:bg-transparent"
|
||||
disabled={feedbackLoading}
|
||||
: ''} dark:hover:text-gray-400 hover:text-gray-600 transition aria-disabled:cursor-progress aria-disabled:hover:bg-transparent"
|
||||
aria-disabled={feedbackLoading}
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
await feedbackHandler(1);
|
||||
|
|
@ -1377,8 +1381,8 @@
|
|||
message?.annotation?.rating ?? ''
|
||||
).toString() === '-1'
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-gray-400 hover:text-gray-600 transition disabled:cursor-progress disabled:hover:bg-transparent"
|
||||
disabled={feedbackLoading}
|
||||
: ''} dark:hover:text-gray-400 hover:text-gray-600 transition aria-disabled:cursor-progress aria-disabled:hover:bg-transparent"
|
||||
aria-disabled={feedbackLoading}
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
await feedbackHandler(-1);
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@
|
|||
let editedFiles = [];
|
||||
|
||||
let messageEditTextAreaElement: HTMLTextAreaElement;
|
||||
let editButtonElement: HTMLButtonElement;
|
||||
let editScrollContainer: HTMLDivElement;
|
||||
|
||||
let message = structuredClone(history.messages[messageId]);
|
||||
|
|
@ -129,10 +130,13 @@
|
|||
editedFiles = [];
|
||||
};
|
||||
|
||||
const cancelEditMessage = () => {
|
||||
const cancelEditMessage = async () => {
|
||||
edit = false;
|
||||
editedContent = '';
|
||||
editedFiles = [];
|
||||
|
||||
await tick();
|
||||
editButtonElement?.focus();
|
||||
};
|
||||
|
||||
const deleteMessageHandler = async () => {
|
||||
|
|
@ -514,7 +518,7 @@
|
|||
<div class="flex self-center" dir="ltr">
|
||||
<button
|
||||
aria-label={$i18n.t('Previous message')}
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition previous-message-button"
|
||||
on:click={() => {
|
||||
showPreviousMessage(message);
|
||||
}}
|
||||
|
|
@ -570,7 +574,7 @@
|
|||
|
||||
<button
|
||||
aria-label={$i18n.t('Next message')}
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition next-message-button"
|
||||
on:click={() => {
|
||||
showNextMessage(message);
|
||||
}}
|
||||
|
|
@ -587,6 +591,7 @@
|
|||
? ''
|
||||
: 'hover-reveal'} inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-gray-400 hover:text-gray-600 transition edit-user-message-button"
|
||||
aria-label={$i18n.t('Edit')}
|
||||
bind:this={editButtonElement}
|
||||
on:click={() => {
|
||||
editMessageHandler();
|
||||
}}
|
||||
|
|
@ -639,7 +644,7 @@
|
|||
<div class="flex self-center" dir="ltr">
|
||||
<button
|
||||
aria-label={$i18n.t('Previous message')}
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition previous-message-button"
|
||||
on:click={() => {
|
||||
showPreviousMessage(message);
|
||||
}}
|
||||
|
|
@ -695,7 +700,7 @@
|
|||
|
||||
<button
|
||||
aria-label={$i18n.t('Next message')}
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition"
|
||||
class="self-center inline-flex size-7 shrink-0 items-center justify-center p-1.5 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-gray-400 hover:text-gray-600 rounded-md transition next-message-button"
|
||||
on:click={() => {
|
||||
showNextMessage(message);
|
||||
}}
|
||||
|
|
|
|||
|
|
@ -186,9 +186,9 @@
|
|||
</Tooltip>
|
||||
{/snippet}
|
||||
|
||||
{#snippet renderChatActions()}
|
||||
{#snippet renderTemporaryChatToggle()}
|
||||
{#if $user?.role === 'user' ? ($user?.permissions?.chat?.temporary ?? true) && !($user?.permissions?.chat?.temporary_enforced ?? false) : true}
|
||||
{#if !chat?.id && !tabbed}
|
||||
{#if !chat?.id}
|
||||
<Tooltip content={$i18n.t(`Temporary Chat`)}>
|
||||
<button
|
||||
class="flex size-6 cursor-pointer items-center justify-center rounded-lg text-gray-500 transition hover:bg-gray-50/40 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-800/40 dark:hover:text-gray-200"
|
||||
|
|
@ -221,7 +221,14 @@
|
|||
{/if}
|
||||
</button>
|
||||
</Tooltip>
|
||||
{:else if chat?.id && $temporaryChatEnabled}
|
||||
{/if}
|
||||
{/if}
|
||||
{/snippet}
|
||||
|
||||
{#snippet renderChatActions()}
|
||||
{#if !tabbed}{@render renderTemporaryChatToggle()}{/if}
|
||||
{#if $user?.role === 'user' ? ($user?.permissions?.chat?.temporary ?? true) && !($user?.permissions?.chat?.temporary_enforced ?? false) : true}
|
||||
{#if chat?.id && $temporaryChatEnabled}
|
||||
<Tooltip content={$i18n.t(`Save Chat`)}>
|
||||
<button
|
||||
class="flex size-6 cursor-pointer items-center justify-center rounded-lg text-gray-500 transition hover:bg-gray-50/40 hover:text-gray-700 dark:text-gray-400 dark:hover:bg-gray-800/40 dark:hover:text-gray-200"
|
||||
|
|
@ -290,6 +297,12 @@
|
|||
|
||||
<ShareChatModal bind:show={showShareChatModal} chatId={$chatId} />
|
||||
|
||||
{#if tabbed && !chat?.id}
|
||||
<div class="absolute right-2.5 top-0 z-30 flex items-center">
|
||||
{@render renderTemporaryChatToggle()}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<button
|
||||
id="new-chat-button"
|
||||
class="hidden"
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
const dispatch = createEventDispatcher();
|
||||
|
||||
import { config, models, settings, theme, user } from '$lib/stores';
|
||||
import { setTheme } from '$lib/utils/theme';
|
||||
|
||||
const i18n: any = getContext('i18n');
|
||||
|
||||
|
|
@ -21,8 +22,8 @@
|
|||
export let getModels: Function;
|
||||
|
||||
// General
|
||||
let themes = ['dark', 'light', 'oled-dark'];
|
||||
let selectedTheme = 'system';
|
||||
$: selectedTheme = $theme;
|
||||
|
||||
let languages: Awaited<ReturnType<typeof getLanguages>> = [];
|
||||
let lang = $i18n.language;
|
||||
|
|
@ -131,8 +132,6 @@
|
|||
};
|
||||
|
||||
onMount(async () => {
|
||||
selectedTheme = localStorage.theme ?? 'system';
|
||||
|
||||
languages = await getLanguages();
|
||||
|
||||
if (!$config?.features?.enable_easter_eggs) {
|
||||
|
|
@ -144,76 +143,6 @@
|
|||
params = { ...params, ...$settings.params };
|
||||
params.stop = $settings?.params?.stop ? ($settings?.params?.stop ?? []).join(',') : null;
|
||||
});
|
||||
|
||||
const applyTheme = (_theme: string) => {
|
||||
let themeToApply = _theme === 'oled-dark' ? 'dark' : _theme === 'her' ? 'light' : _theme;
|
||||
|
||||
if (_theme === 'system') {
|
||||
themeToApply = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
||||
}
|
||||
|
||||
if (themeToApply === 'dark' && !_theme.includes('oled')) {
|
||||
document.documentElement.style.setProperty('--color-gray-800', '#333');
|
||||
document.documentElement.style.setProperty('--color-gray-850', '#262626');
|
||||
document.documentElement.style.setProperty('--color-gray-900', '#171717');
|
||||
document.documentElement.style.setProperty('--color-gray-950', '#0d0d0d');
|
||||
}
|
||||
|
||||
themes
|
||||
.filter((e) => e !== themeToApply)
|
||||
.forEach((e) => {
|
||||
e.split(' ').forEach((e) => {
|
||||
document.documentElement.classList.remove(e);
|
||||
});
|
||||
});
|
||||
|
||||
themeToApply.split(' ').forEach((e) => {
|
||||
document.documentElement.classList.add(e);
|
||||
});
|
||||
|
||||
const metaThemeColor = document.querySelector('meta[name="theme-color"]');
|
||||
if (metaThemeColor) {
|
||||
if (_theme.includes('system')) {
|
||||
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches
|
||||
? 'dark'
|
||||
: 'light';
|
||||
console.log('Setting system meta theme color: ' + systemTheme);
|
||||
metaThemeColor.setAttribute('content', systemTheme === 'light' ? '#ffffff' : '#171717');
|
||||
} else {
|
||||
console.log('Setting meta theme color: ' + _theme);
|
||||
metaThemeColor.setAttribute(
|
||||
'content',
|
||||
_theme === 'dark'
|
||||
? '#171717'
|
||||
: _theme === 'oled-dark'
|
||||
? '#000000'
|
||||
: _theme === 'her'
|
||||
? '#983724'
|
||||
: '#ffffff'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof window !== 'undefined' && window.applyTheme) {
|
||||
window.applyTheme();
|
||||
}
|
||||
|
||||
if (_theme.includes('oled')) {
|
||||
document.documentElement.style.setProperty('--color-gray-800', '#101010');
|
||||
document.documentElement.style.setProperty('--color-gray-850', '#050505');
|
||||
document.documentElement.style.setProperty('--color-gray-900', '#000000');
|
||||
document.documentElement.style.setProperty('--color-gray-950', '#000000');
|
||||
document.documentElement.classList.add('dark');
|
||||
}
|
||||
|
||||
console.log(_theme);
|
||||
};
|
||||
|
||||
const themeChangeHandler = (_theme: string) => {
|
||||
theme.set(_theme);
|
||||
localStorage.setItem('theme', _theme);
|
||||
applyTheme(_theme);
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col h-full justify-between text-sm" id="tab-general">
|
||||
|
|
@ -234,7 +163,7 @@
|
|||
bind:value={selectedTheme}
|
||||
ariaLabel={$i18n.t('settings.personal.general.theme.label')}
|
||||
placeholder={$i18n.t('Select a theme')}
|
||||
on:change={() => themeChangeHandler(selectedTheme)}
|
||||
on:change={() => setTheme(selectedTheme)}
|
||||
>
|
||||
<option value="system">⚙️ {$i18n.t('System')}</option>
|
||||
<option value="dark">🌑 {$i18n.t('Dark')}</option>
|
||||
|
|
|
|||
|
|
@ -218,7 +218,8 @@
|
|||
|
||||
<div class="terminal-dock min-h-0">
|
||||
<div
|
||||
class="flex h-7 min-w-0 items-center border-b border-black/5 text-[11px] text-gray-500 dark:border-white/5 dark:text-gray-400"
|
||||
class="flex h-7 min-w-0 items-center border-black/5 text-[11px] text-gray-500 dark:border-white/5 dark:text-gray-400"
|
||||
class:border-b={expanded}
|
||||
>
|
||||
{#if !expanded}
|
||||
<button
|
||||
|
|
|
|||
|
|
@ -29,6 +29,12 @@
|
|||
let finishConnection: (ready: boolean) => void;
|
||||
const connectionReady = new Promise<boolean>((resolve) => (finishConnection = resolve));
|
||||
let reportedActive: boolean | null = null;
|
||||
let cursor = 0;
|
||||
let outputEnd: number | null = null;
|
||||
let outputPending = Promise.resolve();
|
||||
let reconnectTimer: ReturnType<typeof setTimeout>;
|
||||
let reconnectDelay = 1000;
|
||||
let reconnecting = false;
|
||||
|
||||
export async function bindChat(id: string) {
|
||||
if (readOnly || destroyed || sessionChatId === id) return;
|
||||
|
|
@ -98,15 +104,17 @@
|
|||
async function connect() {
|
||||
connecting = true;
|
||||
try {
|
||||
const session = await terminalRequest<{ id: string }>(
|
||||
connection,
|
||||
sessionChatId,
|
||||
'/api/terminals',
|
||||
{
|
||||
method: 'POST'
|
||||
}
|
||||
);
|
||||
sessionId = session.id;
|
||||
if (!sessionId) {
|
||||
const session = await terminalRequest<{ id: string }>(
|
||||
connection,
|
||||
sessionChatId,
|
||||
'/api/terminals',
|
||||
{
|
||||
method: 'POST'
|
||||
}
|
||||
);
|
||||
sessionId = session.id;
|
||||
}
|
||||
if (destroyed) {
|
||||
await terminalRequest(
|
||||
connection,
|
||||
|
|
@ -123,6 +131,7 @@
|
|||
() => {
|
||||
if (destroyed) return;
|
||||
connected = true;
|
||||
reconnecting = false;
|
||||
finishConnection(true);
|
||||
connecting = false;
|
||||
reportActivity(active);
|
||||
|
|
@ -132,29 +141,64 @@
|
|||
pingInterval = setInterval(() => {
|
||||
if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify({ type: 'ping' }));
|
||||
}, 25000);
|
||||
}
|
||||
},
|
||||
{ resume: true, cursor }
|
||||
);
|
||||
ws.onmessage = (event) => {
|
||||
if (destroyed) return;
|
||||
if (typeof event.data === 'string') {
|
||||
try {
|
||||
if (JSON.parse(event.data).type === 'chat') return;
|
||||
const message = JSON.parse(event.data);
|
||||
if (message.type === 'chat') return;
|
||||
if (message.type === 'output') {
|
||||
outputEnd = message.end;
|
||||
if (message.truncated) write('\r\n[Earlier output is no longer available]\r\n');
|
||||
return;
|
||||
}
|
||||
} catch {
|
||||
/* Render non-JSON terminal output below. */
|
||||
}
|
||||
}
|
||||
if (event.data instanceof ArrayBuffer) term?.write(new Uint8Array(event.data));
|
||||
else write(event.data);
|
||||
if (event.data instanceof ArrayBuffer) {
|
||||
const data = new Uint8Array(event.data);
|
||||
const end = outputEnd;
|
||||
outputEnd = null;
|
||||
outputPending = outputPending.then(
|
||||
() =>
|
||||
new Promise<void>((resolve) => {
|
||||
if (!term || destroyed) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
term.write(data, () => {
|
||||
if (end !== null) cursor = end;
|
||||
reconnectDelay = 1000;
|
||||
resolve();
|
||||
});
|
||||
})
|
||||
);
|
||||
} else write(event.data);
|
||||
};
|
||||
ws.onclose = () => {
|
||||
if (destroyed) return;
|
||||
ws.onclose = async (event) => {
|
||||
disconnect();
|
||||
write('\r\n\x1b[90m[Connection closed]\x1b[0m\r\n');
|
||||
await outputPending;
|
||||
if (destroyed) return;
|
||||
if (event.code === 1000 || [4001, 4003, 4004].includes(event.code)) {
|
||||
reconnecting = false;
|
||||
write(
|
||||
event.code === 4001 || event.code === 4003
|
||||
? '\r\n[Terminal access denied. Check your sign-in and permissions.]\r\n'
|
||||
: '\r\n[Terminal session ended. Open a new terminal to continue.]\r\n'
|
||||
);
|
||||
return;
|
||||
}
|
||||
reconnecting = true;
|
||||
reconnectTimer = setTimeout(() => void connect(), reconnectDelay);
|
||||
reconnectDelay = Math.min(reconnectDelay * 2, 10000);
|
||||
};
|
||||
ws.onerror = () => {
|
||||
if (destroyed) return;
|
||||
disconnect();
|
||||
write('\r\n\x1b[31m[Terminal connection failed]\x1b[0m\r\n');
|
||||
};
|
||||
} catch (error) {
|
||||
if (destroyed) return;
|
||||
|
|
@ -213,6 +257,7 @@
|
|||
onDestroy(() => {
|
||||
document.removeEventListener('visibilitychange', reportVisibility);
|
||||
destroyed = true;
|
||||
clearTimeout(reconnectTimer);
|
||||
disconnect();
|
||||
ws?.close();
|
||||
resizeObserver?.disconnect();
|
||||
|
|
@ -223,6 +268,14 @@
|
|||
</script>
|
||||
|
||||
<div class="terminal-view h-full min-h-0 relative bg-white dark:bg-transparent">
|
||||
{#if reconnecting}
|
||||
<div
|
||||
class="absolute top-1 right-2 z-10 rounded bg-white/90 px-2 py-1 text-xs text-gray-600 dark:bg-gray-900/90 dark:text-gray-300"
|
||||
role="status"
|
||||
>
|
||||
Connection interrupted. Reconnecting to the same terminal…
|
||||
</div>
|
||||
{/if}
|
||||
<div
|
||||
bind:this={terminalEl}
|
||||
class="absolute inset-0 pl-2 pr-0.5"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<script lang="ts">
|
||||
import { Pagination } from 'bits-ui';
|
||||
import { createEventDispatcher, getContext } from 'svelte';
|
||||
import { createEventDispatcher, getContext, tick } from 'svelte';
|
||||
|
||||
import ChevronLeft from '../icons/ChevronLeft.svelte';
|
||||
import ChevronRight from '../icons/ChevronRight.svelte';
|
||||
|
|
@ -10,10 +10,24 @@
|
|||
export let perPage = 20;
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let paginationElement: HTMLDivElement;
|
||||
|
||||
const pageChangeHandler = async () => {
|
||||
const refocus = paginationElement?.contains(document.activeElement);
|
||||
|
||||
await tick();
|
||||
if (
|
||||
refocus &&
|
||||
(document.activeElement === document.body || document.activeElement?.matches(':disabled'))
|
||||
) {
|
||||
paginationElement.querySelector<HTMLElement>('[aria-current="page"]')?.focus();
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<Pagination.Root bind:page {count} {perPage}>
|
||||
<div class="flex justify-center" bind:this={paginationElement}>
|
||||
<Pagination.Root bind:page {count} {perPage} onPageChange={pageChangeHandler}>
|
||||
{#snippet children({ pages, currentPage })}
|
||||
<div class="my-2 flex items-center">
|
||||
<Pagination.PrevButton
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
$: buttonClass =
|
||||
variant === 'settings'
|
||||
? `ml-1.5 bg-transparent text-gray-400 transition hover:text-gray-700 dark:text-gray-500 dark:hover:text-gray-300 ${showButtonClassName}`
|
||||
: `pl-1.5 bg-transparent transition ${showButtonClassName}`;
|
||||
: `min-w-6 pl-1.5 bg-transparent transition ${showButtonClassName}`;
|
||||
</script>
|
||||
|
||||
<div class="relative {outerClass}">
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@
|
|||
{#each embeds as embed, idx}
|
||||
<div class="my-2" id={`${componentId}-tool-call-embed-${idx}`}>
|
||||
{#if typeof embed === 'object' && embed?.type === 'mcp_app'}
|
||||
{#key embed}<MCPApp app={embed} />{/key}
|
||||
{#key JSON.stringify(embed)}<MCPApp app={embed} />{/key}
|
||||
{:else if typeof embed === 'string'}
|
||||
<FullHeightIframe
|
||||
src={embed}
|
||||
|
|
|
|||
|
|
@ -530,7 +530,7 @@
|
|||
$config?.features?.enable_channels &&
|
||||
($user?.role === 'admin' || ($user?.permissions?.features?.channels ?? true))
|
||||
) {
|
||||
await initChannels();
|
||||
initChannels();
|
||||
}
|
||||
|
||||
await initChatList();
|
||||
|
|
|
|||
|
|
@ -320,8 +320,16 @@
|
|||
dropzoneElement?.addEventListener('drop', onDrop);
|
||||
dropzoneElement?.addEventListener('dragleave', onDragLeave);
|
||||
|
||||
let keyboardFocusedElement: Element | null = null;
|
||||
const onFocusIn = (event: FocusEvent) => {
|
||||
const target = event.target as Element;
|
||||
keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)')
|
||||
? target
|
||||
: null;
|
||||
};
|
||||
|
||||
const onKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Shift') {
|
||||
if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) {
|
||||
shiftKey = true;
|
||||
openNoteMenuId = null;
|
||||
}
|
||||
|
|
@ -337,6 +345,7 @@
|
|||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('focusin', onFocusIn);
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
|
@ -344,6 +353,7 @@
|
|||
return () => {
|
||||
clearTimeout(searchDebounceTimer);
|
||||
|
||||
window.removeEventListener('focusin', onFocusIn);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
|
|
|
|||
|
|
@ -488,8 +488,16 @@
|
|||
await tick();
|
||||
loaded = true;
|
||||
|
||||
let keyboardFocusedElement: Element | null = null;
|
||||
const onFocusIn = (event: FocusEvent) => {
|
||||
const target = event.target as Element;
|
||||
keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)')
|
||||
? target
|
||||
: null;
|
||||
};
|
||||
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
|
@ -504,11 +512,13 @@
|
|||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('focusin', onFocusIn);
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener('focusin', onFocusIn);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
|
|
|
|||
|
|
@ -351,8 +351,16 @@
|
|||
openCreateModal();
|
||||
}
|
||||
|
||||
let keyboardFocusedElement: Element | null = null;
|
||||
const onFocusIn = (event: FocusEvent) => {
|
||||
const target = event.target as Element;
|
||||
keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)')
|
||||
? target
|
||||
: null;
|
||||
};
|
||||
|
||||
const onKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Shift') {
|
||||
if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
|
@ -367,6 +375,7 @@
|
|||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('focusin', onFocusIn);
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
|
@ -374,6 +383,7 @@
|
|||
return () => {
|
||||
clearTimeout(searchDebounceTimer);
|
||||
window.removeEventListener('message', onMessage);
|
||||
window.removeEventListener('focusin', onFocusIn);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
|
|
|
|||
|
|
@ -303,8 +303,16 @@
|
|||
viewOption = localStorage?.workspaceViewOption || '';
|
||||
loaded = true;
|
||||
|
||||
let keyboardFocusedElement: Element | null = null;
|
||||
const onFocusIn = (event: FocusEvent) => {
|
||||
const target = event.target as Element;
|
||||
keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)')
|
||||
? target
|
||||
: null;
|
||||
};
|
||||
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
|
@ -319,12 +327,14 @@
|
|||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('focusin', onFocusIn);
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
clearTimeout(searchDebounceTimer);
|
||||
window.removeEventListener('focusin', onFocusIn);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
|
|
|
|||
|
|
@ -299,8 +299,16 @@
|
|||
await init();
|
||||
loaded = true;
|
||||
|
||||
let keyboardFocusedElement: Element | null = null;
|
||||
const onFocusIn = (event: FocusEvent) => {
|
||||
const target = event.target as Element;
|
||||
keyboardFocusedElement = target.matches(':focus-visible:not(input, textarea)')
|
||||
? target
|
||||
: null;
|
||||
};
|
||||
|
||||
const onKeyDown = (event) => {
|
||||
if (event.key === 'Shift') {
|
||||
if (event.key === 'Shift' && document.activeElement !== keyboardFocusedElement) {
|
||||
shiftKey = true;
|
||||
}
|
||||
};
|
||||
|
|
@ -315,12 +323,14 @@
|
|||
shiftKey = false;
|
||||
};
|
||||
|
||||
window.addEventListener('focusin', onFocusIn);
|
||||
window.addEventListener('keydown', onKeyDown);
|
||||
window.addEventListener('keyup', onKeyUp);
|
||||
window.addEventListener('blur', onBlur);
|
||||
|
||||
return () => {
|
||||
clearTimeout(searchDebounceTimer);
|
||||
window.removeEventListener('focusin', onFocusIn);
|
||||
window.removeEventListener('keydown', onKeyDown);
|
||||
window.removeEventListener('keyup', onKeyUp);
|
||||
window.removeEventListener('blur', onBlur);
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "Çatın icrası uğurla tamamlandı.",
|
||||
"A collaboration channel where people join as members": "İnsanların üzv kimi qoşulduğu əməkdaşlıq kanalı",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Girişin qruplar və icazələrlə idarə olunduğu müzakirə kanalı",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Bu adda fayl artıq mövcuddur. Əvəz edilsin?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Yeni versiya (v{{LATEST_VERSION}}) artıq mövcuddur.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Səhifə başqa yerdə dəyişdirilib. Əvvəlki mətninizi endirə bilərsiniz.",
|
||||
"A private conversation between you and selected users": "Sizinlə seçilmiş istifadəçilər arasında şəxsi söhbət",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Gizli modellərin əsas model kimi seçilməsinə icazə verin.",
|
||||
"Allow Sharing With Groups": "Qruplarla paylaşmağa icazə ver",
|
||||
"Allow Sharing With Users": "İstifadəçilərlə paylaşmağa icazə ver",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Yan çata icazə ver",
|
||||
"Allow Speech to Text": "Səsdən mətnə (STT) keçidinə icazə ver",
|
||||
"Allow Temporary Chat": "Müvəqqəti çata icazə ver",
|
||||
"Allow Text to Speech": "Mətndən səsə (TTS) keçidinə icazə ver",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Model cavab verməzdən əvvəl və ya verdikdən sonra mesajları emal edən funksiyaları tətbiq edin.",
|
||||
"Apply to draft": "Qaralamaya tətbiq et",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Tətbiq et əməliyyatı sağdakı təklif olunan redaktəni istifadə edir. Sonra qaralamanızı yadda saxlayın.",
|
||||
"Approve": "",
|
||||
"Approve": "Qəbul et",
|
||||
"Approximate comparison": "Təxmini müqayisə",
|
||||
"Apps": "Tətbiqlər",
|
||||
"April": "Aprel",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Təsdiq istə",
|
||||
"Ask or edit…": "Soruşun və ya redaktə edin…",
|
||||
"Ask this knowledge source a test question": "Bu bilik mənbəyinə sınaq sualı verin",
|
||||
"Assignees": "",
|
||||
"Assignees": "Təyin edilmiş şəxslər",
|
||||
"Assistance": "Yardım",
|
||||
"assistant": "köməkçi",
|
||||
"Assistant": "Köməkçi",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Autentifikator quraşdırılıb",
|
||||
"Authenticator not configured": "Autentifikator quraşdırılmayıb",
|
||||
"Authenticator setup QR code": "Autentifikator quraşdırma QR kodu",
|
||||
"Author": "",
|
||||
"Author": "Müəllif",
|
||||
"Authorize OAuth": "OAuth üçün icazə ver",
|
||||
"Auto": "Avtomatik",
|
||||
"Auto (Random)": "Avto (Təsadüfi)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Geri",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Dəyişikliklərə qayıt",
|
||||
"Back to files": "Fayllara qayıt",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Birləşdirmə sorğularına qayıt",
|
||||
"Back to sign in": "Girişə qayıt",
|
||||
"Background Image": "Fon şəkli",
|
||||
"Background image must be at most 25 megapixels.": "Fon şəkli ən çoxu 25 meqapiksel olmalıdır.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Arxa fondakı alt agent işini tamamladı",
|
||||
"background sub-agents": "arxa fondakı alt agentlər",
|
||||
"Bad Response": "Pis cavab",
|
||||
"Base branch": "",
|
||||
"Base branch": "Hədəf budaq",
|
||||
"Base Model (From)": "Əsas Model (Mənbə)",
|
||||
"Base Model is required.": "Əsas model tələb olunur.",
|
||||
"Base Models": "Əsas modellər",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "əvvəl",
|
||||
"Being lazy": "Tənbəllik edir",
|
||||
"Binary file — text comparison is unavailable.": "İkili fayl — mətn müqayisəsi mümkün deyil.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "İkili fayl dəyişdirildi",
|
||||
"Binary file. Download to open.": "İkili fayl. Açmaq üçün endirin.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Blok seçimləri",
|
||||
"Bold": "Qalın",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Məhdudlaşdırılmış cavablar üçün müəyyən tokenlərin stimullaşdırılması və ya cəzalandırılması. Meyillilik (bias) dəyərləri -100 ilə 100 arasında (daxil olmaqla) məhdudlaşdırılacaq. (Standart: yoxdur)",
|
||||
"Both files are required for comparison.": "Müqayisə üçün hər iki fayl tələb olunur.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Budaq əməliyyatları",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Brauzer",
|
||||
"Browser options": "Brauzer seçimləri",
|
||||
"build · {{hash}}": "yığım · {{hash}}",
|
||||
"Built-in": "Daxili",
|
||||
"Bullet List": "Markerli Siyahı",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Qovluq ikonunu dəyişdir",
|
||||
"Change overview": "Dəyişikliklərin icmalı",
|
||||
"Change User Role": "İstifadəçi Rolunu Dəyişdir",
|
||||
"changed": "",
|
||||
"changed": "dəyişiklik",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Dəyişiklik etdikdə bütün cihazlardan çıxış edilir. İstifadəçilər növbəti girişdə autentifikatoru quraşdıracaq.",
|
||||
"Channel": "Kanal",
|
||||
"Channel deleted successfully": "Kanal uğurla silindi",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "OAuth aşkarlanmasını yoxla",
|
||||
"Check what is running in this chat.": "Bu çatda nələrin işlədiyini yoxlayın.",
|
||||
"Checking for updates...": "Yeniləmələr yoxlanılır...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Budağa keç",
|
||||
"Choose a date range to compare": "Müqayisə üçün tarix aralığı seçin",
|
||||
"Choose a model before saving...": "Yadda saxlamazdan əvvəl bir model seçin...",
|
||||
"Choose a parent page. Subpages move with this page.": "Üst səhifə seçin. Alt səhifələr bu səhifə ilə birlikdə köçürülür.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Pəncərəni bağla",
|
||||
"Close Modal": "Pəncərəni Bağla",
|
||||
"Close pages": "Səhifələri bağla",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Birləşdirmə sorğusunu bağla",
|
||||
"Close search": "Axtarışı bağla",
|
||||
"Close session details": "Sessiya təfərrüatlarını bağla",
|
||||
"Close Sidebar": "Yan paneli bağla",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Əməkdaşlar",
|
||||
"Collapse": "Bük / Yığcamlaşdır",
|
||||
"Collapse {{name}}": "{{name}} qrupunu yığcamlaşdır",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Git panelini yığcamlaşdır",
|
||||
"Collapse sessions": "Sessiyaları yığcamlaşdır",
|
||||
"Collapse terminal": "Terminalı yığcamlaşdır",
|
||||
"Collection": "Kolleksiya",
|
||||
"Collection Field": "Kolleksiya sahəsi",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Şərh silindi",
|
||||
"Comments": "Şərhlər",
|
||||
"Comments are no longer available.": "Şərhlər artıq mövcud deyil.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Təsdiqləmə əməliyyatları",
|
||||
"Commit message": "Təsdiqləmə mesajı",
|
||||
"Commit Message": "Təsdiqləmə mesajı (Commit Message)",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Təsdiqləmə xülasəsi",
|
||||
"Commit to {{branch}}": "{{branch}} budağında təsdiqlə",
|
||||
"Community Reviews": "İcma rəyləri",
|
||||
"Compact": "Konteksti qısalt",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Konteksti qısalt: bu çatın davam edə bilməsi üçün köhnə mesajları qısaldın.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Konfiqurasiya uğurla idxal edildi",
|
||||
"Configure": "Konfiqurasiya et",
|
||||
"Configure app": "Tətbiqi konfiqurasiya et",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Çat fayllarını, klapanları, sistem göstərişini və təkmil parametrləri konfiqurasiya edin.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Bu model üçün real vaxt səsini, səs avatarını və TTS səsini konfiqurasiya edin.",
|
||||
"Confirm": "Təsdiqlə",
|
||||
"Confirm Password": "Şifrəni təsdiqlə",
|
||||
"Confirm Prompt from Embed": "Daxil edilmiş məzmundan gələn göstərişi təsdiqlə",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Birləşdirmə sorğusu əməliyyatını təsdiqlə",
|
||||
"Confirm recording": "Səs yazısını təsdiqlə",
|
||||
"Confirm your action": "Hərəkətinizi təsdiqləyin",
|
||||
"Confirm your new password": "Yeni şifrənizi təsdiqləyin",
|
||||
"Confirm Your Password": "Şifrənizi təsdiqləyin",
|
||||
"Connect": "Qoş",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Əvvəlcə qoşulun və model seçin.",
|
||||
"Connect external apps to Open WebUI.": "Xarici tətbiqləri Open WebUI-yə qoşun.",
|
||||
"Connect to an AI provider to start chatting": "Söhbətə başlamaq üçün bir Sİ (AI) təminatçısına qoşulun",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Open Terminal instansiyalarına qoşulun. Adminlər və giriş icazəsi verilmiş istifadəçilər bu serverlər vasitəsilə fayllara baxa və terminal alətlərindən istifadə edə bilərlər.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Qoşulmuş tətbiqlər",
|
||||
"Connecting": "Qoşulur",
|
||||
"Connecting...": "Qoşulur...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Qoşulur…",
|
||||
"Connection": "Bağlantı",
|
||||
"Connection failed": "Bağlantı uğursuz oldu",
|
||||
"Connection ID": "Bağlantı ID-si",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "Bağlantı ID-sində \":\" və ya \"|\" simvolları ola bilməz",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Bağlantı kəsildi. Zəhmət olmasa yenidən cəhd edin.",
|
||||
"Connection lost. Reconnecting...": "Bağlantı kəsildi. Yenidən qoşulur...",
|
||||
"Connection successful": "Bağlantı uğurludur",
|
||||
"Connection Type": "Bağlantı növü",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Kopyala",
|
||||
"Copy {{name}} to clipboard": "{{name}} faylını mübadilə buferinə kopyala",
|
||||
"Copy API Key": "API açarını kopyala",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Budaq adını kopyala",
|
||||
"Copy change to original": "Dəyişikliyi orijinala kopyala",
|
||||
"Copy change to proposal": "Dəyişikliyi təklifə kopyala",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Təsdiqləmə heşini kopyala",
|
||||
"Copy content": "Məzmunu kopyala",
|
||||
"Copy default": "Standart dəyəri kopyala",
|
||||
"Copy Last Code Block": "Sonuncu kod blokunu kopyala",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Müəllif hüquqları (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "Open WebUI-dən gələn sorğulara icazə vermək üçün CORS təminatçı tərəfindən düzgün konfiqurasiya edilməlidir.",
|
||||
"Could not check for updates": "Yeniləmələri yoxlamaq mümkün olmadı",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Budaq adı kopyalana bilmədi",
|
||||
"Could not copy commit hash": "Təsdiqləmə heşi kopyalana bilmədi",
|
||||
"Could not copy to clipboard. Please try again.": "Mübadilə buferinə kopyalana bilmədi. Zəhmət olmasa yenidən cəhd edin.",
|
||||
"Could not determine the upload folder.": "Yükləmə qovluğu müəyyən edilə bilmədi.",
|
||||
"Could not load avatar.": "Avatar yüklənə bilmədi.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Hesab yarat",
|
||||
"Create Admin Account": "Admin hesabı yarat",
|
||||
"Create announcements shown to users in the app.": "Tətbiqdə istifadəçilərə göstərilən elanlar yaradın.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Budaq yarat",
|
||||
"Create Channel": "Kanal yarat",
|
||||
"Create copy": "Nüsxə yarat",
|
||||
"Create Folder": "Qovluq yarat",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Müəyyən aralıqlarla avtomatik icra olunan planlaşdırılmış göstərişlər yaradın.",
|
||||
"Create skill": "Bacarıq yarat",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Bacarıq yarat: bu çatdan təkrar istifadə oluna bilən terminal bacarığı yarat.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "İş ağacı yarat",
|
||||
"Create your first note from the Create menu.": "İlk qeydinizi Yarat menyusundan yaradın.",
|
||||
"Created": "Yaradılma tarixi",
|
||||
"Created at": "Yaradılma vaxtı",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Fərdi parametr dəyəri",
|
||||
"Custom permissions": "Fərdi icazələr",
|
||||
"Custom range": "Fərdi tarix aralığı",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Fərdi cədvəl",
|
||||
"Customize": "Fərdiləşdir",
|
||||
"Daily": "Gündəlik",
|
||||
"Daily at": "Hər gün saat",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Məlumatlar",
|
||||
"Database": "Verilənlər bazası",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Tarix",
|
||||
"Date Added": "Əlavə edilmə tarixi",
|
||||
"Date is required": "Tarix tələb olunur",
|
||||
"Date Modified": "Dəyişdirilmə tarixi",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Bu qovluğun daxilindəki bütün məzmunu sil",
|
||||
"Delete API Key?": "API açarı silinsin?",
|
||||
"Delete automation?": "Avtomatik tapşırıq silinsin?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Budağı sil",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "{{branch}} budağı silinsin? Birləşdirilməmiş budaqlar saxlanılacaq.",
|
||||
"Delete calendar": "Təqvimi sil",
|
||||
"Delete Calendar": "Təqvimi sil",
|
||||
"Delete Chat": "Çatı sil",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Təsvir",
|
||||
"Description ({{language}})": "Təsvir ({{language}})",
|
||||
"Deselect": "Seçimi ləğv et",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "İş masası",
|
||||
"Desktop access denied. Reopen this tab.": "İş masasına giriş rədd edildi. Bu tabı yenidən açın.",
|
||||
"Desktop audio": "İş masasının səsi",
|
||||
"Desktop audio is not supported by this browser.": "Bu brauzer iş masasının səsini dəstəkləmir.",
|
||||
"Desktop audio unavailable.": "İş masasının səsi mövcud deyil.",
|
||||
"Desktop connection failed.": "İş masası bağlantısı qurula bilmədi.",
|
||||
"Destination": "Təyinat yeri",
|
||||
"Detected Variables": "Aşkarlanan dəyişənlər",
|
||||
"dev build": "dev yığımı",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Müqayisədəki dəyişikliklərdən imtina edilsin?",
|
||||
"Discard unsaved changes?": "Yadda saxlanılmamış dəyişikliklərdən imtina edilsin?",
|
||||
"Discard unsaved skill changes?": "Bacarıqdakı yadda saxlanılmamış dəyişikliklərdən imtina edilsin?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Bu faylın iş ağacındakı yadda saxlanılmamış dəyişikliklərindən imtina edilsin? Bu əməliyyat geri qaytarıla bilməz.",
|
||||
"Disconnect OAuth": "OAuth bağlantısını kəs",
|
||||
"Disconnected": "Bağlantı kəsilib",
|
||||
"Discover a function": "Funksiya kəşf edin",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "\"{{name}}\" endirilir",
|
||||
"Downloading \"{{searchValue}}\"": "\"{{searchValue}}\" endirilir",
|
||||
"Downloading stats...": "Statistika yüklənir...",
|
||||
"Draft": "",
|
||||
"Draft": "Qaralama",
|
||||
"Drag and Drop Container": "Sürükləyib buraxma sahəsi",
|
||||
"Drag or use the up and down arrow keys to reorder": "Sıralamanı dəyişmək üçün sürükləyin və ya yuxarı və aşağı ox düymələrindən istifadə edin",
|
||||
"Drag to move": "Köçürmək üçün sürükləyin",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "CSV faylınızda bu ardıcıllıqla 4 sütun olduğundan əmin olun: Ad, E-poçt, Şifrə, Rol.",
|
||||
"Enter {{role}} message here": "{{role}} mesajını bura daxil edin",
|
||||
"Enter a Connection ID to register.": "Qeydiyyat üçün bağlantı ID-si daxil edin.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Çəp xətt olmayan fayl adı daxil edin.",
|
||||
"Enter a name, content, and a valid command.": "Ad, məzmun və etibarlı əmr daxil edin.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Gözləyən istifadəçi məlumatı qatı üçün başlıq daxil edin. Standart başlıq üçün boş saxlayın.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Cavab üçün su nişanı (watermark) daxil edin. Heç biri üçün boş saxlayın.",
|
||||
"Enter additional headers in JSON format": "Əlavə başlıqları (headers) JSON formatında daxil edin",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Əlavə başlıqları JSON formatında daxil edin (məs. {\"X-Custom-Header\": \"dəyər\"})",
|
||||
"Enter additional parameters in JSON format": "Əlavə parametrləri JSON formatında daxil edin",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Giriş məlumatları olmayan HTTP və ya HTTPS URL-i daxil edin.",
|
||||
"Enter api auth string (e.g. username:password)": "API səlahiyyət sətrini daxil edin (məs. istifadəçi_adı:şifrə)",
|
||||
"Enter Application DN": "Tətbiq DN-ini daxil edin",
|
||||
"Enter Application DN Password": "Tətbiq DN şifrəsini daxil edin",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Analiz üçün kodu icra et",
|
||||
"Executing {{NAME}}...": "{{NAME}} icra edilir...",
|
||||
"Execution timeline": "İcra zaman xətti",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Tam ekran rejimindən çıx",
|
||||
"Expand": "Genişləndir",
|
||||
"Expand {{name}}": "{{name}} qrupunu genişləndir",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Git panelini genişləndir",
|
||||
"Expand input": "Giriş sahəsini genişləndir",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Sessiyaları genişləndir",
|
||||
"Expand terminal": "Terminalı genişləndir",
|
||||
"Experience": "İstifadə təcrübəsi",
|
||||
"Experimental": "Eksperimental",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Modellər idxal edilmədi",
|
||||
"Failed to load chat": "Çat yüklənə bilmədi",
|
||||
"Failed to load chat preview": "Çatın önizləməsi yüklənmədi",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Qovluq yüklənə bilmədi",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "DOCX faylı yüklənmədi. Zəhmət olmasa, onu yükləməyə çalışın.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV faylı yüklənmədi. Zəhmət olmasa, onu yükləməyə çalışın.",
|
||||
"Failed to load file content.": "Fayl məzmunu yüklənmədi.",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Bağlantılar yadda saxlanılmadı",
|
||||
"Failed to save conversation": "Söhbət yadda saxlanılmadı",
|
||||
"Failed to save file": "Fayl yadda saxlanıla bilmədi",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Fayl yadda saxlanıla bilmədi. Dəyişiklikləriniz hələ də redaktordadır.",
|
||||
"Failed to save model": "Model yadda saxlanıla bilmədi",
|
||||
"Failed to save models configuration": "Modellərin konfiqurasiyası yadda saxlanılmadı",
|
||||
"Failed to save policy: {{error}}": "Siyasət yadda saxlanıla bilmədi: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Fayl əməliyyatları",
|
||||
"File added successfully.": "Fayl uğurla əlavə edildi.",
|
||||
"File browser": "Fayl brauzeri",
|
||||
"File changes": "",
|
||||
"File changes": "Fayl dəyişiklikləri",
|
||||
"File content": "Fayl məzmunu",
|
||||
"File content updated successfully.": "Fayl məzmunu uğurla yeniləndi.",
|
||||
"File count limit": "Fayl sayı limiti",
|
||||
"File created": "Fayl yaradıldı",
|
||||
"File deleted successfully.": "Fayl uğurla silindi.",
|
||||
"File differences": "Fayl fərqləri",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Fayla yazmaq mümkün deyil.",
|
||||
"File Mode": "Fayl rejimi",
|
||||
"File moved.": "Fayl köçürüldü.",
|
||||
"File name": "Fayl adı",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "İnterfeysdə {{name}} haqqında məlumat əldə edin",
|
||||
"Get started": "Başlayın",
|
||||
"Get started with {{WEBUI_NAME}}": "{{WEBUI_NAME}} ilə başlayın",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Git dəyişiklikləri",
|
||||
"Git unavailable": "Git mövcud deyil",
|
||||
"Give me ideas": "Mənə ideyalar ver",
|
||||
"give me tips": "mənə məsləhətlər ver",
|
||||
"Global": "Qlobal",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "Başlıq 1",
|
||||
"H2": "Başlıq 2",
|
||||
"H3": "Başlıq 3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Mənbə budaq",
|
||||
"Headers": "Başlıqlar (Headers)",
|
||||
"Headers must be a valid JSON object": "Başlıqlar etibarlı bir JSON obyekti olmalıdır",
|
||||
"Height": "Hündürlük",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Gizlət",
|
||||
"Hide All": "Hamısını gizlət",
|
||||
"Hide conversation": "Söhbəti gizlət",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Fərqi gizlət",
|
||||
"Hide from Sidebar": "Yan paneldən gizlət",
|
||||
"Hide Hidden Files": "Gizli faylları gizlət",
|
||||
"Hide Model": "Modeli gizlət",
|
||||
"Hide preview": "Önizləməni gizlət",
|
||||
"Hide sub-agents": "Alt agentləri gizlət",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Tabları gizlət",
|
||||
"Hide whitespace": "Boşluqları gizlət",
|
||||
"High": "Yüksək",
|
||||
"History": "Tarixçə",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Bilik mənbəyi yeniləndi.",
|
||||
"Knowledge updated successfully": "Bilik uğurla yeniləndi",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Brauzer)",
|
||||
"Labels": "",
|
||||
"Labels": "Etiketlər",
|
||||
"Last 12 months": "Son 12 ay",
|
||||
"Last 24 hours": "Son 24 saat",
|
||||
"Last 30 days": "Son 30 gün",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "Mart",
|
||||
"Mark all as read": "Hamısını oxunmuş kimi işarələ",
|
||||
"Mark as unread": "Oxunmamış kimi işarələ",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Hazır kimi işarələ",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Bazar",
|
||||
"Matching tabs: {{count}}_one": "Uyğun tablar: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Kimisə qeyd et",
|
||||
"Mentions only": "Yalnız qeyd edildikdə",
|
||||
"Menu": "Menyu",
|
||||
"Merge": "",
|
||||
"Merge": "Birləşdir",
|
||||
"Merge Responses": "Cavabları birləşdir",
|
||||
"Merged Response": "Birləşdirilmiş cavab",
|
||||
"Message": "Mesaj",
|
||||
"Message counts and response timestamps": "Mesaj sayı və cavab vaxtları",
|
||||
"Message counts are based on assistant responses.": "Mesaj sayları köməkçinin cavablarına əsaslanır.",
|
||||
"Message exceeds the 16 KiB limit.": "Mesaj 16 KiB limitini aşır.",
|
||||
"Message number": "",
|
||||
"Message number": "Mesaj nömrəsi",
|
||||
"Message rating should be enabled to use this feature": "Bu funksiyadan istifadə etmək üçün mesaj qiymətləndirməsi aktiv olmalıdır",
|
||||
"Message share": "Mesaj payı",
|
||||
"Message text...": "Mesaj mətni...",
|
||||
"messages": "mesajlar",
|
||||
"Messages": "Mesajlar",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Mesajlar uçdan-uca şifrələnir və yadda saxlanılmır.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Bu tabı bağladığınız zaman mesajlar yox olur.",
|
||||
"Metadata Field": "Metaməlumat sahəsi",
|
||||
"Microphone off": "Mikrofon söndürülüb",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Mistral OCR parametrləri",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "B.e.",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Mobil görünüş",
|
||||
"Model": "Model",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' modeli uğurla yükləndi.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' modeli artıq yükləmə növbəsindədir.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Modellər uğurla idxal edildi",
|
||||
"Models Public Sharing": "Modellərin ictimai paylaşımı",
|
||||
"Models Sharing": "Modellərin paylaşılması",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Bu modelin tapşırıq həvalə edə biləcəyi modellər. İstifadəçilərin həmin modellərə çıxışı olmalıdır. Cari modeldən istifadə etmək üçün boş saxlayın.",
|
||||
"Modified": "Dəyişdirilmiş",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "B.e.",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Əvvəlki çata keç",
|
||||
"Never": "Heç vaxt",
|
||||
"New": "Yeni",
|
||||
"New branch": "",
|
||||
"New branch": "Yeni budaq",
|
||||
"New Button": "Yeni Düymə",
|
||||
"New calendar": "Yeni təqvim",
|
||||
"New Calendar": "Yeni Təqvim",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Yeni Qrup",
|
||||
"New Note": "Yeni Qeyd",
|
||||
"New Password": "Yeni Şifrə",
|
||||
"New pull request": "",
|
||||
"New pull request": "Yeni birləşdirmə sorğusu",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Yeni bacarıqlar və nüsxələr özəldir. Əvəz et əməliyyatı yeni versiyanı yadda saxlayır və mövcud paylaşımı qoruyur.",
|
||||
"New tab": "",
|
||||
"New tab": "Yeni tab",
|
||||
"New Temporary Chat": "Yeni Müvəqqəti Çat",
|
||||
"New Terminal": "Yeni Terminal",
|
||||
"New Tool": "Yeni Alət",
|
||||
"New Webhook": "Yeni Webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Yeni iş ağacı",
|
||||
"new-channel": "yeni-kanal",
|
||||
"Next": "Növbəti",
|
||||
"Next change": "Növbəti dəyişiklik",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Qoşulmuş tətbiq yoxdur.",
|
||||
"No authentication": "Autentifikasiya yoxdur",
|
||||
"No automations found": "Avtomatlaşdırma tapılmadı",
|
||||
"No changes": "",
|
||||
"No changes": "Dəyişiklik yoxdur",
|
||||
"No channels": "Kanal yoxdur",
|
||||
"No chat alerts": "Çat xəbərdarlığı yoxdur",
|
||||
"No chat history": "Çat tarixçəsi yoxdur",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Heç bir çat tapılmadı",
|
||||
"No chats found for this user.": "Bu istifadəçi üçün çat tapılmadı.",
|
||||
"No chats found.": "Çat tapılmadı.",
|
||||
"No checks": "",
|
||||
"No checks": "Yoxlama yoxdur",
|
||||
"No comments yet": "Hələ şərh yoxdur",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Hələ təsdiqləmə yoxdur",
|
||||
"No content": "Məzmun yoxdur",
|
||||
"No content available": "Məzmun mövcud deyil",
|
||||
"No content found": "Məzmun tapılmadı",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Əvvəlki istifadə yoxdur",
|
||||
"No prompts found": "Göstəriş tapılmadı",
|
||||
"No prompts yet": "Hələ göstəriş yoxdur",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Birləşdirmə sorğusu yoxdur",
|
||||
"No Repeat": "Təkrarlanmasın",
|
||||
"No results": "Nəticə yoxdur",
|
||||
"No results found": "Nəticə tapılmadı",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Konfiqurasiya edilmiş Terminal bağlantısı yoxdur.",
|
||||
"No terminal connections configured.": "Konfiqurasiya edilmiş terminal bağlantıları yoxdur.",
|
||||
"No terminal servers available": "Mövcud terminal serveri yoxdur",
|
||||
"No text changes": "",
|
||||
"No text changes": "Mətn dəyişikliyi yoxdur",
|
||||
"No text differences": "Mətn fərqi yoxdur",
|
||||
"No tool server connections configured.": "Konfiqurasiya edilmiş alət serveri bağlantıları yoxdur.",
|
||||
"No tools accessible": "Giriş mümkün olan alət yoxdur",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Yenilənəcək klapan yoxdur",
|
||||
"No webhooks yet": "Hələ ki webhook yoxdur",
|
||||
"Node Ids": "Düyün (Node) ID-ləri",
|
||||
"none": "",
|
||||
"none": "heç biri",
|
||||
"None": "Heç biri",
|
||||
"None reported": "Heç biri bildirilməyib",
|
||||
"Not configured": "Konfiqurasiya edilməyib",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Vay! Görünür URL keçərsizdir. Zəhmət olmasa təkrar yoxlayın və yenidən cəhd edin.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Vay! Siz dəstəklənməyən bir üsuldan istifadə edirsiniz (yalnız frontend). Zəhmət olmasa WebUI-ni backend-dən işə salın.",
|
||||
"Open": "Aç",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "+ menyusundan istifadə edərək tab açın.",
|
||||
"Open automation": "Avtomatlaşdırmanı aç",
|
||||
"Open chat": "Çatı aç",
|
||||
"Open create menu": "Yaratma menyusunu aç",
|
||||
"Open file": "Faylı aç",
|
||||
"Open Folder": "Qovluğu aç",
|
||||
"Open in full screen": "Tam ekranda aç",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "GitHub-da aç",
|
||||
"Open in new tab": "Yeni tab-da aç",
|
||||
"Open link": "Linki aç",
|
||||
"Open modal to configure connection": "Bağlantını konfiqurasiya etmək üçün pəncərəni aç",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "parametr",
|
||||
"Parameter": "Parametr",
|
||||
"Parameters": "Parametrlər",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Üst qovluq",
|
||||
"Parent group": "Ana qrup",
|
||||
"Parent message not found": "Ana mesaj tapılmadı",
|
||||
"Parent page": "Üst səhifə",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Zəhmət olmasa bir səbəb seçin",
|
||||
"Please select a valid JSON file": "Zəhmət olmasa etibarlı bir JSON faylı seçin",
|
||||
"Please select at least one user for Direct Message channel.": "Zəhmət olmasa birbaşa mesaj kanalı üçün ən azı bir istifadəçi seçin.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Zəhmət olmasa faylların yüklənməsinin tamamlanmasını gözləyin.",
|
||||
"Please wait until all files are uploaded.": "Zəhmət olmasa bütün fayllar yüklənənə qədər gözləyin.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP və ya GIF. Ən çoxu 5 MiB və 25 meqapiksel.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Siyasət dəyişiklikləri yeni yaradılmış terminallara tətbiq olunur. Onları mövcud terminallara tətbiq etmək üçün uyğun terminalları yeniləyin.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Təminatçı",
|
||||
"Provider context": "Təminatçının kontekst pəncərəsi",
|
||||
"Provider details": "Təminatçı təfərrüatları",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proksi",
|
||||
"Public": "İctimai",
|
||||
"Public key": "Açıq açar",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com-dan \"{{searchValue}}\" modelini çək",
|
||||
"Pull a model from Ollama.com": "Ollama.com-dan bir model çək",
|
||||
"Pull Model": "Modeli çək (Pull)",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Birləşdirmə sorğusu əməliyyatları",
|
||||
"Pull request description": "Birləşdirmə sorğusunun təsviri",
|
||||
"Pull request title": "Birləşdirmə sorğusunun başlığı",
|
||||
"Punctuation": "Durğu işarələri",
|
||||
"Pyodide file browser": "Pyodide fayl brauzeri",
|
||||
"Quality": "Keyfiyyət",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Sənədləri oxuyun",
|
||||
"Read-only": "Yalnız oxuma",
|
||||
"Read-Only Access": "Yalnız oxuma icazəsi",
|
||||
"Ready": "",
|
||||
"Ready": "Hazır kimi işarələ",
|
||||
"Realtime": "Real vaxt",
|
||||
"Realtime Voice": "Real vaxt səsi",
|
||||
"Reason": "Səbəb",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Tövsiyə olunur",
|
||||
"Reconnect": "Yenidən qoş",
|
||||
"Reconnected": "Bağlantı bərpa edildi",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Yenidən qoşulur…",
|
||||
"Record": "Yaz (səs)",
|
||||
"Record voice": "Səsi yaz",
|
||||
"Recorded duration": "Qeydə alınmış müddət",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "{{count}} köhnəlmiş fayl silinir...",
|
||||
"Removing {{count}} stale files..._other": "{{count}} köhnəlmiş fayl silinir...",
|
||||
"Rename": "Adını dəyiş",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Budağın adını dəyişdir",
|
||||
"Rename page": "Səhifənin adını dəyişdir",
|
||||
"Renamed to {{name}}": "Ad {{name}} olaraq dəyişdirildi",
|
||||
"Rendered preview": "Formatlaşdırılmış önizləmə",
|
||||
"Reopen": "",
|
||||
"Reopen": "Yenidən aç",
|
||||
"Reorder": "Sıralamanı dəyiş",
|
||||
"Repeat": "Təkrarlama",
|
||||
"Replace": "Əvəz et",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Mövzuya cavab yaz...",
|
||||
"Replying to {{NAME}}": "{{NAME}} adlı istifadəçiyə cavab verilir",
|
||||
"Reported by the provider.": "Təminatçı tərəfindən bildirilir.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Dəyişiklik tələb et",
|
||||
"Requested scopes": "Tələb olunan icazə sahələri",
|
||||
"Require an authenticator for all users": "Bütün istifadəçilər üçün autentifikator tələb et",
|
||||
"required": "tələb olunur",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Standart dəyərlərə sıfırla",
|
||||
"Reset view": "Görünüşü sıfırla",
|
||||
"Reset zoom": "Miqyası sıfırla",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Git panelinin ölçüsünü dəyişdir",
|
||||
"Resize panel": "Panelin ölçüsünü dəyiş",
|
||||
"Resolved": "Həll edilib",
|
||||
"Response": "Cavab",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Cavablar",
|
||||
"responses with recorded usage": "istifadəsi qeydə alınmış cavab",
|
||||
"Restart": "Yenidən başlat",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Təminatçı bağlantısı ayarlarına edilən dəyişiklikləri tətbiq etmək üçün bütün Open WebUI instansiyalarını yenidən başladın.",
|
||||
"Restricted": "Məhdud",
|
||||
"Result": "Nəticə",
|
||||
"RESULT": "NƏTİCƏ",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "{{count}} mənbə gətirildi",
|
||||
"Retrieved 1 source": "1 mənbə gətirildi",
|
||||
"Retry": "Yenidən cəhd et",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Git aşkarlanmasını yenidən yoxla",
|
||||
"Retry setup": "Quraşdırmanı təkrarla",
|
||||
"Return to call": "Zəngə qayıt",
|
||||
"Return to conversation": "Söhbətə qayıt",
|
||||
"Review": "Nəzərdən keçir",
|
||||
"Review the scopes this app is requesting before adding it.": "Bu tətbiqi əlavə etməzdən əvvəl onun tələb etdiyi icazə sahələrini nəzərdən keçirin.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Rəyçilər",
|
||||
"Revised": "Redaktə edilmiş",
|
||||
"Rewrite the selected text.": "Seçilmiş mətni yenidən yaz.",
|
||||
"Role": "Rol",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "Saxla və Yarat",
|
||||
"Save & Update": "Saxla və Yenilə",
|
||||
"Save and send": "Yadda saxla və göndər",
|
||||
"Save As": "",
|
||||
"Save As": "Fərqli saxla",
|
||||
"Save As Copy": "Kopya kimi saxla",
|
||||
"Save Chat": "Çatı saxla",
|
||||
"Save draft as copy": "Qaralamanı nüsxə kimi yadda saxla",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Fəaliyyətləri axtar",
|
||||
"Search all emojis": "Bütün emojilərdə axtar",
|
||||
"Search Automations": "Avtomatlaşdırmaları axtar",
|
||||
"Search branches": "",
|
||||
"Search branches": "Budaqları axtar",
|
||||
"Search built-in tools": "Daxili alətləri axtar",
|
||||
"Search channels": "Kanalları axtar",
|
||||
"Search Chats": "Çatları axtar",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Nümunə axtarın və ya əlavə edin",
|
||||
"Search parent groups": "Ana qrupları axtar",
|
||||
"Search Prompts": "Axtarış göstərişləri",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Birləşdirmə sorğularını axtar",
|
||||
"Search results": "Axtarış nəticələri",
|
||||
"Search scopes": "İcazə sahələrini axtar",
|
||||
"Search sessions": "Sessiyaları axtar",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "İstifadəçiləri və ya qrupları axtar",
|
||||
"Search workspace": "İş sahəsində axtar",
|
||||
"Search workspace…": "İş sahəsində axtar…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "İş ağaclarını axtar",
|
||||
"Search your workspace": "İş sahənizdə axtar",
|
||||
"Searched {{count}} sites": "{{count}} saytda axtarıldı",
|
||||
"Searching": "Axtarılır",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Yalnız bir modeli göstərmək üçün onu seçin.",
|
||||
"Select a pipeline": "Pipeline seçin",
|
||||
"Select a pipeline url": "Pipeline URL-i seçin",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Birləşdirmə sorğusu seçin",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Sessiyaları filtrləmək üçün aralıq seçin. Qismən istifadə də daxildir.",
|
||||
"Select a reranking model engine": "Yenidən sıralama (reranking) modeli mühərrikini seçin",
|
||||
"Select a role": "Rol seçin",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "localhost URL-lərini açmaq üçün terminal seçin.",
|
||||
"Select a theme": "Mövzu seçin",
|
||||
"Select a tool": "Alət seçin",
|
||||
"Select a voice": "Səs seçin",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Göstərilən faylları seç",
|
||||
"Select Method": "Üsul seçin",
|
||||
"Select model": "Model seçin",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Yalnız bir model seçin",
|
||||
"Select only one model to call": "Çağırmaq üçün yalnız bir model seçin",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Yan çat açmaq üçün yalnız bir model seçin.",
|
||||
"Select options": "Seçimləri seçin",
|
||||
"Select Skill": "Bacarıq seç",
|
||||
"Select to isolate model": "Yalnız bu modeli göstərmək üçün seçin",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Cari vaxtı əldə edin və tarix/vaxt hesablamaları aparın",
|
||||
"settings.admin.models.builtinTools.time.label": "Vaxt və Hesablama",
|
||||
"settings.admin.models.builtinTools.title": "Daxili Alətlər",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Çatdan Python iş sahəsi alətləri yarat",
|
||||
"settings.admin.models.builtinTools.tools.label": "Alət yaradılması",
|
||||
"settings.admin.models.builtinTools.userInput.description": "İstifadəçiyə dəqiqləşdirici sual vermək üçün cavabı müvəqqəti dayandır",
|
||||
"settings.admin.models.builtinTools.userInput.label": "İstifadəçidən soruş",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Vebdə axtar və URL-ləri gətir",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Bütün {{count}} töhfə verəni göstər",
|
||||
"Show all {{count}} contributors_one": "Bütün {{count}} töhfə verəni göstər",
|
||||
"Show all {{count}} contributors_other": "Bütün {{count}} töhfə verəni göstər",
|
||||
"Show diff": "",
|
||||
"Show diff": "Fərqi göstər",
|
||||
"Show Files": "Faylları Göstər",
|
||||
"Show Hidden Files": "Gizli faylları göstər",
|
||||
"Show image preview": "Şəkil önizləməsini göstər",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Dəstəyinizi göstərin!",
|
||||
"Showcased creativity": "Yaradıcılıq nümayiş etdirildi",
|
||||
"Showing search match": "Axtarışa uyğun nəticə göstərilir",
|
||||
"Side chat": "",
|
||||
"Side chat": "Yan çat",
|
||||
"Sidebar": "Yan panel",
|
||||
"Sign in": "Daxil ol",
|
||||
"Sign in again": "Yenidən daxil ol",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Səsdən Mətnə dili",
|
||||
"Split": "Yan-yana",
|
||||
"Sponsor on GitHub": "GitHub-da sponsor ol",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL sorğusu",
|
||||
"Staan API Key": "Staan API açarı",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Təsdiqləməyə hazırlanmış dəyişikliklər",
|
||||
"Standard": "Standart",
|
||||
"Start a new conversation": "Yeni söhbətə başlayın",
|
||||
"Start a voice call using your microphone?": "Mikrofonunuzdan istifadə edərək səsli zəng başladılsın?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Təklif olunan",
|
||||
"Suggested prompts": "Təklif olunan göstərişlər",
|
||||
"Summarize this note.": "Bu qeydi xülasə et.",
|
||||
"Summary": "",
|
||||
"Summary": "Xülasə",
|
||||
"Sun": "B.",
|
||||
"Support": "Dəstək",
|
||||
"Support this plugin:": "Bu plagini dəstəkləyin:",
|
||||
"Supported parameters": "Dəstəklənən parametrlər",
|
||||
"Swap": "Yerlərini dəyiş",
|
||||
"Swap sides": "Tərəflərin yerini dəyişdir",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Budağı dəyişdir",
|
||||
"Switch camera": "Kameranı dəyiş",
|
||||
"Switch to Assistant role": "Köməkçi roluna keç",
|
||||
"Switch to JSON editor": "JSON redaktoruna keç",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Sistem təlimatları",
|
||||
"System Prompt": "Sistem göstərişi (Prompt)",
|
||||
"Table": "Cədvəl",
|
||||
"Tabs": "",
|
||||
"Tabs": "Tablar",
|
||||
"Tag": "Etiket",
|
||||
"Tags": "Etiketlər",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail-free sampling (quyruqsuz seçmə) çıxışda az ehtimallı tokenlərin təsirini azaltmaq üçün istifadə olunur. Daha yüksək dəyər (məsələn, 2.0) təsiri daha çox azaldacaq, 1.0 dəyəri isə bu ayarı söndürür.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Mənə Roma İmperiyası haqqında təsadüfi maraqlı bir fakt de",
|
||||
"Tell us more:": "Bizə daha çox məlumat verin:",
|
||||
"Temporary": "Müvəqqəti",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Müvəqqəti çat",
|
||||
"Temporary Chat": "Müvəqqəti çat",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Müvəqqəti: bu yeni çat üçün müvəqqəti çat rejimini aç və ya söndür.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Bu əməliyyat geri qaytarıla bilməz. Cavablar görünməyə davam edəcək.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Bu kanal {{createdAt}} tarixində yaradılıb. Bu, {{channelName}} kanalının ən başlanğıcıdır.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Bu çat tarixçədə görünməyəcək və mesajlarınız yadda saxlanılmayacaq.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Bu fayl artıq açıqdır. Onun tabını bağlayın və ya başqa ad seçin.",
|
||||
"This folder is empty": "Bu qovluq boşdur",
|
||||
"This is a default user permission and will remain enabled.": "Bu, standart istifadəçi icazəsidir və aktiv qalacaq.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Bu, eksperimental funksiyadır, gözlənildiyi kimi işləməyə bilər və istənilən vaxt dəyişdirilə bilər.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Dəyişdirilməmiş sətirlər göstərilmir",
|
||||
"Underline": "Altdan xətt",
|
||||
"Undo": "Geri al",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Son təsdiqləməni geri al",
|
||||
"Undo the last commit and keep its changes staged?": "Son təsdiqləmə geri alınsın və onun dəyişiklikləri təsdiqləməyə hazırlanmış vəziyyətdə saxlanılsın?",
|
||||
"Unified": "Birləşdirilmiş",
|
||||
"Uninstall": "Sistemdən sil",
|
||||
"Uninstall app": "Tətbiqi sistemdən sil",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Davam etmək üçün mikrofonu yandırın",
|
||||
"Unpin": "Sabitlənmişdən çıxar",
|
||||
"Unpin from Sidebar": "Yan paneldən bərkitməni çıxar",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Göndərilməyib",
|
||||
"Unread": "Oxunmamış",
|
||||
"Unsaved changes": "Yadda saxlanılmamış dəyişikliklər",
|
||||
"Unsaved changes to this version will be discarded.": "Bu versiyadakı yadda saxlanılmamış dəyişikliklərdən imtina ediləcək.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "Bütün modelləri yenilə",
|
||||
"Update and Copy Link": "Yenilə və linki kopyala",
|
||||
"Update app": "Tətbiqi yenilə",
|
||||
"Update branch": "",
|
||||
"Update branch": "Budağı yenilə",
|
||||
"Update for the latest features and improvements.": "Ən son funksiyalar və təkmilləşdirmələr üçün yeniləyin.",
|
||||
"Update your status": "Statusunuzu yeniləyin",
|
||||
"Updated": "Yeniləndi",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Standartdan istifadə et",
|
||||
"Use device vibration feedback on supported Android devices.": "Dəstəklənən Android cihazlarında vibrasiya ilə əks-əlaqədən istifadə edin.",
|
||||
"Use discovered scopes": "Aşkarlanmış icazə sahələrindən istifadə et",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Tam enli tablardan istifadə et",
|
||||
"Use global setting": "Qlobal ayardan istifadə et",
|
||||
"Use groups to organize your users and assign permissions.": "İstifadəçilərinizi təşkil etmək və icazələr təyin etmək üçün qruplardan istifadə edin.",
|
||||
"Use in prompt": "Göstərişdə istifadə et",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Məqsədyönlü və uyğun məzmun çıxarmaq üçün seqmentlər üzrə axtarışdan istifadə edin.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Məqsədyönlü və uyğun kontekst üçün seqmentlər üzrə axtarışdan istifadə edin.",
|
||||
"Use segmented retrieval for focused context.": "Məqsədyönlü kontekst üçün seqmentlər üzrə axtarışdan istifadə edin.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Yan tablardan istifadə et",
|
||||
"Use these in model system prompts as {{example}}.": "Bunları modelin sistem göstərişlərində {{example}} formasında istifadə edin.",
|
||||
"Use Web Search?": "Veb axtarışdan istifadə edilsin?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Yerli funksiya çağırma rejimində istifadə olunur. İş sahəsi ayarları və istifadəçi icazələri qüvvədə qalır.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Video pleyer",
|
||||
"View": "Göstər",
|
||||
"View changes": "",
|
||||
"View changes": "Dəyişikliklərə bax",
|
||||
"View channel": "Kanala bax",
|
||||
"View chat": "Çata bax",
|
||||
"View comment": "Şərhə bax",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "{{platform}} platformasında bax",
|
||||
"View Replies": "Cavabları gör",
|
||||
"View Result from {{NAME}}": "{{NAME}} nəticəsinə bax",
|
||||
"View source": "Xam mətnə bax",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "İş",
|
||||
"Working Directory": "İş qovluğu",
|
||||
"Working Directory Context": "İş qovluğu konteksti",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "İş ağacındakı dəyişikliklər",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Top-k ilə birlikdə işləyir. Daha yüksək dəyər (məs. 0.95) daha müxtəlif mətnlərə, daha aşağı dəyər isə (məs. 0.5) daha fokuslanmış və mühafizəkar mətnlərin yaranmasına səbəb olacaq.",
|
||||
"Workspace": "İş sahəsi",
|
||||
"Workspace Models": "İş sahəsi modelləri",
|
||||
"Workspace Permissions": "İş sahəsi icazələri",
|
||||
"Workspace search": "İş sahəsində axtarış",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "İş ağacının budağı",
|
||||
"Worktree directory": "İş ağacının qovluğu",
|
||||
"Worktrees": "İş ağacları",
|
||||
"Write": "Yaz",
|
||||
"Write a prompt…": "Göstəriş yazın…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "{{topic}} mövzusunu xülasə edən 50 sözlük mətn yaz.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Bu bilik bazasına fayl yükləmək icazəniz yoxdur.",
|
||||
"You do not have permission to upload files.": "Fayl yükləmək icazəniz yoxdur.",
|
||||
"You do not have permission to upload web content.": "Veb məzmunu yükləmək icazəniz yoxdur.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Yan çatdan istifadə etmək icazəniz yoxdur.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "50-dən çox istifadəçiniz var; bu, çox vaxt iş sahəsinin təşkilat daxilində istifadə olunduğunu göstərir. Open WebUI mövcud halında heç bir məhdudiyyət və ya gizli limit olmadan pulsuz istifadə edilə bilər və biz bunun belə qalmasını istəyirik.",
|
||||
"You have no archived conversations.": "Arxivlənmiş söhbətiniz yoxdur.",
|
||||
"You have no shared conversations.": "Paylaşılmış söhbətiniz yoxdur.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "Изпълнението на чат завърши успешно.",
|
||||
"A collaboration channel where people join as members": "Канал за съвместна работа, към който хората се присъединяват като членове",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Канал за обсъждания, в който достъпът се контролира чрез групи и разрешения",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Вече съществува файл с това име. Да се замени ли?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Вече е налична нова версия (v{{LATEST_VERSION}}).",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Една от страниците е променена другаде. Предишният ви текст е наличен за изтегляне.",
|
||||
"A private conversation between you and selected users": "Личен разговор между вас и избрани потребители",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Разрешете избирането на скрити модели като базови модели.",
|
||||
"Allow Sharing With Groups": "Разреши споделяне с групи",
|
||||
"Allow Sharing With Users": "Разреши споделяне с потребители",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Разреши страничен чат",
|
||||
"Allow Speech to Text": "Разреши преобразуване на реч в текст",
|
||||
"Allow Temporary Chat": "Разреши временен чат",
|
||||
"Allow Text to Speech": "Разреши преобразуване на текст в реч",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Прилагайте функции, които обработват съобщенията преди или след отговора на модела.",
|
||||
"Apply to draft": "Прилагане към черновата",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Прилагането използва предложената редакция вдясно. След това запазете черновата си.",
|
||||
"Approve": "",
|
||||
"Approve": "Одобряване",
|
||||
"Approximate comparison": "Приблизително сравнение",
|
||||
"Apps": "Приложения",
|
||||
"April": "Април",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Поискай одобрение",
|
||||
"Ask or edit…": "Попитайте или редактирайте…",
|
||||
"Ask this knowledge source a test question": "Задайте тестов въпрос на този източник на знания",
|
||||
"Assignees": "",
|
||||
"Assignees": "Отговорници",
|
||||
"Assistance": "Помощ",
|
||||
"assistant": "асистент",
|
||||
"Assistant": "Асистент",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Приложението за удостоверяване е настроено",
|
||||
"Authenticator not configured": "Приложението за удостоверяване не е настроено",
|
||||
"Authenticator setup QR code": "QR код за настройка на приложението за удостоверяване",
|
||||
"Author": "",
|
||||
"Author": "Автор",
|
||||
"Authorize OAuth": "Разреши OAuth",
|
||||
"Auto": "Авто",
|
||||
"Auto (Random)": "Автоматично (случаен избор)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Реч",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Назад",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Връщане към промените",
|
||||
"Back to files": "Обратно към файловете",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Връщане към заявките за сливане",
|
||||
"Back to sign in": "Обратно към вписването",
|
||||
"Background Image": "Фоново изображение",
|
||||
"Background image must be at most 25 megapixels.": "Фоновото изображение трябва да е най-много 25 мегапиксела.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Фоновият подагент приключи",
|
||||
"background sub-agents": "фонови подагенти",
|
||||
"Bad Response": "Невалиден отговор от API",
|
||||
"Base branch": "",
|
||||
"Base branch": "Целеви клон",
|
||||
"Base Model (From)": "Базов модел (от)",
|
||||
"Base Model is required.": "Базовият модел е задължителен.",
|
||||
"Base Models": "Базови модели",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "преди",
|
||||
"Being lazy": "Мързелив е",
|
||||
"Binary file — text comparison is unavailable.": "Двоичен файл — текстовото сравнение не е налично.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Двоичният файл е променен",
|
||||
"Binary file. Download to open.": "Двоичен файл. Изтеглете го, за да го отворите.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Опции на блока",
|
||||
"Bold": "Получер",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Насърчава или потиска конкретни токени за ограничаване на отговорите. Стойностите на отклонението ще бъдат ограничени между -100 и 100 включително. (По подразбиране: няма)",
|
||||
"Both files are required for comparison.": "За сравнението са необходими и двата файла.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Действия с клона",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Браузър",
|
||||
"Browser options": "Опции на браузъра",
|
||||
"build · {{hash}}": "компилация · {{hash}}",
|
||||
"Built-in": "Вградена",
|
||||
"Bullet List": "Списък с водещи символи",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Промени иконата на папката",
|
||||
"Change overview": "Преглед на промените",
|
||||
"Change User Role": "Промени ролята на потребителя",
|
||||
"changed": "",
|
||||
"changed": "— променени",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Промените водят до изход от всички устройства. Потребителите ще настроят удостоверяването при следващото си вписване.",
|
||||
"Channel": "Канал",
|
||||
"Channel deleted successfully": "Каналът е изтрит успешно",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "Провери откриването на OAuth",
|
||||
"Check what is running in this chat.": "Проверете какво се изпълнява в този чат.",
|
||||
"Checking for updates...": "Проверка за актуализации...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Превключване към клона",
|
||||
"Choose a date range to compare": "Изберете диапазон от дати за сравнение",
|
||||
"Choose a model before saving...": "Изберете модел преди запазване...",
|
||||
"Choose a parent page. Subpages move with this page.": "Изберете родителска страница. Подстраниците се преместват заедно с тази страница.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Затвори прозореца",
|
||||
"Close Modal": "Затвори прозореца",
|
||||
"Close pages": "Затвори страниците",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Затвори заявката за сливане",
|
||||
"Close search": "Затвори търсенето",
|
||||
"Close session details": "Затвори подробностите за сесията",
|
||||
"Close Sidebar": "Затвори страничната лента",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Сътрудници",
|
||||
"Collapse": "Свий",
|
||||
"Collapse {{name}}": "Свий {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Свиване на панела на Git",
|
||||
"Collapse sessions": "Свиване на сесиите",
|
||||
"Collapse terminal": "Свий терминала",
|
||||
"Collection": "Колекция",
|
||||
"Collection Field": "Поле за колекция",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Коментарът е изтрит",
|
||||
"Comments": "Коментари",
|
||||
"Comments are no longer available.": "Коментарите вече не са налични.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Действия със записа на промени",
|
||||
"Commit message": "Съобщение за промяната",
|
||||
"Commit Message": "Съобщение за промяната",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Обобщение на записа на промени",
|
||||
"Commit to {{branch}}": "Запис на промени в {{branch}}",
|
||||
"Community Reviews": "Отзиви от общността",
|
||||
"Compact": "Свий контекста",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Свий контекста: съкрати по-старите съобщения, за да може този чат да продължи.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Конфигурацията е импортирана успешно",
|
||||
"Configure": "Конфигуриране",
|
||||
"Configure app": "Конфигуриране на приложението",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Конфигуриране на файловете в чата, клапаните, системния промпт и разширените параметри.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Конфигурирайте гласа в реално време, гласовия аватар и гласа за преобразуване на текст в реч за този модел.",
|
||||
"Confirm": "Потвърди",
|
||||
"Confirm Password": "Потвърди Парола",
|
||||
"Confirm Prompt from Embed": "Потвърди промпта от вграденото съдържание",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Потвърждаване на действието със заявката за сливане",
|
||||
"Confirm recording": "Потвърди записа",
|
||||
"Confirm your action": "Потвърдете действието си",
|
||||
"Confirm your new password": "Потвърдете новата си парола",
|
||||
"Confirm Your Password": "Потвърдете паролата си",
|
||||
"Connect": "Свързване",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Първо се свържете и изберете модел.",
|
||||
"Connect external apps to Open WebUI.": "Свързване на външни приложения с Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Свържете се с доставчик на изкуствен интелект, за да започнете чат",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Свържете се с инстанции на Open Terminal. Администраторите и потребителите с предоставен достъп могат да преглеждат файлове и да използват терминални инструменти през тези сървъри.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Свързани приложения",
|
||||
"Connecting": "Свързване",
|
||||
"Connecting...": "Свързване...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Свързване…",
|
||||
"Connection": "Връзка",
|
||||
"Connection failed": "Свързването се провали",
|
||||
"Connection ID": "ID на връзката",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "ID на връзката не може да съдържа символите \":\" или \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Връзката е прекъсната. Опитайте отново.",
|
||||
"Connection lost. Reconnecting...": "Връзката е прекъсната. Повторно свързване...",
|
||||
"Connection successful": "Успешно свързване",
|
||||
"Connection Type": "Тип връзка",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Копирай",
|
||||
"Copy {{name}} to clipboard": "Копиране на {{name}} в клипборда",
|
||||
"Copy API Key": "Копирай API ключ",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Копиране на името на клона",
|
||||
"Copy change to original": "Копиране на промяната в оригинала",
|
||||
"Copy change to proposal": "Копиране на промяната в предложението",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Копиране на хеша на записа на промени",
|
||||
"Copy content": "Копирай съдържанието",
|
||||
"Copy default": "Копирай стойността по подразбиране",
|
||||
"Copy Last Code Block": "Копирай последния блок с код",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Авторско право (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS трябва да бъде правилно конфигуриран от доставчика, за да позволи заявки от Open WebUI.",
|
||||
"Could not check for updates": "Неуспешна проверка за актуализации",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Името на клона не можа да се копира",
|
||||
"Could not copy commit hash": "Хешът на записа на промени не можа да се копира",
|
||||
"Could not copy to clipboard. Please try again.": "Не можа да се копира в клипборда. Опитайте отново.",
|
||||
"Could not determine the upload folder.": "Папката за качване не можа да се определи.",
|
||||
"Could not load avatar.": "Аватарът не можа да бъде зареден.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Създаване на Акаунт",
|
||||
"Create Admin Account": "Създаване на администраторски акаунт",
|
||||
"Create announcements shown to users in the app.": "Създавайте съобщения, които се показват на потребителите в приложението.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Създаване на клон",
|
||||
"Create Channel": "Създаване на канал",
|
||||
"Create copy": "Създаване на копие",
|
||||
"Create Folder": "Създай папка",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Създавайте планирани промптове, които се изпълняват автоматично на редовни интервали.",
|
||||
"Create skill": "Създаване на умение",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Създаване на умение: създаване на терминално умение за многократна употреба от този чат.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Създаване на работно дърво",
|
||||
"Create your first note from the Create menu.": "Създайте първата си бележка от менюто Създай.",
|
||||
"Created": "Създадено",
|
||||
"Created at": "Създадено на",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Стойност на персонализирания параметър",
|
||||
"Custom permissions": "Персонализирани разрешения",
|
||||
"Custom range": "Персонализиран диапазон",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Персонализиран график",
|
||||
"Customize": "Персонализирай",
|
||||
"Daily": "Ежедневно",
|
||||
"Daily at": "Всеки ден в",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Данни",
|
||||
"Database": "База данни",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Дата",
|
||||
"Date Added": "Дата на добавяне",
|
||||
"Date is required": "Датата е задължителна",
|
||||
"Date Modified": "Дата на промяна",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Изтрий цялото съдържание на тази папка",
|
||||
"Delete API Key?": "Изтриване на API ключа?",
|
||||
"Delete automation?": "Изтриване на автоматизацията?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Изтриване на клон",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Изтриване на клона {{branch}}? Неслетите клонове ще бъдат запазени.",
|
||||
"Delete calendar": "Изтрий календара",
|
||||
"Delete Calendar": "Изтрий календара",
|
||||
"Delete Chat": "Изтриване на Чат",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Описание",
|
||||
"Description ({{language}})": "Описание ({{language}})",
|
||||
"Deselect": "Премахни избора",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Работен плот",
|
||||
"Desktop access denied. Reopen this tab.": "Достъпът до работния плот е отказан. Отворете отново този раздел.",
|
||||
"Desktop audio": "Звук от работния плот",
|
||||
"Desktop audio is not supported by this browser.": "Този браузър не поддържа звук от работния плот.",
|
||||
"Desktop audio unavailable.": "Звукът от работния плот не е наличен.",
|
||||
"Desktop connection failed.": "Неуспешно свързване с работния плот.",
|
||||
"Destination": "Местоназначение",
|
||||
"Detected Variables": "Открити променливи",
|
||||
"dev build": "компилация за разработка",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Да се отхвърлят ли промените в сравнението?",
|
||||
"Discard unsaved changes?": "Да се отхвърлят ли незапазените промени?",
|
||||
"Discard unsaved skill changes?": "Да се отхвърлят ли незапазените промени в умението?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Да се отхвърлят ли незапазените промени по този файл в работното дърво? Това действие не може да бъде отменено.",
|
||||
"Disconnect OAuth": "Прекъсни OAuth връзката",
|
||||
"Disconnected": "Не е свързано",
|
||||
"Discover a function": "Открийте функция",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "Изтегляне на \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Изтегляне на \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Изтегляне на статистиката...",
|
||||
"Draft": "",
|
||||
"Draft": "Чернова",
|
||||
"Drag and Drop Container": "Област за плъзгане и пускане",
|
||||
"Drag or use the up and down arrow keys to reorder": "Плъзнете или използвайте клавишите със стрелки нагоре и надолу, за да промените реда",
|
||||
"Drag to move": "Плъзнете за преместване",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверете се, че вашият CSV файл включва 4 колони в следния ред: Име, Имейл, Парола, Роля.",
|
||||
"Enter {{role}} message here": "Въведете съобщение за {{role}} тук",
|
||||
"Enter a Connection ID to register.": "Въведете ID на връзката, за да я регистрирате.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Въведете име на файл без наклонени черти.",
|
||||
"Enter a name, content, and a valid command.": "Въведете име, съдържание и валидна команда.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Въведете заглавие за наслагването с информация за чакащ потребител. Оставете празно за стойността по подразбиране.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Въведете воден знак за отговора. Оставете празно, ако не желаете воден знак.",
|
||||
"Enter additional headers in JSON format": "Въведете допълнителни заглавки във формат JSON",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Въведете допълнителни заглавки във формат JSON (напр. {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "Въведете допълнителни параметри във формат JSON",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Въведете HTTP или HTTPS URL адрес без данни за удостоверяване.",
|
||||
"Enter api auth string (e.g. username:password)": "Въведете низ за удостоверяване на API (напр. потребителско_име:парола)",
|
||||
"Enter Application DN": "Въведете DN на приложението",
|
||||
"Enter Application DN Password": "Въведете парола за DN на приложението",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Изпълнете кода за анализ",
|
||||
"Executing {{NAME}}...": "Изпълнява се {{NAME}}...",
|
||||
"Execution timeline": "Времева линия на изпълнението",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Изход от цял екран",
|
||||
"Expand": "Разгъване",
|
||||
"Expand {{name}}": "Разгъни {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Разгъване на панела на Git",
|
||||
"Expand input": "Разгъване на полето за въвеждане",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Разгъване на сесиите",
|
||||
"Expand terminal": "Разгъни терминала",
|
||||
"Experience": "Потребителско изживяване",
|
||||
"Experimental": "Експериментално",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Неуспешно импортиране на модели",
|
||||
"Failed to load chat": "Неуспешно зареждане на чата",
|
||||
"Failed to load chat preview": "Неуспешно зареждане на прегледа на чата",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Неуспешно зареждане на директорията",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Неуспешно зареждане на DOCX файла. Опитайте да го изтеглите.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Неуспешно зареждане на Excel/CSV файла. Опитайте да го изтеглите.",
|
||||
"Failed to load file content.": "Неуспешно зареждане на съдържанието на файла.",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Неуспешен запис на връзките",
|
||||
"Failed to save conversation": "Неуспешно запазване на разговора",
|
||||
"Failed to save file": "Неуспешно запазване на файла",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Неуспешно запазване на файла. Промените ви все още са в редактора.",
|
||||
"Failed to save model": "Неуспешно запазване на модела",
|
||||
"Failed to save models configuration": "Неуспешно запазване на конфигурацията на моделите",
|
||||
"Failed to save policy: {{error}}": "Неуспешен запис на правилата: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Действия с файла",
|
||||
"File added successfully.": "Файлът е добавен успешно.",
|
||||
"File browser": "Файлов браузър",
|
||||
"File changes": "",
|
||||
"File changes": "Промени във файла",
|
||||
"File content": "Съдържание на файла",
|
||||
"File content updated successfully.": "Съдържанието на файла е актуализирано успешно.",
|
||||
"File count limit": "Ограничение за броя файлове",
|
||||
"File created": "Файлът е създаден",
|
||||
"File deleted successfully.": "Файлът е изтрит успешно.",
|
||||
"File differences": "Разлики между файловете",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Във файла не може да се записва.",
|
||||
"File Mode": "Файлов режим",
|
||||
"File moved.": "Файлът е преместен.",
|
||||
"File name": "Име на файла",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "Получаване на информация за {{name}} в интерфейса",
|
||||
"Get started": "Започнете",
|
||||
"Get started with {{WEBUI_NAME}}": "Започнете с {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Промени в Git",
|
||||
"Git unavailable": "Git не е наличен",
|
||||
"Give me ideas": "Дай ми идеи",
|
||||
"give me tips": "дай ми съвети",
|
||||
"Global": "Глобално",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Изходен клон",
|
||||
"Headers": "Заглавки",
|
||||
"Headers must be a valid JSON object": "Заглавките трябва да са валиден JSON обект",
|
||||
"Height": "Височина",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Скрий",
|
||||
"Hide All": "Скриване на всички",
|
||||
"Hide conversation": "Скриване на разговора",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Скриване на разликите",
|
||||
"Hide from Sidebar": "Скриване от страничната лента",
|
||||
"Hide Hidden Files": "Скриване на скритите файлове",
|
||||
"Hide Model": "Скриване на модела",
|
||||
"Hide preview": "Скриване на прегледа",
|
||||
"Hide sub-agents": "Скриване на подагентите",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Скриване на разделите",
|
||||
"Hide whitespace": "Скриване на празните символи",
|
||||
"High": "Високо",
|
||||
"History": "История",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Източникът на знания е актуализиран.",
|
||||
"Knowledge updated successfully": "Знанието е актуализирано успешно",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Браузър)",
|
||||
"Labels": "",
|
||||
"Labels": "Етикети",
|
||||
"Last 12 months": "Последните 12 месеца",
|
||||
"Last 24 hours": "Последните 24 часа",
|
||||
"Last 30 days": "Последните 30 дни",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "Март",
|
||||
"Mark all as read": "Маркиране на всички като прочетени",
|
||||
"Mark as unread": "Маркиране като непрочетено",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Отбелязване като готова",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Пазар",
|
||||
"Matching tabs: {{count}}_one": "Съвпадащи раздели: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Споменаване на някого",
|
||||
"Mentions only": "Само споменавания",
|
||||
"Menu": "Меню",
|
||||
"Merge": "",
|
||||
"Merge": "Сливане",
|
||||
"Merge Responses": "Обединяване на отговори",
|
||||
"Merged Response": "Обединен отговор",
|
||||
"Message": "Съобщение",
|
||||
"Message counts and response timestamps": "Брой съобщения и времеви отметки на отговорите",
|
||||
"Message counts are based on assistant responses.": "Броят на съобщенията се основава на отговорите на асистента.",
|
||||
"Message exceeds the 16 KiB limit.": "Съобщението надвишава ограничението от 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Номер на съобщението",
|
||||
"Message rating should be enabled to use this feature": "Оценяването на съобщения трябва да бъде активирано, за да използвате тази функция",
|
||||
"Message share": "Дял на съобщенията",
|
||||
"Message text...": "Текст на съобщението...",
|
||||
"messages": "— съобщения",
|
||||
"Messages": "Съобщения",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Съобщенията са шифровани от край до край и не се запазват.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Съобщенията изчезват, когато затворите този раздел.",
|
||||
"Metadata Field": "Поле за метаданни",
|
||||
"Microphone off": "Микрофонът е изключен",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Параметри на Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Пн",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Мобилен изглед",
|
||||
"Model": "Модел",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Моделите са импортирани успешно",
|
||||
"Models Public Sharing": "Споделяне на моделите публично",
|
||||
"Models Sharing": "Споделяне на модели",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Модели, на които този модел може да възлага задачи. Потребителите трябва да имат достъп до тях. Оставете празно, за да използвате текущия модел.",
|
||||
"Modified": "Променено",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Пн",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Преминаване към предишния чат",
|
||||
"Never": "Никога",
|
||||
"New": "Ново",
|
||||
"New branch": "",
|
||||
"New branch": "Нов клон",
|
||||
"New Button": "Нов бутон",
|
||||
"New calendar": "Нов календар",
|
||||
"New Calendar": "Нов календар",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Нова група",
|
||||
"New Note": "Нова бележка",
|
||||
"New Password": "Нова парола",
|
||||
"New pull request": "",
|
||||
"New pull request": "Нова заявка за сливане",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Новите умения и копия са с частен достъп. Замяната запазва нова версия и съхранява съществуващото споделяне.",
|
||||
"New tab": "",
|
||||
"New tab": "Нов раздел",
|
||||
"New Temporary Chat": "Нов временен чат",
|
||||
"New Terminal": "Нов терминал",
|
||||
"New Tool": "Нов инструмент",
|
||||
"New Webhook": "Нова уебкука",
|
||||
"New worktree": "",
|
||||
"New worktree": "Ново работно дърво",
|
||||
"new-channel": "нов-канал",
|
||||
"Next": "Следващо",
|
||||
"Next change": "Следваща промяна",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Няма свързани приложения.",
|
||||
"No authentication": "Без автентикация",
|
||||
"No automations found": "Няма намерени автоматизации",
|
||||
"No changes": "",
|
||||
"No changes": "Няма промени",
|
||||
"No channels": "Няма канали",
|
||||
"No chat alerts": "Няма известия за чатове",
|
||||
"No chat history": "Няма история на чата",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Няма намерени чатове",
|
||||
"No chats found for this user.": "Няма намерени чатове за този потребител.",
|
||||
"No chats found.": "Няма намерени чатове.",
|
||||
"No checks": "",
|
||||
"No checks": "Няма проверки",
|
||||
"No comments yet": "Все още няма коментари",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Все още няма записи на промени",
|
||||
"No content": "Без съдържание",
|
||||
"No content available": "Няма налично съдържание",
|
||||
"No content found": "Не е намерено съдържание",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Няма предишни данни за използване",
|
||||
"No prompts found": "Няма намерени промптове",
|
||||
"No prompts yet": "Все още няма промптове",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Няма заявки за сливане",
|
||||
"No Repeat": "Без повторение",
|
||||
"No results": "Няма намерени резултати",
|
||||
"No results found": "Няма намерени резултати",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Няма конфигурирана терминална връзка.",
|
||||
"No terminal connections configured.": "Няма конфигурирани терминални връзки.",
|
||||
"No terminal servers available": "Няма налични терминални сървъри",
|
||||
"No text changes": "",
|
||||
"No text changes": "Няма промени в текста",
|
||||
"No text differences": "Няма текстови разлики",
|
||||
"No tool server connections configured.": "Няма конфигурирани връзки със сървъри за инструменти.",
|
||||
"No tools accessible": "Нямате достъп до инструменти",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Няма клапани за актуализиране",
|
||||
"No webhooks yet": "Все още няма уебкуки",
|
||||
"Node Ids": "ID на възли",
|
||||
"none": "",
|
||||
"none": "няма",
|
||||
"None": "Никой",
|
||||
"None reported": "Няма посочени",
|
||||
"Not configured": "Не е конфигурирано",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"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.": "Упс! Използвате неподдържан метод (само фронтенд). Моля, сервирайте WebUI от бекенда.",
|
||||
"Open": "Отвори",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Отворете раздел чрез менюто +.",
|
||||
"Open automation": "Отваряне на автоматизацията",
|
||||
"Open chat": "Отваряне на чата",
|
||||
"Open create menu": "Отваряне на менюто за създаване",
|
||||
"Open file": "Отвори файл",
|
||||
"Open Folder": "Отваряне на папка",
|
||||
"Open in full screen": "Отвори на цял екран",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Отваряне в GitHub",
|
||||
"Open in new tab": "Отваряне в нов раздел",
|
||||
"Open link": "Отваряне на връзката",
|
||||
"Open modal to configure connection": "Отваряне на диалог за конфигуриране на връзката",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "параметър",
|
||||
"Parameter": "Параметър",
|
||||
"Parameters": "Параметри",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Родителска директория",
|
||||
"Parent group": "Родителска група",
|
||||
"Parent message not found": "Родителското съобщение не е намерено",
|
||||
"Parent page": "Родителска страница",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Моля, изберете причина",
|
||||
"Please select a valid JSON file": "Изберете валиден JSON файл",
|
||||
"Please select at least one user for Direct Message channel.": "Изберете поне един потребител за канала за директни съобщения.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Изчакайте качването на файловете да приключи.",
|
||||
"Please wait until all files are uploaded.": "Изчакайте да се качат всички файлове.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP или GIF. До 5 MiB и 25 мегапиксела.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Промените в политиката се прилагат към новосъздадените терминали. Обновете съответстващите терминали, за да ги приложите към съществуващите.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Доставчик",
|
||||
"Provider context": "Контекстен прозорец на доставчика",
|
||||
"Provider details": "Подробности от доставчика",
|
||||
"Proxy": "",
|
||||
"Proxy": "Прокси",
|
||||
"Public": "Публично",
|
||||
"Public key": "Публичен ключ",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Извади \"{{searchValue}}\" от Ollama.com",
|
||||
"Pull a model from Ollama.com": "Издърпайте модела от Ollama.com",
|
||||
"Pull Model": "Изтегляне на модел",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Действия със заявката за сливане",
|
||||
"Pull request description": "Описание на заявката за сливане",
|
||||
"Pull request title": "Заглавие на заявката за сливане",
|
||||
"Punctuation": "Пунктуация",
|
||||
"Pyodide file browser": "Файлов браузър на Pyodide",
|
||||
"Quality": "Качество",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Прочетете документацията",
|
||||
"Read-only": "Само за четене",
|
||||
"Read-Only Access": "Достъп само за четене",
|
||||
"Ready": "",
|
||||
"Ready": "Отбелязване като готова",
|
||||
"Realtime": "В реално време",
|
||||
"Realtime Voice": "Глас в реално време",
|
||||
"Reason": "Причина",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Препоръчано",
|
||||
"Reconnect": "Повторно свързване",
|
||||
"Reconnected": "Връзката е възстановена",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Повторно свързване…",
|
||||
"Record": "Запиши",
|
||||
"Record voice": "Записване на глас",
|
||||
"Recorded duration": "Записана продължителност",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "Премахване на {{count}} остарял файл...",
|
||||
"Removing {{count}} stale files..._other": "Премахване на {{count}} остарели файла...",
|
||||
"Rename": "Преименуване",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Преименуване на клон",
|
||||
"Rename page": "Преименуване на страницата",
|
||||
"Renamed to {{name}}": "Преименувано на {{name}}",
|
||||
"Rendered preview": "Визуализиран преглед",
|
||||
"Reopen": "",
|
||||
"Reopen": "Повторно отваряне",
|
||||
"Reorder": "Пренареждане",
|
||||
"Repeat": "Повтаряне",
|
||||
"Replace": "Замяна",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Отговор в нишката...",
|
||||
"Replying to {{NAME}}": "Отговор на {{NAME}}",
|
||||
"Reported by the provider.": "Предоставени от доставчика.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Искане на промени",
|
||||
"Requested scopes": "Заявени обхвати",
|
||||
"Require an authenticator for all users": "Изисквай приложение за удостоверяване за всички потребители",
|
||||
"required": "задължително",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Възстановяване на стойностите по подразбиране",
|
||||
"Reset view": "Нулиране на изгледа",
|
||||
"Reset zoom": "Нулиране на мащаба",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Преоразмеряване на панела на Git",
|
||||
"Resize panel": "Преоразмеряване на панела",
|
||||
"Resolved": "Решен",
|
||||
"Response": "Отговор",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "— отговори със записани данни за използване",
|
||||
"Restart": "Рестартиране",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Рестартирайте всички инстанции на Open WebUI, за да приложите промените в настройките на връзката с доставчика.",
|
||||
"Restricted": "Ограничен достъп",
|
||||
"Result": "Резултат",
|
||||
"RESULT": "Резултат",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "Извлечени {{count}} източника",
|
||||
"Retrieved 1 source": "Извлечен 1 източник",
|
||||
"Retry": "Повторен опит",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Повторен опит за откриване на Git",
|
||||
"Retry setup": "Повторна настройка",
|
||||
"Return to call": "Връщане към обаждането",
|
||||
"Return to conversation": "Връщане към разговора",
|
||||
"Review": "Преглед",
|
||||
"Review the scopes this app is requesting before adding it.": "Прегледайте обхватите, които това приложение заявява, преди да го добавите.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Рецензенти",
|
||||
"Revised": "Променен",
|
||||
"Rewrite the selected text.": "Пренаписване на избрания текст.",
|
||||
"Role": "Роля",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "Запис & Създаване",
|
||||
"Save & Update": "Запис & Актуализиране",
|
||||
"Save and send": "Запис и изпращане",
|
||||
"Save As": "",
|
||||
"Save As": "Запис като",
|
||||
"Save As Copy": "Запиши като копие",
|
||||
"Save Chat": "Запис на чата",
|
||||
"Save draft as copy": "Запис на черновата като копие",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Търси действия",
|
||||
"Search all emojis": "Търси във всички емоджита",
|
||||
"Search Automations": "Търси автоматизации",
|
||||
"Search branches": "",
|
||||
"Search branches": "Търси клонове",
|
||||
"Search built-in tools": "Търси вградени инструменти",
|
||||
"Search channels": "Търси канали",
|
||||
"Search Chats": "Търсене на чатове",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Търси или добави шаблон",
|
||||
"Search parent groups": "Търсене на родителски групи",
|
||||
"Search Prompts": "Търси Промптове",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Търси заявки за сливане",
|
||||
"Search results": "Резултати от търсенето",
|
||||
"Search scopes": "Търси обхвати",
|
||||
"Search sessions": "Търсене в сесиите",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "Търси потребители или групи",
|
||||
"Search workspace": "Търсене в работното пространство",
|
||||
"Search workspace…": "Търси в работното пространство…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Търси работни дървета",
|
||||
"Search your workspace": "Търсене в работното пространство",
|
||||
"Searched {{count}} sites": "Претърсени {{count}} сайт",
|
||||
"Searching": "Търсене",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Изберете модел, за да се показва само той.",
|
||||
"Select a pipeline": "Изберете пайплайн",
|
||||
"Select a pipeline url": "Избор на URL адрес на канал",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Изберете заявка за сливане",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Изберете диапазон, за да филтрирате сесиите. Включени са и частичните данни за използване.",
|
||||
"Select a reranking model engine": "Изберете енджин за модела за преподреждане",
|
||||
"Select a role": "Изберете роля",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Изберете терминал, за да отваряте URL адреси на localhost.",
|
||||
"Select a theme": "Изберете тема",
|
||||
"Select a tool": "Изберете инструмент",
|
||||
"Select a voice": "Изберете глас",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Избор на заредените файлове",
|
||||
"Select Method": "Изберете метод",
|
||||
"Select model": "Изберете модел",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Изберете само един модел",
|
||||
"Select only one model to call": "Изберете само един модел за извикване",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Изберете само един модел, за да отворите страничен чат.",
|
||||
"Select options": "Изберете опции",
|
||||
"Select Skill": "Изберете умение",
|
||||
"Select to isolate model": "Избор за показване само на този модел",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Получаване на текущото време и извършване на изчисления с дати и часове",
|
||||
"settings.admin.models.builtinTools.time.label": "Време и изчисления",
|
||||
"settings.admin.models.builtinTools.title": "Вградени инструменти",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Създаване на инструменти на Python в работното пространство от чата",
|
||||
"settings.admin.models.builtinTools.tools.label": "Създаване на инструменти",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Поставяне на отговора на пауза за уточняващ въпрос към потребителя",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Попитай потребителя",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Търсене в интернет и извличане на URL адреси",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Показване на всички {{count}} автори",
|
||||
"Show all {{count}} contributors_one": "Показване на {{count}} автор",
|
||||
"Show all {{count}} contributors_other": "Показване на всички {{count}} автори",
|
||||
"Show diff": "",
|
||||
"Show diff": "Показване на разликите",
|
||||
"Show Files": "Показване на файлове",
|
||||
"Show Hidden Files": "Показване на скритите файлове",
|
||||
"Show image preview": "Показване на преглед на изображението",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Покажете вашата подкрепа!",
|
||||
"Showcased creativity": "Показана креативност",
|
||||
"Showing search match": "Показано е съвпадение от търсенето",
|
||||
"Side chat": "",
|
||||
"Side chat": "Страничен чат",
|
||||
"Sidebar": "Странична лента",
|
||||
"Sign in": "Вписване",
|
||||
"Sign in again": "Влезте отново",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Език за преобразуване на реч в текст",
|
||||
"Split": "Разделен",
|
||||
"Sponsor on GitHub": "Спонсорирайте в GitHub",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL заявка",
|
||||
"Staan API Key": "API ключ за Staan",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Промени, подготвени за запис",
|
||||
"Standard": "Стандартен",
|
||||
"Start a new conversation": "Започване на нов разговор",
|
||||
"Start a voice call using your microphone?": "Да започне ли гласово обаждане чрез микрофона ви?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Препоръчано",
|
||||
"Suggested prompts": "Предложени промптове",
|
||||
"Summarize this note.": "Обобщаване на тази бележка.",
|
||||
"Summary": "",
|
||||
"Summary": "Обобщение",
|
||||
"Sun": "Нд",
|
||||
"Support": "Поддръжка",
|
||||
"Support this plugin:": "Подкрепете този плъгин:",
|
||||
"Supported parameters": "Поддържани параметри",
|
||||
"Swap": "Размяна",
|
||||
"Swap sides": "Размяна на страните",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Превключване на клона",
|
||||
"Switch camera": "Смяна на камерата",
|
||||
"Switch to Assistant role": "Превключване към ролята на асистент",
|
||||
"Switch to JSON editor": "Превключване към JSON редактор",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Системни инструкции",
|
||||
"System Prompt": "Системен Промпт",
|
||||
"Table": "Таблица",
|
||||
"Tabs": "",
|
||||
"Tabs": "Раздели",
|
||||
"Tag": "Таг",
|
||||
"Tags": "Тагове",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail free sampling намалява влиянието на по-малко вероятните токени върху изхода. По-висока стойност (напр. 2.0) намалява влиянието им повече, а стойност 1.0 изключва тази настройка.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Кажи ми случаен любопитен факт за Римската империя",
|
||||
"Tell us more:": "Повече информация:",
|
||||
"Temporary": "Временен",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Временен чат",
|
||||
"Temporary Chat": "Временен чат",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Временен: включване или изключване на временния режим за този нов чат.",
|
||||
"Terminal": "Терминал",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Това не може да бъде отменено. Отговорите ще останат видими.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Този канал е създаден на {{createdAt}}. Това е самото начало на канала {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Този чат няма да се показва в историята и съобщенията ви няма да се запазват.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Този файл вече е отворен. Затворете раздела му или изберете друго име.",
|
||||
"This folder is empty": "Тази папка е празна",
|
||||
"This is a default user permission and will remain enabled.": "Това е потребителско право по подразбиране и ще остане включено.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Това е експериментална функция, може да не работи според очакванията и подлежи на промяна по всяко време.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Непроменените редове са пропуснати",
|
||||
"Underline": "Подчертаване",
|
||||
"Undo": "Отмяна",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Отмяна на последния запис на промени",
|
||||
"Undo the last commit and keep its changes staged?": "Да се отмени ли последният запис на промени, като промените му останат подготвени за запис?",
|
||||
"Unified": "Обединен",
|
||||
"Uninstall": "Деинсталиране",
|
||||
"Uninstall app": "Деинсталиране на приложението",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Включете микрофона, за да продължите",
|
||||
"Unpin": "Откачи",
|
||||
"Unpin from Sidebar": "Откачане от страничната лента",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Неизпратен",
|
||||
"Unread": "Непрочетени",
|
||||
"Unsaved changes": "Незапазени промени",
|
||||
"Unsaved changes to this version will be discarded.": "Незапазените промени в тази версия ще бъдат отхвърлени.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "Обновяване на всички модели",
|
||||
"Update and Copy Link": "Обнови и копирай връзката",
|
||||
"Update app": "Актуализиране на приложението",
|
||||
"Update branch": "",
|
||||
"Update branch": "Актуализиране на клона",
|
||||
"Update for the latest features and improvements.": "Актуализирайте за най-новите функции и подобрения.",
|
||||
"Update your status": "Обновяване на състоянието ви",
|
||||
"Updated": "Актуализирано",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Използване на стойността по подразбиране",
|
||||
"Use device vibration feedback on supported Android devices.": "Използване на вибрационна обратна връзка на поддържаните Android устройства.",
|
||||
"Use discovered scopes": "Използване на откритите обхвати на достъп",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Използване на раздели с пълна ширина",
|
||||
"Use global setting": "Използване на глобалната настройка",
|
||||
"Use groups to organize your users and assign permissions.": "Използвайте групи за организиране на потребителите и задаване на права.",
|
||||
"Use in prompt": "Използване в промпта",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Използване на сегментирано извличане за получаване на целенасочено и релевантно съдържание.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Използване на сегментирано извличане за целенасочен и релевантен контекст.",
|
||||
"Use segmented retrieval for focused context.": "Използване на сегментирано извличане за целенасочен контекст.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Използване на странични раздели",
|
||||
"Use these in model system prompts as {{example}}.": "Използвайте ги в системните промптове на моделите като {{example}}.",
|
||||
"Use Web Search?": "Използване на търсене в интернет?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Използва се в нативния режим за извикване на функции. Настройките на работното пространство и потребителските разрешения продължават да важат.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Видео",
|
||||
"Video player": "Видео плейър",
|
||||
"View": "Показване",
|
||||
"View changes": "",
|
||||
"View changes": "Преглед на промените",
|
||||
"View channel": "Преглед на канала",
|
||||
"View chat": "Преглед на чата",
|
||||
"View comment": "Преглед на коментара",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Преглед в {{platform}}",
|
||||
"View Replies": "Преглед на отговорите",
|
||||
"View Result from {{NAME}}": "Преглед на резултата от {{NAME}}",
|
||||
"View source": "Преглед на изходния код",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "Работа",
|
||||
"Working Directory": "Работна директория",
|
||||
"Working Directory Context": "Контекст на работната директория",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Промени в работното дърво",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Работи заедно с top-k. По-висока стойност (напр. 0.95) води до по-разнообразен текст, а по-ниска (напр. 0.5) — до по-фокусиран и консервативен текст.",
|
||||
"Workspace": "Работно пространство",
|
||||
"Workspace Models": "Модели в работното пространство",
|
||||
"Workspace Permissions": "Разрешения за работното пространство",
|
||||
"Workspace search": "Търсене в работното пространство",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Клон на работното дърво",
|
||||
"Worktree directory": "Директория на работното дърво",
|
||||
"Worktrees": "Работни дървета",
|
||||
"Write": "Напиши",
|
||||
"Write a prompt…": "Напишете промпт…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Напиши описание в 50 думи, което обобщава {{topic}}.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Нямате право да качвате файлове в тази база знания.",
|
||||
"You do not have permission to upload files.": "Нямате разрешение да качвате файлове.",
|
||||
"You do not have permission to upload web content.": "Нямате право да качвате съдържание от интернет.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Нямате разрешение да използвате страничен чат.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Имате над 50 потребители, което често означава, че това работно пространство се използва от организация. Open WebUI е безплатен за използване в настоящия си вид, без ограничения или скрити лимити, и искаме да остане такъв.",
|
||||
"You have no archived conversations.": "Нямате архивирани разговори.",
|
||||
"You have no shared conversations.": "Нямате споделени разговори.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "একটি চ্যাটের চালনা সফলভাবে শেষ হয়েছে।",
|
||||
"A collaboration channel where people join as members": "একটি সহযোগিতামূলক চ্যানেল, যেখানে মানুষ সদস্য হিসেবে যোগ দেন",
|
||||
"A discussion channel where access is controlled by groups and permissions": "একটি আলোচনা চ্যানেল, যেখানে গ্রুপ ও অনুমতি দিয়ে প্রবেশাধিকার নিয়ন্ত্রণ করা হয়",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "এই নামে একটি ফাইল ইতিমধ্যে রয়েছে। এটি প্রতিস্থাপন করবেন?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "একটি নতুন সংস্করণ (v{{LATEST_VERSION}}) এখন উপলব্ধ।",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "অন্য কোথাও একটি পৃষ্ঠা পরিবর্তিত হয়েছে। আপনার আগের টেক্সট ডাউনলোড করা যাবে।",
|
||||
"A private conversation between you and selected users": "আপনার ও নির্বাচিত ব্যবহারকারীদের মধ্যে ব্যক্তিগত কথোপকথন",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "লুকানো মডেলকে বেস মডেল হিসেবে নির্বাচন করার অনুমতি দিন।",
|
||||
"Allow Sharing With Groups": "গ্রুপের সঙ্গে শেয়ারের অনুমতি দিন",
|
||||
"Allow Sharing With Users": "ব্যবহারকারীদের সঙ্গে শেয়ারের অনুমতি দিন",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "সাইড চ্যাটের অনুমতি দিন",
|
||||
"Allow Speech to Text": "কথা থেকে পাঠ্য তৈরির অনুমতি দিন",
|
||||
"Allow Temporary Chat": "অস্থায়ী চ্যাটের অনুমতি দিন",
|
||||
"Allow Text to Speech": "পাঠ্য থেকে কথা তৈরির অনুমতি দিন",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "মডেল উত্তর দেওয়ার আগে বা পরে বার্তা প্রক্রিয়া করে এমন ফাংশন প্রয়োগ করুন।",
|
||||
"Apply to draft": "খসড়ায় প্রয়োগ করুন",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "প্রয়োগ করলে ডান পাশের প্রস্তাবিত সংশোধিত পাঠ ব্যবহার করা হয়। এরপর আপনার খসড়া সংরক্ষণ করুন।",
|
||||
"Approve": "",
|
||||
"Approve": "অনুমোদন করুন",
|
||||
"Approximate comparison": "আনুমানিক তুলনা",
|
||||
"Apps": "অ্যাপসমূহ",
|
||||
"April": "আপ্রিল",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "অনুমোদন চান",
|
||||
"Ask or edit…": "প্রশ্ন করুন বা সম্পাদনা করুন…",
|
||||
"Ask this knowledge source a test question": "এই জ্ঞানের উৎসকে একটি পরীক্ষামূলক প্রশ্ন করুন",
|
||||
"Assignees": "",
|
||||
"Assignees": "দায়িত্বপ্রাপ্ত ব্যক্তিসমূহ",
|
||||
"Assistance": "সহায়তা",
|
||||
"assistant": "সহকারী",
|
||||
"Assistant": "সহকারী",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "অথেনটিকেটর কনফিগার করা আছে",
|
||||
"Authenticator not configured": "অথেনটিকেটর কনফিগার করা নেই",
|
||||
"Authenticator setup QR code": "অথেনটিকেটর সেটআপের QR কোড",
|
||||
"Author": "",
|
||||
"Author": "লেখক",
|
||||
"Authorize OAuth": "OAuth অনুমোদন করুন",
|
||||
"Auto": "স্বয়ংক্রিয়",
|
||||
"Auto (Random)": "স্বয়ংক্রিয় (এলোমেলো)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "পেছনে",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "পরিবর্তনগুলোতে ফিরে যান",
|
||||
"Back to files": "ফাইলে ফিরে যান",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "পুল রিকোয়েস্টে ফিরে যান",
|
||||
"Back to sign in": "সাইন ইনে ফিরে যান",
|
||||
"Background Image": "পটভূমির ছবি",
|
||||
"Background image must be at most 25 megapixels.": "পটভূমির ছবি সর্বোচ্চ 25 মেগাপিক্সেল হতে পারে।",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "পটভূমির সাব-এজেন্টের কাজ শেষ হয়েছে",
|
||||
"background sub-agents": "পটভূমির সাব-এজেন্টসমূহ",
|
||||
"Bad Response": "খারাপ প্রতিক্রিয়া",
|
||||
"Base branch": "",
|
||||
"Base branch": "বেস শাখা",
|
||||
"Base Model (From)": "বেস মডেল (থেকে)",
|
||||
"Base Model is required.": "বেস মডেল প্রয়োজন।",
|
||||
"Base Models": "বেস মডেলসমূহ",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "পূর্ববর্তী",
|
||||
"Being lazy": "অলস হওয়া",
|
||||
"Binary file — text comparison is unavailable.": "বাইনারি ফাইল — টেক্সটের তুলনা উপলব্ধ নয়।",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "বাইনারি ফাইল পরিবর্তিত হয়েছে",
|
||||
"Binary file. Download to open.": "বাইনারি ফাইল। খুলতে ডাউনলোড করুন।",
|
||||
"Bing": "Bing",
|
||||
"Block options": "ব্লকের বিকল্পসমূহ",
|
||||
"Bold": "গাঢ়",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "সীমিত উত্তরের জন্য নির্দিষ্ট টোকেনকে উৎসাহিত বা নিরুৎসাহিত করে। বায়াসের মান -100 থেকে 100-এর মধ্যে সীমাবদ্ধ থাকবে (উভয় সীমাসহ)। (ডিফল্ট: নেই)",
|
||||
"Both files are required for comparison.": "তুলনার জন্য উভয় ফাইল প্রয়োজন।",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "শাখার অ্যাকশনসমূহ",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "ব্রাউজার",
|
||||
"Browser options": "ব্রাউজারের বিকল্পসমূহ",
|
||||
"build · {{hash}}": "বিল্ড · {{hash}}",
|
||||
"Built-in": "অন্তর্নির্মিত",
|
||||
"Bullet List": "বুলেট তালিকা",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "ফোল্ডারের আইকন পরিবর্তন করুন",
|
||||
"Change overview": "পরিবর্তনের সংক্ষিপ্ত বিবরণ",
|
||||
"Change User Role": "ব্যবহারকারীর ভূমিকা পরিবর্তন করুন",
|
||||
"changed": "",
|
||||
"changed": "পরিবর্তিত",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "পরিবর্তন করলে সব ডিভাইস থেকে সাইন আউট হবে। ব্যবহারকারীরা পরবর্তী সাইন-ইনে নিবন্ধন করবেন।",
|
||||
"Channel": "চ্যানেল",
|
||||
"Channel deleted successfully": "চ্যানেল সফলভাবে মুছে ফেলা হয়েছে",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "OAuth ডিসকভারি যাচাই করুন",
|
||||
"Check what is running in this chat.": "এই চ্যাটে কী চলছে তা দেখুন।",
|
||||
"Checking for updates...": "নতুন আপডেট আছে কিনা চেক করা হচ্ছে...",
|
||||
"Checkout": "",
|
||||
"Checkout": "চেকআউট করুন",
|
||||
"Choose a date range to compare": "তুলনা করতে তারিখের পরিসর বেছে নিন",
|
||||
"Choose a model before saving...": "সেভ করার আগে একটি মডেল নির্বাচন করুন",
|
||||
"Choose a parent page. Subpages move with this page.": "একটি মূল পৃষ্ঠা বেছে নিন। উপপৃষ্ঠাগুলো এই পৃষ্ঠার সঙ্গে সরবে।",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "উইন্ডো বন্ধ করুন",
|
||||
"Close Modal": "উইন্ডো বন্ধ করুন",
|
||||
"Close pages": "পৃষ্ঠাগুলো বন্ধ করুন",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "পুল রিকোয়েস্ট বন্ধ করুন",
|
||||
"Close search": "অনুসন্ধান বন্ধ করুন",
|
||||
"Close session details": "সেশনের বিস্তারিত বন্ধ করুন",
|
||||
"Close Sidebar": "সাইডবার বন্ধ করুন",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "সহযোগীসমূহ",
|
||||
"Collapse": "গুটিয়ে নিন",
|
||||
"Collapse {{name}}": "{{name}} গুটিয়ে নিন",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Git প্যানেল গুটিয়ে নিন",
|
||||
"Collapse sessions": "সেশন গুটিয়ে নিন",
|
||||
"Collapse terminal": "টার্মিনাল গুটিয়ে নিন",
|
||||
"Collection": "সংগ্রহ",
|
||||
"Collection Field": "সংগ্রহের ফিল্ড",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "মন্তব্য মুছে ফেলা হয়েছে",
|
||||
"Comments": "মন্তব্যসমূহ",
|
||||
"Comments are no longer available.": "মন্তব্য আর উপলব্ধ নয়।",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "কমিটের অ্যাকশনসমূহ",
|
||||
"Commit message": "কমিট বার্তা",
|
||||
"Commit Message": "কমিট বার্তা",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "কমিটের সারসংক্ষেপ",
|
||||
"Commit to {{branch}}": "{{branch}}-এ কমিট করুন",
|
||||
"Community Reviews": "কমিউনিটির পর্যালোচনা",
|
||||
"Compact": "কনটেক্সট সংক্ষিপ্ত করুন",
|
||||
"Compact: shorten older messages so this chat can keep going.": "কনটেক্সট সংক্ষিপ্ত করুন: চ্যাট চালিয়ে যেতে পুরোনো বার্তা সংক্ষিপ্ত করুন।",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "কনফিগারেশন সফলভাবে আমদানি হয়েছে",
|
||||
"Configure": "কনফিগার করুন",
|
||||
"Configure app": "অ্যাপ কনফিগার করুন",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "চ্যাটের ফাইল, ভালভ, সিস্টেম প্রম্পট এবং অ্যাডভান্সড প্যারামিটার কনফিগার করুন।",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "এই মডেলের রিয়েলটাইম ভয়েস, ভয়েস অ্যাভাটার ও টেক্সট-টু-স্পিচের কণ্ঠস্বর কনফিগার করুন।",
|
||||
"Confirm": "নিশ্চিত করুন",
|
||||
"Confirm Password": "পাসওয়ার্ড নিশ্চিত করুন",
|
||||
"Confirm Prompt from Embed": "এমবেড করা বিষয়বস্তু থেকে আসা প্রম্পট নিশ্চিত করুন",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "পুল রিকোয়েস্টের কাজ নিশ্চিত করুন",
|
||||
"Confirm recording": "রেকর্ডিং নিশ্চিত করুন",
|
||||
"Confirm your action": "আপনার কাজটি নিশ্চিত করুন",
|
||||
"Confirm your new password": "আপনার নতুন পাসওয়ার্ড নিশ্চিত করুন",
|
||||
"Confirm Your Password": "আপনার পাসওয়ার্ড নিশ্চিত করুন",
|
||||
"Connect": "সংযোগ করুন",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "প্রথমে সংযোগ করুন এবং একটি মডেল নির্বাচন করুন।",
|
||||
"Connect external apps to Open WebUI.": "Open WebUI-এর সঙ্গে বাহ্যিক অ্যাপ সংযোগ করুন।",
|
||||
"Connect to an AI provider to start chatting": "চ্যাট শুরু করতে একটি AI প্রদানকারীর সঙ্গে সংযোগ করুন",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Open Terminal ইনস্ট্যান্সের সঙ্গে সংযোগ করুন। প্রশাসক ও অনুমতিপ্রাপ্ত ব্যবহারকারীরা এই সার্ভারগুলোর মাধ্যমে ফাইল ব্রাউজিং ও টার্মিনাল টুল ব্যবহার করতে পারবেন।",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "সংযুক্ত অ্যাপ",
|
||||
"Connecting": "সংযোগ করা হচ্ছে",
|
||||
"Connecting...": "সংযোগ করা হচ্ছে...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "সংযোগ করা হচ্ছে…",
|
||||
"Connection": "কানেকশন",
|
||||
"Connection failed": "সংযোগ ব্যর্থ হয়েছে",
|
||||
"Connection ID": "কানেকশন ID",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "কানেকশন ID-তে \":\" বা \"|\" অক্ষর থাকতে পারবে না",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "সংযোগ বিচ্ছিন্ন হয়েছে। আবার চেষ্টা করুন।",
|
||||
"Connection lost. Reconnecting...": "সংযোগ বিচ্ছিন্ন হয়েছে। আবার সংযোগ করা হচ্ছে...",
|
||||
"Connection successful": "সংযোগ সফল হয়েছে",
|
||||
"Connection Type": "সংযোগের ধরন",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "অনুলিপি",
|
||||
"Copy {{name}} to clipboard": "{{name}} ক্লিপবোর্ডে কপি করুন",
|
||||
"Copy API Key": "API কী কপি করুন",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "শাখার নাম কপি করুন",
|
||||
"Copy change to original": "পরিবর্তন মূল পাঠে কপি করুন",
|
||||
"Copy change to proposal": "পরিবর্তন প্রস্তাবিত পাঠে কপি করুন",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "কমিটের হ্যাশ কপি করুন",
|
||||
"Copy content": "বিষয়বস্তু কপি করুন",
|
||||
"Copy default": "ডিফল্ট কপি করুন",
|
||||
"Copy Last Code Block": "শেষ কোড ব্লক কপি করুন",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "স্বত্বাধিকার (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "Open WebUI-এর অনুরোধ অনুমোদন করতে প্রদানকারীকে CORS সঠিকভাবে কনফিগার করতে হবে।",
|
||||
"Could not check for updates": "হালনাগাদ পরীক্ষা করা যায়নি",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "শাখার নাম কপি করা যায়নি",
|
||||
"Could not copy commit hash": "কমিটের হ্যাশ কপি করা যায়নি",
|
||||
"Could not copy to clipboard. Please try again.": "ক্লিপবোর্ডে কপি করা যায়নি। আবার চেষ্টা করুন।",
|
||||
"Could not determine the upload folder.": "আপলোডের ফোল্ডার নির্ধারণ করা যায়নি।",
|
||||
"Could not load avatar.": "অ্যাভাটার লোড করা যায়নি।",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "একাউন্ট তৈরি করুন",
|
||||
"Create Admin Account": "প্রশাসকের অ্যাকাউন্ট তৈরি করুন",
|
||||
"Create announcements shown to users in the app.": "অ্যাপে ব্যবহারকারীদের দেখানোর জন্য ঘোষণা তৈরি করুন।",
|
||||
"Create branch": "",
|
||||
"Create branch": "শাখা তৈরি করুন",
|
||||
"Create Channel": "চ্যানেল তৈরি করুন",
|
||||
"Create copy": "কপি তৈরি করুন",
|
||||
"Create Folder": "ফোল্ডার তৈরি করুন",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "নিয়মিত বিরতিতে স্বয়ংক্রিয়ভাবে চলবে এমন নির্ধারিত প্রম্পট তৈরি করুন।",
|
||||
"Create skill": "স্কিল তৈরি করুন",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "স্কিল তৈরি করুন: এই চ্যাট থেকে পুনরায় ব্যবহারযোগ্য একটি টার্মিনাল স্কিল তৈরি করুন।",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "ওয়ার্কট্রি তৈরি করুন",
|
||||
"Create your first note from the Create menu.": "তৈরি করুন মেনু থেকে আপনার প্রথম নোট তৈরি করুন।",
|
||||
"Created": "তৈরির তারিখ",
|
||||
"Created at": "নির্মানকাল",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "কাস্টম প্যারামিটারের মান",
|
||||
"Custom permissions": "কাস্টম অনুমতিসমূহ",
|
||||
"Custom range": "কাস্টম তারিখের পরিসর",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "কাস্টম সময়সূচি",
|
||||
"Customize": "কাস্টমাইজ করুন",
|
||||
"Daily": "প্রতিদিন",
|
||||
"Daily at": "প্রতিদিন সময়:",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "তথ্য",
|
||||
"Database": "ডেটাবেজ",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "তারিখ",
|
||||
"Date Added": "যোগ করার তারিখ",
|
||||
"Date is required": "তারিখ প্রয়োজন",
|
||||
"Date Modified": "পরিবর্তনের তারিখ",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "এই ফোল্ডারের সব বিষয়বস্তু মুছে ফেলুন",
|
||||
"Delete API Key?": "API কী মুছে ফেলবেন?",
|
||||
"Delete automation?": "অটোমেশন মুছে ফেলবেন?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "শাখা মুছে ফেলুন",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "{{branch}} শাখা মুছে ফেলবেন? একত্রিত না হওয়া শাখাগুলো রাখা হবে।",
|
||||
"Delete calendar": "ক্যালেন্ডার মুছে ফেলুন",
|
||||
"Delete Calendar": "ক্যালেন্ডার মুছে ফেলুন",
|
||||
"Delete Chat": "চ্যাট মুছে ফেলুন",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "বিবরণ",
|
||||
"Description ({{language}})": "বিবরণ ({{language}})",
|
||||
"Deselect": "নির্বাচন বাতিল করুন",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "ডেস্কটপ",
|
||||
"Desktop access denied. Reopen this tab.": "ডেস্কটপে প্রবেশাধিকার প্রত্যাখ্যান করা হয়েছে। এই ট্যাবটি আবার খুলুন।",
|
||||
"Desktop audio": "ডেস্কটপের অডিও",
|
||||
"Desktop audio is not supported by this browser.": "এই ব্রাউজার ডেস্কটপের অডিও সমর্থন করে না।",
|
||||
"Desktop audio unavailable.": "ডেস্কটপের অডিও উপলব্ধ নয়।",
|
||||
"Desktop connection failed.": "ডেস্কটপের সংযোগ ব্যর্থ হয়েছে।",
|
||||
"Destination": "গন্তব্য",
|
||||
"Detected Variables": "শনাক্ত করা চলকসমূহ",
|
||||
"dev build": "ডেভ বিল্ড",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "তুলনার পরিবর্তনগুলো বাদ দেবেন?",
|
||||
"Discard unsaved changes?": "অসংরক্ষিত পরিবর্তনগুলো বাদ দেবেন?",
|
||||
"Discard unsaved skill changes?": "স্কিলের অসংরক্ষিত পরিবর্তনগুলো বাদ দেবেন?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "ওয়ার্কিং ট্রিতে এই ফাইলের অসংরক্ষিত পরিবর্তনগুলো বাদ দেবেন? এটি পূর্বাবস্থায় ফেরানো যাবে না।",
|
||||
"Disconnect OAuth": "OAuth সংযোগ বিচ্ছিন্ন করুন",
|
||||
"Disconnected": "সংযোগ বিচ্ছিন্ন",
|
||||
"Discover a function": "একটি ফাংশন খুঁজুন",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "\"{{name}}\" ডাউনলোড হচ্ছে",
|
||||
"Downloading \"{{searchValue}}\"": "\"{{searchValue}}\" ডাউনলোড হচ্ছে",
|
||||
"Downloading stats...": "পরিসংখ্যান ডাউনলোড হচ্ছে...",
|
||||
"Draft": "",
|
||||
"Draft": "খসড়া",
|
||||
"Drag and Drop Container": "টেনে এনে ছেড়ে দেওয়ার ক্ষেত্র",
|
||||
"Drag or use the up and down arrow keys to reorder": "ক্রম বদলাতে টেনে আনুন অথবা ওপর ও নিচের তীর কী ব্যবহার করুন",
|
||||
"Drag to move": "সরাতে টেনে আনুন",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "আপনার সিএসভি ফাইলটিতে এই ক্রমে 4 টি কলাম অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন: নাম, ইমেল, পাসওয়ার্ড, ভূমিকা।.",
|
||||
"Enter {{role}} message here": "{{role}} মেসেজ এখানে লিখুন",
|
||||
"Enter a Connection ID to register.": "নিবন্ধন করতে একটি কানেকশন ID লিখুন।",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "স্ল্যাশ ছাড়া একটি ফাইলের নাম লিখুন।",
|
||||
"Enter a name, content, and a valid command.": "একটি নাম, বিষয়বস্তু ও বৈধ কমান্ড লিখুন।",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "অপেক্ষমাণ ব্যবহারকারীর তথ্যের প্যানেলের শিরোনাম লিখুন। ডিফল্টের জন্য ফাঁকা রাখুন।",
|
||||
"Enter a watermark for the response. Leave empty for none.": "উত্তরের জলছাপ লিখুন। জলছাপ না চাইলে ফাঁকা রাখুন।",
|
||||
"Enter additional headers in JSON format": "JSON ফরম্যাটে অতিরিক্ত হেডার লিখুন",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "JSON ফরম্যাটে অতিরিক্ত হেডার লিখুন (যেমন {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "JSON ফরম্যাটে অতিরিক্ত প্যারামিটার লিখুন",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "পরিচয়পত্র ছাড়া একটি HTTP বা HTTPS URL লিখুন।",
|
||||
"Enter api auth string (e.g. username:password)": "API প্রমাণীকরণ স্ট্রিং লিখুন (যেমন username:password)",
|
||||
"Enter Application DN": "অ্যাপ্লিকেশন DN লিখুন",
|
||||
"Enter Application DN Password": "অ্যাপ্লিকেশন DN-এর পাসওয়ার্ড লিখুন",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "বিশ্লেষণের জন্য কোড চালান",
|
||||
"Executing {{NAME}}...": "{{NAME}} চালানো হচ্ছে...",
|
||||
"Execution timeline": "কার্যসম্পাদনের সময়রেখা",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "পূর্ণ পর্দা থেকে বের হন",
|
||||
"Expand": "প্রসারিত করুন",
|
||||
"Expand {{name}}": "{{name}} প্রসারিত করুন",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Git প্যানেল প্রসারিত করুন",
|
||||
"Expand input": "ইনপুট ক্ষেত্র প্রসারিত করুন",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "সেশন প্রসারিত করুন",
|
||||
"Expand terminal": "টার্মিনাল প্রসারিত করুন",
|
||||
"Experience": "ব্যবহারের অভিজ্ঞতা",
|
||||
"Experimental": "পরিক্ষামূলক",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "মডেলসমূহ ইমপোর্ট করা যায়নি",
|
||||
"Failed to load chat": "চ্যাট লোড করা যায়নি",
|
||||
"Failed to load chat preview": "চ্যাটের প্রিভিউ লোড করা যায়নি",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "ডিরেক্টরি লোড করা যায়নি",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "DOCX ফাইল লোড করা যায়নি। পরিবর্তে ফাইলটি ডাউনলোড করার চেষ্টা করুন।",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV ফাইল লোড করা যায়নি। পরিবর্তে ফাইলটি ডাউনলোড করার চেষ্টা করুন।",
|
||||
"Failed to load file content.": "ফাইলের কনটেন্ট লোড করা যায়নি।",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "কানেকশনসমূহ সংরক্ষণ করা যায়নি",
|
||||
"Failed to save conversation": "কথোপকথন সংরক্ষণ করতে ব্যর্থ",
|
||||
"Failed to save file": "ফাইল সংরক্ষণ করা যায়নি",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "ফাইল সংরক্ষণ করা যায়নি। আপনার পরিবর্তনগুলো এখনও এডিটরে রয়েছে।",
|
||||
"Failed to save model": "মডেল সংরক্ষণ করা যায়নি",
|
||||
"Failed to save models configuration": "মডেলসমূহের কনফিগারেশন সংরক্ষণ করা যায়নি",
|
||||
"Failed to save policy: {{error}}": "নীতি সংরক্ষণ করা যায়নি: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "ফাইলের অ্যাকশনসমূহ",
|
||||
"File added successfully.": "ফাইল সফলভাবে যোগ করা হয়েছে।",
|
||||
"File browser": "ফাইল ব্রাউজার",
|
||||
"File changes": "",
|
||||
"File changes": "ফাইলের পরিবর্তনগুলো",
|
||||
"File content": "ফাইলের কনটেন্ট",
|
||||
"File content updated successfully.": "ফাইলের কনটেন্ট সফলভাবে আপডেট হয়েছে।",
|
||||
"File count limit": "ফাইলের সংখ্যার সীমা",
|
||||
"File created": "ফাইল তৈরি হয়েছে",
|
||||
"File deleted successfully.": "ফাইল সফলভাবে মুছে ফেলা হয়েছে।",
|
||||
"File differences": "ফাইলের পার্থক্য",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "ফাইলটিতে লেখা যায় না।",
|
||||
"File Mode": "ফাইল মোড",
|
||||
"File moved.": "ফাইল সরানো হয়েছে।",
|
||||
"File name": "ফাইলের নাম",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "ইন্টারফেসে {{name}} সম্পর্কে তথ্য পান",
|
||||
"Get started": "শুরু করুন",
|
||||
"Get started with {{WEBUI_NAME}}": "{{WEBUI_NAME}} ব্যবহার শুরু করুন",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Git-এর পরিবর্তনগুলো",
|
||||
"Git unavailable": "Git উপলব্ধ নয়",
|
||||
"Give me ideas": "আমাকে কিছু আইডিয়া দিন",
|
||||
"give me tips": "আমাকে কিছু পরামর্শ দিন",
|
||||
"Global": "সর্বজনীন",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "হেড শাখা",
|
||||
"Headers": "হেডারসমূহ",
|
||||
"Headers must be a valid JSON object": "হেডারগুলো অবশ্যই একটি বৈধ JSON অবজেক্ট হতে হবে",
|
||||
"Height": "উচ্চতা",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "লুকান",
|
||||
"Hide All": "সব লুকান",
|
||||
"Hide conversation": "কথোপকথন লুকান",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "পার্থক্য লুকান",
|
||||
"Hide from Sidebar": "সাইডবার থেকে লুকান",
|
||||
"Hide Hidden Files": "লুকানো ফাইল আড়াল করুন",
|
||||
"Hide Model": "মডেল লুকান",
|
||||
"Hide preview": "প্রিভিউ লুকান",
|
||||
"Hide sub-agents": "সাব-এজেন্ট লুকান",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "ট্যাব লুকান",
|
||||
"Hide whitespace": "ফাঁকা জায়গা লুকান",
|
||||
"High": "বেশি",
|
||||
"History": "ইতিহাস",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "জ্ঞানের উৎস আপডেট হয়েছে।",
|
||||
"Knowledge updated successfully": "জ্ঞান সফলভাবে আপডেট হয়েছে",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (ব্রাউজার)",
|
||||
"Labels": "",
|
||||
"Labels": "লেবেলসমূহ",
|
||||
"Last 12 months": "গত 12 মাস",
|
||||
"Last 24 hours": "গত 24 ঘণ্টা",
|
||||
"Last 30 days": "গত 30 দিন",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "মার্চ",
|
||||
"Mark all as read": "সব পড়া হয়েছে হিসেবে চিহ্নিত করুন",
|
||||
"Mark as unread": "অপঠিত হিসেবে চিহ্নিত করুন",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "প্রস্তুত হিসেবে চিহ্নিত করুন",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "মার্কেট",
|
||||
"Matching tabs: {{count}}_one": "মিলে যাওয়া ট্যাব: {{count}}টি",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "কাউকে উল্লেখ করুন",
|
||||
"Mentions only": "শুধু উল্লেখ",
|
||||
"Menu": "মেনু",
|
||||
"Merge": "",
|
||||
"Merge": "একত্রিতকরণ",
|
||||
"Merge Responses": "উত্তরসমূহ একত্র করুন",
|
||||
"Merged Response": "একত্রিত প্রতিক্রিয়া ফলাফল",
|
||||
"Message": "বার্তা",
|
||||
"Message counts and response timestamps": "বার্তাসংখ্যা এবং উত্তরের টাইমস্ট্যাম্প",
|
||||
"Message counts are based on assistant responses.": "বার্তাসংখ্যা সহকারীর উত্তরের ভিত্তিতে গণনা করা হয়।",
|
||||
"Message exceeds the 16 KiB limit.": "বার্তা 16 KiB সীমা ছাড়িয়েছে।",
|
||||
"Message number": "",
|
||||
"Message number": "বার্তার নম্বর",
|
||||
"Message rating should be enabled to use this feature": "এই সুবিধা ব্যবহার করতে বার্তা মূল্যায়ন চালু থাকতে হবে",
|
||||
"Message share": "বার্তার শতকরা অংশ",
|
||||
"Message text...": "বার্তার টেক্সট...",
|
||||
"messages": "বার্তা",
|
||||
"Messages": "বার্তাসমূহ",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "বার্তাগুলো এন্ড-টু-এন্ড এনক্রিপ্ট করা হয় এবং সংরক্ষণ করা হয় না।",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "এই ট্যাব বন্ধ করলে বার্তাগুলো হারিয়ে যাবে।",
|
||||
"Metadata Field": "মেটাডেটা ক্ষেত্র",
|
||||
"Microphone off": "মাইক্রোফোন বন্ধ",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Mistral OCR প্যারামিটারসমূহ",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "সোম",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "মোবাইল ভিউ",
|
||||
"Model": "মডেল",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "মডেলসমূহ সফলভাবে ইমপোর্ট হয়েছে",
|
||||
"Models Public Sharing": "মডেলসমূহ সর্বজনীনভাবে শেয়ার করা",
|
||||
"Models Sharing": "মডেল শেয়ারিং",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "এই মডেল কাজের দায়িত্ব দিতে পারে এমন মডেলসমূহ। ব্যবহারকারীদের সেগুলোতে প্রবেশাধিকার থাকতে হবে। বর্তমান মডেল ব্যবহার করতে ফাঁকা রাখুন।",
|
||||
"Modified": "পরিবর্তিত",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "সোম",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "পূর্ববর্তী চ্যাটে যান",
|
||||
"Never": "কখনো নয়",
|
||||
"New": "নতুন",
|
||||
"New branch": "",
|
||||
"New branch": "নতুন শাখা",
|
||||
"New Button": "নতুন বাটন",
|
||||
"New calendar": "নতুন ক্যালেন্ডার",
|
||||
"New Calendar": "নতুন ক্যালেন্ডার",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "নতুন গ্রুপ",
|
||||
"New Note": "নতুন নোট",
|
||||
"New Password": "নতুন পাসওয়ার্ড",
|
||||
"New pull request": "",
|
||||
"New pull request": "নতুন পুল রিকোয়েস্ট",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "নতুন স্কিল ও কপিগুলো ব্যক্তিগত থাকে। প্রতিস্থাপন করলে নতুন সংস্করণ সংরক্ষিত হয় এবং বিদ্যমান শেয়ার করার ব্যবস্থা বজায় থাকে।",
|
||||
"New tab": "",
|
||||
"New tab": "নতুন ট্যাব",
|
||||
"New Temporary Chat": "নতুন অস্থায়ী চ্যাট",
|
||||
"New Terminal": "নতুন টার্মিনাল",
|
||||
"New Tool": "নতুন টুল",
|
||||
"New Webhook": "নতুন ওয়েবহুক",
|
||||
"New worktree": "",
|
||||
"New worktree": "নতুন ওয়ার্কট্রি",
|
||||
"new-channel": "নতুন-চ্যানেল",
|
||||
"Next": "পরবর্তী",
|
||||
"Next change": "পরবর্তী পরিবর্তন",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "কোনো অ্যাপ সংযুক্ত নেই।",
|
||||
"No authentication": "প্রমাণীকরণ নেই",
|
||||
"No automations found": "কোনো অটোমেশন পাওয়া যায়নি",
|
||||
"No changes": "",
|
||||
"No changes": "কোনো পরিবর্তন নেই",
|
||||
"No channels": "কোনো চ্যানেল নেই",
|
||||
"No chat alerts": "কোনো চ্যাট সতর্কতা নেই",
|
||||
"No chat history": "কোনো চ্যাটের ইতিহাস নেই",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "কোনো চ্যাট পাওয়া যায়নি",
|
||||
"No chats found for this user.": "এই ব্যবহারকারীর কোনো চ্যাট পাওয়া যায়নি।",
|
||||
"No chats found.": "কোনো চ্যাট পাওয়া যায়নি।",
|
||||
"No checks": "",
|
||||
"No checks": "কোনো যাচাই নেই",
|
||||
"No comments yet": "এখনো কোনো মন্তব্য নেই",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "এখনও কোনো কমিট নেই",
|
||||
"No content": "কোনো বিষয়বস্তু নেই",
|
||||
"No content available": "কোনো বিষয়বস্তু উপলভ্য নেই",
|
||||
"No content found": "কোনো বিষয়বস্তু পাওয়া যায়নি",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "আগের সময়কালে কোনো ব্যবহার নেই",
|
||||
"No prompts found": "কোনো প্রম্পট পাওয়া যায়নি",
|
||||
"No prompts yet": "এখনো কোনো প্রম্পট নেই",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "কোনো পুল রিকোয়েস্ট নেই",
|
||||
"No Repeat": "পুনরাবৃত্তি নয়",
|
||||
"No results": "কোন ফলাফল পাওয়া যায়নি",
|
||||
"No results found": "কোন ফলাফল পাওয়া যায়নি",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "কোনো টার্মিনাল কানেকশন কনফিগার করা নেই।",
|
||||
"No terminal connections configured.": "কোনো টার্মিনাল কানেকশন কনফিগার করা নেই।",
|
||||
"No terminal servers available": "কোনো টার্মিনাল সার্ভার উপলব্ধ নেই",
|
||||
"No text changes": "",
|
||||
"No text changes": "টেক্সটে কোনো পরিবর্তন নেই",
|
||||
"No text differences": "টেক্সটে কোনো পার্থক্য নেই",
|
||||
"No tool server connections configured.": "কোনো টুল সার্ভার কানেকশন কনফিগার করা নেই।",
|
||||
"No tools accessible": "কোনো টুলে অ্যাক্সেস নেই",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "আপডেট করার মতো কোনো ভালভ নেই",
|
||||
"No webhooks yet": "এখনো কোনো ওয়েবহুক নেই",
|
||||
"Node Ids": "নোডের আইডিসমূহ",
|
||||
"none": "",
|
||||
"none": "নেই",
|
||||
"None": "কোনোটিই নয়",
|
||||
"None reported": "কোনোটির তথ্য জানানো হয়নি",
|
||||
"Not configured": "কনফিগার করা হয়নি",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"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 a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "+ মেনু ব্যবহার করে একটি ট্যাব খুলুন।",
|
||||
"Open automation": "অটোমেশন খুলুন",
|
||||
"Open chat": "চ্যাট খুলুন",
|
||||
"Open create menu": "তৈরি করার মেনু খুলুন",
|
||||
"Open file": "ফাইল খুলুন",
|
||||
"Open Folder": "ফোল্ডার খুলুন",
|
||||
"Open in full screen": "পূর্ণ পর্দায় খুলুন",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "GitHub-এ খুলুন",
|
||||
"Open in new tab": "নতুন ট্যাবে খুলুন",
|
||||
"Open link": "লিংক খুলুন",
|
||||
"Open modal to configure connection": "কানেকশন কনফিগার করতে মোডাল খুলুন",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "প্যারামিটার",
|
||||
"Parameter": "প্যারামিটার",
|
||||
"Parameters": "প্যারামিটারসমূহ",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "উপরের ডিরেক্টরিতে যান",
|
||||
"Parent group": "মূল গ্রুপ",
|
||||
"Parent message not found": "মূল বার্তা পাওয়া যায়নি",
|
||||
"Parent page": "মূল পৃষ্ঠা",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "একটি কারণ নির্বাচন করুন",
|
||||
"Please select a valid JSON file": "একটি বৈধ JSON ফাইল নির্বাচন করুন",
|
||||
"Please select at least one user for Direct Message channel.": "সরাসরি মেসেজের চ্যানেলের জন্য অন্তত একজন ব্যবহারকারী নির্বাচন করুন।",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "ফাইল আপলোড শেষ হওয়ার জন্য অপেক্ষা করুন।",
|
||||
"Please wait until all files are uploaded.": "সব ফাইল আপলোড হওয়া পর্যন্ত অপেক্ষা করুন।",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP বা GIF। সর্বোচ্চ 5 MiB ও 25 মেগাপিক্সেল।",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "নীতির পরিবর্তন নতুনভাবে তৈরি টার্মিনালে প্রযোজ্য হয়। বিদ্যমান টার্মিনালে প্রয়োগ করতে সংশ্লিষ্ট টার্মিনালগুলো রিফ্রেশ করুন।",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "প্রদানকারী",
|
||||
"Provider context": "প্রদানকারীর কনটেক্সট উইন্ডো",
|
||||
"Provider details": "প্রদানকারীর বিস্তারিত",
|
||||
"Proxy": "",
|
||||
"Proxy": "প্রক্সি",
|
||||
"Public": "সর্বজনীন",
|
||||
"Public key": "পাবলিক কী",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com থেকে \"{{searchValue}}\" টানুন",
|
||||
"Pull a model from Ollama.com": "Ollama.com থেকে একটি টেনে আনুন আনুন",
|
||||
"Pull Model": "মডেল ডাউনলোড করুন",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "পুল রিকোয়েস্টের অ্যাকশনসমূহ",
|
||||
"Pull request description": "পুল রিকোয়েস্টের বিবরণ",
|
||||
"Pull request title": "পুল রিকোয়েস্টের শিরোনাম",
|
||||
"Punctuation": "বিরামচিহ্ন",
|
||||
"Pyodide file browser": "Pyodide ফাইল ব্রাউজার",
|
||||
"Quality": "মান",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "ডকুমেন্টেশন পড়ুন",
|
||||
"Read-only": "শুধু পড়ার জন্য",
|
||||
"Read-Only Access": "শুধু পড়ার অনুমতি",
|
||||
"Ready": "",
|
||||
"Ready": "প্রস্তুত হিসেবে চিহ্নিত করুন",
|
||||
"Realtime": "রিয়েলটাইম",
|
||||
"Realtime Voice": "রিয়েলটাইম ভয়েস",
|
||||
"Reason": "কারণ",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "প্রস্তাবিত",
|
||||
"Reconnect": "আবার সংযোগ করুন",
|
||||
"Reconnected": "পুনরায় সংযুক্ত হয়েছে",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "আবার সংযোগ করা হচ্ছে…",
|
||||
"Record": "রেকর্ড করুন",
|
||||
"Record voice": "ভয়েস রেকর্ড করুন",
|
||||
"Recorded duration": "রেকর্ড করা সময়কাল",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "{{count}}টি পুরোনো অপ্রয়োজনীয় ফাইল সরানো হচ্ছে...",
|
||||
"Removing {{count}} stale files..._other": "{{count}}টি পুরোনো অপ্রয়োজনীয় ফাইল সরানো হচ্ছে...",
|
||||
"Rename": "রেনেম",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "শাখার নাম পরিবর্তন করুন",
|
||||
"Rename page": "পৃষ্ঠার নাম পরিবর্তন করুন",
|
||||
"Renamed to {{name}}": "নাম পরিবর্তন করে {{name}} করা হয়েছে",
|
||||
"Rendered preview": "রেন্ডার করা প্রিভিউ",
|
||||
"Reopen": "",
|
||||
"Reopen": "আবার খুলুন",
|
||||
"Reorder": "পুনর্বিন্যাস করুন",
|
||||
"Repeat": "পুনরাবৃত্তি",
|
||||
"Replace": "প্রতিস্থাপন করুন",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "থ্রেডে উত্তর দিন...",
|
||||
"Replying to {{NAME}}": "{{NAME}}-কে উত্তর দেওয়া হচ্ছে",
|
||||
"Reported by the provider.": "প্রদানকারীর জানানো তথ্য।",
|
||||
"Request changes": "",
|
||||
"Request changes": "পরিবর্তনের অনুরোধ করুন",
|
||||
"Requested scopes": "অনুরোধ করা অনুমতির পরিধি",
|
||||
"Require an authenticator for all users": "সব ব্যবহারকারীর জন্য অথেনটিকেটর বাধ্যতামূলক করুন",
|
||||
"required": "আবশ্যক",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "ডিফল্ট অবস্থায় ফিরিয়ে আনুন",
|
||||
"Reset view": "ভিউ রিসেট করুন",
|
||||
"Reset zoom": "জুম রিসেট করুন",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Git প্যানেলের আকার পরিবর্তন করুন",
|
||||
"Resize panel": "প্যানেলের আকার পরিবর্তন করুন",
|
||||
"Resolved": "সমাধান হয়েছে",
|
||||
"Response": "উত্তর",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "উত্তরের ব্যবহারের তথ্য রেকর্ড করা হয়েছে",
|
||||
"Restart": "পুনরায় চালু করুন",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "প্রদানকারীর কানেকশনের সেটিংসমূহের পরিবর্তন প্রয়োগ করতে সব Open WebUI ইনস্ট্যান্স পুনরায় চালু করুন।",
|
||||
"Restricted": "সীমাবদ্ধ",
|
||||
"Result": "ফলাফল",
|
||||
"RESULT": "ফলাফল",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "{{count}}টি উৎস উদ্ধার করা হয়েছে",
|
||||
"Retrieved 1 source": "1টি উৎস উদ্ধার করা হয়েছে",
|
||||
"Retry": "আবার চেষ্টা করুন",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Git শনাক্ত করার জন্য আবার চেষ্টা করুন",
|
||||
"Retry setup": "আবার সেটআপের চেষ্টা করুন",
|
||||
"Return to call": "কলে ফিরে যান",
|
||||
"Return to conversation": "কথোপকথনে ফিরে যান",
|
||||
"Review": "পর্যালোচনা করুন",
|
||||
"Review the scopes this app is requesting before adding it.": "অ্যাপটি যোগ করার আগে এটি যে অনুমতির পরিধি চাইছে তা পর্যালোচনা করুন।",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "পর্যালোচকসমূহ",
|
||||
"Revised": "সংশোধিত পাঠ",
|
||||
"Rewrite the selected text.": "নির্বাচিত টেক্সট পুনরায় লিখুন।",
|
||||
"Role": "পদবি",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "সংরক্ষণ এবং তৈরি করুন",
|
||||
"Save & Update": "সংরক্ষণ এবং আপডেট করুন",
|
||||
"Save and send": "সংরক্ষণ করে পাঠান",
|
||||
"Save As": "",
|
||||
"Save As": "নতুন নামে সংরক্ষণ করুন",
|
||||
"Save As Copy": "অনুলিপি হিসেবে সংরক্ষণ করুন",
|
||||
"Save Chat": "চ্যাট সংরক্ষণ করুন",
|
||||
"Save draft as copy": "খসড়াটি কপি হিসেবে সংরক্ষণ করুন",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "অ্যাকশন অনুসন্ধান করুন",
|
||||
"Search all emojis": "সব ইমোজি অনুসন্ধান করুন",
|
||||
"Search Automations": "অটোমেশন অনুসন্ধান করুন",
|
||||
"Search branches": "",
|
||||
"Search branches": "শাখা অনুসন্ধান করুন",
|
||||
"Search built-in tools": "অন্তর্নির্মিত টুল অনুসন্ধান করুন",
|
||||
"Search channels": "চ্যানেল অনুসন্ধান করুন",
|
||||
"Search Chats": "চ্যাট অনুসন্ধান করুন",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "প্যাটার্ন অনুসন্ধান করুন বা যোগ করুন",
|
||||
"Search parent groups": "মূল গ্রুপ অনুসন্ধান করুন",
|
||||
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "পুল রিকোয়েস্ট অনুসন্ধান করুন",
|
||||
"Search results": "অনুসন্ধানের ফলাফলসমূহ",
|
||||
"Search scopes": "অনুমতির পরিধি অনুসন্ধান করুন",
|
||||
"Search sessions": "সেশন অনুসন্ধান করুন",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "ব্যবহারকারী বা গ্রুপ অনুসন্ধান করুন",
|
||||
"Search workspace": "ওয়ার্কস্পেস অনুসন্ধান করুন",
|
||||
"Search workspace…": "ওয়ার্কস্পেস অনুসন্ধান করুন…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "ওয়ার্কট্রি অনুসন্ধান করুন",
|
||||
"Search your workspace": "আপনার ওয়ার্কস্পেস অনুসন্ধান করুন",
|
||||
"Searched {{count}} sites": "{{count}}টি সাইটে অনুসন্ধান করা হয়েছে",
|
||||
"Searching": "অনুসন্ধান করা হচ্ছে",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "শুধু একটি মডেল দেখাতে সেটি নির্বাচন করুন।",
|
||||
"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
|
||||
"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "একটি পুল রিকোয়েস্ট নির্বাচন করুন",
|
||||
"Select a range to filter sessions. Partial usage is included.": "সেশন ফিল্টার করতে একটি পরিসর নির্বাচন করুন। ব্যবহারের আংশিক তথ্যও অন্তর্ভুক্ত করা হয়েছে।",
|
||||
"Select a reranking model engine": "একটি পুনঃক্রমবিন্যাস মডেল ইঞ্জিন নির্বাচন করুন",
|
||||
"Select a role": "একটি ভূমিকা নির্বাচন করুন",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "localhost URL খুলতে একটি টার্মিনাল নির্বাচন করুন।",
|
||||
"Select a theme": "একটি থিম নির্বাচন করুন",
|
||||
"Select a tool": "একটি টুল নির্বাচন করুন",
|
||||
"Select a voice": "একটি কণ্ঠস্বর নির্বাচন করুন",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "লোড করা ফাইল নির্বাচন করুন",
|
||||
"Select Method": "পদ্ধতি নির্বাচন করুন",
|
||||
"Select model": "মডেল নির্বাচন করুন",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "শুধু একটি মডেল নির্বাচন করুন",
|
||||
"Select only one model to call": "ভয়েস কলের জন্য শুধু একটি মডেল নির্বাচন করুন",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "সাইড চ্যাট খুলতে শুধু একটি মডেল নির্বাচন করুন।",
|
||||
"Select options": "বিকল্পসমূহ নির্বাচন করুন",
|
||||
"Select Skill": "স্কিল নির্বাচন করুন",
|
||||
"Select to isolate model": "শুধু এই মডেল দেখাতে নির্বাচন করুন",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "বর্তমান সময় জানুন এবং তারিখ ও সময়ের হিসাব করুন",
|
||||
"settings.admin.models.builtinTools.time.label": "সময় ও গণনা",
|
||||
"settings.admin.models.builtinTools.title": "অন্তর্নির্মিত টুলসমূহ",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "চ্যাট থেকে Python ওয়ার্কস্পেস টুল তৈরি করুন",
|
||||
"settings.admin.models.builtinTools.tools.label": "টুল তৈরি",
|
||||
"settings.admin.models.builtinTools.userInput.description": "ব্যবহারকারীর কাছে স্পষ্টীকরণমূলক প্রশ্ন করতে উত্তর সাময়িকভাবে থামান",
|
||||
"settings.admin.models.builtinTools.userInput.label": "ব্যবহারকারীকে জিজ্ঞাসা করুন",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "ওয়েবে অনুসন্ধান করুন ও URL-এর বিষয়বস্তু আনুন",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "সব {{count}} জন অবদানকারীকে দেখান",
|
||||
"Show all {{count}} contributors_one": "সব {{count}} জন অবদানকারীকে দেখান",
|
||||
"Show all {{count}} contributors_other": "সব {{count}} জন অবদানকারীকে দেখান",
|
||||
"Show diff": "",
|
||||
"Show diff": "পার্থক্য দেখান",
|
||||
"Show Files": "ফাইল দেখান",
|
||||
"Show Hidden Files": "লুকানো ফাইল দেখান",
|
||||
"Show image preview": "ছবির প্রিভিউ দেখান",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "আর্থিক সহায়তা করুন!",
|
||||
"Showcased creativity": "সৃজনশীলতা প্রদর্শন",
|
||||
"Showing search match": "অনুসন্ধানের সঙ্গে মিলে যাওয়া ফলাফল দেখানো হচ্ছে",
|
||||
"Side chat": "",
|
||||
"Side chat": "সাইড চ্যাট",
|
||||
"Sidebar": "সাইডবার",
|
||||
"Sign in": "সাইন ইন",
|
||||
"Sign in again": "আবার সাইন ইন করুন",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "স্পিচ-টু-টেক্সটের ভাষা",
|
||||
"Split": "পাশাপাশি",
|
||||
"Sponsor on GitHub": "GitHub-এ আর্থিক সহায়তা করুন",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL কোয়েরি",
|
||||
"Staan API Key": "Staan API কী",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "স্টেজ করা পরিবর্তনগুলো",
|
||||
"Standard": "সাধারণ",
|
||||
"Start a new conversation": "নতুন কথোপকথন শুরু করুন",
|
||||
"Start a voice call using your microphone?": "আপনার মাইক্রোফোন ব্যবহার করে ভয়েস কল শুরু করবেন?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "প্রস্তাবিত",
|
||||
"Suggested prompts": "প্রস্তাবিত প্রম্পটসমূহ",
|
||||
"Summarize this note.": "এই নোটের সারসংক্ষেপ তৈরি করুন।",
|
||||
"Summary": "",
|
||||
"Summary": "সারসংক্ষেপ",
|
||||
"Sun": "রবি",
|
||||
"Support": "আর্থিক সহায়তা করুন",
|
||||
"Support this plugin:": "এই প্লাগইনে আর্থিক সহায়তা করুন:",
|
||||
"Supported parameters": "সমর্থিত প্যারামিটার",
|
||||
"Swap": "অদলবদল করুন",
|
||||
"Swap sides": "দুই পাশ অদলবদল করুন",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "অন্য শাখায় যান",
|
||||
"Switch camera": "ক্যামেরা পরিবর্তন করুন",
|
||||
"Switch to Assistant role": "সহকারী ভূমিকায় যান",
|
||||
"Switch to JSON editor": "JSON এডিটরে যান",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "সিস্টেম নির্দেশনা",
|
||||
"System Prompt": "সিস্টেম প্রম্পট",
|
||||
"Table": "সারণি",
|
||||
"Tabs": "",
|
||||
"Tabs": "ট্যাবসমূহ",
|
||||
"Tag": "ট্যাগ",
|
||||
"Tags": "ট্যাগসমূহ",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "আউটপুটে কম সম্ভাব্য টোকেনের প্রভাব কমাতে টেইল-ফ্রি স্যাম্পলিং ব্যবহৃত হয়। বড় মান (যেমন 2.0) প্রভাব আরও কমায়, আর 1.0 মান এই সেটিং বন্ধ করে।",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "রোমান সাম্রাজ্য সম্পর্কে যেকোনো একটি মজার তথ্য বলুন",
|
||||
"Tell us more:": "আরও বলুন:",
|
||||
"Temporary": "অস্থায়ী",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "অস্থায়ী চ্যাট",
|
||||
"Temporary Chat": "অস্থায়ী চ্যাট",
|
||||
"Temporary: toggle temporary chat for this new chat.": "অস্থায়ী: এই নতুন চ্যাটের অস্থায়ী মোড চালু বা বন্ধ করুন।",
|
||||
"Terminal": "টার্মিনাল",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "এটি পূর্বাবস্থায় ফেরানো যাবে না। উত্তরগুলো দৃশ্যমান থাকবে।",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "এই চ্যানেল {{createdAt}} তারিখে তৈরি হয়েছে। এটি {{channelName}} চ্যানেলের একেবারে শুরু।",
|
||||
"This chat won't appear in history and your messages will not be saved.": "এই চ্যাট ইতিহাসে থাকবে না এবং আপনার মেসেজ সংরক্ষিত হবে না।",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "এই ফাইল ইতিমধ্যে খোলা আছে। এর ট্যাব বন্ধ করুন অথবা অন্য একটি নাম বেছে নিন।",
|
||||
"This folder is empty": "এই ফোল্ডার খালি",
|
||||
"This is a default user permission and will remain enabled.": "এটি ব্যবহারকারীর ডিফল্ট অনুমতি এবং সক্রিয় থাকবে।",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "এটি পরীক্ষামূলক ফিচার; প্রত্যাশামতো কাজ নাও করতে পারে এবং যেকোনো সময় পরিবর্তিত হতে পারে।",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "অপরিবর্তিত লাইন বাদ দেওয়া হয়েছে",
|
||||
"Underline": "আন্ডারলাইন",
|
||||
"Undo": "পূর্বাবস্থায় ফিরিয়ে নিন",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "শেষ কমিট পূর্বাবস্থায় ফেরান",
|
||||
"Undo the last commit and keep its changes staged?": "শেষ কমিট পূর্বাবস্থায় ফিরিয়ে তার পরিবর্তনগুলো স্টেজ করা অবস্থায় রাখবেন?",
|
||||
"Unified": "একত্রিত",
|
||||
"Uninstall": "আনইনস্টল করুন",
|
||||
"Uninstall app": "অ্যাপ আনইনস্টল করুন",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "চালিয়ে যেতে আনমিউট করুন",
|
||||
"Unpin": "পিন সরান",
|
||||
"Unpin from Sidebar": "সাইডবার থেকে পিন সরান",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "পুশ করা হয়নি",
|
||||
"Unread": "অপঠিত",
|
||||
"Unsaved changes": "অসংরক্ষিত পরিবর্তন",
|
||||
"Unsaved changes to this version will be discarded.": "এই সংস্করণের অসংরক্ষিত পরিবর্তনগুলো বাদ দেওয়া হবে।",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "সব মডেল আপডেট করুন",
|
||||
"Update and Copy Link": "আপডেট এবং লিংক কপি করুন",
|
||||
"Update app": "অ্যাপ আপডেট করুন",
|
||||
"Update branch": "",
|
||||
"Update branch": "শাখা আপডেট করুন",
|
||||
"Update for the latest features and improvements.": "সর্বশেষ ফিচার ও উন্নতি পেতে আপডেট করুন।",
|
||||
"Update your status": "আপনার স্ট্যাটাস আপডেট করুন",
|
||||
"Updated": "আপডেট হয়েছে",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "ডিফল্ট ব্যবহার করুন",
|
||||
"Use device vibration feedback on supported Android devices.": "সমর্থিত Android ডিভাইসে কম্পনের মাধ্যমে প্রতিক্রিয়া ব্যবহার করুন।",
|
||||
"Use discovered scopes": "শনাক্ত করা অনুমতির পরিধি ব্যবহার করুন",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "পুরো প্রস্থজুড়ে ট্যাব ব্যবহার করুন",
|
||||
"Use global setting": "সর্বজনীন সেটিং ব্যবহার করুন",
|
||||
"Use groups to organize your users and assign permissions.": "ব্যবহারকারীদের সাজাতে ও অনুমতি দিতে গ্রুপ ব্যবহার করুন।",
|
||||
"Use in prompt": "প্রম্পটে ব্যবহার করুন",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "সুনির্দিষ্ট ও প্রাসঙ্গিক বিষয়বস্তু আহরণের জন্য খণ্ডভিত্তিক পুনরুদ্ধার ব্যবহার করুন।",
|
||||
"Use segmented retrieval for focused and relevant context.": "সুনির্দিষ্ট ও প্রাসঙ্গিক কনটেক্সট পেতে খণ্ডভিত্তিক পুনরুদ্ধার ব্যবহার করুন।",
|
||||
"Use segmented retrieval for focused context.": "সুনির্দিষ্ট কনটেক্সট পেতে খণ্ডভিত্তিক পুনরুদ্ধার ব্যবহার করুন।",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "পাশে ট্যাব ব্যবহার করুন",
|
||||
"Use these in model system prompts as {{example}}.": "মডেলের সিস্টেম প্রম্পটে এগুলো {{example}} হিসেবে ব্যবহার করুন।",
|
||||
"Use Web Search?": "ওয়েব অনুসন্ধান ব্যবহার করবেন?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "নেটিভ ফাংশন কলিং মোডে ব্যবহৃত হয়। ওয়ার্কস্পেসের সেটিংসমূহ ও ব্যবহারকারীর অনুমতি তখনও প্রযোজ্য থাকে।",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "ভিডিও",
|
||||
"Video player": "ভিডিও প্লেয়ার",
|
||||
"View": "প্রদর্শন",
|
||||
"View changes": "",
|
||||
"View changes": "পরিবর্তনগুলো দেখুন",
|
||||
"View channel": "চ্যানেল দেখুন",
|
||||
"View chat": "চ্যাট দেখুন",
|
||||
"View comment": "মন্তব্য দেখুন",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "{{platform}}-এ দেখুন",
|
||||
"View Replies": "উত্তরসমূহ দেখুন",
|
||||
"View Result from {{NAME}}": "{{NAME}} থেকে পাওয়া ফলাফল দেখুন",
|
||||
"View source": "মূল টেক্সট দেখুন",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "কাজ",
|
||||
"Working Directory": "ওয়ার্কিং ডিরেক্টরি",
|
||||
"Working Directory Context": "ওয়ার্কিং ডিরেক্টরির কনটেক্সট",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "ওয়ার্কিং ট্রির পরিবর্তনগুলো",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "top-k-এর সঙ্গে কাজ করে। বড় মান (যেমন 0.95) বেশি বৈচিত্র্যময় টেক্সট তৈরি করবে, আর ছোট মান (যেমন 0.5) আরও সুনির্দিষ্ট ও সংযত টেক্সট তৈরি করবে।",
|
||||
"Workspace": "ওয়ার্কস্পেস",
|
||||
"Workspace Models": "ওয়ার্কস্পেসের মডেলসমূহ",
|
||||
"Workspace Permissions": "ওয়ার্কস্পেসের অনুমতিসমূহ",
|
||||
"Workspace search": "ওয়ার্কস্পেস অনুসন্ধান",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "ওয়ার্কট্রির শাখা",
|
||||
"Worktree directory": "ওয়ার্কট্রির ডিরেক্টরি",
|
||||
"Worktrees": "ওয়ার্কট্রিসমূহ",
|
||||
"Write": "লেখার অনুমতি",
|
||||
"Write a prompt…": "একটি প্রম্পট লিখুন…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "৫০ শব্দের মধ্যে {{topic}} এর একটি সারসংক্ষেপ লিখুন।",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "এই জ্ঞানভান্ডারে ফাইল আপলোড করার অনুমতি আপনার নেই।",
|
||||
"You do not have permission to upload files.": "ফাইল আপলোড করার অনুমতি আপনার নেই।",
|
||||
"You do not have permission to upload web content.": "ওয়েবের বিষয়বস্তু আপলোড করার অনুমতি আপনার নেই।",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "আপনার সাইড চ্যাট ব্যবহারের অনুমতি নেই।",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "আপনার 50 জনের বেশি ব্যবহারকারী রয়েছে, যা প্রায়ই বোঝায় এই ওয়ার্কস্পেস কোনো প্রতিষ্ঠানের কাজে ব্যবহৃত হচ্ছে। Open WebUI যেমন আছে তেমনই বিনামূল্যে ব্যবহার করা যায়, কোনো বিধিনিষেধ বা গোপন সীমা নেই, এবং আমরা এভাবেই রাখতে চাই।",
|
||||
"You have no archived conversations.": "আপনার কোনও আর্কাইভ করা কথোপকথন নেই।",
|
||||
"You have no shared conversations.": "আপনার কোনো শেয়ার করা কথোপকথন নেই।",
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -115,7 +115,7 @@
|
|||
"A chat run finished successfully.": "Izvršavanje razgovora je uspješno završeno.",
|
||||
"A collaboration channel where people join as members": "Kanal za saradnju kojem se ljudi pridružuju kao članovi",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Kanal za diskusiju u kojem grupe i dozvole određuju pristup",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Datoteka s ovim nazivom već postoji. Zamijeniti je?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Dostupna je nova verzija (v{{LATEST_VERSION}}).",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Stranica je promijenjena na drugom mjestu. Vaš prethodni tekst je dostupan za preuzimanje.",
|
||||
"A private conversation between you and selected users": "Privatan razgovor između vas i odabranih korisnika",
|
||||
|
|
@ -253,7 +253,7 @@
|
|||
"Allow selecting hidden models as base models.": "Dozvolite odabir skrivenih modela kao osnovnih modela.",
|
||||
"Allow Sharing With Groups": "Dozvoli dijeljenje s grupama",
|
||||
"Allow Sharing With Users": "Dozvoli dijeljenje s korisnicima",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Dozvoli bočni razgovor",
|
||||
"Allow Speech to Text": "Dozvoli transformaciju Govora u Tekst",
|
||||
"Allow Temporary Chat": "Dozvoli Privremeni Razgovor",
|
||||
"Allow Text to Speech": "Dozvoli Transformaciju Teksta u Govor",
|
||||
|
|
@ -302,7 +302,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Primijenite funkcije koje obrađuju poruke prije ili nakon odgovora modela.",
|
||||
"Apply to draft": "Primijeni na nacrt",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Opcija \"Primijeni na nacrt\" koristi predloženu verziju s desne strane. Nakon toga spremite nacrt.",
|
||||
"Approve": "",
|
||||
"Approve": "Odobri",
|
||||
"Approximate comparison": "Približno poređenje",
|
||||
"Apps": "Aplikacije",
|
||||
"April": "April",
|
||||
|
|
@ -335,7 +335,7 @@
|
|||
"Ask for approval": "Zatraži odobrenje",
|
||||
"Ask or edit…": "Pitajte ili uredite…",
|
||||
"Ask this knowledge source a test question": "Postavite probno pitanje ovom izvoru znanja",
|
||||
"Assignees": "",
|
||||
"Assignees": "Zadužene osobe",
|
||||
"Assistance": "Pomoć",
|
||||
"assistant": "asistent",
|
||||
"Assistant": "Asistent",
|
||||
|
|
@ -363,7 +363,7 @@
|
|||
"Authenticator configured": "Autentifikator je postavljen",
|
||||
"Authenticator not configured": "Autentifikator nije postavljen",
|
||||
"Authenticator setup QR code": "QR kod za postavljanje autentifikatora",
|
||||
"Author": "",
|
||||
"Author": "Autor",
|
||||
"Authorize OAuth": "Odobri OAuth",
|
||||
"Auto": "Automatski",
|
||||
"Auto (Random)": "Automatski (nasumično)",
|
||||
|
|
@ -396,9 +396,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Natrag",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Natrag na izmjene",
|
||||
"Back to files": "Nazad na datoteke",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Natrag na zahtjeve za spajanje",
|
||||
"Back to sign in": "Natrag na prijavu",
|
||||
"Background Image": "Pozadinska slika",
|
||||
"Background image must be at most 25 megapixels.": "Pozadinska slika ne smije imati više od 25 megapiksela.",
|
||||
|
|
@ -408,7 +408,7 @@
|
|||
"Background sub-agent finished": "Pozadinski podagent je završio",
|
||||
"background sub-agents": "pozadinski podagenti",
|
||||
"Bad Response": "Loš odgovor",
|
||||
"Base branch": "",
|
||||
"Base branch": "Ciljna grana",
|
||||
"Base Model (From)": "Osnovni model (Od)",
|
||||
"Base Model is required.": "Potreban je osnovni model.",
|
||||
"Base Models": "Osnovni modeli",
|
||||
|
|
@ -419,17 +419,17 @@
|
|||
"before": "prije",
|
||||
"Being lazy": "Biti lijen",
|
||||
"Binary file — text comparison is unavailable.": "Binarna datoteka — poređenje teksta nije dostupno.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Binarna datoteka je promijenjena",
|
||||
"Binary file. Download to open.": "Binarna datoteka. Preuzmite je da je otvorite.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Opcije bloka",
|
||||
"Bold": "Podebljano",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Pojačava ili potiskuje određene tokene radi ograničavanja odgovora. Vrijednosti pristranosti bit će ograničene na raspon od -100 do 100, uključujući obje granice. (Zadano: ništa)",
|
||||
"Both files are required for comparison.": "Za poređenje su potrebne obje datoteke.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Radnje grane",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Preglednik",
|
||||
"Browser options": "Opcije preglednika",
|
||||
"build · {{hash}}": "verzija · {{hash}}",
|
||||
"Built-in": "Ugrađena",
|
||||
"Bullet List": "Lista s oznakama",
|
||||
|
|
@ -466,7 +466,7 @@
|
|||
"Change folder icon": "Promijeni ikonu foldera",
|
||||
"Change overview": "Pregled izmjena",
|
||||
"Change User Role": "Promijeni ulogu korisnika",
|
||||
"changed": "",
|
||||
"changed": "promijenjeno",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Promjene odjavljuju sve uređaje. Korisnici postavljaju autentifikator pri sljedećoj prijavi.",
|
||||
"Channel": "Kanal",
|
||||
"Channel deleted successfully": "Kanal je uspješno izbrisan",
|
||||
|
|
@ -511,7 +511,7 @@
|
|||
"Check OAuth Discovery": "Provjeri OAuth otkrivanje",
|
||||
"Check what is running in this chat.": "Provjerite šta se izvršava u ovom razgovoru.",
|
||||
"Checking for updates...": "Provjeravam ažuriranja...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Prebaci se na granu",
|
||||
"Choose a date range to compare": "Odaberite raspon datuma za poređenje",
|
||||
"Choose a model before saving...": "Odaberite model prije spremanja...",
|
||||
"Choose a parent page. Subpages move with this page.": "Odaberite nadređenu stranicu. Podstranice se premještaju zajedno s ovom stranicom.",
|
||||
|
|
@ -573,7 +573,7 @@
|
|||
"Close modal": "Zatvori prozor",
|
||||
"Close Modal": "Zatvori prozor",
|
||||
"Close pages": "Zatvori stranice",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Zatvori zahtjev za spajanje",
|
||||
"Close search": "Zatvori pretragu",
|
||||
"Close session details": "Zatvori detalje sesije",
|
||||
"Close Sidebar": "Zatvori bočnu traku",
|
||||
|
|
@ -591,8 +591,8 @@
|
|||
"Collaborators": "Saradnici",
|
||||
"Collapse": "Sažmi",
|
||||
"Collapse {{name}}": "Sažmi {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Sažmi Git panel",
|
||||
"Collapse sessions": "Sažmi sesije",
|
||||
"Collapse terminal": "Sažmi terminal",
|
||||
"Collection": "Kolekcija",
|
||||
"Collection Field": "Polje kolekcije",
|
||||
|
|
@ -610,11 +610,11 @@
|
|||
"Comment deleted": "Komentar je izbrisan",
|
||||
"Comments": "Komentari",
|
||||
"Comments are no longer available.": "Komentari više nisu dostupni.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Radnje zabilježene izmjene",
|
||||
"Commit message": "Poruka izmjene",
|
||||
"Commit Message": "Poruka izmjene",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Sažetak izmjene",
|
||||
"Commit to {{branch}}": "Zabilježi izmjene na grani {{branch}}",
|
||||
"Community Reviews": "Recenzije zajednice",
|
||||
"Compact": "Sažmi kontekst",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Sažmi kontekst: skrati starije poruke kako bi se ovaj razgovor mogao nastaviti.",
|
||||
|
|
@ -643,18 +643,18 @@
|
|||
"Config imported successfully": "Konfiguracija je uspješno uvezena",
|
||||
"Configure": "Promijeni",
|
||||
"Configure app": "Konfiguriraj aplikaciju",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Konfigurirajte datoteke razgovora, ventile, sistemski prompt i napredne parametre.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Konfigurirajte glas u stvarnom vremenu, glasovni avatar i glas za pretvaranje teksta u govor za ovaj model.",
|
||||
"Confirm": "Potvrdi",
|
||||
"Confirm Password": "Potvrdite lozinku",
|
||||
"Confirm Prompt from Embed": "Potvrdi prompt iz ugrađenog sadržaja",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Potvrdi radnju zahtjeva za spajanje",
|
||||
"Confirm recording": "Potvrdi snimak",
|
||||
"Confirm your action": "Potvrdi radnju",
|
||||
"Confirm your new password": "Potvrdi novu sifru",
|
||||
"Confirm Your Password": "Potvrdi sifru",
|
||||
"Connect": "Poveži",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Prvo se povežite i odaberite model.",
|
||||
"Connect external apps to Open WebUI.": "Povežite vanjske aplikacije s Open WebUI-jem.",
|
||||
"Connect to an AI provider to start chatting": "Povežite se s pružaocem AI usluge da započnete razgovor",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Povežite se s Open Terminal instancama. Admini i korisnici s odobrenim pristupom mogu putem tih servera pregledati datoteke i koristiti terminalske alate.",
|
||||
|
|
@ -665,12 +665,12 @@
|
|||
"Connected apps": "Povezane aplikacije",
|
||||
"Connecting": "Povezivanje",
|
||||
"Connecting...": "Povezivanje...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Povezivanje…",
|
||||
"Connection": "Veza",
|
||||
"Connection failed": "Konekcija nije uspjela",
|
||||
"Connection ID": "ID veze",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "ID veze ne može sadržavati znakove \":\" ili \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Veza je prekinuta. Pokušajte ponovo.",
|
||||
"Connection lost. Reconnecting...": "Veza je prekinuta. Ponovno povezivanje...",
|
||||
"Connection successful": "Konekcija uspjesna",
|
||||
"Connection Type": "Tip Konekcije",
|
||||
|
|
@ -709,10 +709,10 @@
|
|||
"Copy": "Kopiraj",
|
||||
"Copy {{name}} to clipboard": "Kopiraj sadržaj {{name}} u međuspremnik",
|
||||
"Copy API Key": "Kopiraj API ključ",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Kopiraj naziv grane",
|
||||
"Copy change to original": "Kopiraj izmjenu u izvornik",
|
||||
"Copy change to proposal": "Kopiraj izmjenu u predloženu verziju",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Kopiraj hash izmjene",
|
||||
"Copy content": "Kopiraj sadržaj",
|
||||
"Copy default": "Kopiraj zadanu vrijednost",
|
||||
"Copy Last Code Block": "Kopiraj posljednji blok koda",
|
||||
|
|
@ -733,8 +733,8 @@
|
|||
"Copyright (c)": "Autorska prava (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "Pružalac usluge mora pravilno konfigurirati CORS da dozvoli zahtjeve iz Open WebUI-ja.",
|
||||
"Could not check for updates": "Nije moguće provjeriti ažuriranja",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Nije moguće kopirati naziv grane",
|
||||
"Could not copy commit hash": "Nije moguće kopirati hash izmjene",
|
||||
"Could not copy to clipboard. Please try again.": "Nije moguće kopirati u međuspremnik. Pokušajte ponovo.",
|
||||
"Could not determine the upload folder.": "Nije moguće odrediti folder za učitavanje.",
|
||||
"Could not load avatar.": "Avatar se nije mogao učitati.",
|
||||
|
|
@ -759,7 +759,7 @@
|
|||
"Create Account": "Stvori račun",
|
||||
"Create Admin Account": "Kreiraj administratorski račun",
|
||||
"Create announcements shown to users in the app.": "Kreirajte obavještenja koja se prikazuju korisnicima u aplikaciji.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Kreiraj granu",
|
||||
"Create Channel": "Kreiraj kanal",
|
||||
"Create copy": "Kreiraj kopiju",
|
||||
"Create Folder": "Kreiraj folder",
|
||||
|
|
@ -770,7 +770,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Kreirajte zakazane prompte koji se automatski izvršavaju u redovnim intervalima.",
|
||||
"Create skill": "Kreiraj vještinu",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Kreiraj vještinu: kreiraj terminalsku vještinu za višekratnu upotrebu iz ovog razgovora.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Kreiraj radno stablo",
|
||||
"Create your first note from the Create menu.": "Kreirajte prvu bilješku putem menija Kreiraj.",
|
||||
"Created": "Datum kreiranja",
|
||||
"Created at": "Stvoreno",
|
||||
|
|
@ -797,7 +797,7 @@
|
|||
"Custom Parameter Value": "Vrijednost prilagođenog parametra",
|
||||
"Custom permissions": "Prilagođene dozvole",
|
||||
"Custom range": "Prilagođeni raspon datuma",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Prilagođeni raspored",
|
||||
"Customize": "Prilagodi",
|
||||
"Daily": "Svakodnevno",
|
||||
"Daily at": "Svaki dan u",
|
||||
|
|
@ -807,7 +807,7 @@
|
|||
"Data": "Podaci",
|
||||
"Database": "Baza podataka",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Datum",
|
||||
"Date Added": "Datum dodavanja",
|
||||
"Date is required": "Potreban je datum",
|
||||
"Date Modified": "Datum izmjene",
|
||||
|
|
@ -855,8 +855,8 @@
|
|||
"Delete all contents inside this folder": "Izbriši sav sadržaj ovog foldera",
|
||||
"Delete API Key?": "Izbrisati API ključ?",
|
||||
"Delete automation?": "Izbrisati automatizaciju?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Izbriši granu",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Izbrisati granu {{branch}}? Nespojene grane bit će zadržane.",
|
||||
"Delete calendar": "Izbriši kalendar",
|
||||
"Delete Calendar": "Izbriši kalendar",
|
||||
"Delete Chat": "Izbriši razgovor",
|
||||
|
|
@ -906,12 +906,12 @@
|
|||
"Description": "Opis",
|
||||
"Description ({{language}})": "Opis ({{language}})",
|
||||
"Deselect": "Poništi odabir",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Radna površina",
|
||||
"Desktop access denied. Reopen this tab.": "Pristup radnoj površini je odbijen. Ponovo otvorite ovu karticu.",
|
||||
"Desktop audio": "Zvuk radne površine",
|
||||
"Desktop audio is not supported by this browser.": "Ovaj preglednik ne podržava zvuk radne površine.",
|
||||
"Desktop audio unavailable.": "Zvuk radne površine nije dostupan.",
|
||||
"Desktop connection failed.": "Povezivanje s radnom površinom nije uspjelo.",
|
||||
"Destination": "Odredište",
|
||||
"Detected Variables": "Prepoznate varijable",
|
||||
"dev build": "razvojna verzija",
|
||||
|
|
@ -937,7 +937,7 @@
|
|||
"Discard comparison changes?": "Odbaciti izmjene poređenja?",
|
||||
"Discard unsaved changes?": "Odbaciti nespremljene izmjene?",
|
||||
"Discard unsaved skill changes?": "Odbaciti nespremljene izmjene vještine?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Odbaciti nespremljene izmjene ove datoteke u radnom stablu? Ovo nije moguće poništiti.",
|
||||
"Disconnect OAuth": "Prekini OAuth vezu",
|
||||
"Disconnected": "Nije povezano",
|
||||
"Discover a function": "Pronađi funkciju",
|
||||
|
|
@ -986,7 +986,7 @@
|
|||
"Downloading \"{{name}}\"": "Preuzimanje \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Preuzimanje \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Preuzimanje statistike...",
|
||||
"Draft": "",
|
||||
"Draft": "Nacrt",
|
||||
"Drag and Drop Container": "Područje za povlačenje i ispuštanje",
|
||||
"Drag or use the up and down arrow keys to reorder": "Prevucite ili koristite tipke sa strelicama gore i dolje da promijenite redoslijed",
|
||||
"Drag to move": "Povucite za pomjeranje",
|
||||
|
|
@ -1086,14 +1086,14 @@
|
|||
"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: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Unesite {{role}} poruku ovdje",
|
||||
"Enter a Connection ID to register.": "Unesite ID veze za registraciju.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Unesite naziv datoteke bez kosih crta.",
|
||||
"Enter a name, content, and a valid command.": "Unesite naziv, sadržaj i ispravnu naredbu.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Unesite naslov preklopnog prikaza informacija o korisniku na čekanju. Ostavite prazno za zadani naslov.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Unesite vodeni žig za odgovor. Ostavite prazno ako ga ne želite.",
|
||||
"Enter additional headers in JSON format": "Unesite dodatna zaglavlja u JSON formatu",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Unesite dodatna zaglavlja u JSON formatu (npr. {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "Unesite dodatne parametre u JSON formatu",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Unesite HTTP ili HTTPS URL bez podataka za autentifikaciju.",
|
||||
"Enter api auth string (e.g. username:password)": "Unesite niz za API autentifikaciju (npr. username:password)",
|
||||
"Enter Application DN": "Unesite DN aplikacije",
|
||||
"Enter Application DN Password": "Unesite lozinku za DN aplikacije",
|
||||
|
|
@ -1280,12 +1280,12 @@
|
|||
"Execute code for analysis": "Izvrši kod za analizu",
|
||||
"Executing {{NAME}}...": "Izvršavanje {{NAME}}...",
|
||||
"Execution timeline": "Vremenska linija izvršavanja",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Izađi iz prikaza preko cijelog ekrana",
|
||||
"Expand": "Proširi",
|
||||
"Expand {{name}}": "Proširi {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Proširi Git panel",
|
||||
"Expand input": "Proširi polje za unos",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Proširi sesije",
|
||||
"Expand terminal": "Proširi terminal",
|
||||
"Experience": "Korisničko iskustvo",
|
||||
"Experimental": "Eksperimentalno",
|
||||
|
|
@ -1342,7 +1342,7 @@
|
|||
"Failed to import models": "Uvoz modela nije uspio",
|
||||
"Failed to load chat": "Učitavanje razgovora nije uspjelo",
|
||||
"Failed to load chat preview": "Učitavanje pregleda razgovora nije uspjelo",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Učitavanje direktorija nije uspjelo",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Učitavanje DOCX datoteke nije uspjelo. Pokušajte je preuzeti.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Učitavanje Excel/CSV datoteke nije uspjelo. Pokušajte je preuzeti.",
|
||||
"Failed to load file content.": "Učitavanje sadržaja datoteke nije uspjelo.",
|
||||
|
|
@ -1368,7 +1368,7 @@
|
|||
"Failed to save connections": "Spremanje povezivanja nije uspjelo",
|
||||
"Failed to save conversation": "Neuspješno spremanje razgovora",
|
||||
"Failed to save file": "Spremanje datoteke nije uspjelo",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Spremanje datoteke nije uspjelo. Vaše izmjene su još u uređivaču.",
|
||||
"Failed to save model": "Spremanje modela nije uspjelo",
|
||||
"Failed to save models configuration": "Spremanje konfiguracije modela nije uspjelo",
|
||||
"Failed to save policy: {{error}}": "Spremanje pravila nije uspjelo: {{error}}",
|
||||
|
|
@ -1400,14 +1400,14 @@
|
|||
"File actions": "Radnje s datotekom",
|
||||
"File added successfully.": "Datoteka uspješno dodana.",
|
||||
"File browser": "Preglednik datoteka",
|
||||
"File changes": "",
|
||||
"File changes": "Izmjene datoteke",
|
||||
"File content": "Sadržaj datoteke",
|
||||
"File content updated successfully.": "Sadržaj datoteke uspješno ažuriran.",
|
||||
"File count limit": "Ograničenje broja datoteka",
|
||||
"File created": "Datoteka je kreirana",
|
||||
"File deleted successfully.": "Datoteka uspješno izbrisana.",
|
||||
"File differences": "Razlike između datoteka",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Nije moguće pisati u datoteku.",
|
||||
"File Mode": "Način datoteke",
|
||||
"File moved.": "Datoteka premještena.",
|
||||
"File name": "Naziv datoteke",
|
||||
|
|
@ -1504,9 +1504,9 @@
|
|||
"Get information on {{name}} in the UI": "Prikaži informacije o {{name}} u korisničkom sučelju",
|
||||
"Get started": "Započni",
|
||||
"Get started with {{WEBUI_NAME}}": "Počnite koristiti {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Git izmjene",
|
||||
"Git unavailable": "Git nije dostupan",
|
||||
"Give me ideas": "Daj mi ideje",
|
||||
"give me tips": "daj mi savjete",
|
||||
"Global": "Globalno",
|
||||
|
|
@ -1534,7 +1534,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Izvorna grana",
|
||||
"Headers": "Zaglavlja",
|
||||
"Headers must be a valid JSON object": "Zaglavlja moraju biti ispravan JSON objekt",
|
||||
"Height": "Visina",
|
||||
|
|
@ -1551,13 +1551,13 @@
|
|||
"Hide": "Sakrij",
|
||||
"Hide All": "Sakrij sve",
|
||||
"Hide conversation": "Sakrij razgovor",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Sakrij poređenje",
|
||||
"Hide from Sidebar": "Sakrij s bočne trake",
|
||||
"Hide Hidden Files": "Sakrij skrivene datoteke",
|
||||
"Hide Model": "Sakrij model",
|
||||
"Hide preview": "Sakrij pregled",
|
||||
"Hide sub-agents": "Sakrij podagente",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Sakrij kartice",
|
||||
"Hide whitespace": "Sakrij razmake",
|
||||
"High": "Visoko",
|
||||
"History": "Historija",
|
||||
|
|
@ -1696,7 +1696,7 @@
|
|||
"Knowledge source updated.": "Izvor znanja ažuriran.",
|
||||
"Knowledge updated successfully": "Znanje uspješno ažurirano",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Preglednik)",
|
||||
"Labels": "",
|
||||
"Labels": "Oznake",
|
||||
"Last 12 months": "Posljednjih 12 mjeseci",
|
||||
"Last 24 hours": "Posljednja 24 sata",
|
||||
"Last 30 days": "Posljednjih 30 dana",
|
||||
|
|
@ -1792,7 +1792,7 @@
|
|||
"March": "Mart",
|
||||
"Mark all as read": "Označi sve kao pročitano",
|
||||
"Mark as unread": "Označi kao nepročitano",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Označi kao spremno",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Tržište",
|
||||
"Matching tabs: {{count}}_one": "Odgovarajuće kartice: {{count}}",
|
||||
|
|
@ -1824,21 +1824,21 @@
|
|||
"Mention someone": "Spomeni nekoga",
|
||||
"Mentions only": "Samo spominjanja",
|
||||
"Menu": "Meni",
|
||||
"Merge": "",
|
||||
"Merge": "Spajanje",
|
||||
"Merge Responses": "Spoji odgovore",
|
||||
"Merged Response": "Spojeni odgovor",
|
||||
"Message": "Poruka",
|
||||
"Message counts and response timestamps": "Broj poruka i vremenske oznake odgovora",
|
||||
"Message counts are based on assistant responses.": "Broj poruka zasniva se na odgovorima asistenta.",
|
||||
"Message exceeds the 16 KiB limit.": "Poruka premašuje ograničenje od 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Broj poruke",
|
||||
"Message rating should be enabled to use this feature": "Za korištenje ove mogućnosti potrebno je omogućiti ocjenjivanje poruka",
|
||||
"Message share": "Udio poruka",
|
||||
"Message text...": "Tekst poruke...",
|
||||
"messages": "— poruke",
|
||||
"Messages": "Poruke",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Poruke su šifrirane s kraja na kraj i ne spremaju se.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Poruke nestaju kada zatvorite ovu karticu.",
|
||||
"Metadata Field": "Polje metapodataka",
|
||||
"Microphone off": "Mikrofon isključen",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1852,7 +1852,7 @@
|
|||
"Mistral OCR Parameters": "Mistral OCR parametri",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Pon",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Mobilni prikaz",
|
||||
"Model": "Model",
|
||||
"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.",
|
||||
|
|
@ -1907,7 +1907,7 @@
|
|||
"Models imported successfully": "Modeli uspješno uvezeni",
|
||||
"Models Public Sharing": "Javno dijeljenje modela",
|
||||
"Models Sharing": "Dijeljenje modela",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Modeli kojima ovaj model može delegirati zadatke. Korisnici im moraju imati pristup. Ostavite prazno za korištenje trenutnog modela.",
|
||||
"Modified": "Izmijenjeno",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Pon",
|
||||
|
|
@ -1943,7 +1943,7 @@
|
|||
"Navigate to Previous Chat": "Idi na prethodni razgovor",
|
||||
"Never": "Nikad",
|
||||
"New": "Novo",
|
||||
"New branch": "",
|
||||
"New branch": "Nova grana",
|
||||
"New Button": "Novo dugme",
|
||||
"New calendar": "Novi kalendar",
|
||||
"New Calendar": "Novi kalendar",
|
||||
|
|
@ -1958,14 +1958,14 @@
|
|||
"New Group": "Nova grupa",
|
||||
"New Note": "Nova bilješka",
|
||||
"New Password": "Nova lozinka",
|
||||
"New pull request": "",
|
||||
"New pull request": "Novi zahtjev za spajanje",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Nove vještine i kopije su privatne. Opcija \"Zamijeni\" sprema novu verziju i zadržava postojeće dijeljenje.",
|
||||
"New tab": "",
|
||||
"New tab": "Nova kartica",
|
||||
"New Temporary Chat": "Novi privremeni razgovor",
|
||||
"New Terminal": "Novi terminal",
|
||||
"New Tool": "Novi alat",
|
||||
"New Webhook": "Novi webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Novo radno stablo",
|
||||
"new-channel": "novi-kanal",
|
||||
"Next": "Sljedeće",
|
||||
"Next change": "Sljedeća izmjena",
|
||||
|
|
@ -1985,7 +1985,7 @@
|
|||
"No apps connected.": "Nema povezanih aplikacija.",
|
||||
"No authentication": "Bez autentifikacije",
|
||||
"No automations found": "Nisu pronađene automatizacije",
|
||||
"No changes": "",
|
||||
"No changes": "Nema izmjena",
|
||||
"No channels": "Nema kanala",
|
||||
"No chat alerts": "Nema obavijesti o razgovorima",
|
||||
"No chat history": "Nema historije razgovora",
|
||||
|
|
@ -1995,9 +1995,9 @@
|
|||
"No chats found": "Nisu pronađeni razgovori",
|
||||
"No chats found for this user.": "Nisu pronađeni razgovori za ovog korisnika.",
|
||||
"No chats found.": "Nisu pronađeni razgovori.",
|
||||
"No checks": "",
|
||||
"No checks": "Nema provjera",
|
||||
"No comments yet": "Još nema komentara",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Još nema zabilježenih izmjena",
|
||||
"No content": "Nema sadržaja",
|
||||
"No content available": "Nema dostupnog sadržaja",
|
||||
"No content found": "Sadržaj nije pronađen",
|
||||
|
|
@ -2056,7 +2056,7 @@
|
|||
"No previous usage": "Nema prethodnog korištenja",
|
||||
"No prompts found": "Nisu pronađeni prompti",
|
||||
"No prompts yet": "Još nema promptova",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Nema zahtjeva za spajanje",
|
||||
"No Repeat": "Bez ponavljanja",
|
||||
"No results": "Nema rezultata",
|
||||
"No results found": "Nema rezultata",
|
||||
|
|
@ -2074,7 +2074,7 @@
|
|||
"No Terminal connection configured.": "Nije konfigurirana konekcija s terminalom.",
|
||||
"No terminal connections configured.": "Nisu konfigurirane konekcije s terminalima.",
|
||||
"No terminal servers available": "Nema dostupnih terminalskih servera",
|
||||
"No text changes": "",
|
||||
"No text changes": "Nema izmjena teksta",
|
||||
"No text differences": "Nema razlika u tekstu",
|
||||
"No tool server connections configured.": "Nisu konfigurirane konekcije sa serverima alata.",
|
||||
"No tools accessible": "Nema alata kojima možete pristupiti",
|
||||
|
|
@ -2087,7 +2087,7 @@
|
|||
"No valves to update": "Nema ventila za ažuriranje",
|
||||
"No webhooks yet": "Još nema webhookova",
|
||||
"Node Ids": "ID-jevi čvorova",
|
||||
"none": "",
|
||||
"none": "nema",
|
||||
"None": "Ništa",
|
||||
"None reported": "Ništa nije navedeno",
|
||||
"Not configured": "Nije konfigurirano",
|
||||
|
|
@ -2150,14 +2150,14 @@
|
|||
"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": "Otvori",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Otvorite karticu pomoću menija +.",
|
||||
"Open automation": "Otvori automatizaciju",
|
||||
"Open chat": "Otvori razgovor",
|
||||
"Open create menu": "Otvori meni za kreiranje",
|
||||
"Open file": "Otvori datoteku",
|
||||
"Open Folder": "Otvori folder",
|
||||
"Open in full screen": "Otvori preko cijelog ekrana",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Otvori na GitHubu",
|
||||
"Open in new tab": "Otvori u novoj kartici",
|
||||
"Open link": "Otvori link",
|
||||
"Open modal to configure connection": "Otvori dijalog za konfiguriranje konekcije",
|
||||
|
|
@ -2217,7 +2217,7 @@
|
|||
"parameter": "parametar",
|
||||
"Parameter": "Parametar",
|
||||
"Parameters": "Parametri",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Nadređeni direktorij",
|
||||
"Parent group": "Nadređena grupa",
|
||||
"Parent message not found": "Nadređena poruka nije pronađena",
|
||||
"Parent page": "Nadređena stranica",
|
||||
|
|
@ -2285,7 +2285,7 @@
|
|||
"Please select a reason": "Odaberite razlog",
|
||||
"Please select a valid JSON file": "Odaberite važeću JSON datoteku",
|
||||
"Please select at least one user for Direct Message channel.": "Odaberite barem jednog korisnika za kanal direktnih poruka.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Pričekajte da se završi učitavanje datoteka.",
|
||||
"Please wait until all files are uploaded.": "Sačekajte da se sve datoteke učitaju.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP ili GIF. Do 5 MiB i 25 megapiksela.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Promjene pravila primjenjuju se na novokreirane terminale. Osvježite odgovarajuće terminale da ih primijenite i na postojeće terminale.",
|
||||
|
|
@ -2342,15 +2342,15 @@
|
|||
"Provider": "Pružalac usluge",
|
||||
"Provider context": "Kontekstni prozor pružaoca usluge",
|
||||
"Provider details": "Detalji pružaoca usluge",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proxy",
|
||||
"Public": "Javno",
|
||||
"Public key": "Javni ključ",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Povucite \"{{searchValue}}\" s Ollama.com",
|
||||
"Pull a model from Ollama.com": "Povucite model s Ollama.com",
|
||||
"Pull Model": "Preuzmi model",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Radnje zahtjeva za spajanje",
|
||||
"Pull request description": "Opis zahtjeva za spajanje",
|
||||
"Pull request title": "Naslov zahtjeva za spajanje",
|
||||
"Punctuation": "Interpunkcija",
|
||||
"Pyodide file browser": "Pyodide preglednik datoteka",
|
||||
"Quality": "Kvalitet",
|
||||
|
|
@ -2371,7 +2371,7 @@
|
|||
"Read the docs": "Pročitaj dokumentaciju",
|
||||
"Read-only": "Samo za čitanje",
|
||||
"Read-Only Access": "Pristup samo za čitanje",
|
||||
"Ready": "",
|
||||
"Ready": "Označi kao spremno",
|
||||
"Realtime": "U stvarnom vremenu",
|
||||
"Realtime Voice": "Glas u stvarnom vremenu",
|
||||
"Reason": "Razlog",
|
||||
|
|
@ -2385,7 +2385,7 @@
|
|||
"Recommended": "Preporučeno",
|
||||
"Reconnect": "Ponovo poveži",
|
||||
"Reconnected": "Ponovo povezano",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Ponovno povezivanje…",
|
||||
"Record": "Snimi",
|
||||
"Record voice": "Snimanje glasa",
|
||||
"Recorded duration": "Zabilježeno trajanje",
|
||||
|
|
@ -2446,11 +2446,11 @@
|
|||
"Removing {{count}} stale files..._few": "Uklanjanje {{count}} zastarjele datoteke...",
|
||||
"Removing {{count}} stale files..._other": "Uklanjanje {{count}} zastarjelih datoteka...",
|
||||
"Rename": "Preimenuj",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Preimenuj granu",
|
||||
"Rename page": "Preimenuj stranicu",
|
||||
"Renamed to {{name}}": "Preimenovano u {{name}}",
|
||||
"Rendered preview": "Formatirani prikaz",
|
||||
"Reopen": "",
|
||||
"Reopen": "Ponovo otvori",
|
||||
"Reorder": "Promijeni redoslijed",
|
||||
"Repeat": "Ponavljanje",
|
||||
"Replace": "Zamijeni",
|
||||
|
|
@ -2462,7 +2462,7 @@
|
|||
"Reply to thread...": "Odgovori u temi...",
|
||||
"Replying to {{NAME}}": "Odgovor za {{NAME}}",
|
||||
"Reported by the provider.": "Podatke navodi pružalac usluge.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Zatraži izmjene",
|
||||
"Requested scopes": "Zatraženi opsezi dozvola",
|
||||
"Require an authenticator for all users": "Zahtijevaj autentifikator za sve korisnike",
|
||||
"required": "obavezno",
|
||||
|
|
@ -2477,7 +2477,7 @@
|
|||
"Reset to Defaults": "Vrati na zadano",
|
||||
"Reset view": "Vrati prikaz na početno",
|
||||
"Reset zoom": "Vrati zumiranje na početno",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Promijeni veličinu Git panela",
|
||||
"Resize panel": "Promijeni veličinu panela",
|
||||
"Resolved": "Riješeno",
|
||||
"Response": "Odgovor",
|
||||
|
|
@ -2488,7 +2488,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "odgovora sa zabilježenom potrošnjom",
|
||||
"Restart": "Ponovo pokreni",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Ponovo pokrenite sve instance Open WebUI-ja da biste primijenili promjene postavki veze s pružaocem usluge.",
|
||||
"Restricted": "Ograničeno",
|
||||
"Result": "Rezultat",
|
||||
"RESULT": "REZULTAT",
|
||||
|
|
@ -2500,13 +2500,13 @@
|
|||
"Retrieved {{count}} sources_other": "Dohvaćeno {{count}} izvora",
|
||||
"Retrieved 1 source": "Dohvaćen 1 izvor",
|
||||
"Retry": "Pokušaj ponovo",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Ponovi otkrivanje Gita",
|
||||
"Retry setup": "Ponovi postavljanje",
|
||||
"Return to call": "Vrati se na poziv",
|
||||
"Return to conversation": "Vrati se na razgovor",
|
||||
"Review": "Pregledaj",
|
||||
"Review the scopes this app is requesting before adding it.": "Prije dodavanja pregledajte opsege dozvola koje ova aplikacija traži.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Pregledavaoci",
|
||||
"Revised": "Revidirana verzija",
|
||||
"Rewrite the selected text.": "Preformuliši odabrani tekst.",
|
||||
"Role": "Uloga",
|
||||
|
|
@ -2532,7 +2532,7 @@
|
|||
"Save & Create": "Spremi i stvori",
|
||||
"Save & Update": "Spremi i ažuriraj",
|
||||
"Save and send": "Spremi i pošalji",
|
||||
"Save As": "",
|
||||
"Save As": "Spremi kao",
|
||||
"Save As Copy": "Spremi kao kopiju",
|
||||
"Save Chat": "Spremi razgovor",
|
||||
"Save draft as copy": "Spremi nacrt kao kopiju",
|
||||
|
|
@ -2559,7 +2559,7 @@
|
|||
"Search actions": "Pretraži radnje",
|
||||
"Search all emojis": "Pretraži sve emojije",
|
||||
"Search Automations": "Pretraži automatizacije",
|
||||
"Search branches": "",
|
||||
"Search branches": "Pretraži grane",
|
||||
"Search built-in tools": "Pretraži ugrađene alate",
|
||||
"Search channels": "Pretraži kanale",
|
||||
"Search Chats": "Pretraži razgovore",
|
||||
|
|
@ -2588,7 +2588,7 @@
|
|||
"Search or add pattern": "Pretraži ili dodaj obrazac",
|
||||
"Search parent groups": "Pretraži nadređene grupe",
|
||||
"Search Prompts": "Pretraga prompta",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Pretraži zahtjeve za spajanje",
|
||||
"Search results": "Rezultati pretrage",
|
||||
"Search scopes": "Pretraži opsege dozvola",
|
||||
"Search sessions": "Pretraži sesije",
|
||||
|
|
@ -2602,7 +2602,7 @@
|
|||
"Search users or groups": "Pretraži korisnike ili grupe",
|
||||
"Search workspace": "Pretraži radni prostor",
|
||||
"Search workspace…": "Pretraži radni prostor…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Pretraži radna stabla",
|
||||
"Search your workspace": "Pretražite svoj radni prostor",
|
||||
"Searched {{count}} sites": "Broj pretraženih stranica: {{count}}",
|
||||
"Searching": "Pretraživanje",
|
||||
|
|
@ -2629,11 +2629,11 @@
|
|||
"Select a model to isolate it.": "Odaberite model da biste prikazali samo njega.",
|
||||
"Select a pipeline": "Odabir kanala",
|
||||
"Select a pipeline url": "Odabir URL-a kanala",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Odaberite zahtjev za spajanje",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Odaberite raspon za filtriranje sesija. Uključeni su i djelimični podaci o potrošnji.",
|
||||
"Select a reranking model engine": "Odaberi pogon modela za ponovno rangiranje",
|
||||
"Select a role": "Odaberi ulogu",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Odaberite terminal da biste otvorili localhost URL-ove.",
|
||||
"Select a theme": "Odaberi temu",
|
||||
"Select a tool": "Odaberi alat",
|
||||
"Select a voice": "Odaberi glas",
|
||||
|
|
@ -2657,9 +2657,9 @@
|
|||
"Select loaded files": "Odaberi prikazane datoteke",
|
||||
"Select Method": "Odaberi metodu",
|
||||
"Select model": "Odaberi model",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Odaberite samo jedan model",
|
||||
"Select only one model to call": "Odaberite samo jedan model za poziv",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Odaberite samo jedan model da biste otvorili bočni razgovor.",
|
||||
"Select options": "Odaberi opcije",
|
||||
"Select Skill": "Odaberi vještinu",
|
||||
"Select to isolate model": "Odaberi za prikaz samo tog modela",
|
||||
|
|
@ -3361,8 +3361,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Dohvati trenutno vrijeme i izvrši izračune s datumima i vremenom",
|
||||
"settings.admin.models.builtinTools.time.label": "Vrijeme i izračuni",
|
||||
"settings.admin.models.builtinTools.title": "Ugrađeni alati",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Kreirajte Python alate na radnoj ploči iz razgovora",
|
||||
"settings.admin.models.builtinTools.tools.label": "Kreiranje alata",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Pauziraj odgovor da korisniku postaviš pitanje radi pojašnjenja",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Pitaj korisnika",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Pretraži web i dohvati sadržaj URL-ova",
|
||||
|
|
@ -3883,7 +3883,7 @@
|
|||
"Show all {{count}} contributors_one": "Prikaži sve doprinosioce ({{count}})",
|
||||
"Show all {{count}} contributors_few": "Prikaži sve doprinosioce ({{count}})",
|
||||
"Show all {{count}} contributors_other": "Prikaži sve doprinosioce ({{count}})",
|
||||
"Show diff": "",
|
||||
"Show diff": "Prikaži poređenje",
|
||||
"Show Files": "Prikaži datoteke",
|
||||
"Show Hidden Files": "Prikaži skrivene datoteke",
|
||||
"Show image preview": "Prikaži pregled slike",
|
||||
|
|
@ -3899,7 +3899,7 @@
|
|||
"Show your support!": "Podržite razvoj!",
|
||||
"Showcased creativity": "Prikazana kreativnost",
|
||||
"Showing search match": "Prikazuje se rezultat pretrage",
|
||||
"Side chat": "",
|
||||
"Side chat": "Bočni razgovor",
|
||||
"Sidebar": "Bočna traka",
|
||||
"Sign in": "Prijava",
|
||||
"Sign in again": "Prijavi se ponovo",
|
||||
|
|
@ -3956,9 +3956,9 @@
|
|||
"Speech-to-Text Language": "Jezik pretvorbe govora u tekst",
|
||||
"Split": "Podijeljeno",
|
||||
"Sponsor on GitHub": "Sponzoriši na GitHubu",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL upit",
|
||||
"Staan API Key": "Staan API ključ",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Izmjene pripremljene za bilježenje",
|
||||
"Standard": "Standardno",
|
||||
"Start a new conversation": "Započni novi razgovor",
|
||||
"Start a voice call using your microphone?": "Započeti glasovni poziv pomoću mikrofona?",
|
||||
|
|
@ -4004,14 +4004,14 @@
|
|||
"Suggested": "Predloženo",
|
||||
"Suggested prompts": "Predloženi prompti",
|
||||
"Summarize this note.": "Sažmi ovu bilješku.",
|
||||
"Summary": "",
|
||||
"Summary": "Sažetak",
|
||||
"Sun": "Ned",
|
||||
"Support": "Podrži razvoj",
|
||||
"Support this plugin:": "Podržite ovaj dodatak:",
|
||||
"Supported parameters": "Podržani parametri",
|
||||
"Swap": "Zamijeni mjesta",
|
||||
"Swap sides": "Zamijeni strane",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Promijeni granu",
|
||||
"Switch camera": "Promijeni kameru",
|
||||
"Switch to Assistant role": "Prebaci na ulogu asistenta",
|
||||
"Switch to JSON editor": "Prebaci na JSON uređivač",
|
||||
|
|
@ -4033,7 +4033,7 @@
|
|||
"System Instructions": "Sistemske upute",
|
||||
"System Prompt": "Sistemski prompt",
|
||||
"Table": "Tabela",
|
||||
"Tabs": "",
|
||||
"Tabs": "Kartice",
|
||||
"Tag": "Oznaka",
|
||||
"Tags": "Oznake",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Uzorkovanje bez repa smanjuje utjecaj manje vjerovatnih tokena u izlazu. Veća vrijednost (npr. 2.0) više smanjuje utjecaj, dok vrijednost 1.0 isključuje ovu postavku.",
|
||||
|
|
@ -4048,7 +4048,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Reci mi nasumičnu zanimljivu činjenicu o Rimskom carstvu",
|
||||
"Tell us more:": "Recite nam više:",
|
||||
"Temporary": "Privremeno",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Privremeni razgovor",
|
||||
"Temporary Chat": "Privremeni razgovor",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Privremeno: uključi ili isključi privremeni način za ovaj novi razgovor.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4093,7 +4093,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Ovo se ne može poništiti. Odgovori će ostati vidljivi.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Ovaj kanal je kreiran {{createdAt}}. Ovo je sam početak kanala {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Ovaj razgovor neće biti prikazan u historiji i vaše poruke neće biti spremljene.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Ova datoteka je već otvorena. Zatvorite njenu karticu ili odaberite drugi naziv.",
|
||||
"This folder is empty": "Ovaj folder je prazan",
|
||||
"This is a default user permission and will remain enabled.": "Ovo je zadana korisnička dozvola i ostat će omogućena.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ovo je eksperimentalna značajka, možda neće funkcionirati prema očekivanjima i podložna je promjenama u bilo kojem trenutku.",
|
||||
|
|
@ -4231,8 +4231,8 @@
|
|||
"Unchanged lines omitted": "Nepromijenjeni redovi su izostavljeni",
|
||||
"Underline": "Podvučeno",
|
||||
"Undo": "Poništi",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Poništi posljednju zabilježenu izmjenu",
|
||||
"Undo the last commit and keep its changes staged?": "Poništiti posljednju zabilježenu izmjenu i zadržati njene izmjene pripremljene za bilježenje?",
|
||||
"Unified": "Objedinjeno",
|
||||
"Uninstall": "Deinstaliraj",
|
||||
"Uninstall app": "Deinstaliraj aplikaciju",
|
||||
|
|
@ -4250,7 +4250,7 @@
|
|||
"Unmute to continue": "Uključite mikrofon za nastavak",
|
||||
"Unpin": "Otkači",
|
||||
"Unpin from Sidebar": "Otkači s bočne trake",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Nije poslano",
|
||||
"Unread": "Nepročitano",
|
||||
"Unsaved changes": "Nespremljene izmjene",
|
||||
"Unsaved changes to this version will be discarded.": "Nespremljene izmjene ove verzije bit će odbačene.",
|
||||
|
|
@ -4267,7 +4267,7 @@
|
|||
"Update All Models": "Ažuriraj sve modele",
|
||||
"Update and Copy Link": "Ažuriraj i kopiraj vezu",
|
||||
"Update app": "Ažuriraj aplikaciju",
|
||||
"Update branch": "",
|
||||
"Update branch": "Ažuriraj granu",
|
||||
"Update for the latest features and improvements.": "Ažurirajte za najnovije funkcije i poboljšanja.",
|
||||
"Update your status": "Ažuriraj svoj status",
|
||||
"Updated": "Ažurirano",
|
||||
|
|
@ -4311,7 +4311,7 @@
|
|||
"Use default": "Koristi zadano",
|
||||
"Use device vibration feedback on supported Android devices.": "Koristi povratne informacije vibracijom na podržanim Android uređajima.",
|
||||
"Use discovered scopes": "Koristi otkrivene opsege dozvola",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Koristi kartice pune širine",
|
||||
"Use global setting": "Koristite globalnu postavku",
|
||||
"Use groups to organize your users and assign permissions.": "Koristi grupe za organiziranje korisnika i dodjeljivanje dozvola.",
|
||||
"Use in prompt": "Koristi u promptu",
|
||||
|
|
@ -4319,7 +4319,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Koristi segmentirani dohvat za izdvajanje ciljanog i relevantnog sadržaja.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Koristi segmentirani dohvat za ciljani i relevantni kontekst.",
|
||||
"Use segmented retrieval for focused context.": "Koristi segmentirani dohvat za ciljani kontekst.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Koristi bočne kartice",
|
||||
"Use these in model system prompts as {{example}}.": "Koristi ih u sistemskim promptima modela kao {{example}}.",
|
||||
"Use Web Search?": "Koristiti internet pretragu?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Koristi se u načinu nativnog pozivanja funkcija. Postavke radne ploče i korisničke dozvole i dalje vrijede.",
|
||||
|
|
@ -4373,11 +4373,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Video reproduktor",
|
||||
"View": "Prikaz",
|
||||
"View changes": "",
|
||||
"View changes": "Prikaži izmjene",
|
||||
"View channel": "Prikaži kanal",
|
||||
"View chat": "Prikaži razgovor",
|
||||
"View comment": "Prikaži komentar",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Prikaži na platformi {{platform}}",
|
||||
"View Replies": "Prikaži odgovore",
|
||||
"View Result from {{NAME}}": "Prikaži rezultat iz {{NAME}}",
|
||||
"View source": "Prikaži izvor",
|
||||
|
|
@ -4448,15 +4448,15 @@
|
|||
"Work": "Rad",
|
||||
"Working Directory": "Radni direktorij",
|
||||
"Working Directory Context": "Kontekst radnog direktorija",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Izmjene radnog stabla",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Radi zajedno s top-k. Veća vrijednost (npr. 0.95) daje raznovrsniji tekst, dok manja vrijednost (npr. 0.5) daje usmjereniji i suzdržaniji tekst.",
|
||||
"Workspace": "Radna ploča",
|
||||
"Workspace Models": "Modeli radne ploče",
|
||||
"Workspace Permissions": "Dozvole radne ploče",
|
||||
"Workspace search": "Pretraga radnog prostora",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Grana radnog stabla",
|
||||
"Worktree directory": "Direktorij radnog stabla",
|
||||
"Worktrees": "Radna stabla",
|
||||
"Write": "Pisanje",
|
||||
"Write a prompt…": "Napišite prompt…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Napišite sažetak u 50 riječi koji sažima {{topic}}.",
|
||||
|
|
@ -4485,7 +4485,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Nemate dozvolu za učitavanje datoteka u ovu bazu znanja.",
|
||||
"You do not have permission to upload files.": "Nemate dozvolu za učitavanje datoteka.",
|
||||
"You do not have permission to upload web content.": "Nemate dozvolu za učitavanje web-sadržaja.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Nemate dozvolu za korištenje bočnog razgovora.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Imate više od 50 korisnika, što često znači da se ova radna ploča koristi u organizaciji. Open WebUI je besplatan za korištenje u izvornom obliku, bez ograničenja ili skrivenih limita, i želimo da tako ostane.",
|
||||
"You have no archived conversations.": "Nemate arhiviranih razgovora.",
|
||||
"You have no shared conversations.": "Nemate podijeljenih razgovora.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "Malampusong nahuman ang pagpadagan sa usa ka panaghisgot.",
|
||||
"A collaboration channel where people join as members": "Channel sa pagtinabangay diin moapil ang mga tawo isip mga miyembro",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Channel sa panaghisgot diin ang akses kontrolado sa mga grupo ug pagtugot",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Aduna nay file nga adunay kini nga ngalan. Ilisan kini?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Anaa na ang bag-ong bersyon (v{{LATEST_VERSION}}).",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Nausab ang usa ka panid sa laing dapit. Mahimong i-download ang imong miaging teksto.",
|
||||
"A private conversation between you and selected users": "Pribadong panaghisgot tali kanimo ug sa gipiling mga tiggamit",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Tugoti ang pagpili sa tinagong mga modelo isip mga basihang modelo.",
|
||||
"Allow Sharing With Groups": "Tugoti ang pagpaambit sa mga grupo",
|
||||
"Allow Sharing With Users": "Tugoti ang pagpaambit sa mga tiggamit",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Tugoti ang panaghisgot sa kilid",
|
||||
"Allow Speech to Text": "Tugoti ang pag-ilis sa sinultihan ngadto sa teksto",
|
||||
"Allow Temporary Chat": "Tugoti ang temporaryong panaghisgot",
|
||||
"Allow Text to Speech": "Tugoti ang pag-ilis sa teksto ngadto sa sinultihan",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Gamita ang mga punsiyon nga moproseso sa mga mensahe sa dili pa o human motubag ang modelo.",
|
||||
"Apply to draft": "Gamita sa burador",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Ang Gamita mogamit sa gisugyot nga pag-usab sa tuo. Tipigi ang imong burador pagkahuman.",
|
||||
"Approve": "",
|
||||
"Approve": "Tugoti",
|
||||
"Approximate comparison": "Gibanabanang pagtandi",
|
||||
"Apps": "Mga app",
|
||||
"April": "Abril",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Pangayo og pagtugot",
|
||||
"Ask or edit…": "Pangutana o i-edit…",
|
||||
"Ask this knowledge source a test question": "Pangutana og pagsulay nga pangutana niini nga tinubdan sa kahibalo",
|
||||
"Assignees": "",
|
||||
"Assignees": "Mga gitahasan",
|
||||
"Assistance": "Pagtabang",
|
||||
"assistant": "katabang",
|
||||
"Assistant": "Katabang",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Na-configure ang app sa pagpamatuod",
|
||||
"Authenticator not configured": "Wala ma-configure ang app sa pagpamatuod",
|
||||
"Authenticator setup QR code": "QR code sa pag-set up sa app sa pagpamatuod",
|
||||
"Author": "",
|
||||
"Author": "Tagsulat",
|
||||
"Authorize OAuth": "Hatagi og pagtugot ang OAuth",
|
||||
"Auto": "Awtomatiko",
|
||||
"Auto (Random)": "Awtomatiko (random)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Balik",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Balik sa mga kausaban",
|
||||
"Back to files": "Balik sa mga file",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Balik sa mga hangyo sa paghiusa",
|
||||
"Back to sign in": "Balik sa pagsulod",
|
||||
"Background Image": "Hulagway sa background",
|
||||
"Background image must be at most 25 megapixels.": "Kinahanglang dili molapas sa 25 ka megapixel ang hulagway sa background.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Nahuman na ang sub-agent sa background",
|
||||
"background sub-agents": "mga sub-agent sa background",
|
||||
"Bad Response": "Dili maayong tubag",
|
||||
"Base branch": "",
|
||||
"Base branch": "Basihang sanga",
|
||||
"Base Model (From)": "Basihang modelo (Gikan sa)",
|
||||
"Base Model is required.": "Gikinahanglan ang basihang modelo.",
|
||||
"Base Models": "Mga basihang modelo",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "kaniadto",
|
||||
"Being lazy": "Nagtinapolan",
|
||||
"Binary file — text comparison is unavailable.": "Binary nga file — dili magamit ang pagtandi sa teksto.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Nausab ang binary nga file",
|
||||
"Binary file. Download to open.": "Binary nga file. I-download aron maablihan.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Mga kapilian sa block",
|
||||
"Bold": "Baga nga letra",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Pagpabor o pagsilot sa piho nga mga token aron malimitahan ang mga tubag. Ang mga bili sa bias limitahan tali sa -100 ug 100, lakip ang duha ka utlanan. (Default: wala)",
|
||||
"Both files are required for comparison.": "Gikinahanglan ang duha ka file alang sa pagtandi.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Mga aksyon sa sanga",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Browser",
|
||||
"Browser options": "Mga kapilian sa browser",
|
||||
"build · {{hash}}": "build · {{hash}}",
|
||||
"Built-in": "Built-in",
|
||||
"Bullet List": "Lista nga adunay mga bullet",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Usba ang icon sa folder",
|
||||
"Change overview": "Kinatibuk-ang pagtan-aw sa mga kausaban",
|
||||
"Change User Role": "Usba ang papel sa tiggamit",
|
||||
"changed": "",
|
||||
"changed": "ang giusab",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Ma-sign out ang tanang device kon adunay kausaban. Magparehistro ang mga tiggamit sa ilang sunod nga pagsulod.",
|
||||
"Channel": "Channel",
|
||||
"Channel deleted successfully": "Malampusong napapas ang channel",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "Susiha ang OAuth Discovery",
|
||||
"Check what is running in this chat.": "Susiha kon unsay nagdagan niini nga panaghisgot.",
|
||||
"Checking for updates...": "Pagsusi alang sa mga update...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Balhin ngadto sa sanga",
|
||||
"Choose a date range to compare": "Pagpili og gilapdon sa petsa alang sa pagtandi",
|
||||
"Choose a model before saving...": "Pagpili og template sa dili pa i-save...",
|
||||
"Choose a parent page. Subpages move with this page.": "Pagpili og ginikanang panid. Ang mga anak nga panid ibalhin uban niini nga panid.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Sirad-i ang bintana",
|
||||
"Close Modal": "Sirad-i ang bintana",
|
||||
"Close pages": "Sirad-i ang mga panid",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Sirad-i ang hangyo sa paghiusa",
|
||||
"Close search": "Sirad-i ang pagpangita",
|
||||
"Close session details": "Sirad-i ang mga detalye sa sesyon",
|
||||
"Close Sidebar": "Sirad-i ang sidebar",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Mga kauban sa pagtinabangay",
|
||||
"Collapse": "Ipilo",
|
||||
"Collapse {{name}}": "Ipilo ang {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Ipilo ang panel sa Git",
|
||||
"Collapse sessions": "Ipilo ang mga sesyon",
|
||||
"Collapse terminal": "Ipilo ang terminal",
|
||||
"Collection": "Koleksyon",
|
||||
"Collection Field": "Field sa koleksyon",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Napapas na ang komento",
|
||||
"Comments": "Mga komento",
|
||||
"Comments are no longer available.": "Dili na magamit ang mga komento.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Mga aksyon sa pagtipig sa kausaban",
|
||||
"Commit message": "Mensahe sa pagtipig sa kausaban",
|
||||
"Commit Message": "Mensahe sa pagtipig sa kausaban",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Katingbanan sa pagtipig sa kausaban",
|
||||
"Commit to {{branch}}": "Tipigi ang mga kausaban sa {{branch}}",
|
||||
"Community Reviews": "Mga rebyu sa komunidad",
|
||||
"Compact": "Pamuboa ang konteksto",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Pamuboa ang konteksto: pamuboa ang daang mga mensahe aron makapadayon kini nga panaghisgot.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Malampusong na-import ang konfigurasyon",
|
||||
"Configure": "I-configure",
|
||||
"Configure app": "I-configure ang app",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "I-configure ang mga file sa panaghisgot, Valves, aghat sa sistema, ug abanteng mga parametro.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "I-configure ang tingog sa tinuod nga oras, avatar sa tingog, ug tingog sa pag-ilis sa teksto ngadto sa sinultihan alang niini nga modelo.",
|
||||
"Confirm": "Kumpirmaha",
|
||||
"Confirm Password": "Kumpirma ang password",
|
||||
"Confirm Prompt from Embed": "Kumpirmaha ang aghat gikan sa gisulod nga kontento",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Kumpirmaha ang aksyon sa hangyo sa paghiusa",
|
||||
"Confirm recording": "Kumpirmaha ang pagrekord",
|
||||
"Confirm your action": "Kumpirmaha ang imong aksyon",
|
||||
"Confirm your new password": "Kumpirmaha ang imong bag-ong password",
|
||||
"Confirm Your Password": "Kumpirmaha ang imong password",
|
||||
"Connect": "Ikonektar",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Ikonektar ug pagpili una og modelo.",
|
||||
"Connect external apps to Open WebUI.": "Ikonektar ang mga eksternal nga app sa Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Ikonektar sa tighatag sa AI aron magsugod sa panaghisgot",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Ikonektar sa mga instance sa Open Terminal. Ang mga administrator ug mga tiggamit nga gitugotan maka-browse sa mga file ug makagamit sa mga himan sa terminal pinaagi niini nga mga server.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Nakonektar nga mga app",
|
||||
"Connecting": "Nagkonektar",
|
||||
"Connecting...": "Nagkonektar...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Nagkonektar…",
|
||||
"Connection": "Koneksyon",
|
||||
"Connection failed": "Napakyas ang koneksyon",
|
||||
"Connection ID": "ID sa koneksyon",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "Dili mahimong adunay mga karakter nga \":\" o \"|\" ang ID sa koneksyon",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Naputol ang koneksyon. Sulayi pag-usab.",
|
||||
"Connection lost. Reconnecting...": "Naputol ang koneksyon. Nagkonektar pag-usab...",
|
||||
"Connection successful": "Malampuson ang koneksyon",
|
||||
"Connection Type": "Matang sa koneksyon",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Kopyaha",
|
||||
"Copy {{name}} to clipboard": "Kopyaha ang {{name}} ngadto sa clipboard",
|
||||
"Copy API Key": "Kopyaha ang yawe sa API",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Kopyaha ang ngalan sa sanga",
|
||||
"Copy change to original": "Kopyaha ang kausaban ngadto sa orihinal",
|
||||
"Copy change to proposal": "Kopyaha ang kausaban ngadto sa gisugyot nga pag-usab",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Kopyaha ang hash sa pagtipig sa kausaban",
|
||||
"Copy content": "Kopyaha ang kontento",
|
||||
"Copy default": "Kopyaha ang default nga bili",
|
||||
"Copy Last Code Block": "Kopyaha ang kataposang block sa kodigo",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Katungod sa pagkopya (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "Kinahanglang husto ang pag-configure sa CORS sa tighatag aron tugotan ang mga hangyo gikan sa Open WebUI.",
|
||||
"Could not check for updates": "Dili masusi ang mga update",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Napakyas sa pagkopya sa ngalan sa sanga",
|
||||
"Could not copy commit hash": "Napakyas sa pagkopya sa hash sa pagtipig sa kausaban",
|
||||
"Could not copy to clipboard. Please try again.": "Dili makopya ngadto sa clipboard. Sulayi pag-usab.",
|
||||
"Could not determine the upload folder.": "Dili matino ang folder alang sa pag-upload.",
|
||||
"Could not load avatar.": "Dili makarga ang avatar.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Paghimo og account",
|
||||
"Create Admin Account": "Paghimo og account sa administrator",
|
||||
"Create announcements shown to users in the app.": "Paghimo og mga pahibalo nga ipakita sa mga tiggamit sulod sa app.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Paghimo og sanga",
|
||||
"Create Channel": "Paghimo og channel",
|
||||
"Create copy": "Paghimo og kopya",
|
||||
"Create Folder": "Paghimo og folder",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Paghimo og nakaeskedyul nga mga aghat nga awtomatikong modagan sa kanunayng mga lat-ang.",
|
||||
"Create skill": "Paghimo og kahanas",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Paghimo og kahanas: paghimo og kahanas sa terminal nga magamit pag-usab gikan niini nga panaghisgot.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Paghimo og kopya sa trabaho",
|
||||
"Create your first note from the Create menu.": "Himoa ang imong unang nota gikan sa menu nga Paghimo.",
|
||||
"Created": "Nahimo na",
|
||||
"Created at": "Gihimo ang",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Bili sa custom nga parametro",
|
||||
"Custom permissions": "Custom nga mga pagtugot",
|
||||
"Custom range": "Custom nga gilapdon",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Custom nga eskedyul",
|
||||
"Customize": "Ipahiangay",
|
||||
"Daily": "Matag adlaw",
|
||||
"Daily at": "Matag adlaw sa",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Datos",
|
||||
"Database": "Database",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Petsa",
|
||||
"Date Added": "Petsa sa pagdugang",
|
||||
"Date is required": "Gikinahanglan ang petsa",
|
||||
"Date Modified": "Petsa sa pag-usab",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Papasa ang tanang sulod niini nga folder",
|
||||
"Delete API Key?": "Papason ang yawe sa API?",
|
||||
"Delete automation?": "Papason ang awtomasyon?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Papasa ang sanga",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Papason ang sanga nga {{branch}}? Magpabilin ang mga sanga nga wala pa mahiusa.",
|
||||
"Delete calendar": "Papasa ang kalendaryo",
|
||||
"Delete Calendar": "Papasa ang kalendaryo",
|
||||
"Delete Chat": "Papasa ang panaghisgot",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Deskripsyon",
|
||||
"Description ({{language}})": "Deskripsyon ({{language}})",
|
||||
"Deselect": "Tangtanga ang pagpili",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Desktop",
|
||||
"Desktop access denied. Reopen this tab.": "Gidili ang akses sa desktop. Ablihi pag-usab kini nga tab.",
|
||||
"Desktop audio": "Audio sa desktop",
|
||||
"Desktop audio is not supported by this browser.": "Dili mosuporta kini nga browser sa audio sa desktop.",
|
||||
"Desktop audio unavailable.": "Dili magamit ang audio sa desktop.",
|
||||
"Desktop connection failed.": "Napakyas ang koneksyon sa desktop.",
|
||||
"Destination": "Padulngan",
|
||||
"Detected Variables": "Nakit-ang mga variable",
|
||||
"dev build": "dev build",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Isalikway ang mga kausaban sa pagtandi?",
|
||||
"Discard unsaved changes?": "Isalikway ang wala matipigang mga kausaban?",
|
||||
"Discard unsaved skill changes?": "Isalikway ang wala matipigang mga kausaban sa kahanas?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Isalikway ang wala matipigang mga kausaban niini nga file sa trabaho? Dili na kini ma-undo.",
|
||||
"Disconnect OAuth": "Putla ang koneksyon sa OAuth",
|
||||
"Disconnected": "Naputol",
|
||||
"Discover a function": "Pagdiskobre og punsiyon",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "Nag-download sa \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Nag-download sa \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Nag-download sa estadistika...",
|
||||
"Draft": "",
|
||||
"Draft": "Burador",
|
||||
"Drag and Drop Container": "Dapit sa pag-drag ug pag-drop",
|
||||
"Drag or use the up and down arrow keys to reorder": "I-drag o gamita ang mga yawe sa pana pataas ug paubos aron usbon ang han-ay",
|
||||
"Drag to move": "I-drag aron ibalhin",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Siguroha nga adunay 4 ka kolum ang imong CSV file niini nga han-ay: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Pagsulod sa mensahe {{role}} dinhi",
|
||||
"Enter a Connection ID to register.": "Isulod ang ID sa koneksyon aron magparehistro.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Pagsulod og ngalan sa file nga walay mga slash.",
|
||||
"Enter a name, content, and a valid command.": "Pagsulod og ngalan, sulod, ug balidong sugo.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Isulod ang titulo alang sa overlay sa impormasyon sa naghulat nga tiggamit. Ibilin nga walay sulod alang sa default.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Isulod ang watermark alang sa tubag. Ibilin nga walay sulod kon walay watermark.",
|
||||
"Enter additional headers in JSON format": "Isulod ang dugang nga mga header sa JSON nga pormat",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Isulod ang dugang nga mga header sa JSON nga pormat (pananglitan, {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "Isulod ang dugang nga mga parametro sa JSON nga pormat",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Pagsulod og HTTP o HTTPS nga URL nga walay mga kredensiyal.",
|
||||
"Enter api auth string (e.g. username:password)": "Isulod ang string sa pagpamatuod sa API (pananglitan, username:password)",
|
||||
"Enter Application DN": "Isulod ang DN sa aplikasyon",
|
||||
"Enter Application DN Password": "Isulod ang password sa DN sa aplikasyon",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Ipadagan ang kodigo alang sa pagtuki",
|
||||
"Executing {{NAME}}...": "Gipadagan ang {{NAME}}...",
|
||||
"Execution timeline": "Han-ay sa panahon sa pagpadagan",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Gawas gikan sa tibuok screen",
|
||||
"Expand": "Palapda",
|
||||
"Expand {{name}}": "Palapda ang {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Palapda ang panel sa Git",
|
||||
"Expand input": "Palapda ang input",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Palapda ang mga sesyon",
|
||||
"Expand terminal": "Palapda ang terminal",
|
||||
"Experience": "Kasinatian sa paggamit",
|
||||
"Experimental": "Eksperimento",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Napakyas sa pag-import sa mga modelo",
|
||||
"Failed to load chat": "Napakyas sa pagkarga sa panaghisgot",
|
||||
"Failed to load chat preview": "Napakyas sa pagkarga sa pasiuna nga pagtan-aw sa panaghisgot",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Napakyas sa pagkarga sa direktoryo",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Napakyas sa pagkarga sa DOCX file. Sulayi hinuon ang pag-download niini.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Napakyas sa pagkarga sa Excel/CSV file. Sulayi hinuon ang pag-download niini.",
|
||||
"Failed to load file content.": "Napakyas sa pagkarga sa sulod sa file.",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Napakyas sa pagtipig sa mga koneksyon",
|
||||
"Failed to save conversation": "Napakyas sa pagtipig sa panag-istorya",
|
||||
"Failed to save file": "Napakyas sa pagtipig sa file",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Napakyas sa pagtipig sa file. Anaa pa sa editor ang imong mga kausaban.",
|
||||
"Failed to save model": "Napakyas sa pagtipig sa modelo",
|
||||
"Failed to save models configuration": "Napakyas sa pagtipig sa konpigurasyon sa mga modelo",
|
||||
"Failed to save policy: {{error}}": "Napakyas sa pagtipig sa palisiya: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Mga aksyon sa file",
|
||||
"File added successfully.": "Malampusong nadugang ang file.",
|
||||
"File browser": "Browser sa file",
|
||||
"File changes": "",
|
||||
"File changes": "Mga kausaban sa file",
|
||||
"File content": "Sulod sa file",
|
||||
"File content updated successfully.": "Malampusong na-update ang sulod sa file.",
|
||||
"File count limit": "Limitasyon sa gidaghanon sa file",
|
||||
"File created": "Nahimo na ang file",
|
||||
"File deleted successfully.": "Malampusong natangtang ang file.",
|
||||
"File differences": "Mga kalainan sa file",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Dili masulatan ang file.",
|
||||
"File Mode": "File mode",
|
||||
"File moved.": "Nabalhin na ang file.",
|
||||
"File name": "Ngalan sa file",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "Tan-awa ang impormasyon bahin sa {{name}} sa interface",
|
||||
"Get started": "Sugdi",
|
||||
"Get started with {{WEBUI_NAME}}": "Sugdi ang paggamit sa {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Mga kausaban sa Git",
|
||||
"Git unavailable": "Dili magamit ang Git",
|
||||
"Give me ideas": "Hatagi ko og mga ideya",
|
||||
"give me tips": "hatagi ko og mga tambag",
|
||||
"Global": "Tibuok sistema",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Tinubdang sanga",
|
||||
"Headers": "Mga header",
|
||||
"Headers must be a valid JSON object": "Ang mga header kinahanglan balidong JSON object",
|
||||
"Height": "Gitas-on",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Tagoa",
|
||||
"Hide All": "Tagoa ang tanan",
|
||||
"Hide conversation": "Tagoa ang panaghisgot",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Tagoa ang kalainan",
|
||||
"Hide from Sidebar": "Tagoa gikan sa sidebar",
|
||||
"Hide Hidden Files": "Tagoa ang mga tinagong file",
|
||||
"Hide Model": "Tagoa ang modelo",
|
||||
"Hide preview": "Tagoa ang tan-aw daan",
|
||||
"Hide sub-agents": "Tagoa ang mga sub-agent",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Tagoa ang mga tab",
|
||||
"Hide whitespace": "Tagoa ang blangkong luna",
|
||||
"High": "Taas",
|
||||
"History": "Kasaysayan",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Na-update na ang tinubdan sa kahibalo.",
|
||||
"Knowledge updated successfully": "Malampusong na-update ang kahibalo",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Browser)",
|
||||
"Labels": "",
|
||||
"Labels": "Mga label",
|
||||
"Last 12 months": "Miaging 12 ka bulan",
|
||||
"Last 24 hours": "Miaging 24 ka oras",
|
||||
"Last 30 days": "Miaging 30 ka adlaw",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "Marso",
|
||||
"Mark all as read": "Markahi ang tanan nga nabasa na",
|
||||
"Mark as unread": "Markahi nga wala pa mabasa",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Markahi nga andam",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Merkado",
|
||||
"Matching tabs: {{count}}_one": "Mga katugbang nga tab: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Pag-mention og tawo",
|
||||
"Mentions only": "Mga mention lamang",
|
||||
"Menu": "Menu",
|
||||
"Merge": "",
|
||||
"Merge": "Paghiusa",
|
||||
"Merge Responses": "Hiusahi ang mga tubag",
|
||||
"Merged Response": "Gihiusa nga Resulta sa Tubag",
|
||||
"Message": "Mensahe",
|
||||
"Message counts and response timestamps": "Mga ihap sa mensahe ug oras sa mga tubag",
|
||||
"Message counts are based on assistant responses.": "Ang mga ihap sa mensahe gibase sa mga tubag sa katabang.",
|
||||
"Message exceeds the 16 KiB limit.": "Milapas ang mensahe sa limitasyon nga 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Numero sa mensahe",
|
||||
"Message rating should be enabled to use this feature": "Kinahanglang i-enable ang pag-rate sa mensahe aron magamit kini nga bahin",
|
||||
"Message share": "Porsiyento sa mga mensahe",
|
||||
"Message text...": "Teksto sa mensahe...",
|
||||
"messages": "ka mensahe",
|
||||
"Messages": "Mga mensahe",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Ang mga mensahe adunay end-to-end nga pag-encrypt ug dili tipigan.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Mawala ang mga mensahe kon imong sirad-an kini nga tab.",
|
||||
"Metadata Field": "Natad sa metadata",
|
||||
"Microphone off": "Napatay ang mikropono",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Mga parametro sa Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Lu",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Panglantaw sa mobile",
|
||||
"Model": "Modelo",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Ang modelo'{{modelName}}' malampuson nga na-download.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Ang modelo'{{modelTag}}' naa na sa pila para ma-download.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Malampusong na-import ang mga modelo",
|
||||
"Models Public Sharing": "Publikong pagpaambit sa mga modelo",
|
||||
"Models Sharing": "Pagpaambit sa mga modelo",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Mga modelo nga matugyanan niini nga modelo og mga buluhaton. Kinahanglang adunay akses niini ang mga tiggamit. Biyai nga walay sulod aron gamiton ang kasamtangang modelo.",
|
||||
"Modified": "Giusab",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Lun",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Adto sa miaging panaghisgot",
|
||||
"Never": "Dili gayod",
|
||||
"New": "Bag-o",
|
||||
"New branch": "",
|
||||
"New branch": "Bag-ong sanga",
|
||||
"New Button": "Bag-ong buton",
|
||||
"New calendar": "Bag-ong kalendaryo",
|
||||
"New Calendar": "Bag-ong kalendaryo",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Bag-ong grupo",
|
||||
"New Note": "Bag-ong nota",
|
||||
"New Password": "Bag-ong Password",
|
||||
"New pull request": "",
|
||||
"New pull request": "Bag-ong hangyo sa paghiusa",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Pribado ang bag-ong mga kahanas ug kopya. Ang Ilisi motipig og bag-ong bersyon ug magpabilin ang kasamtangang pagpaambit.",
|
||||
"New tab": "",
|
||||
"New tab": "Bag-ong tab",
|
||||
"New Temporary Chat": "Bag-ong temporaryong panaghisgot",
|
||||
"New Terminal": "Bag-ong terminal",
|
||||
"New Tool": "Bag-ong himan",
|
||||
"New Webhook": "Bag-ong webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Bag-ong kopya sa trabaho",
|
||||
"new-channel": "bag-ong-channel",
|
||||
"Next": "Sunod",
|
||||
"Next change": "Sunod nga kausaban",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Walay nakonektar nga mga app.",
|
||||
"No authentication": "Walay pagpamatuod sa pagkatawo",
|
||||
"No automations found": "Walay nakit-ang mga awtomasyon",
|
||||
"No changes": "",
|
||||
"No changes": "Walay kausaban",
|
||||
"No channels": "Walay mga channel",
|
||||
"No chat alerts": "Walay mga pahibalo sa panaghisgot",
|
||||
"No chat history": "Walay kasaysayan sa panaghisgot",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Walay nakitang panaghisgot",
|
||||
"No chats found for this user.": "Walay nakitang panaghisgot alang niini nga tiggamit.",
|
||||
"No chats found.": "Walay nakitang panaghisgot.",
|
||||
"No checks": "",
|
||||
"No checks": "Walay mga pagsusi",
|
||||
"No comments yet": "Wala pay mga komento",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Wala pay natipigang kausaban",
|
||||
"No content": "Walay sulod",
|
||||
"No content available": "Walay magamit nga sulod",
|
||||
"No content found": "Walay nakitang sulod",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Walay miaging paggamit",
|
||||
"No prompts found": "Walay nakitang aghat",
|
||||
"No prompts yet": "Wala pay mga aghat",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Walay mga hangyo sa paghiusa",
|
||||
"No Repeat": "Dili balik-balikon",
|
||||
"No results": "Walay resulta",
|
||||
"No results found": "Walay nakitang resulta",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Walay gi-configure nga koneksyon sa terminal.",
|
||||
"No terminal connections configured.": "Walay gi-configure nga mga koneksyon sa terminal.",
|
||||
"No terminal servers available": "Walay magamit nga mga server sa terminal",
|
||||
"No text changes": "",
|
||||
"No text changes": "Walay kausaban sa teksto",
|
||||
"No text differences": "Walay kalainan sa teksto",
|
||||
"No tool server connections configured.": "Walay gi-configure nga mga koneksyon sa server sa himan.",
|
||||
"No tools accessible": "Walay maakses nga himan",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Walay Valves nga i-update",
|
||||
"No webhooks yet": "Wala pay mga webhook",
|
||||
"Node Ids": "Mga ID sa node",
|
||||
"none": "",
|
||||
"none": "wala",
|
||||
"None": "Wala",
|
||||
"None reported": "Walay gitaho",
|
||||
"Not configured": "Wala gi-configure",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Oops! ",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Oops! ",
|
||||
"Open": "Ablihi",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Pag-abli og tab gamit ang + nga menu.",
|
||||
"Open automation": "Ablihi ang awtomasyon",
|
||||
"Open chat": "Ablihi ang panaghisgot",
|
||||
"Open create menu": "Ablihi ang menu sa paghimo",
|
||||
"Open file": "Ablihi ang file",
|
||||
"Open Folder": "Ablihi ang folder",
|
||||
"Open in full screen": "Ablihi sa tibuok screen",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Ablihi sa GitHub",
|
||||
"Open in new tab": "Ablihi sa bag-ong tab",
|
||||
"Open link": "Ablihi ang link",
|
||||
"Open modal to configure connection": "Ablihi ang dialog aron i-configure ang koneksyon",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "parametro",
|
||||
"Parameter": "Parametro",
|
||||
"Parameters": "Mga parameter",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Ginikanang direktoryo",
|
||||
"Parent group": "Ginikanang grupo",
|
||||
"Parent message not found": "Wala makit-i ang gigikanang mensahe",
|
||||
"Parent page": "Ginikanang panid",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Pagpili og hinungdan",
|
||||
"Please select a valid JSON file": "Pagpili og balidong JSON file",
|
||||
"Please select at least one user for Direct Message channel.": "Pagpili og labing menos usa ka tiggamit alang sa channel sa direktang mensahe.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Hulata nga mahuman ang pag-upload sa mga file.",
|
||||
"Please wait until all files are uploaded.": "Paghulat hangtod mahuman og upload ang tanang file.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP, o GIF. Hangtod sa 5 MiB ug 25 ka megapixel.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Ang mga kausaban sa polisiya magamit sa bag-ong giandam nga mga terminal. I-refresh ang katugbang nga mga terminal aron magamit usab kini sa kasamtangang mga terminal.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Tighatag",
|
||||
"Provider context": "Bintana sa konteksto sa tighatag",
|
||||
"Provider details": "Mga detalye sa tighatag",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proxy",
|
||||
"Public": "Publiko",
|
||||
"Public key": "Publikong yawe",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "I-download ang \"{{searchValue}}\" gikan sa Ollama.com",
|
||||
"Pull a model from Ollama.com": "Pagkuha ug template gikan sa Ollama.com",
|
||||
"Pull Model": "I-download ang modelo",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Mga aksyon sa hangyo sa paghiusa",
|
||||
"Pull request description": "Deskripsyon sa hangyo sa paghiusa",
|
||||
"Pull request title": "Titulo sa hangyo sa paghiusa",
|
||||
"Punctuation": "Mga bantas",
|
||||
"Pyodide file browser": "Tigtan-aw sa mga file sa Pyodide",
|
||||
"Quality": "Kalidad",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Basaha ang dokumentasyon",
|
||||
"Read-only": "Alang lamang sa pagbasa",
|
||||
"Read-Only Access": "Akses alang lamang sa pagbasa",
|
||||
"Ready": "",
|
||||
"Ready": "Himoang andam",
|
||||
"Realtime": "Tinuod nga oras",
|
||||
"Realtime Voice": "Tingog sa tinuod nga oras",
|
||||
"Reason": "Hinungdan",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Girekomendar",
|
||||
"Reconnect": "Ikonektar pag-usab",
|
||||
"Reconnected": "Nakonektar pag-usab",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Nagkonektar pag-usab…",
|
||||
"Record": "Irekord",
|
||||
"Record voice": "Irekord ang tingog",
|
||||
"Recorded duration": "Natala nga gidugayon",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "Gitangtang ang {{count}} ka karaan nga file...",
|
||||
"Removing {{count}} stale files..._other": "Gitangtang ang {{count}} ka karaan nga file...",
|
||||
"Rename": "Usba ang ngalan",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Usba ang ngalan sa sanga",
|
||||
"Rename page": "Usba ang ngalan sa panid",
|
||||
"Renamed to {{name}}": "Giusab ang ngalan ngadto sa {{name}}",
|
||||
"Rendered preview": "Na-format nga tan-aw daan",
|
||||
"Reopen": "",
|
||||
"Reopen": "Ablihi pag-usab",
|
||||
"Reorder": "Usba ang han-ay",
|
||||
"Repeat": "Balika",
|
||||
"Replace": "Ilisi",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Tubaga sa hilo...",
|
||||
"Replying to {{NAME}}": "Nagtubag kang {{NAME}}",
|
||||
"Reported by the provider.": "Gitaho sa tighatag.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Pangayo og mga kausaban",
|
||||
"Requested scopes": "Gipangayo nga mga sakop sa pagtugot",
|
||||
"Require an authenticator for all users": "Ipugos ang app sa pagpamatuod sa tanang tiggamit",
|
||||
"required": "gikinahanglan",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Ibalik sa mga default",
|
||||
"Reset view": "I-reset ang panglantaw",
|
||||
"Reset zoom": "I-reset ang pag-zoom",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Usba ang gidak-on sa panel sa Git",
|
||||
"Resize panel": "Usba ang gidak-on sa panel",
|
||||
"Resolved": "Nasulbad",
|
||||
"Response": "Tubag",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "ka tubag nga adunay natala nga paggamit",
|
||||
"Restart": "Sugdi pag-usab",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Sugdi pag-usab ang tanang instansiya sa Open WebUI aron moepekto ang mga kausaban sa mga setting sa koneksyon sa tighatag.",
|
||||
"Restricted": "Gilimitahan",
|
||||
"Result": "Resulta",
|
||||
"RESULT": "RESULTA",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "Nakuha ang {{count}} ka tinubdan",
|
||||
"Retrieved 1 source": "Nakuha ang 1 ka tinubdan",
|
||||
"Retry": "Sulayi pag-usab",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Sulayi pag-usab ang pag-ila sa Git",
|
||||
"Retry setup": "Sulayi pag-usab ang pag-set up",
|
||||
"Return to call": "Balik sa tawag",
|
||||
"Return to conversation": "Balik sa panaghisgot",
|
||||
"Review": "Susiha",
|
||||
"Review the scopes this app is requesting before adding it.": "Susiha ang mga sakop sa pagtugot nga gipangayo niini nga app sa dili pa kini idugang.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Mga tigsusi",
|
||||
"Revised": "Giusab",
|
||||
"Rewrite the selected text.": "Isulat pag-usab ang gipiling teksto.",
|
||||
"Role": "Papel",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "I-save ug Paghimo",
|
||||
"Save & Update": "I-save ug I-update",
|
||||
"Save and send": "Tipigi ug ipadala",
|
||||
"Save As": "",
|
||||
"Save As": "Tipigi isip",
|
||||
"Save As Copy": "Tipigi isip kopya",
|
||||
"Save Chat": "Tipigi ang panaghisgot",
|
||||
"Save draft as copy": "Tipigi ang burador isip kopya",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Pangitaa ang mga aksyon",
|
||||
"Search all emojis": "Pangitaa ang tanang emoji",
|
||||
"Search Automations": "Pangitaa ang mga awtomasyon",
|
||||
"Search branches": "",
|
||||
"Search branches": "Pangitaa ang mga sanga",
|
||||
"Search built-in tools": "Pangitaa ang nakasulod nang mga himan",
|
||||
"Search channels": "Pangitaa ang mga channel",
|
||||
"Search Chats": "Pangitaa ang mga panaghisgot",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Pangita o pagdugang og sumbanan",
|
||||
"Search parent groups": "Pangitaa ang mga ginikanang grupo",
|
||||
"Search Prompts": "Pangitaa ang mga prompt",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Pangitaa ang mga hangyo sa paghiusa",
|
||||
"Search results": "Mga resulta sa pagpangita",
|
||||
"Search scopes": "Pangitaa ang mga sakop sa pagtugot",
|
||||
"Search sessions": "Pangitaa ang mga sesyon",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "Pangitaa ang mga tiggamit o grupo",
|
||||
"Search workspace": "Pangita sa lugar sa trabaho",
|
||||
"Search workspace…": "Pangita sa lugar sa trabaho…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Pangitaa ang mga kopya sa trabaho",
|
||||
"Search your workspace": "Pangita sa imong lugar sa trabaho",
|
||||
"Searched {{count}} sites": "Gipangitaan ang {{count}} ka site",
|
||||
"Searching": "Nagpangita",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Pagpili og modelo aron kini lamang ang ipakita.",
|
||||
"Select a pipeline": "Pagpili og pipeline",
|
||||
"Select a pipeline url": "Pagpili og URL sa pipeline",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Pagpili og hangyo sa paghiusa",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Pagpili og gilapdon aron masala ang mga sesyon. Giapil usab ang mga sesyon nga bahin lamang sa paggamit ang natala.",
|
||||
"Select a reranking model engine": "Pagpili og makina sa modelo sa pagranggo pag-usab",
|
||||
"Select a role": "Pagpili og papel",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Pagpili og terminal aron maablihan ang mga URL sa localhost.",
|
||||
"Select a theme": "Pagpili og tema",
|
||||
"Select a tool": "Pagpili og himan",
|
||||
"Select a voice": "Pagpili og tingog",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Pilia ang nakarga nga mga file",
|
||||
"Select Method": "Pilia ang paagi",
|
||||
"Select model": "Pilia ang modelo",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Pagpili og usa lamang ka modelo",
|
||||
"Select only one model to call": "Pagpili og usa lamang ka modelo nga tawagan",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Pagpili og usa lamang ka modelo aron maablihan ang panaghisgot sa kilid.",
|
||||
"Select options": "Pilia ang mga kapilian",
|
||||
"Select Skill": "Pilia ang kahanas",
|
||||
"Select to isolate model": "Pilia aron kini nga modelo lamang ang ipakita",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Kuhaa ang kasamtangang oras ug paghimo og mga kalkulasyon sa petsa ug oras",
|
||||
"settings.admin.models.builtinTools.time.label": "Oras ug pagkalkula",
|
||||
"settings.admin.models.builtinTools.title": "Nakasulod nang mga himan",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Paghimo og mga himan sa Python sa lugar sa trabaho gikan sa panaghisgot",
|
||||
"settings.admin.models.builtinTools.tools.label": "Paghimo og himan",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Hunonga kadiyot ang tubag aron mangutana sa tiggamit alang sa pagpatin-aw",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Pangutan-a ang tiggamit",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Pangita sa web ug kuhaa ang mga URL",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Ipakita ang tanang {{count}} ka nag-amot",
|
||||
"Show all {{count}} contributors_one": "Ipakita ang tanang {{count}} ka nag-amot",
|
||||
"Show all {{count}} contributors_other": "Ipakita ang tanang {{count}} ka nag-amot",
|
||||
"Show diff": "",
|
||||
"Show diff": "Ipakita ang kalainan",
|
||||
"Show Files": "Ipakita ang mga file",
|
||||
"Show Hidden Files": "Ipakita ang tinagong mga file",
|
||||
"Show image preview": "Ipakita ang tan-aw daan sa hulagway",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Ipakita ang imong suporta!",
|
||||
"Showcased creativity": "Nagpakita og pagkamamugnaon",
|
||||
"Showing search match": "Gipakita ang katugbang sa pagpangita",
|
||||
"Side chat": "",
|
||||
"Side chat": "Panaghisgot sa kilid",
|
||||
"Sidebar": "Sidebar",
|
||||
"Sign in": "Para maka log in",
|
||||
"Sign in again": "Pagsulod pag-usab",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Pinulongan sa sinultihan ngadto sa teksto",
|
||||
"Split": "Gibahin",
|
||||
"Sponsor on GitHub": "Suportahi sa GitHub",
|
||||
"SQL query": "",
|
||||
"SQL query": "Pangutana sa SQL",
|
||||
"Staan API Key": "Yawe sa API sa Staan",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Mga kausaban nga giandam alang sa pagtipig",
|
||||
"Standard": "Naandan",
|
||||
"Start a new conversation": "Sugdi ang bag-ong panaghisgot",
|
||||
"Start a voice call using your microphone?": "Magsugod og tawag sa tingog gamit ang imong mikropono?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Gisugyot",
|
||||
"Suggested prompts": "Gisugyot nga mga aghat",
|
||||
"Summarize this note.": "Muboa kini nga nota.",
|
||||
"Summary": "",
|
||||
"Summary": "Katingbanan",
|
||||
"Sun": "Dom",
|
||||
"Support": "Pagsuporta",
|
||||
"Support this plugin:": "Suportahi kini nga plugin:",
|
||||
"Supported parameters": "Gisuportahang mga parametro",
|
||||
"Swap": "Ibaylo",
|
||||
"Swap sides": "Ibaylo ang mga kilid",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Balhin ngadto sa laing sanga",
|
||||
"Switch camera": "Ilisi ang kamera",
|
||||
"Switch to Assistant role": "Balhin ngadto sa papel sa katabang",
|
||||
"Switch to JSON editor": "Balhin ngadto sa editor sa JSON",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Mga panudlo sa sistema",
|
||||
"System Prompt": "Madasig nga Sistema",
|
||||
"Table": "Talaan",
|
||||
"Tabs": "",
|
||||
"Tabs": "Mga tab",
|
||||
"Tag": "Tag",
|
||||
"Tags": "Mga tag",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Ang tail free sampling gigamit sa pagpamenos sa epekto sa mga token nga dili kaayo lagmit nga mogawas. Ang mas taas nga bili (pananglitan 2.0) mas mopamenos sa epekto, samtang ang bili nga 1.0 mopalong niini nga setting.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Sultihi ko og bisan unsang makalingaw nga kamatuoran bahin sa Imperyo sa Roma",
|
||||
"Tell us more:": "Sultihi kami og dugang:",
|
||||
"Temporary": "Temporaryo",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Temporaryong panaghisgot",
|
||||
"Temporary Chat": "Temporaryong panaghisgot",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Temporaryo: i-on o i-off ang temporaryong mode alang niini nga bag-ong panaghisgot.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Dili na kini ma-undo. Magpabiling makita ang mga tubag.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Gihimo kini nga channel niadtong {{createdAt}}. Kini ang sinugdanan sa channel nga {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Dili kini nga panaghisgot makita sa kasaysayan ug dili tipigan ang imong mga mensahe.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Abli na kini nga file. Sirad-i ang tab niini o pagpili og laing ngalan.",
|
||||
"This folder is empty": "Walay sulod kini nga folder",
|
||||
"This is a default user permission and will remain enabled.": "Default kini nga pagtugot sa tiggamit ug magpabiling gipaandar.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Sulayanan pa kini nga bahin, mahimong dili molihok sumala sa gipaabot ug mahimong mausab bisan kanus-a.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Wala giapil ang wala mausab nga mga linya",
|
||||
"Underline": "Linyaa sa ubos",
|
||||
"Undo": "I-undo",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "I-undo ang kataposang pagtipig sa kausaban",
|
||||
"Undo the last commit and keep its changes staged?": "I-undo ang kataposang pagtipig sa kausaban ug ipabilin ang mga kausaban nga giandam alang sa pagtipig?",
|
||||
"Unified": "Hiniusa",
|
||||
"Uninstall": "I-uninstall",
|
||||
"Uninstall app": "I-uninstall ang app",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Ipaandar ang mikropono aron makapadayon",
|
||||
"Unpin": "Tangtanga ang pin",
|
||||
"Unpin from Sidebar": "Tangtanga ang pin gikan sa sidebar",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Wala pa mapadala",
|
||||
"Unread": "Wala pa mabasa",
|
||||
"Unsaved changes": "Wala matipigang mga kausaban",
|
||||
"Unsaved changes to this version will be discarded.": "Masalikway ang wala matipigang mga kausaban niini nga bersyon.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "I-update ang tanang modelo",
|
||||
"Update and Copy Link": "I-update ug kopyaha ang link",
|
||||
"Update app": "I-update ang app",
|
||||
"Update branch": "",
|
||||
"Update branch": "I-update ang sanga",
|
||||
"Update for the latest features and improvements.": "I-update aron makuha ang pinakabag-ong mga bahin ug pagpaayo.",
|
||||
"Update your status": "I-update ang imong kahimtang",
|
||||
"Updated": "Na-update",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Gamita ang default",
|
||||
"Use device vibration feedback on supported Android devices.": "Gamita ang pagkurog isip tubag sa mga Android device nga mosuporta niini.",
|
||||
"Use discovered scopes": "Gamita ang nakit-ang mga sakop sa pagtugot",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Gamita ang mga tab sa tibuok gilapdon",
|
||||
"Use global setting": "Gamita ang setting sa tibuok sistema",
|
||||
"Use groups to organize your users and assign permissions.": "Gamita ang mga grupo aron maorganisar ang mga tiggamit ug mahatagan og pagtugot.",
|
||||
"Use in prompt": "Gamita sa aghat",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Gamita ang binahin nga pagkuha aron makakuha og gitumong ug may kalabotang sulod.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Gamita ang binahin nga pagkuha alang sa gitumong ug may kalabotang konteksto.",
|
||||
"Use segmented retrieval for focused context.": "Gamita ang binahin nga pagkuha alang sa gitumong nga konteksto.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Gamita ang mga tab sa kilid",
|
||||
"Use these in model system prompts as {{example}}.": "Gamita kini sa mga aghat sa sistema sa modelo isip {{example}}.",
|
||||
"Use Web Search?": "Gamita ang pagpangita sa web?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Gigamit sa lumad nga mode sa pagtawag sa punsiyon. Moepekto gihapon ang mga setting sa lugar sa trabaho ug ang mga pagtugot sa tiggamit.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Tigpatukar sa video",
|
||||
"View": "Panglantaw",
|
||||
"View changes": "",
|
||||
"View changes": "Tan-awa ang mga kausaban",
|
||||
"View channel": "Tan-awa ang channel",
|
||||
"View chat": "Tan-awa ang panaghisgot",
|
||||
"View comment": "Tan-awa ang komento",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Tan-awa sa {{platform}}",
|
||||
"View Replies": "Tan-awa ang mga tubag",
|
||||
"View Result from {{NAME}}": "Tan-awa ang resulta gikan sa {{NAME}}",
|
||||
"View source": "Tan-awa ang tinubdan",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "Trabaho",
|
||||
"Working Directory": "Direktoryo sa trabaho",
|
||||
"Working Directory Context": "Konteksto sa direktoryo sa trabaho",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Mga kausaban sa mga file sa trabaho",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Motrabaho uban sa top-k. Ang mas taas nga bili (pananglitan 0.95) mohatag og mas nagkalainlaing teksto, samtang ang mas ubos (pananglitan 0.5) mohimo og mas gitumong ug konserbatibong teksto.",
|
||||
"Workspace": "Lugar sa trabaho",
|
||||
"Workspace Models": "Mga modelo sa lugar sa trabaho",
|
||||
"Workspace Permissions": "Mga pagtugot sa lugar sa trabaho",
|
||||
"Workspace search": "Pagpangita sa lugar sa trabaho",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Sanga sa kopya sa trabaho",
|
||||
"Worktree directory": "Direktoryo sa kopya sa trabaho",
|
||||
"Worktrees": "Mga kopya sa trabaho",
|
||||
"Write": "Pagsulat",
|
||||
"Write a prompt…": "Pagsulat og aghat…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Pagsulat og 50 ka pulong nga summary nga nagsumaryo {{topic}}.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Wala kay pagtugot sa pag-upload og mga file niini nga tipiganan sa kahibalo.",
|
||||
"You do not have permission to upload files.": "Wala kay pagtugot sa pag-upload og mga file.",
|
||||
"You do not have permission to upload web content.": "Wala kay pagtugot sa pag-upload og sulod sa web.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Wala kay pagtugot sa paggamit sa panaghisgot sa kilid.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Aduna kay labaw sa 50 ka tiggamit, nga kasagarang nagpasabot nga kini nga lugar sa trabaho gigamit sa usa ka organisasyon. Libre gamiton ang Open WebUI sa kasamtangang porma niini, nga walay mga pagpugong o tinagong limitasyon, ug gusto namo nga magpabilin kini nga ingon niana.",
|
||||
"You have no archived conversations.": "Wala kay gi-archive nga mga panaghisgot.",
|
||||
"You have no shared conversations.": "Wala kay gipaambit nga mga panaghisgot.",
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@
|
|||
"A chat run finished successfully.": "Běh konverzace byl úspěšně dokončen.",
|
||||
"A collaboration channel where people join as members": "Kanál pro spolupráci, do kterého se lidé připojují jako členové",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Diskusní kanál, ve kterém přístup řídí skupiny a oprávnění",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Soubor s tímto názvem již existuje. Nahradit jej?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Nová verze (v{{LATEST_VERSION}}) je nyní k dispozici.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Stránka byla změněna jinde. Předchozí text si můžete stáhnout.",
|
||||
"A private conversation between you and selected users": "Soukromá konverzace mezi vámi a vybranými uživateli",
|
||||
|
|
@ -265,7 +265,7 @@
|
|||
"Allow selecting hidden models as base models.": "Povolte uživatelům vybírat skryté modely jako základní modely.",
|
||||
"Allow Sharing With Groups": "Povolit sdílení se skupinami",
|
||||
"Allow Sharing With Users": "Povolit sdílení s uživateli",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Povolit vedlejší konverzaci",
|
||||
"Allow Speech to Text": "Povolit převod řeči na text",
|
||||
"Allow Temporary Chat": "Povolit dočasnou konverzaci",
|
||||
"Allow Text to Speech": "Povolit převod textu na řeč",
|
||||
|
|
@ -314,7 +314,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Použijte funkce, které zpracovávají zprávy před odpovědí modelu nebo po ní.",
|
||||
"Apply to draft": "Použít v konceptu",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Tlačítko „Použít v konceptu“ převezme navrhovanou revizi vpravo. Poté koncept uložte.",
|
||||
"Approve": "",
|
||||
"Approve": "Schválit",
|
||||
"Approximate comparison": "Přibližné porovnání",
|
||||
"Apps": "Aplikace",
|
||||
"April": "Duben",
|
||||
|
|
@ -347,7 +347,7 @@
|
|||
"Ask for approval": "Požádat o schválení",
|
||||
"Ask or edit…": "Zeptejte se nebo zadejte úpravu…",
|
||||
"Ask this knowledge source a test question": "Položte tomuto zdroji znalostí zkušební otázku",
|
||||
"Assignees": "",
|
||||
"Assignees": "Přiřazení uživatelé",
|
||||
"Assistance": "Asistence",
|
||||
"assistant": "asistent",
|
||||
"Assistant": "Asistent",
|
||||
|
|
@ -375,7 +375,7 @@
|
|||
"Authenticator configured": "Ověřovací aplikace je nastavena",
|
||||
"Authenticator not configured": "Ověřovací aplikace není nastavena",
|
||||
"Authenticator setup QR code": "QR kód pro nastavení ověřovací aplikace",
|
||||
"Author": "",
|
||||
"Author": "Autor",
|
||||
"Authorize OAuth": "Autorizovat OAuth",
|
||||
"Auto": "Auto",
|
||||
"Auto (Random)": "Automaticky (náhodně)",
|
||||
|
|
@ -408,9 +408,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Zpět",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Zpět ke změnám",
|
||||
"Back to files": "Zpět k souborům",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Zpět k žádostem o sloučení",
|
||||
"Back to sign in": "Zpět na přihlášení",
|
||||
"Background Image": "Obrázek na pozadí",
|
||||
"Background image must be at most 25 megapixels.": "Obrázek na pozadí může mít nejvýše 25 megapixelů.",
|
||||
|
|
@ -420,7 +420,7 @@
|
|||
"Background sub-agent finished": "Dílčí agent na pozadí dokončil práci",
|
||||
"background sub-agents": "dílčí agenti na pozadí",
|
||||
"Bad Response": "Špatná odpověď",
|
||||
"Base branch": "",
|
||||
"Base branch": "Cílová větev",
|
||||
"Base Model (From)": "Základní model (ze souboru)",
|
||||
"Base Model is required.": "Je vyžadován základní model.",
|
||||
"Base Models": "Základní modely",
|
||||
|
|
@ -431,17 +431,17 @@
|
|||
"before": "před",
|
||||
"Being lazy": "Být líný",
|
||||
"Binary file — text comparison is unavailable.": "Binární soubor – porovnání textu není k dispozici.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Binární soubor byl změněn",
|
||||
"Binary file. Download to open.": "Binární soubor. Pro otevření jej stáhněte.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Možnosti bloku",
|
||||
"Bold": "Tučně",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Zvýhodňování nebo penalizace specifických tokenů pro omezené odpovědi. Hodnoty odchylky budou omezeny v rozmezí -100 až 100 (včetně). (Výchozí: žádné)",
|
||||
"Both files are required for comparison.": "K porovnání jsou potřeba oba soubory.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Akce větve",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Prohlížeč",
|
||||
"Browser options": "Možnosti prohlížeče",
|
||||
"build · {{hash}}": "sestavení · {{hash}}",
|
||||
"Built-in": "Vestavěná",
|
||||
"Bullet List": "Seznam s odrážkami",
|
||||
|
|
@ -478,7 +478,7 @@
|
|||
"Change folder icon": "Změnit ikonu složky",
|
||||
"Change overview": "Přehled změn",
|
||||
"Change User Role": "Změnit roli uživatele",
|
||||
"changed": "",
|
||||
"changed": "změněno",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Uložení změn odhlásí všechna zařízení. Uživatelé si ověřovací aplikaci nastaví při příštím přihlášení.",
|
||||
"Channel": "Kanál",
|
||||
"Channel deleted successfully": "Kanál byl úspěšně smazán",
|
||||
|
|
@ -523,7 +523,7 @@
|
|||
"Check OAuth Discovery": "Zkontrolovat zjišťování konfigurace OAuth",
|
||||
"Check what is running in this chat.": "Zkontrolujte, co běží v této konverzaci.",
|
||||
"Checking for updates...": "Kontrola aktualizací...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Přepnout na větev",
|
||||
"Choose a date range to compare": "Vyberte období pro porovnání",
|
||||
"Choose a model before saving...": "Před uložením vyberte model...",
|
||||
"Choose a parent page. Subpages move with this page.": "Vyberte nadřazenou stránku. Podstránky se přesunou spolu s touto stránkou.",
|
||||
|
|
@ -585,7 +585,7 @@
|
|||
"Close modal": "Zavřít modální okno",
|
||||
"Close Modal": "Zavřít okno",
|
||||
"Close pages": "Zavřít stránky",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Zavřít žádost o sloučení",
|
||||
"Close search": "Zavřít vyhledávání",
|
||||
"Close session details": "Zavřít podrobnosti relace",
|
||||
"Close Sidebar": "Zavřít postranní panel",
|
||||
|
|
@ -603,8 +603,8 @@
|
|||
"Collaborators": "Spolupracovníci",
|
||||
"Collapse": "Sbalit",
|
||||
"Collapse {{name}}": "Sbalit {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Sbalit panel Git",
|
||||
"Collapse sessions": "Sbalit relace",
|
||||
"Collapse terminal": "Sbalit terminál",
|
||||
"Collection": "Kolekce",
|
||||
"Collection Field": "Pole kolekce",
|
||||
|
|
@ -622,11 +622,11 @@
|
|||
"Comment deleted": "Komentář byl smazán",
|
||||
"Comments": "Komentáře",
|
||||
"Comments are no longer available.": "Komentáře již nejsou dostupné.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Akce revize",
|
||||
"Commit message": "Zpráva o změně",
|
||||
"Commit Message": "Zpráva o změně",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Souhrn revize",
|
||||
"Commit to {{branch}}": "Uložit revizi do větve {{branch}}",
|
||||
"Community Reviews": "Recenze komunity",
|
||||
"Compact": "Zhuštit kontext",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Zhuštit kontext: zkrátit starší zprávy, aby mohla tato konverzace pokračovat.",
|
||||
|
|
@ -656,18 +656,18 @@
|
|||
"Config imported successfully": "Konfigurace byla úspěšně importována",
|
||||
"Configure": "Konfigurovat",
|
||||
"Configure app": "Konfigurovat aplikaci",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Nastavte soubory konverzace, Valves, systémové instrukce a pokročilé parametry.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Nastavte pro tento model hlas pro hovory v reálném čase, hlasový avatar a hlas pro převod textu na řeč.",
|
||||
"Confirm": "Potvrdit",
|
||||
"Confirm Password": "Potvrdit heslo",
|
||||
"Confirm Prompt from Embed": "Potvrdit instrukce z vloženého obsahu",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Potvrdit akci žádosti o sloučení",
|
||||
"Confirm recording": "Potvrdit nahrávku",
|
||||
"Confirm your action": "Potvrďte svou akci",
|
||||
"Confirm your new password": "Potvrďte své nové heslo",
|
||||
"Confirm Your Password": "Potvrďte své heslo",
|
||||
"Connect": "Připojit",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Nejprve se připojte a vyberte model.",
|
||||
"Connect external apps to Open WebUI.": "Připojte externí aplikace k Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Připojte se k poskytovateli AI a začněte konverzaci",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Připojte se k instancím Open Terminal. Administrátoři a uživatelé s uděleným přístupem mohou prostřednictvím těchto serverů procházet soubory a používat terminálové nástroje.",
|
||||
|
|
@ -678,12 +678,12 @@
|
|||
"Connected apps": "Připojené aplikace",
|
||||
"Connecting": "Připojování",
|
||||
"Connecting...": "Připojování...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Připojování…",
|
||||
"Connection": "Připojení",
|
||||
"Connection failed": "Připojení se nezdařilo",
|
||||
"Connection ID": "ID připojení",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "ID připojení nesmí obsahovat znaky \":\" ani \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Připojení bylo přerušeno. Zkuste to prosím znovu.",
|
||||
"Connection lost. Reconnecting...": "Připojení bylo přerušeno. Obnovování připojení...",
|
||||
"Connection successful": "Připojení úspěšné",
|
||||
"Connection Type": "Typ připojení",
|
||||
|
|
@ -722,10 +722,10 @@
|
|||
"Copy": "Kopírovat",
|
||||
"Copy {{name}} to clipboard": "Kopírovat {{name}} do schránky",
|
||||
"Copy API Key": "Kopírovat klíč API",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Kopírovat název větve",
|
||||
"Copy change to original": "Kopírovat změnu do originálu",
|
||||
"Copy change to proposal": "Kopírovat změnu do návrhu",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Kopírovat hash revize",
|
||||
"Copy content": "Kopírovat obsah",
|
||||
"Copy default": "Kopírovat výchozí hodnotu",
|
||||
"Copy Last Code Block": "Kopírovat poslední blok kódu",
|
||||
|
|
@ -746,8 +746,8 @@
|
|||
"Copyright (c)": "Autorská práva (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS musí být správně nakonfigurován poskytovatelem, aby povolil požadavky z Open WebUI.",
|
||||
"Could not check for updates": "Nepodařilo se zkontrolovat aktualizace",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Nepodařilo se zkopírovat název větve",
|
||||
"Could not copy commit hash": "Nepodařilo se zkopírovat hash revize",
|
||||
"Could not copy to clipboard. Please try again.": "Nepodařilo se zkopírovat do schránky. Zkuste to prosím znovu.",
|
||||
"Could not determine the upload folder.": "Nepodařilo se určit složku pro nahrávání.",
|
||||
"Could not load avatar.": "Nepodařilo se načíst avatar.",
|
||||
|
|
@ -773,7 +773,7 @@
|
|||
"Create Account": "Vytvořit účet",
|
||||
"Create Admin Account": "Vytvořit účet administrátora",
|
||||
"Create announcements shown to users in the app.": "Vytvářejte oznámení zobrazovaná uživatelům v aplikaci.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Vytvořit větev",
|
||||
"Create Channel": "Vytvořit kanál",
|
||||
"Create copy": "Vytvořit kopii",
|
||||
"Create Folder": "Vytvořit složku",
|
||||
|
|
@ -784,7 +784,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Vytvářejte naplánované instrukce, které se automaticky spouštějí opakovaně.",
|
||||
"Create skill": "Vytvořit dovednost",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Vytvořit dovednost: vytvořit z této konverzace opakovaně použitelnou dovednost pro terminál.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Vytvořit pracovní strom",
|
||||
"Create your first note from the Create menu.": "Vytvořte svou první poznámku z nabídky Vytvořit.",
|
||||
"Created": "Datum vytvoření",
|
||||
"Created at": "Vytvořeno",
|
||||
|
|
@ -811,7 +811,7 @@
|
|||
"Custom Parameter Value": "Hodnota vlastního parametru",
|
||||
"Custom permissions": "Vlastní oprávnění",
|
||||
"Custom range": "Vlastní období",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Vlastní plán",
|
||||
"Customize": "Přizpůsobit",
|
||||
"Daily": "Denně",
|
||||
"Daily at": "Každý den v",
|
||||
|
|
@ -821,7 +821,7 @@
|
|||
"Data": "Data",
|
||||
"Database": "Databáze",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Datum",
|
||||
"Date Added": "Datum přidání",
|
||||
"Date is required": "Je vyžadováno datum",
|
||||
"Date Modified": "Datum změny",
|
||||
|
|
@ -871,8 +871,8 @@
|
|||
"Delete all contents inside this folder": "Smazat veškerý obsah této složky",
|
||||
"Delete API Key?": "Smazat klíč API?",
|
||||
"Delete automation?": "Smazat automatizaci?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Smazat větev",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Smazat větev {{branch}}? Nesloučené větve budou zachovány.",
|
||||
"Delete calendar": "Smazat kalendář",
|
||||
"Delete Calendar": "Smazat kalendář",
|
||||
"Delete Chat": "Smazat konverzaci",
|
||||
|
|
@ -922,12 +922,12 @@
|
|||
"Description": "Popis",
|
||||
"Description ({{language}})": "Popis ({{language}})",
|
||||
"Deselect": "Zrušit výběr",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Pracovní plocha",
|
||||
"Desktop access denied. Reopen this tab.": "Přístup k pracovní ploše byl odepřen. Znovu otevřete tuto kartu.",
|
||||
"Desktop audio": "Zvuk pracovní plochy",
|
||||
"Desktop audio is not supported by this browser.": "Tento prohlížeč nepodporuje zvuk pracovní plochy.",
|
||||
"Desktop audio unavailable.": "Zvuk pracovní plochy není dostupný.",
|
||||
"Desktop connection failed.": "Připojení k pracovní ploše se nezdařilo.",
|
||||
"Destination": "Cíl",
|
||||
"Detected Variables": "Rozpoznané proměnné",
|
||||
"dev build": "vývojové sestavení",
|
||||
|
|
@ -953,7 +953,7 @@
|
|||
"Discard comparison changes?": "Zahodit změny v porovnání?",
|
||||
"Discard unsaved changes?": "Zahodit neuložené změny?",
|
||||
"Discard unsaved skill changes?": "Zahodit neuložené změny dovednosti?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Zahodit neuložené změny tohoto souboru v pracovním stromu? Tuto akci nelze vrátit zpět.",
|
||||
"Disconnect OAuth": "Odpojit OAuth",
|
||||
"Disconnected": "Odpojeno",
|
||||
"Discover a function": "Objevit funkci",
|
||||
|
|
@ -1002,7 +1002,7 @@
|
|||
"Downloading \"{{name}}\"": "Stahování \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Stahování \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Stahování statistik...",
|
||||
"Draft": "",
|
||||
"Draft": "Koncept",
|
||||
"Drag and Drop Container": "Oblast pro přetažení",
|
||||
"Drag or use the up and down arrow keys to reorder": "Pořadí změníte přetažením nebo klávesami se šipkami nahoru a dolů",
|
||||
"Drag to move": "Přetažením přesunete",
|
||||
|
|
@ -1102,14 +1102,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Ujistěte se, že váš CSV soubor obsahuje 4 sloupce v tomto pořadí: Jméno, E-mail, Heslo, Role.",
|
||||
"Enter {{role}} message here": "Zde zadejte zprávu {{role}}",
|
||||
"Enter a Connection ID to register.": "Pro registraci zadejte ID připojení.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Zadejte název souboru bez lomítek.",
|
||||
"Enter a name, content, and a valid command.": "Zadejte název, obsah a platný příkaz.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Zadejte název pro překryvnou vrstvu s informacemi o čekajícím uživateli. Pro výchozí ponechte prázdné.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Zadejte vodoznak pro odpověď. Pro žádný vodoznak ponechte prázdné.",
|
||||
"Enter additional headers in JSON format": "Zadejte další hlavičky ve formátu JSON",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Zadejte další hlavičky ve formátu JSON (např. {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "Zadejte další parametry ve formátu JSON",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Zadejte URL s protokolem HTTP nebo HTTPS bez přihlašovacích údajů.",
|
||||
"Enter api auth string (e.g. username:password)": "Zadejte ověřovací řetězec API (např. uzivatelske_jmeno:heslo)",
|
||||
"Enter Application DN": "Zadejte Application DN",
|
||||
"Enter Application DN Password": "Zadejte heslo pro Application DN",
|
||||
|
|
@ -1298,12 +1298,12 @@
|
|||
"Execute code for analysis": "Spustit kód pro analýzu",
|
||||
"Executing {{NAME}}...": "Spouštění {{NAME}}...",
|
||||
"Execution timeline": "Časová osa provádění",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Ukončit režim celé obrazovky",
|
||||
"Expand": "Rozbalit",
|
||||
"Expand {{name}}": "Rozbalit {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Rozbalit panel Git",
|
||||
"Expand input": "Rozšířit vstupní pole",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Rozbalit relace",
|
||||
"Expand terminal": "Rozbalit terminál",
|
||||
"Experience": "Uživatelský zážitek",
|
||||
"Experimental": "Experimentální",
|
||||
|
|
@ -1360,7 +1360,7 @@
|
|||
"Failed to import models": "Import modelů se nezdařil",
|
||||
"Failed to load chat": "Načtení konverzace se nezdařilo",
|
||||
"Failed to load chat preview": "Nepodařilo se načíst náhled konverzace",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Načtení adresáře se nezdařilo",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Načtení souboru DOCX se nezdařilo. Zkuste jej místo toho stáhnout.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Načtení souboru Excel/CSV se nezdařilo. Zkuste jej místo toho stáhnout.",
|
||||
"Failed to load file content.": "Nepodařilo se načíst obsah souboru.",
|
||||
|
|
@ -1386,7 +1386,7 @@
|
|||
"Failed to save connections": "Nepodařilo se uložit připojení",
|
||||
"Failed to save conversation": "Nepodařilo se uložit konverzaci",
|
||||
"Failed to save file": "Uložení souboru se nezdařilo",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Uložení souboru se nezdařilo. Změny jsou stále v editoru.",
|
||||
"Failed to save model": "Uložení modelu se nezdařilo",
|
||||
"Failed to save models configuration": "Nepodařilo se uložit konfiguraci modelů",
|
||||
"Failed to save policy: {{error}}": "Uložení zásad se nezdařilo: {{error}}",
|
||||
|
|
@ -1418,14 +1418,14 @@
|
|||
"File actions": "Akce souboru",
|
||||
"File added successfully.": "Soubor byl úspěšně přidán.",
|
||||
"File browser": "Prohlížeč souborů",
|
||||
"File changes": "",
|
||||
"File changes": "Změny souboru",
|
||||
"File content": "Obsah souboru",
|
||||
"File content updated successfully.": "Obsah souboru byl úspěšně aktualizován.",
|
||||
"File count limit": "Limit počtu souborů",
|
||||
"File created": "Soubor byl vytvořen",
|
||||
"File deleted successfully.": "Soubor byl úspěšně smazán.",
|
||||
"File differences": "Rozdíly mezi soubory",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Do souboru nelze zapisovat.",
|
||||
"File Mode": "Režim souboru",
|
||||
"File moved.": "Soubor byl přesunut.",
|
||||
"File name": "Název souboru",
|
||||
|
|
@ -1522,9 +1522,9 @@
|
|||
"Get information on {{name}} in the UI": "Získat informace o {{name}} v uživatelském rozhraní",
|
||||
"Get started": "Začít",
|
||||
"Get started with {{WEBUI_NAME}}": "Začněte s {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Změny v systému Git",
|
||||
"Git unavailable": "Git není dostupný",
|
||||
"Give me ideas": "Dej mi nápady",
|
||||
"give me tips": "poraď mi",
|
||||
"Global": "Globální",
|
||||
|
|
@ -1552,7 +1552,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Zdrojová větev",
|
||||
"Headers": "Hlavičky",
|
||||
"Headers must be a valid JSON object": "Hlavičky musí být platný objekt JSON",
|
||||
"Height": "Výška",
|
||||
|
|
@ -1569,13 +1569,13 @@
|
|||
"Hide": "Skrýt",
|
||||
"Hide All": "Skrýt vše",
|
||||
"Hide conversation": "Skrýt konverzaci",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Skrýt porovnání",
|
||||
"Hide from Sidebar": "Skrýt z postranního panelu",
|
||||
"Hide Hidden Files": "Skrýt skryté soubory",
|
||||
"Hide Model": "Skrýt model",
|
||||
"Hide preview": "Skrýt náhled",
|
||||
"Hide sub-agents": "Skrýt dílčí agenty",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Skrýt karty",
|
||||
"Hide whitespace": "Ignorovat bílé znaky",
|
||||
"High": "Vysoká",
|
||||
"History": "Historie",
|
||||
|
|
@ -1714,7 +1714,7 @@
|
|||
"Knowledge source updated.": "Zdroj znalostí byl aktualizován.",
|
||||
"Knowledge updated successfully": "Znalost byla úspěšně aktualizována",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (prohlížeč)",
|
||||
"Labels": "",
|
||||
"Labels": "Štítky",
|
||||
"Last 12 months": "Posledních 12 měsíců",
|
||||
"Last 24 hours": "Posledních 24 hodin",
|
||||
"Last 30 days": "Posledních 30 dní",
|
||||
|
|
@ -1810,7 +1810,7 @@
|
|||
"March": "Březen",
|
||||
"Mark all as read": "Označit vše jako přečtené",
|
||||
"Mark as unread": "Označit jako nepřečtené",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Označit jako připravené ke kontrole",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Oblast trhu",
|
||||
"Matching tabs: {{count}}_one": "Odpovídající karty: {{count}}",
|
||||
|
|
@ -1843,21 +1843,21 @@
|
|||
"Mention someone": "Zmínit někoho",
|
||||
"Mentions only": "Pouze zmínky",
|
||||
"Menu": "Nabídka",
|
||||
"Merge": "",
|
||||
"Merge": "Sloučení",
|
||||
"Merge Responses": "Sloučit odpovědi",
|
||||
"Merged Response": "Sloučená odpověď",
|
||||
"Message": "Zpráva",
|
||||
"Message counts and response timestamps": "Počty zpráv a časové značky odpovědí",
|
||||
"Message counts are based on assistant responses.": "Počty zpráv vycházejí z odpovědí asistenta.",
|
||||
"Message exceeds the 16 KiB limit.": "Zpráva překračuje limit 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Číslo zprávy",
|
||||
"Message rating should be enabled to use this feature": "Pro použití této funkce musí být povoleno hodnocení zpráv.",
|
||||
"Message share": "Podíl zpráv",
|
||||
"Message text...": "Text zprávy...",
|
||||
"messages": "— zprávy",
|
||||
"Messages": "Zprávy",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Zprávy jsou chráněny koncovým šifrováním a neukládají se.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Po zavření této karty zprávy zmizí.",
|
||||
"Metadata Field": "Pole metadat",
|
||||
"Microphone off": "Mikrofon ztlumen",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1871,7 +1871,7 @@
|
|||
"Mistral OCR Parameters": "Parametry Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Po",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Mobilní zobrazení",
|
||||
"Model": "Model",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' byl úspěšně stažen.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je již ve frontě na stažení.",
|
||||
|
|
@ -1926,7 +1926,7 @@
|
|||
"Models imported successfully": "Modely byly úspěšně importovány",
|
||||
"Models Public Sharing": "Veřejné sdílení modelů",
|
||||
"Models Sharing": "Sdílení modelů",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Modely, kterým může tento model delegovat úkoly. Uživatelé k nim musí mít přístup. Ponechte prázdné pro použití aktuálního modelu.",
|
||||
"Modified": "Změněno",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Po",
|
||||
|
|
@ -1962,7 +1962,7 @@
|
|||
"Navigate to Previous Chat": "Přejít na předchozí konverzaci",
|
||||
"Never": "Nikdy",
|
||||
"New": "Nové",
|
||||
"New branch": "",
|
||||
"New branch": "Nová větev",
|
||||
"New Button": "Nové tlačítko",
|
||||
"New calendar": "Nový kalendář",
|
||||
"New Calendar": "Nový kalendář",
|
||||
|
|
@ -1977,14 +1977,14 @@
|
|||
"New Group": "Nová skupina",
|
||||
"New Note": "Nová poznámka",
|
||||
"New Password": "Nové heslo",
|
||||
"New pull request": "",
|
||||
"New pull request": "Nová žádost o sloučení",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Nové dovednosti a kopie jsou soukromé. Nahrazením se uloží nová verze a zachová stávající sdílení.",
|
||||
"New tab": "",
|
||||
"New tab": "Nová karta",
|
||||
"New Temporary Chat": "Nová dočasná konverzace",
|
||||
"New Terminal": "Nový terminál",
|
||||
"New Tool": "Nový nástroj",
|
||||
"New Webhook": "Nový webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Nový pracovní strom",
|
||||
"new-channel": "novy-kanal",
|
||||
"Next": "Další",
|
||||
"Next change": "Další změna",
|
||||
|
|
@ -2004,7 +2004,7 @@
|
|||
"No apps connected.": "Nejsou připojeny žádné aplikace.",
|
||||
"No authentication": "Bez ověřování",
|
||||
"No automations found": "Nebyly nalezeny žádné automatizace",
|
||||
"No changes": "",
|
||||
"No changes": "Žádné změny",
|
||||
"No channels": "Žádné kanály",
|
||||
"No chat alerts": "Žádná upozornění na konverzace",
|
||||
"No chat history": "Žádná historie konverzací",
|
||||
|
|
@ -2014,9 +2014,9 @@
|
|||
"No chats found": "Nebyly nalezeny žádné konverzace",
|
||||
"No chats found for this user.": "Pro tohoto uživatele nebyly nalezeny žádné konverzace.",
|
||||
"No chats found.": "Nebyly nalezeny žádné konverzace.",
|
||||
"No checks": "",
|
||||
"No checks": "Žádné kontroly",
|
||||
"No comments yet": "Zatím žádné komentáře",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Zatím žádné revize",
|
||||
"No content": "Žádný obsah",
|
||||
"No content available": "Žádný dostupný obsah",
|
||||
"No content found": "Nebyl nalezen žádný obsah.",
|
||||
|
|
@ -2075,7 +2075,7 @@
|
|||
"No previous usage": "Žádné předchozí využití",
|
||||
"No prompts found": "Nebyly nalezeny žádné instrukce",
|
||||
"No prompts yet": "Zatím žádné instrukce",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Žádné žádosti o sloučení",
|
||||
"No Repeat": "Bez opakování",
|
||||
"No results": "Nebyly nalezeny žádné výsledky",
|
||||
"No results found": "Nebyly nalezeny žádné výsledky",
|
||||
|
|
@ -2093,7 +2093,7 @@
|
|||
"No Terminal connection configured.": "Není nastaveno žádné připojení k terminálu.",
|
||||
"No terminal connections configured.": "Nejsou nastavena žádná připojení k terminálům.",
|
||||
"No terminal servers available": "Nejsou k dispozici žádné servery terminálu",
|
||||
"No text changes": "",
|
||||
"No text changes": "Žádné změny v textu",
|
||||
"No text differences": "Žádné rozdíly v textu",
|
||||
"No tool server connections configured.": "Nejsou nastavena žádná připojení k serverům nástrojů.",
|
||||
"No tools accessible": "Žádné přístupné nástroje",
|
||||
|
|
@ -2106,7 +2106,7 @@
|
|||
"No valves to update": "Žádné valves k aktualizaci",
|
||||
"No webhooks yet": "Zatím žádné webhooky",
|
||||
"Node Ids": "ID uzlů",
|
||||
"none": "",
|
||||
"none": "žádné",
|
||||
"None": "Žádný",
|
||||
"None reported": "Žádné uvedené",
|
||||
"Not configured": "Nenastaveno",
|
||||
|
|
@ -2169,14 +2169,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Jejda! Zdá se, že URL adresa je neplatná. Zkontrolujte ji prosím a zkuste to znovu.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Jejda! Používáte nepodporovanou metodu (pouze frontend). Spusťte prosím WebUI z backendu.",
|
||||
"Open": "Otevřít",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Otevřete kartu pomocí nabídky +.",
|
||||
"Open automation": "Otevřít automatizaci",
|
||||
"Open chat": "Otevřít konverzaci",
|
||||
"Open create menu": "Otevřít nabídku pro vytvoření",
|
||||
"Open file": "Otevřít soubor",
|
||||
"Open Folder": "Otevřít složku",
|
||||
"Open in full screen": "Otevřít na celou obrazovku",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Otevřít na platformě GitHub",
|
||||
"Open in new tab": "Otevřít na nové kartě",
|
||||
"Open link": "Otevřít link",
|
||||
"Open modal to configure connection": "Otevřít modální okno pro konfiguraci připojení",
|
||||
|
|
@ -2236,7 +2236,7 @@
|
|||
"parameter": "parametr",
|
||||
"Parameter": "Parametr",
|
||||
"Parameters": "Parametry",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Nadřazený adresář",
|
||||
"Parent group": "Nadřazená skupina",
|
||||
"Parent message not found": "Nadřazená zpráva nebyla nalezena",
|
||||
"Parent page": "Nadřazená stránka",
|
||||
|
|
@ -2304,7 +2304,7 @@
|
|||
"Please select a reason": "Vyberte prosím důvod",
|
||||
"Please select a valid JSON file": "Vyberte platný soubor JSON",
|
||||
"Please select at least one user for Direct Message channel.": "Vyberte alespoň jednoho uživatele pro kanál přímých zpráv.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Počkejte prosím na dokončení nahrávání souborů.",
|
||||
"Please wait until all files are uploaded.": "Prosím počkejte dokud nebudou všechny soubory nahrány.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP nebo GIF. Nejvýše 5 MiB a 25 megapixelů.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Změny zásad se použijí na nově vytvořené terminály. Obnovte odpovídající terminály, aby se změny použily i na stávající terminály.",
|
||||
|
|
@ -2361,15 +2361,15 @@
|
|||
"Provider": "Poskytovatel",
|
||||
"Provider context": "Kontextové okno poskytovatele",
|
||||
"Provider details": "Podrobnosti od poskytovatele",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proxy server",
|
||||
"Public": "Veřejné",
|
||||
"Public key": "Veřejný klíč",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Stáhnout \"{{searchValue}}\" z Ollama.com",
|
||||
"Pull a model from Ollama.com": "Stáhnout model z Ollama.com",
|
||||
"Pull Model": "Stáhnout model",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Akce žádosti o sloučení",
|
||||
"Pull request description": "Popis žádosti o sloučení",
|
||||
"Pull request title": "Název žádosti o sloučení",
|
||||
"Punctuation": "Interpunkce",
|
||||
"Pyodide file browser": "Prohlížeč souborů Pyodide",
|
||||
"Quality": "Kvalita",
|
||||
|
|
@ -2390,7 +2390,7 @@
|
|||
"Read the docs": "Přečíst dokumentaci",
|
||||
"Read-only": "Jen pro čtení",
|
||||
"Read-Only Access": "Přístup jen pro čtení",
|
||||
"Ready": "",
|
||||
"Ready": "Označit jako připravené",
|
||||
"Realtime": "V reálném čase",
|
||||
"Realtime Voice": "Hlas pro hovory v reálném čase",
|
||||
"Reason": "Důvod",
|
||||
|
|
@ -2404,7 +2404,7 @@
|
|||
"Recommended": "Doporučené",
|
||||
"Reconnect": "Znovu připojit",
|
||||
"Reconnected": "Znovu připojeno",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Obnovování připojení…",
|
||||
"Record": "Nahrát",
|
||||
"Record voice": "Nahrát hlas",
|
||||
"Recorded duration": "Zaznamenaná doba trvání",
|
||||
|
|
@ -2467,11 +2467,11 @@
|
|||
"Removing {{count}} stale files..._many": "Odstraňuje se {{count}} zastaralého souboru...",
|
||||
"Removing {{count}} stale files..._other": "Odstraňuje se {{count}} zastaralých souborů...",
|
||||
"Rename": "Přejmenovat",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Přejmenovat větev",
|
||||
"Rename page": "Přejmenovat stránku",
|
||||
"Renamed to {{name}}": "Přejmenováno na {{name}}",
|
||||
"Rendered preview": "Vykreslený náhled",
|
||||
"Reopen": "",
|
||||
"Reopen": "Znovu otevřít",
|
||||
"Reorder": "Změnit pořadí",
|
||||
"Repeat": "Opakování",
|
||||
"Replace": "Nahradit",
|
||||
|
|
@ -2483,7 +2483,7 @@
|
|||
"Reply to thread...": "Odpovědět ve vlákně...",
|
||||
"Replying to {{NAME}}": "Odpověď pro {{NAME}}",
|
||||
"Reported by the provider.": "Údaje od poskytovatele.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Požádat o změny",
|
||||
"Requested scopes": "Požadované rozsahy oprávnění",
|
||||
"Require an authenticator for all users": "Vyžadovat ověřovací aplikaci pro všechny uživatele",
|
||||
"required": "povinné",
|
||||
|
|
@ -2498,7 +2498,7 @@
|
|||
"Reset to Defaults": "Obnovit výchozí nastavení",
|
||||
"Reset view": "Resetovat zobrazení",
|
||||
"Reset zoom": "Obnovit přiblížení",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Změnit velikost panelu Git",
|
||||
"Resize panel": "Změnit velikost panelu",
|
||||
"Resolved": "Vyřešeno",
|
||||
"Response": "Odpověď",
|
||||
|
|
@ -2509,7 +2509,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "odpovědí se zaznamenaným využitím",
|
||||
"Restart": "Restartovat",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Restartujte všechny instance Open WebUI, aby se změny nastavení připojení poskytovatele projevily.",
|
||||
"Restricted": "Omezený přístup",
|
||||
"Result": "Výsledek",
|
||||
"RESULT": "Výsledek",
|
||||
|
|
@ -2522,13 +2522,13 @@
|
|||
"Retrieved {{count}} sources_other": "Získáno {{count}} zdrojů",
|
||||
"Retrieved 1 source": "Získán 1 zdroj",
|
||||
"Retry": "Zkusit znovu",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Znovu zkusit detekovat Git",
|
||||
"Retry setup": "Zkusit nastavení znovu",
|
||||
"Return to call": "Zpět k hovoru",
|
||||
"Return to conversation": "Zpět ke konverzaci",
|
||||
"Review": "Zkontrolovat",
|
||||
"Review the scopes this app is requesting before adding it.": "Před přidáním aplikace zkontrolujte rozsahy oprávnění, které požaduje.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Kontroloři",
|
||||
"Revised": "Upravená verze",
|
||||
"Rewrite the selected text.": "Přeformulovat vybraný text.",
|
||||
"Role": "Role",
|
||||
|
|
@ -2554,7 +2554,7 @@
|
|||
"Save & Create": "Uložit a vytvořit",
|
||||
"Save & Update": "Uložit a aktualizovat",
|
||||
"Save and send": "Uložit a odeslat",
|
||||
"Save As": "",
|
||||
"Save As": "Uložit jako",
|
||||
"Save As Copy": "Uložit jako kopii",
|
||||
"Save Chat": "Uložit konverzaci",
|
||||
"Save draft as copy": "Uložit koncept jako kopii",
|
||||
|
|
@ -2581,7 +2581,7 @@
|
|||
"Search actions": "Hledat akce",
|
||||
"Search all emojis": "Hledat všechny emoji",
|
||||
"Search Automations": "Hledat automatizace",
|
||||
"Search branches": "",
|
||||
"Search branches": "Hledat větve",
|
||||
"Search built-in tools": "Hledat vestavěné nástroje",
|
||||
"Search channels": "Hledat kanály",
|
||||
"Search Chats": "Hledat v konverzacích",
|
||||
|
|
@ -2610,7 +2610,7 @@
|
|||
"Search or add pattern": "Hledat nebo přidat vzor",
|
||||
"Search parent groups": "Hledat nadřazené skupiny",
|
||||
"Search Prompts": "Hledat instrukce",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Hledat žádosti o sloučení",
|
||||
"Search results": "Výsledky hledání",
|
||||
"Search scopes": "Hledat rozsahy oprávnění",
|
||||
"Search sessions": "Hledat relace",
|
||||
|
|
@ -2624,7 +2624,7 @@
|
|||
"Search users or groups": "Hledat uživatele nebo skupiny",
|
||||
"Search workspace": "Hledat v pracovním prostoru",
|
||||
"Search workspace…": "Hledat v pracovním prostoru…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Hledat pracovní stromy",
|
||||
"Search your workspace": "Hledat ve svém pracovním prostoru",
|
||||
"Searched {{count}} sites": "Prohledáno {{count}} stránek",
|
||||
"Searching": "Vyhledávání",
|
||||
|
|
@ -2651,11 +2651,11 @@
|
|||
"Select a model to isolate it.": "Vyberte model, který chcete zobrazit samostatně.",
|
||||
"Select a pipeline": "Vyberte pipeline",
|
||||
"Select a pipeline url": "Vyberte URL pipeline",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Vyberte žádost o sloučení",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Vyberte rozsah pro filtrování relací. Zahrnuty jsou i částečné údaje o využití.",
|
||||
"Select a reranking model engine": "Vyberte jádro modelu pro přehodnocení",
|
||||
"Select a role": "Vyberte roli",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Pro otevření URL na localhost vyberte terminál.",
|
||||
"Select a theme": "Vyberte motiv",
|
||||
"Select a tool": "Vyberte nástroj",
|
||||
"Select a voice": "Vyberte hlas",
|
||||
|
|
@ -2679,9 +2679,9 @@
|
|||
"Select loaded files": "Vybrat načtené soubory",
|
||||
"Select Method": "Vybrat metodu",
|
||||
"Select model": "Vybrat model",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Vyberte pouze jeden model",
|
||||
"Select only one model to call": "Vyberte pouze jeden model k volání",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Pro otevření vedlejší konverzace vyberte pouze jeden model.",
|
||||
"Select options": "Vyberte možnosti",
|
||||
"Select Skill": "Vybrat dovednost",
|
||||
"Select to isolate model": "Vybrat model pro samostatné zobrazení",
|
||||
|
|
@ -3383,8 +3383,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Zjistit aktuální čas a provádět výpočty s daty a časem",
|
||||
"settings.admin.models.builtinTools.time.label": "Čas a výpočty",
|
||||
"settings.admin.models.builtinTools.title": "Vestavěné nástroje",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Vytvářet z konverzace nástroje pracovního prostoru v jazyce Python",
|
||||
"settings.admin.models.builtinTools.tools.label": "Vytváření nástrojů",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Pozastavit odpověď a položit uživateli upřesňující otázku",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Zeptat se uživatele",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Hledat na webu a načítat URL",
|
||||
|
|
@ -3907,7 +3907,7 @@
|
|||
"Show all {{count}} contributors_few": "Zobrazit všechny {{count}} přispěvatele",
|
||||
"Show all {{count}} contributors_many": "Zobrazit všech {{count}} přispěvatele",
|
||||
"Show all {{count}} contributors_other": "Zobrazit všech {{count}} přispěvatelů",
|
||||
"Show diff": "",
|
||||
"Show diff": "Zobrazit porovnání",
|
||||
"Show Files": "Zobrazit soubory",
|
||||
"Show Hidden Files": "Zobrazit skryté soubory",
|
||||
"Show image preview": "Zobrazit náhled obrázku",
|
||||
|
|
@ -3923,7 +3923,7 @@
|
|||
"Show your support!": "Vyjádřete svou podporu!",
|
||||
"Showcased creativity": "Předvedená kreativita",
|
||||
"Showing search match": "Zobrazuje se výsledek hledání",
|
||||
"Side chat": "",
|
||||
"Side chat": "Vedlejší konverzace",
|
||||
"Sidebar": "Postranní panel",
|
||||
"Sign in": "Přihlásit se",
|
||||
"Sign in again": "Znovu se přihlásit",
|
||||
|
|
@ -3980,9 +3980,9 @@
|
|||
"Speech-to-Text Language": "Jazyk převodu řeči na text",
|
||||
"Split": "Vedle sebe",
|
||||
"Sponsor on GitHub": "Podpořit na GitHubu",
|
||||
"SQL query": "",
|
||||
"SQL query": "Dotaz SQL",
|
||||
"Staan API Key": "API klíč pro Staan",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Změny připravené k uložení do revize",
|
||||
"Standard": "Standardní",
|
||||
"Start a new conversation": "Zahájit novou konverzaci",
|
||||
"Start a voice call using your microphone?": "Zahájit hlasový hovor pomocí mikrofonu?",
|
||||
|
|
@ -4029,14 +4029,14 @@
|
|||
"Suggested": "Navrhované",
|
||||
"Suggested prompts": "Navrhované instrukce",
|
||||
"Summarize this note.": "Shrňte tuto poznámku.",
|
||||
"Summary": "",
|
||||
"Summary": "Souhrn",
|
||||
"Sun": "Ne",
|
||||
"Support": "Podpora",
|
||||
"Support this plugin:": "Podpořte tento plugin:",
|
||||
"Supported parameters": "Podporované parametry",
|
||||
"Swap": "Prohodit",
|
||||
"Swap sides": "Prohodit strany",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Přepnout větev",
|
||||
"Switch camera": "Přepnout kameru",
|
||||
"Switch to Assistant role": "Přepnout na roli asistenta",
|
||||
"Switch to JSON editor": "Přepnout do editoru JSON",
|
||||
|
|
@ -4058,7 +4058,7 @@
|
|||
"System Instructions": "Systémové instrukce",
|
||||
"System Prompt": "Systémové instrukce",
|
||||
"Table": "Tabulka",
|
||||
"Tabs": "",
|
||||
"Tabs": "Karty",
|
||||
"Tag": "Štítek",
|
||||
"Tags": "Štítky",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Vzorkování bez konce (tail free sampling) se používá ke snížení vlivu méně pravděpodobných tokenů na výstup. Vyšší hodnota (např. 2.0) sníží vliv více, zatímco hodnota 1.0 toto nastavení vypne.",
|
||||
|
|
@ -4073,7 +4073,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Řekni mi náhodnou zajímavost o Římské říši",
|
||||
"Tell us more:": "Řekněte nám více:",
|
||||
"Temporary": "Dočasná konverzace",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Dočasná konverzace",
|
||||
"Temporary Chat": "Dočasná konverzace",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Dočasná konverzace: zapnout nebo vypnout dočasný režim pro tuto novou konverzaci.",
|
||||
"Terminal": "Terminál",
|
||||
|
|
@ -4118,7 +4118,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Tuto akci nelze vrátit zpět. Odpovědi zůstanou viditelné.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Tento kanál byl vytvořen {{createdAt}}. Toto je úplný začátek kanálu {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Tato konverzace se neobjeví v historii a vaše zprávy nebudou uloženy.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Tento soubor je již otevřený. Zavřete jeho kartu nebo zvolte jiný název.",
|
||||
"This folder is empty": "Tato složka je prázdná",
|
||||
"This is a default user permission and will remain enabled.": "Toto je výchozí uživatelské oprávnění a zůstane povolené.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Toto je experimentální funkce, nemusí fungovat podle očekávání a může být kdykoli změněna.",
|
||||
|
|
@ -4256,8 +4256,8 @@
|
|||
"Unchanged lines omitted": "Nezměněné řádky vynechány",
|
||||
"Underline": "Podtržení",
|
||||
"Undo": "Zpět",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Vrátit poslední revizi",
|
||||
"Undo the last commit and keep its changes staged?": "Vrátit poslední revizi a ponechat její změny připravené k uložení do revize?",
|
||||
"Unified": "Sjednocené",
|
||||
"Uninstall": "Odinstalovat",
|
||||
"Uninstall app": "Odinstalovat aplikaci",
|
||||
|
|
@ -4275,7 +4275,7 @@
|
|||
"Unmute to continue": "Pro pokračování zrušte ztlumení mikrofonu",
|
||||
"Unpin": "Odepnout",
|
||||
"Unpin from Sidebar": "Odepnout z postranního panelu",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Neodesláno",
|
||||
"Unread": "Nepřečtené",
|
||||
"Unsaved changes": "Neuložené změny",
|
||||
"Unsaved changes to this version will be discarded.": "Neuložené změny této verze budou zahozeny.",
|
||||
|
|
@ -4292,7 +4292,7 @@
|
|||
"Update All Models": "Aktualizovat všechny modely",
|
||||
"Update and Copy Link": "Aktualizovat a zkopírovat odkaz",
|
||||
"Update app": "Aktualizovat aplikaci",
|
||||
"Update branch": "",
|
||||
"Update branch": "Aktualizovat větev",
|
||||
"Update for the latest features and improvements.": "Aktualizujte pro nejnovější funkce a vylepšení.",
|
||||
"Update your status": "Aktualizovat svůj stav",
|
||||
"Updated": "Aktualizováno",
|
||||
|
|
@ -4336,7 +4336,7 @@
|
|||
"Use default": "Použít výchozí",
|
||||
"Use device vibration feedback on supported Android devices.": "Na podporovaných zařízeních Android používat vibrační odezvu.",
|
||||
"Use discovered scopes": "Použít zjištěné rozsahy oprávnění",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Zobrazit karty na celou šířku",
|
||||
"Use global setting": "Použít globální nastavení",
|
||||
"Use groups to organize your users and assign permissions.": "Pomocí skupin organizujte uživatele a přidělujte oprávnění.",
|
||||
"Use in prompt": "Použít v instrukcích",
|
||||
|
|
@ -4344,7 +4344,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Pro cílenou a relevantní extrakci obsahu použít vyhledávání po částech.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Pro cílený a relevantní kontext použít vyhledávání po částech.",
|
||||
"Use segmented retrieval for focused context.": "Pro cílený kontext použít vyhledávání po částech.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Zobrazit karty po straně",
|
||||
"Use these in model system prompts as {{example}}.": "Použijte je v systémových instrukcích modelu jako {{example}}.",
|
||||
"Use Web Search?": "Použít vyhledávání na webu?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Používá se v režimu nativního volání funkcí. Nastavení pracovního prostoru a oprávnění uživatelů nadále platí.",
|
||||
|
|
@ -4398,11 +4398,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Přehrávač videa",
|
||||
"View": "Zobrazení",
|
||||
"View changes": "",
|
||||
"View changes": "Zobrazit změny",
|
||||
"View channel": "Zobrazit kanál",
|
||||
"View chat": "Zobrazit konverzaci",
|
||||
"View comment": "Zobrazit komentář",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Zobrazit na platformě {{platform}}",
|
||||
"View Replies": "Zobrazit odpovědi",
|
||||
"View Result from {{NAME}}": "Zobrazit výsledek nástroje {{NAME}}",
|
||||
"View source": "Zobrazit zdroj",
|
||||
|
|
@ -4473,15 +4473,15 @@
|
|||
"Work": "Práce",
|
||||
"Working Directory": "Pracovní adresář",
|
||||
"Working Directory Context": "Kontext pracovního adresáře",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Změny v pracovním stromu",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Funguje společně s top-k. Vyšší hodnota (např. 0,95) povede k rozmanitějšímu textu, zatímco nižší hodnota (např. 0,5) vygeneruje soustředěnější a konzervativnější text.",
|
||||
"Workspace": "Pracovní prostor",
|
||||
"Workspace Models": "Modely pracovního prostoru",
|
||||
"Workspace Permissions": "Oprávnění pracovního prostoru",
|
||||
"Workspace search": "Vyhledávání v pracovním prostoru",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Větev pracovního stromu",
|
||||
"Worktree directory": "Adresář pracovního stromu",
|
||||
"Worktrees": "Pracovní stromy",
|
||||
"Write": "Napsat",
|
||||
"Write a prompt…": "Napište instrukci…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Napište shrnutí na 50 slov, které shrnuje {{topic}}.",
|
||||
|
|
@ -4510,7 +4510,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Nemáte oprávnění nahrávat soubory do této znalostní báze.",
|
||||
"You do not have permission to upload files.": "Nemáte oprávnění nahrávat soubory.",
|
||||
"You do not have permission to upload web content.": "Nemáte oprávnění nahrávat webový obsah.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Nemáte oprávnění používat vedlejší konverzaci.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Máte více než 50 uživatelů, což často znamená, že tento pracovní prostor slouží organizaci. Open WebUI lze používat zdarma v současné podobě, bez omezení nebo skrytých limitů, a chceme, aby to tak zůstalo.",
|
||||
"You have no archived conversations.": "Nemáte žádné archivované konverzace.",
|
||||
"You have no shared conversations.": "Nemáte žádné sdílené konverzace.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "En chatkørsel blev fuldført.",
|
||||
"A collaboration channel where people join as members": "En samarbejdskanal hvor folk tilmelder sig som medlemmer",
|
||||
"A discussion channel where access is controlled by groups and permissions": "En diskussionskanal hvor adgang styres af grupper og tilladelser",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Der findes allerede en fil med dette navn. Vil du erstatte den?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "En ny version (v{{LATEST_VERSION}}) er nu tilgængelig.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "En side er ændret et andet sted. Du kan downloade din tidligere tekst.",
|
||||
"A private conversation between you and selected users": "En privat samtale mellem dig og udvalgte brugere",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Tillad valg af skjulte modeller som basismodeller.",
|
||||
"Allow Sharing With Groups": "Tillad deling med grupper",
|
||||
"Allow Sharing With Users": "Tillad deling med brugere",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Tillad sidechat",
|
||||
"Allow Speech to Text": "Tillad tale til tekst",
|
||||
"Allow Temporary Chat": "Tillad midlertidig chat",
|
||||
"Allow Text to Speech": "Tillad tekst til tale",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Anvend funktioner, der behandler beskeder, før eller efter modellen svarer.",
|
||||
"Apply to draft": "Anvend på kladde",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Når du anvender ændringerne, bruges den foreslåede revision til højre. Gem din kladde bagefter.",
|
||||
"Approve": "",
|
||||
"Approve": "Godkend",
|
||||
"Approximate comparison": "Omtrentlig sammenligning",
|
||||
"Apps": "Apps",
|
||||
"April": "April",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Bed om godkendelse",
|
||||
"Ask or edit…": "Spørg eller rediger…",
|
||||
"Ask this knowledge source a test question": "Stil denne videnskilde et testspørgsmål",
|
||||
"Assignees": "",
|
||||
"Assignees": "Ansvarlige",
|
||||
"Assistance": "Assistance",
|
||||
"assistant": "assistent",
|
||||
"Assistant": "Assistent",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Godkendelsesapp konfigureret",
|
||||
"Authenticator not configured": "Godkendelsesapp ikke konfigureret",
|
||||
"Authenticator setup QR code": "QR-kode til opsætning af godkendelsesapp",
|
||||
"Author": "",
|
||||
"Author": "Forfatter",
|
||||
"Authorize OAuth": "Godkend OAuth",
|
||||
"Auto": "Auto",
|
||||
"Auto (Random)": "Automatisk (tilfældig)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Tilbage",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Tilbage til ændringer",
|
||||
"Back to files": "Tilbage til filer",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Tilbage til ændringsanmodninger",
|
||||
"Back to sign in": "Tilbage til login",
|
||||
"Background Image": "Baggrundsbillede",
|
||||
"Background image must be at most 25 megapixels.": "Baggrundsbilledet må højst være på 25 megapixel.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Underagent i baggrunden er færdig",
|
||||
"background sub-agents": "underagenter i baggrunden",
|
||||
"Bad Response": "Problem i response",
|
||||
"Base branch": "",
|
||||
"Base branch": "Målgren",
|
||||
"Base Model (From)": "Base Model (Fra)",
|
||||
"Base Model is required.": "En basismodel er påkrævet.",
|
||||
"Base Models": "Basismodeller",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "før",
|
||||
"Being lazy": "At være doven",
|
||||
"Binary file — text comparison is unavailable.": "Binær fil — tekstsammenligning er ikke tilgængelig.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Binær fil ændret",
|
||||
"Binary file. Download to open.": "Binær fil. Download for at åbne.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Blokindstillinger",
|
||||
"Bold": "Fed",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Forøg eller reducer specifikke tokens for begrænsede svar. Bias-værdier vil blive begrænset til mellem -100 og 100 (inklusiv). (Standard: ingen)",
|
||||
"Both files are required for comparison.": "Begge filer er nødvendige for sammenligning.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Grenhandlinger",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Browser",
|
||||
"Browser options": "Browserindstillinger",
|
||||
"build · {{hash}}": "build · {{hash}}",
|
||||
"Built-in": "Indbygget",
|
||||
"Bullet List": "Punktliste",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Skift mappeikon",
|
||||
"Change overview": "Oversigt over ændringer",
|
||||
"Change User Role": "Skift brugerrolle",
|
||||
"changed": "",
|
||||
"changed": "ændret",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Ændringer logger alle enheder ud. Brugerne tilmelder sig ved deres næste login.",
|
||||
"Channel": "Kanal",
|
||||
"Channel deleted successfully": "Kanal slettet",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "Kontrollér opslag af OAuth-konfiguration",
|
||||
"Check what is running in this chat.": "Se, hvad der kører i denne chat.",
|
||||
"Checking for updates...": "Søger efter opdateringer",
|
||||
"Checkout": "",
|
||||
"Checkout": "Skift til grenen",
|
||||
"Choose a date range to compare": "Vælg et datointerval til sammenligning",
|
||||
"Choose a model before saving...": "Vælg en model før du gemmer",
|
||||
"Choose a parent page. Subpages move with this page.": "Vælg en overordnet side. Undersider flyttes sammen med denne side.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Luk dialogboks",
|
||||
"Close Modal": "Luk dialogboks",
|
||||
"Close pages": "Luk sider",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Luk ændringsanmodning",
|
||||
"Close search": "Luk søgning",
|
||||
"Close session details": "Luk sessionsdetaljer",
|
||||
"Close Sidebar": "Luk sidebar",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Samarbejdspartnere",
|
||||
"Collapse": "Kollapse",
|
||||
"Collapse {{name}}": "Skjul {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Skjul Git-panel",
|
||||
"Collapse sessions": "Skjul sessioner",
|
||||
"Collapse terminal": "Skjul terminal",
|
||||
"Collection": "Samling",
|
||||
"Collection Field": "Samlingsfelt",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Kommentar slettet",
|
||||
"Comments": "Kommentarer",
|
||||
"Comments are no longer available.": "Kommentarer er ikke længere tilgængelige.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Handlinger for ændringssæt",
|
||||
"Commit message": "Ændringsbesked",
|
||||
"Commit Message": "Ændringsbesked",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Resumé af ændringssæt",
|
||||
"Commit to {{branch}}": "Opret ændringssæt på {{branch}}",
|
||||
"Community Reviews": "Anmeldelser fra fællesskabet",
|
||||
"Compact": "Komprimer kontekst",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Komprimer kontekst: forkort ældre beskeder, så denne chat kan fortsætte.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Konfiguration importeret",
|
||||
"Configure": "Konfigurer",
|
||||
"Configure app": "Konfigurer app",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Konfigurer chatfiler, ventiler, systemprompt og avancerede indstillinger.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Konfigurer stemmen i realtid, stemmeavataren og tekst-til-tale-stemmen for denne model.",
|
||||
"Confirm": "Bekræft",
|
||||
"Confirm Password": "Bekræft password",
|
||||
"Confirm Prompt from Embed": "Bekræft prompt fra indlejret indhold",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Bekræft handling for ændringsanmodning",
|
||||
"Confirm recording": "Bekræft optagelse",
|
||||
"Confirm your action": "Bekræft din handling",
|
||||
"Confirm your new password": "Bekræft dit nye password",
|
||||
"Confirm Your Password": "Bekræft dit password",
|
||||
"Connect": "Opret forbindelse",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Opret forbindelse, og vælg en model først.",
|
||||
"Connect external apps to Open WebUI.": "Forbind eksterne apps med Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Opret forbindelse til en AI-udbyder for at begynde at chatte",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Opret forbindelse til Open Terminal-instanser. Administratorer og brugere med tildelt adgang kan gennemse filer og bruge terminalværktøjer via disse servere.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Forbundne apps",
|
||||
"Connecting": "Opretter forbindelse",
|
||||
"Connecting...": "Opretter forbindelse...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Opretter forbindelse…",
|
||||
"Connection": "Forbindelse",
|
||||
"Connection failed": "Forbindelse mislykkedes",
|
||||
"Connection ID": "Forbindelses-ID",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "Forbindelses-ID må ikke indeholde tegnene \":\" eller \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Forbindelsen blev afbrudt. Prøv igen.",
|
||||
"Connection lost. Reconnecting...": "Forbindelsen blev afbrudt. Genopretter forbindelsen...",
|
||||
"Connection successful": "Forbindelse lykkedes",
|
||||
"Connection Type": "Forbindelsestype",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Kopier",
|
||||
"Copy {{name}} to clipboard": "Kopier {{name}} til udklipsholder",
|
||||
"Copy API Key": "Kopier API-nøgle",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Kopier grennavn",
|
||||
"Copy change to original": "Kopier ændringen til originalen",
|
||||
"Copy change to proposal": "Kopier ændringen til forslaget",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Kopier hash for ændringssæt",
|
||||
"Copy content": "Kopier indhold",
|
||||
"Copy default": "Kopier standardværdi",
|
||||
"Copy Last Code Block": "Kopier sidste kodeblok",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Ophavsret (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS skal være korrekt konfigureret af udbyderen for at tillade anmodninger fra Open WebUI.",
|
||||
"Could not check for updates": "Kunne ikke søge efter opdateringer",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Kunne ikke kopiere grennavnet",
|
||||
"Could not copy commit hash": "Kunne ikke kopiere hash for ændringssættet",
|
||||
"Could not copy to clipboard. Please try again.": "Kunne ikke kopiere til udklipsholder. Prøv igen.",
|
||||
"Could not determine the upload folder.": "Kunne ikke finde uploadmappen.",
|
||||
"Could not load avatar.": "Kunne ikke indlæse avatar.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Opret profil",
|
||||
"Create Admin Account": "Opret administrator profil",
|
||||
"Create announcements shown to users in the app.": "Opret meddelelser, der vises til brugere i appen.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Opret gren",
|
||||
"Create Channel": "Opret kanal",
|
||||
"Create copy": "Opret kopi",
|
||||
"Create Folder": "Opret mappe",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Opret planlagte prompts, der kører automatisk med faste mellemrum.",
|
||||
"Create skill": "Opret færdighed",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Opret færdighed: opret en genbrugelig terminalfærdighed ud fra denne chat.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Opret arbejdstræ",
|
||||
"Create your first note from the Create menu.": "Opret din første note fra menuen Opret.",
|
||||
"Created": "Oprettelsesdato",
|
||||
"Created at": "Oprettet",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Brugerdefineret parameterværdi",
|
||||
"Custom permissions": "Brugerdefinerede tilladelser",
|
||||
"Custom range": "Brugerdefineret datointerval",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Brugerdefineret tidsplan",
|
||||
"Customize": "Tilpas",
|
||||
"Daily": "Dagligt",
|
||||
"Daily at": "Dagligt kl.",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Data",
|
||||
"Database": "Database",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Dato",
|
||||
"Date Added": "Tilføjelsesdato",
|
||||
"Date is required": "En dato er påkrævet",
|
||||
"Date Modified": "Ændringsdato",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Slet alt indhold i denne mappe",
|
||||
"Delete API Key?": "Slet API-nøglen?",
|
||||
"Delete automation?": "Slet automatisering?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Slet gren",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Vil du slette grenen {{branch}}? Grene, der ikke er flettet, bevares.",
|
||||
"Delete calendar": "Slet kalender",
|
||||
"Delete Calendar": "Slet kalender",
|
||||
"Delete Chat": "Slet chat",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Beskrivelse",
|
||||
"Description ({{language}})": "Beskrivelse ({{language}})",
|
||||
"Deselect": "Ryd markering",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Skrivebord",
|
||||
"Desktop access denied. Reopen this tab.": "Adgang til skrivebordet blev nægtet. Åbn denne fane igen.",
|
||||
"Desktop audio": "Skrivebordslyd",
|
||||
"Desktop audio is not supported by this browser.": "Denne browser understøtter ikke skrivebordslyd.",
|
||||
"Desktop audio unavailable.": "Skrivebordslyd er ikke tilgængelig.",
|
||||
"Desktop connection failed.": "Kunne ikke oprette forbindelse til skrivebordet.",
|
||||
"Destination": "Destination",
|
||||
"Detected Variables": "Registrerede variabler",
|
||||
"dev build": "udviklingsbuild",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Kassér ændringerne i sammenligningen?",
|
||||
"Discard unsaved changes?": "Kassér ikke-gemte ændringer?",
|
||||
"Discard unsaved skill changes?": "Kassér ikke-gemte ændringer af færdigheden?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Vil du kassere de ikke-gemte ændringer af denne fil i arbejdstræet? Dette kan ikke fortrydes.",
|
||||
"Disconnect OAuth": "Afbryd OAuth-forbindelsen",
|
||||
"Disconnected": "Ikke forbundet",
|
||||
"Discover a function": "Find en funktion",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "Downloader \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Downloader \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Downloader statistik...",
|
||||
"Draft": "",
|
||||
"Draft": "Kladde",
|
||||
"Drag and Drop Container": "Område til træk og slip",
|
||||
"Drag or use the up and down arrow keys to reorder": "Træk, eller brug piletasterne op og ned for at ændre rækkefølgen",
|
||||
"Drag to move": "Træk for at flytte",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Sørg for at din CSV-fil indeholder 4 kolonner i denne rækkefølge: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Indtast {{role}} besked her",
|
||||
"Enter a Connection ID to register.": "Indtast et forbindelses-ID for at registrere.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Indtast et filnavn uden skråstreger.",
|
||||
"Enter a name, content, and a valid command.": "Indtast et navn, indhold og en gyldig kommando.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Indtast en titel til afventende bruger informations overlay. Lad være tom for standard.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Indtast et vandmærke til svaret. Lad være tom for ingen.",
|
||||
"Enter additional headers in JSON format": "Indtast yderligere headers i JSON format",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Indtast yderligere headers i JSON format (f.eks. {\"X-Custom-Header\": \"value\"})",
|
||||
"Enter additional parameters in JSON format": "Indtast yderligere parametre i JSON format",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Indtast en HTTP- eller HTTPS-URL uden legitimationsoplysninger.",
|
||||
"Enter api auth string (e.g. username:password)": "Indtast api-godkendelsesstreng (f.eks. brugernavn:adgangskode)",
|
||||
"Enter Application DN": "Indtast Application DN",
|
||||
"Enter Application DN Password": "Indtast Application DN Password",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Kør kode til analyse",
|
||||
"Executing {{NAME}}...": "Kører {{NAME}}...",
|
||||
"Execution timeline": "Tidslinje for kørsel",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Afslut fuld skærm",
|
||||
"Expand": "Udvid",
|
||||
"Expand {{name}}": "Udvid {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Udvid Git-panel",
|
||||
"Expand input": "Udvid inputfelt",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Udvid sessioner",
|
||||
"Expand terminal": "Udvid terminal",
|
||||
"Experience": "Brugeroplevelse",
|
||||
"Experimental": "Eksperimentel",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Kunne ikke importere modeller",
|
||||
"Failed to load chat": "Kunne ikke indlæse chat",
|
||||
"Failed to load chat preview": "Kunne ikke indlæse chat forhåndsvisning",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Kunne ikke indlæse mappen",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Kunne ikke indlæse DOCX-filen. Prøv at downloade den i stedet.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Kunne ikke indlæse Excel/CSV-filen. Prøv at downloade den i stedet.",
|
||||
"Failed to load file content.": "Kunne ikke indlæse filindhold.",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Kunne ikke gemme forbindelser",
|
||||
"Failed to save conversation": "Kunne ikke gemme samtalen",
|
||||
"Failed to save file": "Kunne ikke gemme fil",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Kunne ikke gemme filen. Dine ændringer er stadig i editoren.",
|
||||
"Failed to save model": "Kunne ikke gemme modellen",
|
||||
"Failed to save models configuration": "Kunne ikke gemme modeller konfiguration",
|
||||
"Failed to save policy: {{error}}": "Kunne ikke gemme politik: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Filhandlinger",
|
||||
"File added successfully.": "Fil tilføjet.",
|
||||
"File browser": "Filbrowser",
|
||||
"File changes": "",
|
||||
"File changes": "Filændringer",
|
||||
"File content": "Filindhold",
|
||||
"File content updated successfully.": "Filens indhold er opdateret.",
|
||||
"File count limit": "Grænse for antal filer",
|
||||
"File created": "Fil oprettet",
|
||||
"File deleted successfully.": "Filen blev slettet.",
|
||||
"File differences": "Forskelle mellem filer",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Der kan ikke skrives til filen.",
|
||||
"File Mode": "Filtilstand",
|
||||
"File moved.": "Filen blev flyttet.",
|
||||
"File name": "Filnavn",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "Få information om {{name}} i brugergrænsefladen",
|
||||
"Get started": "Kom i gang",
|
||||
"Get started with {{WEBUI_NAME}}": "Kom i gang med {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Git-ændringer",
|
||||
"Git unavailable": "Git er ikke tilgængelig",
|
||||
"Give me ideas": "Giv mig idéer",
|
||||
"give me tips": "giv mig tips",
|
||||
"Global": "Global",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Kildegren",
|
||||
"Headers": "Headers",
|
||||
"Headers must be a valid JSON object": "Headers skal være et gyldigt JSON objekt",
|
||||
"Height": "Højde",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Skjul",
|
||||
"Hide All": "Skjul alle",
|
||||
"Hide conversation": "Skjul samtale",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Skjul forskelle",
|
||||
"Hide from Sidebar": "Skjul fra sidebaren",
|
||||
"Hide Hidden Files": "Skjul skjulte filer",
|
||||
"Hide Model": "Skjul model",
|
||||
"Hide preview": "Skjul forhåndsvisning",
|
||||
"Hide sub-agents": "Skjul underagenter",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Skjul faner",
|
||||
"Hide whitespace": "Skjul mellemrum",
|
||||
"High": "Høj",
|
||||
"History": "Historik",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Videnskilde opdateret.",
|
||||
"Knowledge updated successfully": "Viden opdateret.",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Browser)",
|
||||
"Labels": "",
|
||||
"Labels": "Etiketter",
|
||||
"Last 12 months": "Seneste 12 måneder",
|
||||
"Last 24 hours": "Seneste 24 timer",
|
||||
"Last 30 days": "Seneste 30 dage",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "Marts",
|
||||
"Mark all as read": "Marker alle som læst",
|
||||
"Mark as unread": "Marker som ulæst",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Marker som klar",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Marked",
|
||||
"Matching tabs: {{count}}_one": "Matchende faner: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Omtal nogen",
|
||||
"Mentions only": "Kun omtaler",
|
||||
"Menu": "Menu",
|
||||
"Merge": "",
|
||||
"Merge": "Fletning",
|
||||
"Merge Responses": "Flet svar",
|
||||
"Merged Response": "Sammensat svar",
|
||||
"Message": "Besked",
|
||||
"Message counts and response timestamps": "Beskedantal og tidsstempler for svar",
|
||||
"Message counts are based on assistant responses.": "Beskedantal er baseret på assistentens svar.",
|
||||
"Message exceeds the 16 KiB limit.": "Beskeden overskrider grænsen på 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Beskednummer",
|
||||
"Message rating should be enabled to use this feature": "Besked rating skal være aktiveret for at bruge denne funktion",
|
||||
"Message share": "Andel af beskeder",
|
||||
"Message text...": "Beskedtekst...",
|
||||
"messages": "— beskeder",
|
||||
"Messages": "Beskeder",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Beskeder er end-to-end-krypteret og gemmes ikke.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Beskeder forsvinder, når du lukker denne fane.",
|
||||
"Metadata Field": "Metadatafelt",
|
||||
"Microphone off": "Mikrofon slået fra",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Parametre til Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Man",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Mobilvisning",
|
||||
"Model": "Model",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' er blevet downloadet.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' er allerede i kø til download.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Modeller importeret",
|
||||
"Models Public Sharing": "Modeller offentlig deling",
|
||||
"Models Sharing": "Modeldeling",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Modeller, som denne model kan delegere til. Brugerne skal have adgang til dem. Lad feltet være tomt for at bruge den aktuelle model.",
|
||||
"Modified": "Ændret",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Man",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Gå til forrige chat",
|
||||
"Never": "Aldrig",
|
||||
"New": "Nyeste",
|
||||
"New branch": "",
|
||||
"New branch": "Ny gren",
|
||||
"New Button": "Ny knap",
|
||||
"New calendar": "Ny kalender",
|
||||
"New Calendar": "Ny kalender",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Ny gruppe",
|
||||
"New Note": "Ny note",
|
||||
"New Password": "Ny adgangskode",
|
||||
"New pull request": "",
|
||||
"New pull request": "Ny ændringsanmodning",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Nye færdigheder og kopier er private. Hvis du vælger Erstat, gemmes en ny version, og eksisterende deling bevares.",
|
||||
"New tab": "",
|
||||
"New tab": "Ny fane",
|
||||
"New Temporary Chat": "Ny midlertidig chat",
|
||||
"New Terminal": "Ny terminal",
|
||||
"New Tool": "Nyt værktøj",
|
||||
"New Webhook": "Ny webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Nyt arbejdstræ",
|
||||
"new-channel": "ny-kanal",
|
||||
"Next": "Næste",
|
||||
"Next change": "Næste ændring",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Ingen apps forbundet.",
|
||||
"No authentication": "Ingen autentificering",
|
||||
"No automations found": "Ingen automatiseringer fundet",
|
||||
"No changes": "",
|
||||
"No changes": "Ingen ændringer",
|
||||
"No channels": "Ingen kanaler",
|
||||
"No chat alerts": "Ingen chatadvarsler",
|
||||
"No chat history": "Ingen chathistorik",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Ingen chats fundet",
|
||||
"No chats found for this user.": "Ingen besked-tråde fundet for denne bruger.",
|
||||
"No chats found.": "Ingen besked-tråde fundet.",
|
||||
"No checks": "",
|
||||
"No checks": "Ingen kontroller",
|
||||
"No comments yet": "Ingen kommentarer endnu",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Ingen ændringssæt endnu",
|
||||
"No content": "Intet indhold",
|
||||
"No content available": "Intet indhold tilgængeligt",
|
||||
"No content found": "Intet indhold fundet",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Intet tidligere forbrug",
|
||||
"No prompts found": "Ingen prompts fundet",
|
||||
"No prompts yet": "Ingen prompts endnu",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Ingen ændringsanmodninger",
|
||||
"No Repeat": "Ingen gentagelse",
|
||||
"No results": "Ingen resultater fundet",
|
||||
"No results found": "Ingen resultater fundet",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Ingen terminalforbindelse er konfigureret.",
|
||||
"No terminal connections configured.": "Ingen terminalforbindelser er konfigureret.",
|
||||
"No terminal servers available": "Ingen terminalservere tilgængelige",
|
||||
"No text changes": "",
|
||||
"No text changes": "Ingen tekstændringer",
|
||||
"No text differences": "Ingen tekstforskelle",
|
||||
"No tool server connections configured.": "Ingen forbindelser til værktøjsservere er konfigureret.",
|
||||
"No tools accessible": "Ingen værktøjer, du har adgang til",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Ingen ventiler at opdatere",
|
||||
"No webhooks yet": "Ingen webhooks endnu",
|
||||
"Node Ids": "Node Id'er",
|
||||
"none": "",
|
||||
"none": "ingen",
|
||||
"None": "Ingen",
|
||||
"None reported": "Ingen oplyst",
|
||||
"Not configured": "Ikke konfigureret",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! URL'en ser ud til at være ugyldig. Tjek den igen, og prøv igen.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Du bruger en metode, der ikke understøttes (kun frontend). Kør WebUI fra backend.",
|
||||
"Open": "Åbn",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Åbn en fane via +-menuen.",
|
||||
"Open automation": "Åbn automatisering",
|
||||
"Open chat": "Åbn chat",
|
||||
"Open create menu": "Åbn oprettelsesmenu",
|
||||
"Open file": "Åbn fil",
|
||||
"Open Folder": "Åbn mappe",
|
||||
"Open in full screen": "Åbn i fuld skærm",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Åbn på GitHub",
|
||||
"Open in new tab": "Åbn i ny fane",
|
||||
"Open link": "Åbn link",
|
||||
"Open modal to configure connection": "Åbn modal for at konfigurere forbindelse",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "parameter",
|
||||
"Parameter": "Parameter",
|
||||
"Parameters": "Parametre",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Overordnet mappe",
|
||||
"Parent group": "Overordnet gruppe",
|
||||
"Parent message not found": "Den overordnede besked blev ikke fundet",
|
||||
"Parent page": "Overordnet side",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Vælg en årsag",
|
||||
"Please select a valid JSON file": "Vælg en valid JSON-fil",
|
||||
"Please select at least one user for Direct Message channel.": "Vælg mindst én bruger til direkte besked-kanal.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Vent, indtil filerne er uploadet.",
|
||||
"Please wait until all files are uploaded.": "Vent venligst indtil alle filerne er uploadet.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP eller GIF. Op til 5 MiB og 25 megapixel.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Politikændringer gælder for nyoprettede terminaler. Opdater de tilsvarende terminaler for at anvende ændringerne på eksisterende terminaler.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Udbyder",
|
||||
"Provider context": "Udbyderens kontekstvindue",
|
||||
"Provider details": "Udbyderoplysninger",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proxy",
|
||||
"Public": "Offentlig",
|
||||
"Public key": "Offentlig nøgle",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Hent \"{{searchValue}}\" fra Ollama.com",
|
||||
"Pull a model from Ollama.com": "Hent en model fra Ollama.com",
|
||||
"Pull Model": "Hent model",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Handlinger for ændringsanmodning",
|
||||
"Pull request description": "Beskrivelse af ændringsanmodning",
|
||||
"Pull request title": "Titel på ændringsanmodning",
|
||||
"Punctuation": "Tegnsætning",
|
||||
"Pyodide file browser": "Pyodide-filbrowser",
|
||||
"Quality": "Kvalitet",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Læs dokumentationen",
|
||||
"Read-only": "Skrivebeskyttet",
|
||||
"Read-Only Access": "Kun læseadgang",
|
||||
"Ready": "",
|
||||
"Ready": "Marker som klar",
|
||||
"Realtime": "Realtid",
|
||||
"Realtime Voice": "Stemme i realtid",
|
||||
"Reason": "Årsag",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Anbefalet",
|
||||
"Reconnect": "Genopret forbindelse",
|
||||
"Reconnected": "Forbundet igen",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Genopretter forbindelsen…",
|
||||
"Record": "Optag",
|
||||
"Record voice": "Optag stemme",
|
||||
"Recorded duration": "Registreret varighed",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "Fjerner {{count}} forældet fil...",
|
||||
"Removing {{count}} stale files..._other": "Fjerner {{count}} forældede filer...",
|
||||
"Rename": "Omdøb",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Omdøb gren",
|
||||
"Rename page": "Omdøb side",
|
||||
"Renamed to {{name}}": "Omdøbt til {{name}}",
|
||||
"Rendered preview": "Gengivet forhåndsvisning",
|
||||
"Reopen": "",
|
||||
"Reopen": "Genåbn",
|
||||
"Reorder": "Skift rækkefølge",
|
||||
"Repeat": "Gentagelse",
|
||||
"Replace": "Erstat",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Svar på tråd...",
|
||||
"Replying to {{NAME}}": "Svarer {{NAME}}",
|
||||
"Reported by the provider.": "Oplyst af udbyderen.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Anmod om ændringer",
|
||||
"Requested scopes": "Anmodede adgangsområder",
|
||||
"Require an authenticator for all users": "Kræv godkendelsesapp for alle brugere",
|
||||
"required": "påkrævet",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Nulstil til standardværdier",
|
||||
"Reset view": "Nulstil visning",
|
||||
"Reset zoom": "Nulstil zoom",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Tilpas Git-panelets størrelse",
|
||||
"Resize panel": "Tilpas panelets størrelse",
|
||||
"Resolved": "Løst",
|
||||
"Response": "Svar",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "svar med registreret forbrug",
|
||||
"Restart": "Genstart",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Genstart alle Open WebUI-instanser for at anvende ændringerne i udbyderens forbindelsesindstillinger.",
|
||||
"Restricted": "Begrænset",
|
||||
"Result": "Resultat",
|
||||
"RESULT": "Resultat",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "Fandt {{count}} kildehenvisninger",
|
||||
"Retrieved 1 source": "Fandt en kildehenvisning",
|
||||
"Retry": "Prøv igen",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Prøv at registrere Git igen",
|
||||
"Retry setup": "Prøv opsætningen igen",
|
||||
"Return to call": "Vend tilbage til opkaldet",
|
||||
"Return to conversation": "Tilbage til samtalen",
|
||||
"Review": "Gennemgå",
|
||||
"Review the scopes this app is requesting before adding it.": "Gennemgå de adgangsområder, som denne app anmoder om, før du tilføjer den.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Kodegennemlæsere",
|
||||
"Revised": "Revideret",
|
||||
"Rewrite the selected text.": "Omskriv den valgte tekst.",
|
||||
"Role": "Rolle",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "Gem og opret",
|
||||
"Save & Update": "Gem og opdater",
|
||||
"Save and send": "Gem og send",
|
||||
"Save As": "",
|
||||
"Save As": "Gem som",
|
||||
"Save As Copy": "Gem som kopi",
|
||||
"Save Chat": "Gem chat",
|
||||
"Save draft as copy": "Gem kladde som kopi",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Søg efter handlinger",
|
||||
"Search all emojis": "Søg i alle emojis",
|
||||
"Search Automations": "Søg efter automatiseringer",
|
||||
"Search branches": "",
|
||||
"Search branches": "Søg efter grene",
|
||||
"Search built-in tools": "Søg i indbyggede værktøjer",
|
||||
"Search channels": "Søg efter kanaler",
|
||||
"Search Chats": "Søg i chats",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Søg efter eller tilføj mønster",
|
||||
"Search parent groups": "Søg i overordnede grupper",
|
||||
"Search Prompts": "Søg i prompts",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Søg efter ændringsanmodninger",
|
||||
"Search results": "Søgeresultater",
|
||||
"Search scopes": "Søg efter adgangsområder",
|
||||
"Search sessions": "Søg efter sessioner",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "Søg efter brugere eller grupper",
|
||||
"Search workspace": "Søg i arbejdsområdet",
|
||||
"Search workspace…": "Søg i arbejdsområdet…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Søg efter arbejdstræer",
|
||||
"Search your workspace": "Søg i dit arbejdsområde",
|
||||
"Searched {{count}} sites": "Søgte {{count}} sider",
|
||||
"Searching": "Søger",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Vælg en model for kun at vise den.",
|
||||
"Select a pipeline": "Vælg en pipeline",
|
||||
"Select a pipeline url": "Vælg en pipeline-URL",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Vælg en ændringsanmodning",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Vælg et interval for at filtrere sessioner. Delvist registreret forbrug er inkluderet.",
|
||||
"Select a reranking model engine": "Vælg en omarrangeringsmodel engine",
|
||||
"Select a role": "Vælg en rolle",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Vælg en terminal for at åbne localhost-URL'er.",
|
||||
"Select a theme": "Vælg et tema",
|
||||
"Select a tool": "Vælg et værktøj",
|
||||
"Select a voice": "Vælg en stemme",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Vælg indlæste filer",
|
||||
"Select Method": "Vælg metode",
|
||||
"Select model": "Vælg model",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Vælg kun én model",
|
||||
"Select only one model to call": "Vælg kun én model at kalde",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Vælg kun én model for at åbne en sidechat.",
|
||||
"Select options": "Vælg muligheder",
|
||||
"Select Skill": "Vælg færdighed",
|
||||
"Select to isolate model": "Vælg for kun at vise denne model",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Hent det aktuelle tidspunkt, og foretag beregninger med datoer og tidspunkter",
|
||||
"settings.admin.models.builtinTools.time.label": "Tid og beregning",
|
||||
"settings.admin.models.builtinTools.title": "Indbyggede værktøjer",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Opret Python-værktøjer i arbejdsområdet fra chatten",
|
||||
"settings.admin.models.builtinTools.tools.label": "Oprettelse af værktøjer",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Sæt et svar på pause for at stille brugeren et afklarende spørgsmål",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Spørg brugeren",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Søg på nettet, og hent URL'er",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Vis alle {{count}} bidragydere",
|
||||
"Show all {{count}} contributors_one": "Vis {{count}} bidragyder",
|
||||
"Show all {{count}} contributors_other": "Vis alle {{count}} bidragydere",
|
||||
"Show diff": "",
|
||||
"Show diff": "Vis forskelle",
|
||||
"Show Files": "Vis filer",
|
||||
"Show Hidden Files": "Vis skjulte filer",
|
||||
"Show image preview": "Vis billedforhåndsvisning",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Vis din støtte!",
|
||||
"Showcased creativity": "Udstillet kreativitet",
|
||||
"Showing search match": "Viser søgeresultat",
|
||||
"Side chat": "",
|
||||
"Side chat": "Sidechat",
|
||||
"Sidebar": "Sidepanel",
|
||||
"Sign in": "Log ind",
|
||||
"Sign in again": "Log ind igen",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Sprog til tale-til-tekst",
|
||||
"Split": "Opdelt",
|
||||
"Sponsor on GitHub": "Støt på GitHub",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL-forespørgsel",
|
||||
"Staan API Key": "Staan API-nøgle",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Klargjorte ændringer",
|
||||
"Standard": "Standard",
|
||||
"Start a new conversation": "Start en ny samtale",
|
||||
"Start a voice call using your microphone?": "Start et taleopkald med din mikrofon?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Foreslået",
|
||||
"Suggested prompts": "Foreslåede prompts",
|
||||
"Summarize this note.": "Opsummér denne note.",
|
||||
"Summary": "",
|
||||
"Summary": "Resumé",
|
||||
"Sun": "Søn",
|
||||
"Support": "Support",
|
||||
"Support this plugin:": "Støt dette plugin:",
|
||||
"Supported parameters": "Understøttede parametre",
|
||||
"Swap": "Byt om",
|
||||
"Swap sides": "Byt om på siderne",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Skift gren",
|
||||
"Switch camera": "Skift kamera",
|
||||
"Switch to Assistant role": "Skift til assistentrollen",
|
||||
"Switch to JSON editor": "Skift til JSON-editor",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Systeminstruktioner",
|
||||
"System Prompt": "Systemprompt",
|
||||
"Table": "Tabel",
|
||||
"Tabs": "",
|
||||
"Tabs": "Faner",
|
||||
"Tag": "Tag",
|
||||
"Tags": "Tags",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail free sampling bruges til at reducere påvirkningen af mindre sandsynlige tokens fra outputtet. En højere værdi (f.eks. 2,0) vil reducere påvirkningen mere, mens en værdi på 1,0 deaktiverer denne indstilling.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Fortæl mig et tilfældigt sjovt faktum om Romerriget",
|
||||
"Tell us more:": "Fortæl os mere:",
|
||||
"Temporary": "Midlertidig chat",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Midlertidig chat",
|
||||
"Temporary Chat": "Midlertidig chat",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Midlertidig chat: Slå midlertidig tilstand til eller fra for denne nye chat.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Dette kan ikke fortrydes. Svar forbliver synlige.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Denne kanal blev oprettet den {{createdAt}}. Dette er det helt første i kanalen {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Denne chat vil ikke vises i historikken, og dine beskeder vil ikke blive gemt.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Denne fil er allerede åben. Luk dens fane, eller vælg et andet navn.",
|
||||
"This folder is empty": "Denne mappe er tom",
|
||||
"This is a default user permission and will remain enabled.": "Dette er en standardbrugertilladelse og vil forblive aktiveret.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dette er en eksperimentel funktion, den fungerer muligvis ikke som forventet og kan ændres når som helst.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Uændrede linjer er udeladt",
|
||||
"Underline": "Understreget",
|
||||
"Undo": "Fortryd",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Fortryd seneste ændringssæt",
|
||||
"Undo the last commit and keep its changes staged?": "Vil du fortryde det seneste ændringssæt og beholde dets ændringer som klargjorte?",
|
||||
"Unified": "Samlet",
|
||||
"Uninstall": "Afinstaller",
|
||||
"Uninstall app": "Afinstaller app",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Slå mikrofonen til for at fortsætte",
|
||||
"Unpin": "Frigør",
|
||||
"Unpin from Sidebar": "Frigør fra sidepanelet",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Ikke sendt",
|
||||
"Unread": "Ulæst",
|
||||
"Unsaved changes": "Ikke-gemte ændringer",
|
||||
"Unsaved changes to this version will be discarded.": "Ikke-gemte ændringer i denne version bliver kasseret.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "Opdater alle modeller",
|
||||
"Update and Copy Link": "Opdater og kopier link",
|
||||
"Update app": "Opdater app",
|
||||
"Update branch": "",
|
||||
"Update branch": "Opdater gren",
|
||||
"Update for the latest features and improvements.": "Opdater for at få de nyeste funktioner og forbedringer.",
|
||||
"Update your status": "Opdater din status",
|
||||
"Updated": "Opdateret",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Brug standard",
|
||||
"Use device vibration feedback on supported Android devices.": "Brug vibrationsfeedback på understøttede Android-enheder.",
|
||||
"Use discovered scopes": "Brug fundne tilladelsesområder",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Brug faner i fuld bredde",
|
||||
"Use global setting": "Brug global indstilling",
|
||||
"Use groups to organize your users and assign permissions.": "Brug grupper til at organisere dine brugere og tildele tilladelser.",
|
||||
"Use in prompt": "Brug i prompt",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Brug segmenteret hentning til fokuseret og relevant indholdsudtræk.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Brug segmenteret hentning til fokuseret og relevant kontekst.",
|
||||
"Use segmented retrieval for focused context.": "Brug segmenteret hentning til fokuseret kontekst.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Brug faner ved siden af chatten",
|
||||
"Use these in model system prompts as {{example}}.": "Brug disse i modellernes systemprompts som {{example}}.",
|
||||
"Use Web Search?": "Brug websøgning?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Bruges i tilstanden for indbygget funktionskald. Indstillinger for arbejdsområdet og brugertilladelser gælder stadig.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Videoafspiller",
|
||||
"View": "Visning",
|
||||
"View changes": "",
|
||||
"View changes": "Vis ændringer",
|
||||
"View channel": "Vis kanal",
|
||||
"View chat": "Vis chat",
|
||||
"View comment": "Vis kommentar",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Vis på {{platform}}",
|
||||
"View Replies": "Vis svar",
|
||||
"View Result from {{NAME}}": "Vis resultat fra {{NAME}}",
|
||||
"View source": "Vis kilde",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "Arbejde",
|
||||
"Working Directory": "Arbejdsmappe",
|
||||
"Working Directory Context": "Kontekst for arbejdsmappe",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Ændringer i arbejdstræet",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Fungerer sammen med top-k. En højere værdi (f.eks. 0,95) vil føre til mere forskelligartet tekst, mens en lavere værdi (f.eks. 0,5) vil generere mere fokuseret og konservativ tekst.",
|
||||
"Workspace": "Arbejdsområde",
|
||||
"Workspace Models": "Modeller i arbejdsområdet",
|
||||
"Workspace Permissions": "Arbejdsområde rettigheder",
|
||||
"Workspace search": "Søgning i arbejdsområdet",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Arbejdstræets gren",
|
||||
"Worktree directory": "Arbejdstræets mappe",
|
||||
"Worktrees": "Arbejdstræer",
|
||||
"Write": "Skriv",
|
||||
"Write a prompt…": "Skriv en prompt…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Skriv en opsummering på 50 ord, der opsummerer {{topic}}.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Du har ikke tilladelse til at uploade filer til denne vidensbase.",
|
||||
"You do not have permission to upload files.": "Du har ikke rettighed til at uploade filer.",
|
||||
"You do not have permission to upload web content.": "Du har ikke tilladelse til at uploade webindhold.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Du har ikke tilladelse til at bruge sidechat.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Du har mere end 50 brugere, hvilket ofte betyder, at dette arbejdsområde bruges af en organisation. Open WebUI er gratis at bruge, som det er, uden begrænsninger eller skjulte grænser, og det vil vi gerne bevare.",
|
||||
"You have no archived conversations.": "Du har ingen arkiverede samtaler.",
|
||||
"You have no shared conversations.": "Du har ingen delte samtaler.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "Ein Chat-Durchlauf wurde erfolgreich abgeschlossen.",
|
||||
"A collaboration channel where people join as members": "Ein Kanal zur Zusammenarbeit, dem Mitglieder beitreten können",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Ein Diskussionskanal, dessen Zugriff durch Gruppen und Berechtigungen gesteuert wird",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Eine Datei mit diesem Namen ist bereits vorhanden. Ersetzen?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Eine neue Version (v{{LATEST_VERSION}}) ist jetzt verfügbar.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Eine Seite wurde an anderer Stelle geändert. Ihr vorheriger Text steht zum Download bereit.",
|
||||
"A private conversation between you and selected users": "Eine private Unterhaltung zwischen Ihnen und ausgewählten Benutzern",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Erlaubt die Auswahl ausgeblendeter Modelle als Basismodelle.",
|
||||
"Allow Sharing With Groups": "Teilen mit Gruppen erlauben",
|
||||
"Allow Sharing With Users": "Teilen mit Benutzern erlauben",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Neben-Chat erlauben",
|
||||
"Allow Speech to Text": "Sprache-zu-Text erlauben",
|
||||
"Allow Temporary Chat": "Temporäre Chats erlauben",
|
||||
"Allow Text to Speech": "Text-zu-Sprache erlauben",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Wendet Funktionen an, die Nachrichten verarbeiten, bevor oder nachdem das Modell antwortet.",
|
||||
"Apply to draft": "In Entwurf übernehmen",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Beim Übernehmen wird die vorgeschlagene Überarbeitung auf der rechten Seite verwendet. Speichern Sie anschließend Ihren Entwurf.",
|
||||
"Approve": "",
|
||||
"Approve": "Genehmigen",
|
||||
"Approximate comparison": "Ungefährer Vergleich",
|
||||
"Apps": "Apps",
|
||||
"April": "April",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Um Bestätigung bitten",
|
||||
"Ask or edit…": "Fragen stellen oder bearbeiten…",
|
||||
"Ask this knowledge source a test question": "Dieser Wissensquelle eine Testfrage stellen",
|
||||
"Assignees": "",
|
||||
"Assignees": "Zugewiesene Benutzer",
|
||||
"Assistance": "Unterstützung",
|
||||
"assistant": "Assistent",
|
||||
"Assistant": "Assistent",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Authenticator eingerichtet",
|
||||
"Authenticator not configured": "Authenticator nicht eingerichtet",
|
||||
"Authenticator setup QR code": "QR-Code zur Einrichtung des Authenticators",
|
||||
"Author": "",
|
||||
"Author": "Autor",
|
||||
"Authorize OAuth": "OAuth autorisieren",
|
||||
"Auto": "Automatisch",
|
||||
"Auto (Random)": "Auto (zufällig)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Azure AI Speech",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Zurück",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Zurück zu den Änderungen",
|
||||
"Back to files": "Zurück zu den Dateien",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Zurück zu den Pull-Requests",
|
||||
"Back to sign in": "Zurück zur Anmeldung",
|
||||
"Background Image": "Hintergrundbild",
|
||||
"Background image must be at most 25 megapixels.": "Das Hintergrundbild darf höchstens 25 Megapixel groß sein.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Sub-Agent im Hintergrund abgeschlossen",
|
||||
"background sub-agents": "Sub-Agents im Hintergrund",
|
||||
"Bad Response": "Schlechte Antwort",
|
||||
"Base branch": "",
|
||||
"Base branch": "Zielzweig",
|
||||
"Base Model (From)": "Basismodell (Von)",
|
||||
"Base Model is required.": "Basismodell ist erforderlich.",
|
||||
"Base Models": "Basismodelle",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "bereits geteilt",
|
||||
"Being lazy": "Faulheit",
|
||||
"Binary file — text comparison is unavailable.": "Binärdatei – Textvergleich ist nicht verfügbar.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Binärdatei geändert",
|
||||
"Binary file. Download to open.": "Binärdatei. Laden Sie sie herunter, um sie zu öffnen.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Blockoptionen",
|
||||
"Bold": "Fett",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Bevorzugung oder Benachteiligung spezifischer Token für die Antwortsteuerung. Bias-Werte werden zwischen -100 und 100 (inklusive) begrenzt. (Standard: keine)",
|
||||
"Both files are required for comparison.": "Für den Vergleich werden beide Dateien benötigt.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Zweigaktionen",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Browser",
|
||||
"Browser options": "Browser-Optionen",
|
||||
"build · {{hash}}": "Build · {{hash}}",
|
||||
"Built-in": "Integriert",
|
||||
"Bullet List": "Aufzählungsliste",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Ordnersymbol ändern",
|
||||
"Change overview": "Änderungsübersicht",
|
||||
"Change User Role": "Benutzerrolle ändern",
|
||||
"changed": "",
|
||||
"changed": "geändert",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Änderungen führen zur Abmeldung auf allen Geräten. Benutzer richten den Authenticator bei ihrer nächsten Anmeldung ein.",
|
||||
"Channel": "Kanal",
|
||||
"Channel deleted successfully": "Kanal erfolgreich gelöscht",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "OAuth-Discovery prüfen",
|
||||
"Check what is running in this chat.": "Prüfen, was in diesem Chat gerade läuft.",
|
||||
"Checking for updates...": "Suche nach Updates...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Auschecken",
|
||||
"Choose a date range to compare": "Wählen Sie einen Zeitraum für den Vergleich",
|
||||
"Choose a model before saving...": "Wählen Sie vor dem Speichern ein Modell...",
|
||||
"Choose a parent page. Subpages move with this page.": "Wählen Sie eine übergeordnete Seite. Unterseiten werden mit dieser Seite verschoben.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Modal schließen",
|
||||
"Close Modal": "Modal schließen",
|
||||
"Close pages": "Seiten schließen",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Pull-Request schließen",
|
||||
"Close search": "Suche schließen",
|
||||
"Close session details": "Sitzungsdetails schließen",
|
||||
"Close Sidebar": "Seitenleiste schließen",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Mitwirkende",
|
||||
"Collapse": "Einklappen",
|
||||
"Collapse {{name}}": "{{name}} einklappen",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Git-Bereich einklappen",
|
||||
"Collapse sessions": "Sitzungen einklappen",
|
||||
"Collapse terminal": "Terminal einklappen",
|
||||
"Collection": "Sammlung",
|
||||
"Collection Field": "Collection-Feld",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Kommentar gelöscht",
|
||||
"Comments": "Kommentare",
|
||||
"Comments are no longer available.": "Kommentare sind nicht mehr verfügbar.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Commit-Aktionen",
|
||||
"Commit message": "Commit-Nachricht",
|
||||
"Commit Message": "Commit-Nachricht",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Commit-Zusammenfassung",
|
||||
"Commit to {{branch}}": "Commit auf {{branch}} erstellen",
|
||||
"Community Reviews": "Community-Bewertungen",
|
||||
"Compact": "Verdichten",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Verdichten: ältere Nachrichten kürzen, damit dieser Chat fortgesetzt werden kann.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Konfiguration erfolgreich importiert",
|
||||
"Configure": "Konfigurieren",
|
||||
"Configure app": "App konfigurieren",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Konfiguriert Chat-Dateien, Valves, den System-Prompt und erweiterte Parameter.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Konfiguriert die Echtzeit-Stimme, den Sprach-Avatar und die Text-zu-Sprache-Stimme für dieses Modell.",
|
||||
"Confirm": "Bestätigen",
|
||||
"Confirm Password": "Passwort bestätigen",
|
||||
"Confirm Prompt from Embed": "Prompt aus Embed bestätigen",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Pull-Request-Aktion bestätigen",
|
||||
"Confirm recording": "Aufnahme bestätigen",
|
||||
"Confirm your action": "Bitte bestätigen",
|
||||
"Confirm your new password": "Neues Passwort bestätigen",
|
||||
"Confirm Your Password": "Passwort bestätigen",
|
||||
"Connect": "Verbinden",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Stellen Sie zuerst eine Verbindung her und wählen Sie ein Modell aus.",
|
||||
"Connect external apps to Open WebUI.": "Verbindet externe Apps mit Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Verbinden Sie sich mit einem KI-Anbieter, um zu chatten",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Stellt eine Verbindung zu Open-Terminal-Instanzen her. Administratoren und Benutzer mit Zugriff können über diese Server die Dateiansicht und Terminal-Werkzeuge nutzen.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Verbundene Apps",
|
||||
"Connecting": "Verbindung wird hergestellt",
|
||||
"Connecting...": "Verbindung wird hergestellt...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Verbindung wird hergestellt…",
|
||||
"Connection": "Verbindung",
|
||||
"Connection failed": "Verbindung fehlgeschlagen",
|
||||
"Connection ID": "Verbindungs-ID",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "Die Verbindungs-ID darf weder \":\" noch \"|\" enthalten",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Verbindung unterbrochen. Bitte versuchen Sie es erneut.",
|
||||
"Connection lost. Reconnecting...": "Verbindung unterbrochen. Wird wiederhergestellt...",
|
||||
"Connection successful": "Verbindung erfolgreich",
|
||||
"Connection Type": "Verbindungstyp",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Kopieren",
|
||||
"Copy {{name}} to clipboard": "{{name}} in die Zwischenablage kopieren",
|
||||
"Copy API Key": "API-Schlüssel kopieren",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Zweignamen kopieren",
|
||||
"Copy change to original": "Änderung ins Original kopieren",
|
||||
"Copy change to proposal": "Änderung in den Vorschlag kopieren",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Commit-Hash kopieren",
|
||||
"Copy content": "Inhalt kopieren",
|
||||
"Copy default": "Standard übernehmen",
|
||||
"Copy Last Code Block": "Letzten Code-Block kopieren",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Copyright (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS muss vom Anbieter korrekt konfiguriert sein, um Anfragen von Open WebUI zuzulassen.",
|
||||
"Could not check for updates": "Suche nach Updates fehlgeschlagen",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Zweigname konnte nicht kopiert werden",
|
||||
"Could not copy commit hash": "Commit-Hash konnte nicht kopiert werden",
|
||||
"Could not copy to clipboard. Please try again.": "Inhalt konnte nicht in die Zwischenablage kopiert werden. Bitte versuchen Sie es erneut.",
|
||||
"Could not determine the upload folder.": "Upload-Ordner konnte nicht ermittelt werden.",
|
||||
"Could not load avatar.": "Avatar konnte nicht geladen werden.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Konto erstellen",
|
||||
"Create Admin Account": "Admin-Konto erstellen",
|
||||
"Create announcements shown to users in the app.": "Erstellt Ankündigungen, die Benutzern in der App angezeigt werden.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Zweig erstellen",
|
||||
"Create Channel": "Kanal erstellen",
|
||||
"Create copy": "Kopie erstellen",
|
||||
"Create Folder": "Ordner erstellen",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Erstellen Sie geplante Prompts, die automatisch in regelmäßigen Abständen ausgeführt werden.",
|
||||
"Create skill": "Skill erstellen",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Skill erstellen: aus diesem Chat einen wiederverwendbaren Terminal-Skill erstellen.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Arbeitsbaum erstellen",
|
||||
"Create your first note from the Create menu.": "Erstellen Sie Ihre erste Notiz über das Menü \"Erstellen\".",
|
||||
"Created": "Erstellt",
|
||||
"Created at": "Erstellt am",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Wert des benutzerdef. Parameters",
|
||||
"Custom permissions": "Eigene Berechtigungen",
|
||||
"Custom range": "Benutzerdefinierter Bereich",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Benutzerdefinierter Zeitplan",
|
||||
"Customize": "Anpassen",
|
||||
"Daily": "Täglich",
|
||||
"Daily at": "Täglich um",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Daten",
|
||||
"Database": "Datenbank",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Datum",
|
||||
"Date Added": "Hinzugefügt am",
|
||||
"Date is required": "Datum ist erforderlich",
|
||||
"Date Modified": "Änderungsdatum",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Alle Inhalte in diesem Ordner löschen",
|
||||
"Delete API Key?": "API-Schlüssel löschen?",
|
||||
"Delete automation?": "Automatisierung löschen?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Zweig löschen",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Zweig {{branch}} löschen? Nicht zusammengeführte Zweige bleiben erhalten.",
|
||||
"Delete calendar": "Kalender löschen",
|
||||
"Delete Calendar": "Kalender löschen",
|
||||
"Delete Chat": "Chat löschen",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Beschreibung",
|
||||
"Description ({{language}})": "Beschreibung ({{language}})",
|
||||
"Deselect": "Abwählen",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Arbeitsoberfläche",
|
||||
"Desktop access denied. Reopen this tab.": "Zugriff auf die Arbeitsoberfläche verweigert. Öffnen Sie diesen Tab erneut.",
|
||||
"Desktop audio": "Audioausgabe der Arbeitsoberfläche",
|
||||
"Desktop audio is not supported by this browser.": "Die Audioausgabe der Arbeitsoberfläche wird von diesem Browser nicht unterstützt.",
|
||||
"Desktop audio unavailable.": "Audioausgabe der Arbeitsoberfläche nicht verfügbar.",
|
||||
"Desktop connection failed.": "Verbindung zur Arbeitsoberfläche fehlgeschlagen.",
|
||||
"Destination": "Ziel",
|
||||
"Detected Variables": "Erkannte Variablen",
|
||||
"dev build": "Dev-Build",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Änderungen im Vergleich verwerfen?",
|
||||
"Discard unsaved changes?": "Ungespeicherte Änderungen verwerfen?",
|
||||
"Discard unsaved skill changes?": "Ungespeicherte Änderungen am Skill verwerfen?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Ungespeicherte Änderungen an dieser Datei im Arbeitsbaum verwerfen? Dieser Vorgang kann nicht rückgängig gemacht werden.",
|
||||
"Disconnect OAuth": "OAuth trennen",
|
||||
"Disconnected": "Getrennt",
|
||||
"Discover a function": "Funktion entdecken",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "Wird heruntergeladen: \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "\"{{searchValue}}\" wird heruntergeladen",
|
||||
"Downloading stats...": "Statistiken werden heruntergeladen...",
|
||||
"Draft": "",
|
||||
"Draft": "Entwurf",
|
||||
"Drag and Drop Container": "Drag-and-Drop-Bereich",
|
||||
"Drag or use the up and down arrow keys to reorder": "Zum Umsortieren ziehen oder die Pfeiltasten nach oben und unten verwenden",
|
||||
"Drag to move": "Zum Verschieben ziehen",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Die CSV-Datei muss 4 Spalten in dieser Reihenfolge enthalten: Name, E-Mail, Passwort, Rolle.",
|
||||
"Enter {{role}} message here": "{{role}}-Nachricht hier eingeben",
|
||||
"Enter a Connection ID to register.": "Geben Sie zur Registrierung eine Verbindungs-ID ein.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Geben Sie einen Dateinamen ohne Schrägstriche ein.",
|
||||
"Enter a name, content, and a valid command.": "Geben Sie einen Namen, Inhalt und einen gültigen Befehl ein.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Titel für das Overlay 'Ausstehende Aktivierung'. Leer lassen für Standard.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Wasserzeichen für die Antwort. Leer lassen für keines.",
|
||||
"Enter additional headers in JSON format": "Zusätzliche Header im JSON-Format eingeben",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Zusätzliche Header im JSON-Format eingeben (z. B. {\"X-Custom-Header\": \"value\"})",
|
||||
"Enter additional parameters in JSON format": "Zusätzliche Parameter im JSON-Format eingeben",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Geben Sie eine HTTP- oder HTTPS-URL ohne Zugangsdaten ein.",
|
||||
"Enter api auth string (e.g. username:password)": "API-Auth-String eingeben (z. B. username:password)",
|
||||
"Enter Application DN": "Anwendungs-DN eingeben",
|
||||
"Enter Application DN Password": "Anwendungs-DN-Passwort eingeben",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Code zur Analyse ausführen",
|
||||
"Executing {{NAME}}...": "{{NAME}} wird ausgeführt...",
|
||||
"Execution timeline": "Ausführungszeitachse",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Vollbildmodus verlassen",
|
||||
"Expand": "Ausklappen",
|
||||
"Expand {{name}}": "{{name}} ausklappen",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Git-Bereich ausklappen",
|
||||
"Expand input": "Eingabefeld erweitern",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Sitzungen ausklappen",
|
||||
"Expand terminal": "Terminal ausklappen",
|
||||
"Experience": "Benutzererlebnis",
|
||||
"Experimental": "Experimentell",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Modelle konnten nicht importiert werden",
|
||||
"Failed to load chat": "Chat konnte nicht geladen werden",
|
||||
"Failed to load chat preview": "Chat-Vorschau konnte nicht geladen werden",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Verzeichnis konnte nicht geladen werden",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "DOCX-Datei konnte nicht geladen werden. Versuchen Sie stattdessen, sie herunterzuladen.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Excel/CSV-Datei konnte nicht geladen werden. Bitte versuchen Sie stattdessen, sie herunterzuladen.",
|
||||
"Failed to load file content.": "Dateiinhalt konnte nicht geladen werden.",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Verbindungen konnten nicht gespeichert werden",
|
||||
"Failed to save conversation": "Unterhaltung konnte nicht gespeichert werden",
|
||||
"Failed to save file": "Datei konnte nicht gespeichert werden",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Datei konnte nicht gespeichert werden. Ihre Änderungen befinden sich noch im Editor.",
|
||||
"Failed to save model": "Modell konnte nicht gespeichert werden",
|
||||
"Failed to save models configuration": "Modellkonfiguration konnte nicht gespeichert werden",
|
||||
"Failed to save policy: {{error}}": "Richtlinie konnte nicht gespeichert werden: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Dateiaktionen",
|
||||
"File added successfully.": "Datei erfolgreich hinzugefügt.",
|
||||
"File browser": "Datei-Browser",
|
||||
"File changes": "",
|
||||
"File changes": "Dateiänderungen",
|
||||
"File content": "Datei-Inhalt",
|
||||
"File content updated successfully.": "Dateiinhalt erfolgreich aktualisiert.",
|
||||
"File count limit": "Dateianzahllimit",
|
||||
"File created": "Datei erstellt",
|
||||
"File deleted successfully.": "Datei erfolgreich gelöscht.",
|
||||
"File differences": "Dateiunterschiede",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Die Datei ist nicht beschreibbar.",
|
||||
"File Mode": "Datei-Modus",
|
||||
"File moved.": "Datei verschoben.",
|
||||
"File name": "Dateiname",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "Informationen zu {{name}} in der UI abrufen",
|
||||
"Get started": "Loslegen",
|
||||
"Get started with {{WEBUI_NAME}}": "Loslegen mit {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Git-Änderungen",
|
||||
"Git unavailable": "Git nicht verfügbar",
|
||||
"Give me ideas": "Gib mir Ideen",
|
||||
"give me tips": "mit ein paar Tipps",
|
||||
"Global": "Global",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Quellzweig",
|
||||
"Headers": "Header",
|
||||
"Headers must be a valid JSON object": "Header müssen ein gültiges JSON-Objekt sein",
|
||||
"Height": "Höhe",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Verbergen",
|
||||
"Hide All": "Alle verstecken",
|
||||
"Hide conversation": "Unterhaltung ausblenden",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Vergleich ausblenden",
|
||||
"Hide from Sidebar": "Aus Seitenleiste ausblenden",
|
||||
"Hide Hidden Files": "Versteckte Dateien ausblenden",
|
||||
"Hide Model": "Modell verbergen",
|
||||
"Hide preview": "Vorschau ausblenden",
|
||||
"Hide sub-agents": "Sub-Agents ausblenden",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Tabs ausblenden",
|
||||
"Hide whitespace": "Leerraum ausblenden",
|
||||
"High": "Hoch",
|
||||
"History": "Verlauf",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Wissensquelle aktualisiert.",
|
||||
"Knowledge updated successfully": "Wissen erfolgreich aktualisiert",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Browser)",
|
||||
"Labels": "",
|
||||
"Labels": "Labels",
|
||||
"Last 12 months": "Letzte 12 Monate",
|
||||
"Last 24 hours": "Letzte 24 Stunden",
|
||||
"Last 30 days": "Letzte 30 Tage",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "März",
|
||||
"Mark all as read": "Alle als gelesen markieren",
|
||||
"Mark as unread": "Als ungelesen markieren",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Zur Überprüfung freigeben",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Markt",
|
||||
"Matching tabs: {{count}}_one": "Passender Tab: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Jemanden erwähnen",
|
||||
"Mentions only": "Nur Erwähnungen",
|
||||
"Menu": "Menü",
|
||||
"Merge": "",
|
||||
"Merge": "Zusammenführen",
|
||||
"Merge Responses": "Antworten zusammenführen",
|
||||
"Merged Response": "Zusammengeführte Antwort",
|
||||
"Message": "Nachricht",
|
||||
"Message counts and response timestamps": "Nachrichtenanzahl und Antwort-Zeitstempel",
|
||||
"Message counts are based on assistant responses.": "Die Nachrichtenanzahl basiert auf den Antworten des Assistenten.",
|
||||
"Message exceeds the 16 KiB limit.": "Die Nachricht überschreitet das Limit von 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Nachrichtennummer",
|
||||
"Message rating should be enabled to use this feature": "Nachrichtenbewertung muss aktiviert sein, um diese Funktion zu nutzen",
|
||||
"Message share": "Nachrichtenanteil",
|
||||
"Message text...": "Nachrichtentext...",
|
||||
"messages": "Nachrichten",
|
||||
"Messages": "Nachrichten",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Nachrichten sind Ende-zu-Ende-verschlüsselt und werden nicht gespeichert.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Nachrichten verschwinden, wenn Sie diesen Tab schließen.",
|
||||
"Metadata Field": "Metadatenfeld",
|
||||
"Microphone off": "Mikrofon aus",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Mistral-OCR-Parameter",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Mo",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Mobile Ansicht",
|
||||
"Model": "Modell",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modell '{{modelTag}}' befindet sich bereits in der Warteschlange.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Modelle erfolgreich importiert",
|
||||
"Models Public Sharing": "Öffentliche Freigabe von Modellen",
|
||||
"Models Sharing": "Modelle teilen",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Modelle, an die dieses Modell Aufgaben delegieren kann. Benutzer müssen Zugriff auf diese Modelle haben. Lassen Sie das Feld leer, um das aktuelle Modell zu verwenden.",
|
||||
"Modified": "Geändert",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Mo",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Zum vorherigen Chat wechseln",
|
||||
"Never": "Nie",
|
||||
"New": "Neu",
|
||||
"New branch": "",
|
||||
"New branch": "Neuer Zweig",
|
||||
"New Button": "Neue Schaltfläche",
|
||||
"New calendar": "Neuer Kalender",
|
||||
"New Calendar": "Neuer Kalender",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Neue Gruppe",
|
||||
"New Note": "Neue Notiz",
|
||||
"New Password": "Neues Passwort",
|
||||
"New pull request": "",
|
||||
"New pull request": "Neuer Pull-Request",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Neue Skills und Kopien sind privat. \"Ersetzen\" speichert eine neue Version und behält bestehende Freigaben bei.",
|
||||
"New tab": "",
|
||||
"New tab": "Neuer Tab",
|
||||
"New Temporary Chat": "Neuer temporärer Chat",
|
||||
"New Terminal": "Neues Terminal",
|
||||
"New Tool": "Neues Werkzeug",
|
||||
"New Webhook": "Neuer Webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Neuer Arbeitsbaum",
|
||||
"new-channel": "neuer-kanal",
|
||||
"Next": "Weiter",
|
||||
"Next change": "Nächste Änderung",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Keine Apps verbunden.",
|
||||
"No authentication": "Keine Authentifizierung",
|
||||
"No automations found": "Keine Automatisierungen gefunden",
|
||||
"No changes": "",
|
||||
"No changes": "Keine Änderungen",
|
||||
"No channels": "Keine Kanäle",
|
||||
"No chat alerts": "Keine Chat-Benachrichtigungen",
|
||||
"No chat history": "Kein Chatverlauf",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Keine Chats gefunden",
|
||||
"No chats found for this user.": "Keine Chats für diesen Benutzer gefunden.",
|
||||
"No chats found.": "Keine Chats gefunden.",
|
||||
"No checks": "",
|
||||
"No checks": "Keine Prüfungen",
|
||||
"No comments yet": "Noch keine Kommentare",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Noch keine Commits",
|
||||
"No content": "Kein Inhalt",
|
||||
"No content available": "Kein Inhalt verfügbar",
|
||||
"No content found": "Kein Inhalt gefunden",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Keine vorherige Nutzung",
|
||||
"No prompts found": "Keine Prompts gefunden",
|
||||
"No prompts yet": "Noch keine Prompts",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Keine Pull-Requests",
|
||||
"No Repeat": "Keine Wiederholung",
|
||||
"No results": "Keine Ergebnisse",
|
||||
"No results found": "Keine Ergebnisse gefunden",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Keine Terminalverbindung konfiguriert.",
|
||||
"No terminal connections configured.": "Keine Terminalverbindungen konfiguriert.",
|
||||
"No terminal servers available": "Keine Terminal-Server verfügbar",
|
||||
"No text changes": "",
|
||||
"No text changes": "Keine Textänderungen",
|
||||
"No text differences": "Keine Textunterschiede",
|
||||
"No tool server connections configured.": "Keine Tool-Server-Verbindungen konfiguriert.",
|
||||
"No tools accessible": "Keine Werkzeuge zugänglich",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Keine Valves zum Aktualisieren",
|
||||
"No webhooks yet": "Noch keine Webhooks",
|
||||
"Node Ids": "Knoten-IDs",
|
||||
"none": "",
|
||||
"none": "keine",
|
||||
"None": "Keine",
|
||||
"None reported": "Keine gemeldet",
|
||||
"Not configured": "Nicht konfiguriert",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Ups! Die URL scheint ungültig zu sein. Bitte überprüfen Sie diese und versuchen Sie es erneut.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ups! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI über das Backend bereit.",
|
||||
"Open": "Öffnen",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Öffnen Sie einen Tab über das Menü \"+\".",
|
||||
"Open automation": "Automatisierung öffnen",
|
||||
"Open chat": "Chat öffnen",
|
||||
"Open create menu": "Menü \"Erstellen\" öffnen",
|
||||
"Open file": "Datei öffnen",
|
||||
"Open Folder": "Ordner öffnen",
|
||||
"Open in full screen": "Im Vollbildmodus öffnen",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Auf GitHub öffnen",
|
||||
"Open in new tab": "In neuem Tab öffnen",
|
||||
"Open link": "Link öffnen",
|
||||
"Open modal to configure connection": "Verbindungskonfiguration öffnen",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "Parameter",
|
||||
"Parameter": "Parameter",
|
||||
"Parameters": "Parameter",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Übergeordnetes Verzeichnis",
|
||||
"Parent group": "Übergeordnete Gruppe",
|
||||
"Parent message not found": "Übergeordnete Nachricht nicht gefunden",
|
||||
"Parent page": "Übergeordnete Seite",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Bitte wählen Sie einen Grund aus",
|
||||
"Please select a valid JSON file": "Bitte wählen Sie eine gültige JSON-Datei aus",
|
||||
"Please select at least one user for Direct Message channel.": "Bitte wählen Sie mindestens einen Benutzer für den Direktnachrichten-Kanal aus.",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Bitte warten Sie, bis die Dateien vollständig hochgeladen sind.",
|
||||
"Please wait until all files are uploaded.": "Bitte warten Sie, bis alle Dateien hochgeladen sind.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP oder GIF. Bis zu 5 MiB und 25 Megapixel.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Änderungen an der Richtlinie gelten für neu bereitgestellte Terminals. Aktualisieren Sie die passenden Terminals, um die Änderungen auch dort zu übernehmen.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Anbieter",
|
||||
"Provider context": "Kontextfenster des Anbieters",
|
||||
"Provider details": "Anbieterdetails",
|
||||
"Proxy": "",
|
||||
"Proxy": "Proxy",
|
||||
"Public": "Öffentlich",
|
||||
"Public key": "Öffentlicher Schlüssel",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com laden",
|
||||
"Pull a model from Ollama.com": "Ein Modell von Ollama.com laden",
|
||||
"Pull Model": "Modell laden",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Pull-Request-Aktionen",
|
||||
"Pull request description": "Pull-Request-Beschreibung",
|
||||
"Pull request title": "Pull-Request-Titel",
|
||||
"Punctuation": "Satzzeichen",
|
||||
"Pyodide file browser": "Pyodide-Dateibrowser",
|
||||
"Quality": "Qualität",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Zur Dokumentation",
|
||||
"Read-only": "Schreibgeschützt",
|
||||
"Read-Only Access": "Nur lesender Zugriff",
|
||||
"Ready": "",
|
||||
"Ready": "Zur Überprüfung freigeben",
|
||||
"Realtime": "Echtzeit",
|
||||
"Realtime Voice": "Echtzeit-Stimme",
|
||||
"Reason": "Grund",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Empfohlen",
|
||||
"Reconnect": "Erneut verbinden",
|
||||
"Reconnected": "Erneut verbunden",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Verbindung wird erneut hergestellt…",
|
||||
"Record": "Aufnehmen",
|
||||
"Record voice": "Stimme aufnehmen",
|
||||
"Recorded duration": "Aufgezeichnete Dauer",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "{{count}} veraltete Datei wird entfernt...",
|
||||
"Removing {{count}} stale files..._other": "{{count}} veraltete Dateien werden entfernt...",
|
||||
"Rename": "Umbenennen",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Zweig umbenennen",
|
||||
"Rename page": "Seite umbenennen",
|
||||
"Renamed to {{name}}": "In {{name}} umbenannt",
|
||||
"Rendered preview": "Gerenderte Vorschau",
|
||||
"Reopen": "",
|
||||
"Reopen": "Erneut öffnen",
|
||||
"Reorder": "Neu anordnen",
|
||||
"Repeat": "Wiederholung",
|
||||
"Replace": "Ersetzen",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Im Thread antworten...",
|
||||
"Replying to {{NAME}}": "Antwort an {{NAME}}",
|
||||
"Reported by the provider.": "Vom Anbieter gemeldet.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Änderungen anfordern",
|
||||
"Requested scopes": "Angeforderte Scopes",
|
||||
"Require an authenticator for all users": "Authenticator für alle Benutzer vorschreiben",
|
||||
"required": "erforderlich",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Auf Standardwerte zurücksetzen",
|
||||
"Reset view": "Ansicht zurücksetzen",
|
||||
"Reset zoom": "Zoom zurücksetzen",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Größe des Git-Bereichs ändern",
|
||||
"Resize panel": "Bereichsgröße ändern",
|
||||
"Resolved": "Erledigt",
|
||||
"Response": "Antwort",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "Antworten mit aufgezeichneter Nutzung",
|
||||
"Restart": "Neustarten",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Starten Sie alle Instanzen von Open WebUI neu, um Änderungen an den Verbindungseinstellungen des Anbieters anzuwenden.",
|
||||
"Restricted": "Eingeschränkt",
|
||||
"Result": "Ergebnis",
|
||||
"RESULT": "ERGEBNIS",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "{{count}} Quellen abgerufen",
|
||||
"Retrieved 1 source": "1 Quelle abgerufen",
|
||||
"Retry": "Erneut versuchen",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Git-Erkennung erneut versuchen",
|
||||
"Retry setup": "Einrichtung erneut versuchen",
|
||||
"Return to call": "Zurück zum Anruf",
|
||||
"Return to conversation": "Zurück zur Unterhaltung",
|
||||
"Review": "Überprüfen",
|
||||
"Review the scopes this app is requesting before adding it.": "Überprüfen Sie die von dieser App angeforderten Scopes, bevor Sie die App hinzufügen.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Prüfer",
|
||||
"Revised": "Überarbeitet",
|
||||
"Rewrite the selected text.": "Den markierten Text umformulieren.",
|
||||
"Role": "Rolle",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "Speichern & Erstellen",
|
||||
"Save & Update": "Speichern & Aktualisieren",
|
||||
"Save and send": "Speichern und senden",
|
||||
"Save As": "",
|
||||
"Save As": "Speichern unter",
|
||||
"Save As Copy": "Als Kopie speichern",
|
||||
"Save Chat": "Chat speichern",
|
||||
"Save draft as copy": "Entwurf als Kopie speichern",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Aktionen durchsuchen",
|
||||
"Search all emojis": "Alle Emojis durchsuchen",
|
||||
"Search Automations": "Automatisierungen suchen",
|
||||
"Search branches": "",
|
||||
"Search branches": "Zweige durchsuchen",
|
||||
"Search built-in tools": "Eingebaute Werkzeuge durchsuchen",
|
||||
"Search channels": "Kanäle durchsuchen",
|
||||
"Search Chats": "Chats durchsuchen...",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Muster suchen oder hinzufügen",
|
||||
"Search parent groups": "Übergeordnete Gruppen durchsuchen",
|
||||
"Search Prompts": "Prompts durchsuchen...",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Pull-Requests durchsuchen",
|
||||
"Search results": "Suchergebnisse",
|
||||
"Search scopes": "Scopes durchsuchen",
|
||||
"Search sessions": "Sitzungen durchsuchen",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "Benutzer oder Gruppen suchen",
|
||||
"Search workspace": "Arbeitsbereich durchsuchen",
|
||||
"Search workspace…": "Arbeitsbereich durchsuchen…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Arbeitsbäume durchsuchen",
|
||||
"Search your workspace": "Ihren Arbeitsbereich durchsuchen",
|
||||
"Searched {{count}} sites": "{{count}} Seiten durchsucht",
|
||||
"Searching": "Suche...",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Wählen Sie ein Modell, um es einzeln anzuzeigen.",
|
||||
"Select a pipeline": "Wählen Sie eine Pipeline",
|
||||
"Select a pipeline url": "Wählen Sie eine Pipeline-URL",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Wählen Sie einen Pull-Request aus",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Wählen Sie einen Bereich, um Sitzungen zu filtern. Teilweise aufgezeichnete Nutzung wird einbezogen.",
|
||||
"Select a reranking model engine": "Wählen Sie eine Reranking-Modell-Engine",
|
||||
"Select a role": "Wählen Sie eine Rolle",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Wählen Sie ein Terminal aus, um localhost-URLs zu öffnen.",
|
||||
"Select a theme": "Wählen Sie ein Design",
|
||||
"Select a tool": "Wählen Sie ein Werkzeug",
|
||||
"Select a voice": "Wählen Sie eine Stimme",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Geladene Dateien auswählen",
|
||||
"Select Method": "Methode auswählen",
|
||||
"Select model": "Modell auswählen",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Wählen Sie nur ein Modell aus",
|
||||
"Select only one model to call": "Wählen Sie nur ein Modell zum Aufrufen aus",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Wählen Sie nur ein Modell aus, um einen Neben-Chat zu öffnen.",
|
||||
"Select options": "Optionen auswählen",
|
||||
"Select Skill": "Skill auswählen",
|
||||
"Select to isolate model": "Auswählen, um das Modell einzeln anzuzeigen",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Aktuelle Uhrzeit abrufen und Datums-/Zeitberechnungen durchführen",
|
||||
"settings.admin.models.builtinTools.time.label": "Zeit & Berechnung",
|
||||
"settings.admin.models.builtinTools.title": "Eingebaute Werkzeuge",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Python-Werkzeuge im Arbeitsbereich aus dem Chat heraus erstellen",
|
||||
"settings.admin.models.builtinTools.tools.label": "Werkzeugerstellung",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Eine Antwort anhalten, um dem Benutzer eine Rückfrage zu stellen",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Benutzer fragen",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Das Internet durchsuchen und URLs abrufen",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Alle {{count}} Beitragenden anzeigen",
|
||||
"Show all {{count}} contributors_one": "{{count}} Beitragenden anzeigen",
|
||||
"Show all {{count}} contributors_other": "Alle {{count}} Beitragenden anzeigen",
|
||||
"Show diff": "",
|
||||
"Show diff": "Vergleich anzeigen",
|
||||
"Show Files": "Dateien anzeigen",
|
||||
"Show Hidden Files": "Versteckte Dateien anzeigen",
|
||||
"Show image preview": "Bildvorschau anzeigen",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Zeigen Sie Ihre Unterstützung!",
|
||||
"Showcased creativity": "Kreativität gezeigt",
|
||||
"Showing search match": "Suchtreffer wird angezeigt",
|
||||
"Side chat": "",
|
||||
"Side chat": "Neben-Chat",
|
||||
"Sidebar": "Seitenleiste",
|
||||
"Sign in": "Anmelden",
|
||||
"Sign in again": "Erneut anmelden",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Sprache für Spracherkennung",
|
||||
"Split": "Nebeneinander",
|
||||
"Sponsor on GitHub": "Auf GitHub sponsern",
|
||||
"SQL query": "",
|
||||
"SQL query": "SQL-Abfrage",
|
||||
"Staan API Key": "Staan API-Schlüssel",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Für den Commit vorgemerkte Änderungen",
|
||||
"Standard": "Standard",
|
||||
"Start a new conversation": "Neue Unterhaltung beginnen",
|
||||
"Start a voice call using your microphone?": "Sprachanruf mit Ihrem Mikrofon starten?",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Vorgeschlagen",
|
||||
"Suggested prompts": "Vorgeschlagene Prompts",
|
||||
"Summarize this note.": "Diese Notiz zusammenfassen.",
|
||||
"Summary": "",
|
||||
"Summary": "Zusammenfassung",
|
||||
"Sun": "So",
|
||||
"Support": "Unterstützung",
|
||||
"Support this plugin:": "Unterstützen Sie dieses Plugin:",
|
||||
"Supported parameters": "Unterstützte Parameter",
|
||||
"Swap": "Tauschen",
|
||||
"Swap sides": "Seiten tauschen",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Zweig wechseln",
|
||||
"Switch camera": "Kamera wechseln",
|
||||
"Switch to Assistant role": "Zur Rolle \"Assistent\" wechseln",
|
||||
"Switch to JSON editor": "Zum JSON-Editor wechseln",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Systemanweisungen",
|
||||
"System Prompt": "System-Prompt",
|
||||
"Table": "Tabelle",
|
||||
"Tabs": "",
|
||||
"Tabs": "Tabs",
|
||||
"Tag": "Tag",
|
||||
"Tags": "Tags",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail-Free Sampling reduziert den Einfluss weniger wahrscheinlicher Token in der Ausgabe. Ein höherer Wert (z. B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Erzähl mir einen zufälligen Fun Fact über das Römische Reich",
|
||||
"Tell us more:": "Erzählen Sie uns mehr:",
|
||||
"Temporary": "Temporär",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Temporärer Chat",
|
||||
"Temporary Chat": "Temporärer Chat",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Temporär: temporären Chat für diesen neuen Chat ein- oder ausschalten.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Dieser Vorgang kann nicht rückgängig gemacht werden. Antworten bleiben sichtbar.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dieser Kanal wurde am {{createdAt}} erstellt. Dies ist der Anfang des Kanals {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Dieser Chat erscheint nicht im Verlauf und Ihre Nachrichten werden nicht gespeichert.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Diese Datei ist bereits geöffnet. Schließen Sie ihren Tab oder wählen Sie einen anderen Namen.",
|
||||
"This folder is empty": "Dieser Ordner ist leer",
|
||||
"This is a default user permission and will remain enabled.": "Dies ist eine Standardberechtigung und bleibt aktiviert.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion. Sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Unveränderte Zeilen ausgelassen",
|
||||
"Underline": "Unterstreichen",
|
||||
"Undo": "Rückgängig machen",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Letzten Commit rückgängig machen",
|
||||
"Undo the last commit and keep its changes staged?": "Den letzten Commit rückgängig machen und seine Änderungen für den Commit vorgemerkt lassen?",
|
||||
"Unified": "Untereinander",
|
||||
"Uninstall": "Deinstallieren",
|
||||
"Uninstall app": "App deinstallieren",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Stummschaltung aufheben, um fortzufahren",
|
||||
"Unpin": "Lösen",
|
||||
"Unpin from Sidebar": "Aus der Seitenleiste lösen",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Noch nicht übertragen",
|
||||
"Unread": "Ungelesen",
|
||||
"Unsaved changes": "Ungespeicherte Änderungen",
|
||||
"Unsaved changes to this version will be discarded.": "Ungespeicherte Änderungen an dieser Version werden verworfen.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "Alle Modelle aktualisieren",
|
||||
"Update and Copy Link": "Aktualisieren und Link kopieren",
|
||||
"Update app": "App aktualisieren",
|
||||
"Update branch": "",
|
||||
"Update branch": "Zweig aktualisieren",
|
||||
"Update for the latest features and improvements.": "Führen Sie ein Update für die neuesten Funktionen und Verbesserungen durch.",
|
||||
"Update your status": "Status aktualisieren",
|
||||
"Updated": "Aktualisiert",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Standard verwenden",
|
||||
"Use device vibration feedback on supported Android devices.": "Nutzt die Vibration des Geräts auf unterstützten Android-Geräten.",
|
||||
"Use discovered scopes": "Erkannte Scopes verwenden",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Tabs in voller Breite anzeigen",
|
||||
"Use global setting": "Globale Einstellung verwenden",
|
||||
"Use groups to organize your users and assign permissions.": "Verwenden Sie Gruppen, um Ihre Benutzer zu organisieren und Berechtigungen zu vergeben.",
|
||||
"Use in prompt": "Im Prompt verwenden",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Verwendet segmentiertes Retrieval, um gezielt relevante Inhalte zu extrahieren.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Verwendet segmentiertes Retrieval für einen gezielten und relevanten Kontext.",
|
||||
"Use segmented retrieval for focused context.": "Verwendet segmentiertes Retrieval für einen gezielten Kontext.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Tabs seitlich anzeigen",
|
||||
"Use these in model system prompts as {{example}}.": "Verwenden Sie diese in System-Prompts von Modellen als {{example}}.",
|
||||
"Use Web Search?": "Websuche verwenden?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Wird im nativen Funktionsaufruf-Modus verwendet. Arbeitsbereichseinstellungen und Benutzerberechtigungen gelten weiterhin.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Video",
|
||||
"Video player": "Videoplayer",
|
||||
"View": "Ansicht",
|
||||
"View changes": "",
|
||||
"View changes": "Änderungen anzeigen",
|
||||
"View channel": "Kanal anzeigen",
|
||||
"View chat": "Chat ansehen",
|
||||
"View comment": "Kommentar anzeigen",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Auf {{platform}} anzeigen",
|
||||
"View Replies": "Antworten anzeigen",
|
||||
"View Result from {{NAME}}": "Ergebnis von {{NAME}} ansehen",
|
||||
"View source": "Quelltext anzeigen",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "Arbeit",
|
||||
"Working Directory": "Arbeitsverzeichnis",
|
||||
"Working Directory Context": "Kontext des Arbeitsverzeichnisses",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Änderungen im Arbeitsbaum",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Funktioniert zusammen mit Top-K. Ein höherer Wert (z. B. 0.95) führt zu vielfältigerem Text, während ein niedrigerer Wert (z. B. 0.5) fokussierteren und konservativeren Text erzeugt.",
|
||||
"Workspace": "Arbeitsbereich",
|
||||
"Workspace Models": "Arbeitsbereichsmodelle",
|
||||
"Workspace Permissions": "Arbeitsbereichsberechtigungen",
|
||||
"Workspace search": "Arbeitsbereichssuche",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Zweig des Arbeitsbaums",
|
||||
"Worktree directory": "Verzeichnis des Arbeitsbaums",
|
||||
"Worktrees": "Arbeitsbäume",
|
||||
"Write": "Schreiben",
|
||||
"Write a prompt…": "Prompt schreiben…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Schreiben Sie eine Zusammenfassung in 50 Wörtern über {{topic}}.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Sie haben keine Berechtigung, Dateien in diesen Wissensspeicher hochzuladen.",
|
||||
"You do not have permission to upload files.": "Sie haben keine Berechtigung, Dateien hochzuladen.",
|
||||
"You do not have permission to upload web content.": "Sie haben keine Berechtigung, Webinhalte hochzuladen.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Sie haben keine Berechtigung, den Neben-Chat zu verwenden.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Sie haben mehr als 50 Benutzer – das deutet meist darauf hin, dass dieser Arbeitsbereich organisationsweit genutzt wird. Open WebUI ist in dieser Form kostenlos nutzbar, ohne Einschränkungen oder versteckte Limits, und das soll auch so bleiben.",
|
||||
"You have no archived conversations.": "Sie haben keine archivierten Unterhaltungen.",
|
||||
"You have no shared conversations.": "Sie haben keine geteilten Unterhaltungen.",
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@
|
|||
"A chat run finished successfully.": "Μια εκτέλεση συνομιλίας ολοκληρώθηκε με επιτυχία.",
|
||||
"A collaboration channel where people join as members": "Ένα κανάλι συνεργασίας όπου οι χρήστες συμμετέχουν ως μέλη",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Ένα κανάλι συζήτησης όπου η πρόσβαση ελέγχεται από ομάδες και δικαιώματα",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Υπάρχει ήδη αρχείο με αυτό το όνομα. Αντικατάσταση;",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Μια νέα έκδοση (v{{LATEST_VERSION}}) είναι τώρα διαθέσιμη.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Μια σελίδα άλλαξε αλλού. Το προηγούμενο κείμενό σας είναι διαθέσιμο για λήψη.",
|
||||
"A private conversation between you and selected users": "Μια ιδιωτική συνομιλία ανάμεσα σε εσάς και επιλεγμένους χρήστες",
|
||||
|
|
@ -241,7 +241,7 @@
|
|||
"Allow selecting hidden models as base models.": "Επιτρέπει την επιλογή κρυφών μοντέλων ως βασικών μοντέλων.",
|
||||
"Allow Sharing With Groups": "Επιτρέπεται η κοινή χρήση με ομάδες",
|
||||
"Allow Sharing With Users": "Επιτρέπεται η κοινή χρήση με χρήστες",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Επιτρέπεται η πλευρική συνομιλία",
|
||||
"Allow Speech to Text": "Επιτρέπεται η Μετατροπή Φωνής σε Κείμενο",
|
||||
"Allow Temporary Chat": "Επιτρέπεται η Προσωρινή Συνομιλία",
|
||||
"Allow Text to Speech": "Επιτρέπεται η Μετατροπή Κειμένου σε Φωνή",
|
||||
|
|
@ -290,7 +290,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Εφαρμόστε λειτουργίες που επεξεργάζονται τα μηνύματα πριν ή μετά την απάντηση του μοντέλου.",
|
||||
"Apply to draft": "Εφαρμογή στο προσχέδιο",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Η εφαρμογή στο προσχέδιο χρησιμοποιεί την προτεινόμενη αναθεώρηση στα δεξιά. Στη συνέχεια, αποθηκεύστε το προσχέδιό σας.",
|
||||
"Approve": "",
|
||||
"Approve": "Έγκριση",
|
||||
"Approximate comparison": "Προσεγγιστική σύγκριση",
|
||||
"Apps": "Εφαρμογές",
|
||||
"April": "Απρίλιος",
|
||||
|
|
@ -323,7 +323,7 @@
|
|||
"Ask for approval": "Αίτημα έγκρισης",
|
||||
"Ask or edit…": "Ρωτήστε ή επεξεργαστείτε…",
|
||||
"Ask this knowledge source a test question": "Κάντε μια δοκιμαστική ερώτηση σε αυτή την πηγή γνώσης",
|
||||
"Assignees": "",
|
||||
"Assignees": "Υπεύθυνοι",
|
||||
"Assistance": "Υποβοήθηση",
|
||||
"assistant": "βοηθός",
|
||||
"Assistant": "Βοηθός",
|
||||
|
|
@ -351,7 +351,7 @@
|
|||
"Authenticator configured": "Η εφαρμογή ταυτοποίησης έχει ρυθμιστεί",
|
||||
"Authenticator not configured": "Η εφαρμογή ταυτοποίησης δεν έχει ρυθμιστεί",
|
||||
"Authenticator setup QR code": "Κωδικός QR για τη ρύθμιση της εφαρμογής ταυτοποίησης",
|
||||
"Author": "",
|
||||
"Author": "Συντάκτης",
|
||||
"Authorize OAuth": "Εξουσιοδότηση OAuth",
|
||||
"Auto": "Αυτόματο",
|
||||
"Auto (Random)": "Αυτόματο (τυχαίο)",
|
||||
|
|
@ -384,9 +384,9 @@
|
|||
"Azure AI Speech": "Ομιλία Azure AI",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Πίσω",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Επιστροφή στις αλλαγές",
|
||||
"Back to files": "Επιστροφή στα αρχεία",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Επιστροφή στα αιτήματα ενσωμάτωσης",
|
||||
"Back to sign in": "Επιστροφή στη σύνδεση",
|
||||
"Background Image": "Εικόνα φόντου",
|
||||
"Background image must be at most 25 megapixels.": "Η εικόνα φόντου πρέπει να είναι το πολύ 25 megapixel.",
|
||||
|
|
@ -396,7 +396,7 @@
|
|||
"Background sub-agent finished": "Ο υποπράκτορας στο παρασκήνιο ολοκλήρωσε την εργασία του",
|
||||
"background sub-agents": "υποπράκτορες στο παρασκήνιο",
|
||||
"Bad Response": "Κακή Απάντηση",
|
||||
"Base branch": "",
|
||||
"Base branch": "Κλάδος βάσης",
|
||||
"Base Model (From)": "Βασικό Μοντέλο (Από)",
|
||||
"Base Model is required.": "Απαιτείται βασικό μοντέλο.",
|
||||
"Base Models": "Βασικά μοντέλα",
|
||||
|
|
@ -407,17 +407,17 @@
|
|||
"before": "πριν",
|
||||
"Being lazy": "Τρώλακας",
|
||||
"Binary file — text comparison is unavailable.": "Δυαδικό αρχείο — η σύγκριση κειμένου δεν είναι διαθέσιμη.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Το δυαδικό αρχείο άλλαξε",
|
||||
"Binary file. Download to open.": "Δυαδικό αρχείο. Κατεβάστε το για να το ανοίξετε.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Επιλογές μπλοκ",
|
||||
"Bold": "Έντονα",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Ενίσχυση ή επιβολή ποινής σε συγκεκριμένα token για περιορισμένες απαντήσεις. Οι τιμές μεροληψίας θα περιοριστούν μεταξύ -100 και 100 (συμπεριλαμβανομένων). (Προεπιλογή: καμία)",
|
||||
"Both files are required for comparison.": "Απαιτούνται και τα δύο αρχεία για τη σύγκριση.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Ενέργειες κλάδου",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Περιηγητής",
|
||||
"Browser options": "Επιλογές περιηγητή",
|
||||
"build · {{hash}}": "δομή · {{hash}}",
|
||||
"Built-in": "Ενσωματωμένη",
|
||||
"Bullet List": "Λίστα με κουκκίδες",
|
||||
|
|
@ -454,7 +454,7 @@
|
|||
"Change folder icon": "Αλλαγή εικονιδίου φακέλου",
|
||||
"Change overview": "Επισκόπηση αλλαγών",
|
||||
"Change User Role": "Αλλαγή ρόλου χρήστη",
|
||||
"changed": "",
|
||||
"changed": "με αλλαγές",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Οι αλλαγές αποσυνδέουν όλες τις συσκευές. Οι χρήστες ρυθμίζουν την εφαρμογή ταυτοποίησης κατά την επόμενη σύνδεσή τους.",
|
||||
"Channel": "Κανάλι",
|
||||
"Channel deleted successfully": "Το κανάλι διαγράφηκε επιτυχώς",
|
||||
|
|
@ -499,7 +499,7 @@
|
|||
"Check OAuth Discovery": "Έλεγχος ανακάλυψης OAuth",
|
||||
"Check what is running in this chat.": "Έλεγχος όσων εκτελούνται σε αυτή τη συνομιλία.",
|
||||
"Checking for updates...": "Ελέγχεται για ενημερώσεις...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Μετάβαση στον κλάδο",
|
||||
"Choose a date range to compare": "Επιλέξτε ένα εύρος ημερομηνιών για σύγκριση",
|
||||
"Choose a model before saving...": "Επιλέξτε ένα μοντέλο πριν αποθηκεύσετε...",
|
||||
"Choose a parent page. Subpages move with this page.": "Επιλέξτε μια γονική σελίδα. Οι υποσελίδες μετακινούνται μαζί με αυτή τη σελίδα.",
|
||||
|
|
@ -561,7 +561,7 @@
|
|||
"Close modal": "Κλείσιμο παραθύρου διαλόγου",
|
||||
"Close Modal": "Κλείσιμο παραθύρου διαλόγου",
|
||||
"Close pages": "Κλείσιμο σελίδων",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Κλείσιμο αιτήματος ενσωμάτωσης",
|
||||
"Close search": "Κλείσιμο αναζήτησης",
|
||||
"Close session details": "Κλείσιμο λεπτομερειών περιόδου σύνδεσης",
|
||||
"Close Sidebar": "Κλείσιμο πλευρικής μπάρας",
|
||||
|
|
@ -579,8 +579,8 @@
|
|||
"Collaborators": "Συνεργάτες",
|
||||
"Collapse": "Σύμπτυξη",
|
||||
"Collapse {{name}}": "Σύμπτυξη της ομάδας «{{name}}»",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Σύμπτυξη πλαισίου Git",
|
||||
"Collapse sessions": "Σύμπτυξη περιόδων λειτουργίας",
|
||||
"Collapse terminal": "Σύμπτυξη τερματικού",
|
||||
"Collection": "Συλλογή",
|
||||
"Collection Field": "Πεδίο συλλογής",
|
||||
|
|
@ -598,11 +598,11 @@
|
|||
"Comment deleted": "Το σχόλιο διαγράφηκε",
|
||||
"Comments": "Σχόλια",
|
||||
"Comments are no longer available.": "Τα σχόλια δεν είναι πλέον διαθέσιμα.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Ενέργειες καταχώρισης αλλαγών",
|
||||
"Commit message": "Μήνυμα αλλαγών",
|
||||
"Commit Message": "Μήνυμα αλλαγών",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Σύνοψη καταχώρισης αλλαγών",
|
||||
"Commit to {{branch}}": "Καταχώριση αλλαγών στον κλάδο {{branch}}",
|
||||
"Community Reviews": "Κριτικές κοινότητας",
|
||||
"Compact": "Συμπύκνωση",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Συμπύκνωση: σύντμηση παλαιότερων μηνυμάτων, ώστε η συνομιλία να μπορεί να συνεχιστεί.",
|
||||
|
|
@ -630,18 +630,18 @@
|
|||
"Config imported successfully": "Η διαμόρφωση εισήχθη με επιτυχία",
|
||||
"Configure": "Διαμόρφωση",
|
||||
"Configure app": "Διαμόρφωση εφαρμογής",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Διαμόρφωση των αρχείων συνομιλίας, των βαλβίδων, της προτροπής συστήματος και των προηγμένων παραμέτρων.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Ρυθμίστε τη φωνή πραγματικού χρόνου, το άβαταρ φωνής και τη φωνή μετατροπής κειμένου σε ομιλία για αυτό το μοντέλο.",
|
||||
"Confirm": "Επιβεβαίωση",
|
||||
"Confirm Password": "Επιβεβαίωση Κωδικού",
|
||||
"Confirm Prompt from Embed": "Επιβεβαίωση προτροπής από ενσωματωμένο περιεχόμενο",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Επιβεβαίωση ενέργειας αιτήματος ενσωμάτωσης",
|
||||
"Confirm recording": "Επιβεβαίωση ηχογράφησης",
|
||||
"Confirm your action": "Επιβεβαιώστε την ενέργειά σας",
|
||||
"Confirm your new password": "Επιβεβαιώστε τον νέο σας κωδικό",
|
||||
"Confirm Your Password": "Επιβεβαιώστε τον Κωδικό σας",
|
||||
"Connect": "Σύνδεση",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Συνδεθείτε και επιλέξτε πρώτα ένα μοντέλο.",
|
||||
"Connect external apps to Open WebUI.": "Συνδέστε εξωτερικές εφαρμογές στο Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Συνδεθείτε σε έναν πάροχο τεχνητής νοημοσύνης για να ξεκινήσετε τη συνομιλία",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Συνδεθείτε σε στιγμιότυπα Open Terminal. Οι διαχειριστές και οι χρήστες στους οποίους έχει παραχωρηθεί πρόσβαση μπορούν να χρησιμοποιούν την εξερεύνηση αρχείων και τα εργαλεία τερματικού μέσω αυτών των διακομιστών.",
|
||||
|
|
@ -652,12 +652,12 @@
|
|||
"Connected apps": "Συνδεδεμένες εφαρμογές",
|
||||
"Connecting": "Γίνεται σύνδεση",
|
||||
"Connecting...": "Σύνδεση...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Σύνδεση…",
|
||||
"Connection": "Σύνδεση",
|
||||
"Connection failed": "Σύνδεση απέτυχε",
|
||||
"Connection ID": "ID σύνδεσης",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "Το ID σύνδεσης δεν μπορεί να περιέχει τους χαρακτήρες \":\" ή \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Η σύνδεση χάθηκε. Παρακαλώ δοκιμάστε ξανά.",
|
||||
"Connection lost. Reconnecting...": "Η σύνδεση χάθηκε. Επανασύνδεση...",
|
||||
"Connection successful": "Σύνδεση επιτυχής",
|
||||
"Connection Type": "Είδος Σύνδεσης",
|
||||
|
|
@ -696,10 +696,10 @@
|
|||
"Copy": "Αντιγραφή",
|
||||
"Copy {{name}} to clipboard": "Αντιγραφή του αρχείου {{name}} στο πρόχειρο",
|
||||
"Copy API Key": "Αντιγραφή κλειδιού API",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Αντιγραφή ονόματος κλάδου",
|
||||
"Copy change to original": "Αντιγραφή αλλαγής στο αρχικό",
|
||||
"Copy change to proposal": "Αντιγραφή αλλαγής στην προτεινόμενη αναθεώρηση",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Αντιγραφή τιμής κατακερματισμού καταχώρισης αλλαγών",
|
||||
"Copy content": "Αντιγραφή περιεχομένου",
|
||||
"Copy default": "Αντιγραφή προεπιλογής",
|
||||
"Copy Last Code Block": "Αντιγραφή τελευταίου μπλοκ κώδικα",
|
||||
|
|
@ -720,8 +720,8 @@
|
|||
"Copyright (c)": "Copyright (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "Το CORS πρέπει να έχει ρυθμιστεί σωστά από τον πάροχο, ώστε να επιτρέπονται αιτήματα από το Open WebUI.",
|
||||
"Could not check for updates": "Δεν ήταν δυνατός ο έλεγχος για ενημερώσεις",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "Δεν ήταν δυνατή η αντιγραφή του ονόματος του κλάδου",
|
||||
"Could not copy commit hash": "Δεν ήταν δυνατή η αντιγραφή της τιμής κατακερματισμού της καταχώρισης αλλαγών",
|
||||
"Could not copy to clipboard. Please try again.": "Δεν ήταν δυνατή η αντιγραφή στο πρόχειρο. Παρακαλώ δοκιμάστε ξανά.",
|
||||
"Could not determine the upload folder.": "Δεν ήταν δυνατός ο προσδιορισμός του φακέλου ανεβάσματος.",
|
||||
"Could not load avatar.": "Δεν ήταν δυνατή η φόρτωση του άβαταρ.",
|
||||
|
|
@ -745,7 +745,7 @@
|
|||
"Create Account": "Δημιουργία Λογαριασμού",
|
||||
"Create Admin Account": "Δημιουργία Λογαριασμού Διαχειριστή",
|
||||
"Create announcements shown to users in the app.": "Δημιουργήστε ανακοινώσεις που εμφανίζονται στους χρήστες μέσα στην εφαρμογή.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Δημιουργία κλάδου",
|
||||
"Create Channel": "Δημιουργία Καναλιού",
|
||||
"Create copy": "Δημιουργία αντιγράφου",
|
||||
"Create Folder": "Δημιουργία Φακέλου",
|
||||
|
|
@ -756,7 +756,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Δημιουργήστε προγραμματισμένες προτροπές που εκτελούνται αυτόματα σε επαναλαμβανόμενη βάση.",
|
||||
"Create skill": "Δημιουργία δεξιότητας",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Δημιουργία δεξιότητας: δημιουργία επαναχρησιμοποιήσιμης δεξιότητας τερματικού από αυτή τη συνομιλία.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Δημιουργία δέντρου εργασίας",
|
||||
"Create your first note from the Create menu.": "Δημιουργήστε την πρώτη σας σημείωση από το μενού «Δημιουργία».",
|
||||
"Created": "Δημιουργήθηκε",
|
||||
"Created at": "Δημιουργήθηκε στις",
|
||||
|
|
@ -783,7 +783,7 @@
|
|||
"Custom Parameter Value": "Τιμή προσαρμοσμένης παραμέτρου",
|
||||
"Custom permissions": "Προσαρμοσμένα δικαιώματα",
|
||||
"Custom range": "Προσαρμοσμένο εύρος",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Προσαρμοσμένος χρονοπρογραμματισμός",
|
||||
"Customize": "Προσαρμογή",
|
||||
"Daily": "Καθημερινά",
|
||||
"Daily at": "Καθημερινά στις",
|
||||
|
|
@ -793,7 +793,7 @@
|
|||
"Data": "Δεδομένα",
|
||||
"Database": "Βάση Δεδομένων",
|
||||
"Datalab Marker API": "Datalab Marker API",
|
||||
"Date": "",
|
||||
"Date": "Ημερομηνία",
|
||||
"Date Added": "Ημερομηνία προσθήκης",
|
||||
"Date is required": "Απαιτείται ημερομηνία",
|
||||
"Date Modified": "Ημερομηνία τροποποίησης",
|
||||
|
|
@ -839,8 +839,8 @@
|
|||
"Delete all contents inside this folder": "Διαγραφή όλου του περιεχομένου αυτού του φακέλου",
|
||||
"Delete API Key?": "Διαγραφή κλειδιού API;",
|
||||
"Delete automation?": "Διαγραφή αυτοματισμού;",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Διαγραφή κλάδου",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "Διαγραφή του κλάδου {{branch}}; Οι κλάδοι που δεν έχουν συγχωνευθεί θα διατηρηθούν.",
|
||||
"Delete calendar": "Διαγραφή ημερολογίου",
|
||||
"Delete Calendar": "Διαγραφή ημερολογίου",
|
||||
"Delete Chat": "Διαγραφή Συνομιλίας",
|
||||
|
|
@ -890,12 +890,12 @@
|
|||
"Description": "Περιγραφή",
|
||||
"Description ({{language}})": "Περιγραφή ({{language}})",
|
||||
"Deselect": "Αποεπιλογή",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Επιφάνεια εργασίας",
|
||||
"Desktop access denied. Reopen this tab.": "Η πρόσβαση στην επιφάνεια εργασίας απορρίφθηκε. Ανοίξτε ξανά αυτή την καρτέλα.",
|
||||
"Desktop audio": "Ήχος επιφάνειας εργασίας",
|
||||
"Desktop audio is not supported by this browser.": "Ο ήχος της επιφάνειας εργασίας δεν υποστηρίζεται από αυτόν τον περιηγητή.",
|
||||
"Desktop audio unavailable.": "Ο ήχος της επιφάνειας εργασίας δεν είναι διαθέσιμος.",
|
||||
"Desktop connection failed.": "Η σύνδεση με την επιφάνεια εργασίας απέτυχε.",
|
||||
"Destination": "Προορισμός",
|
||||
"Detected Variables": "Εντοπισμένες μεταβλητές",
|
||||
"dev build": "δομή dev",
|
||||
|
|
@ -921,7 +921,7 @@
|
|||
"Discard comparison changes?": "Απόρριψη αλλαγών σύγκρισης;",
|
||||
"Discard unsaved changes?": "Απόρριψη μη αποθηκευμένων αλλαγών;",
|
||||
"Discard unsaved skill changes?": "Απόρριψη μη αποθηκευμένων αλλαγών της δεξιότητας;",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "Απόρριψη των μη αποθηκευμένων αλλαγών του δέντρου εργασίας σε αυτό το αρχείο; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
|
||||
"Disconnect OAuth": "Αποσύνδεση OAuth",
|
||||
"Disconnected": "Αποσυνδεδεμένο",
|
||||
"Discover a function": "Ανακάλυψη λειτουργίας",
|
||||
|
|
@ -970,7 +970,7 @@
|
|||
"Downloading \"{{name}}\"": "Γίνεται λήψη \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Γίνεται λήψη \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Λήψη στατιστικών...",
|
||||
"Draft": "",
|
||||
"Draft": "Προσχέδιο",
|
||||
"Drag and Drop Container": "Περιοχή μεταφοράς και απόθεσης",
|
||||
"Drag or use the up and down arrow keys to reorder": "Σύρετε ή χρησιμοποιήστε τα πλήκτρα βέλους πάνω και κάτω για αναδιάταξη",
|
||||
"Drag to move": "Σύρετε για μετακίνηση",
|
||||
|
|
@ -1070,14 +1070,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Βεβαιωθείτε ότι το αρχείο CSV σας περιλαμβάνει 4 στήλες με αυτή τη σειρά: Όνομα, Email, Κωδικός, Ρόλος.",
|
||||
"Enter {{role}} message here": "Εισάγετε το μήνυμα {{role}} εδώ",
|
||||
"Enter a Connection ID to register.": "Εισάγετε ένα ID σύνδεσης για καταχώριση.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Εισάγετε ένα όνομα αρχείου χωρίς καθέτους.",
|
||||
"Enter a name, content, and a valid command.": "Εισάγετε όνομα, περιεχόμενο και μια έγκυρη εντολή.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Εισάγετε έναν τίτλο για την επικάλυψη πληροφοριών χρήστη σε εκκρεμότητα. Αφήστε κενό για την προεπιλογή.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Εισάγετε ένα υδρογράφημα για την απάντηση. Αφήστε κενό για να μην προστίθεται υδρογράφημα.",
|
||||
"Enter additional headers in JSON format": "Εισάγετε πρόσθετες κεφαλίδες σε μορφή JSON",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Εισάγετε πρόσθετες κεφαλίδες σε μορφή JSON (π.χ. {\"X-Custom-Header\": \"value\"}",
|
||||
"Enter additional parameters in JSON format": "Εισάγετε πρόσθετες παραμέτρους σε μορφή JSON",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Εισάγετε ένα URL HTTP ή HTTPS χωρίς διαπιστευτήρια.",
|
||||
"Enter api auth string (e.g. username:password)": "Εισάγετε τη σειρά επαλήθευσης api (π.χ. username:password)",
|
||||
"Enter Application DN": "Εισάγετε DN Εφαρμογής",
|
||||
"Enter Application DN Password": "Εισάγετε Κωδικό DN Εφαρμογής",
|
||||
|
|
@ -1262,12 +1262,12 @@
|
|||
"Execute code for analysis": "Εκτελέστε κώδικα για ανάλυση",
|
||||
"Executing {{NAME}}...": "Εκτέλεση του {{NAME}}...",
|
||||
"Execution timeline": "Χρονολόγιο εκτέλεσης",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Έξοδος από πλήρη οθόνη",
|
||||
"Expand": "Επέκταση",
|
||||
"Expand {{name}}": "Επέκταση της ομάδας «{{name}}»",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Επέκταση πλαισίου Git",
|
||||
"Expand input": "Επέκταση πεδίου μηνύματος",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Επέκταση περιόδων λειτουργίας",
|
||||
"Expand terminal": "Επέκταση τερματικού",
|
||||
"Experience": "Εμπειρία",
|
||||
"Experimental": "Πειραματικό",
|
||||
|
|
@ -1324,7 +1324,7 @@
|
|||
"Failed to import models": "Αποτυχία εισαγωγής μοντέλων",
|
||||
"Failed to load chat": "Αποτυχία φόρτωσης συνομιλίας",
|
||||
"Failed to load chat preview": "Αποτυχία φόρτωσης προεπισκόπησης συνομιλίας",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Αποτυχία φόρτωσης του καταλόγου",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Αποτυχία φόρτωσης του αρχείου DOCX. Παρακαλώ δοκιμάστε να το κατεβάσετε.",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Αποτυχία φόρτωσης του αρχείου Excel/CSV. Παρακαλώ δοκιμάστε να το κατεβάσετε.",
|
||||
"Failed to load file content.": "Αποτυχία φόρτωσης περιεχομένου αρχείου",
|
||||
|
|
@ -1350,7 +1350,7 @@
|
|||
"Failed to save connections": "Αποτυχία αποθήκευσης συνδέσεων",
|
||||
"Failed to save conversation": "Αποτυχία αποθήκευσης συνομιλίας",
|
||||
"Failed to save file": "Αποτυχία αποθήκευσης αρχείου",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Αποτυχία αποθήκευσης του αρχείου. Οι αλλαγές σας παραμένουν στον επεξεργαστή.",
|
||||
"Failed to save model": "Αποτυχία αποθήκευσης μοντέλου",
|
||||
"Failed to save models configuration": "Αποτυχία αποθήκευσης ρυθμίσεων μοντέλων",
|
||||
"Failed to save policy: {{error}}": "Αποτυχία αποθήκευσης πολιτικής: {{error}}",
|
||||
|
|
@ -1382,14 +1382,14 @@
|
|||
"File actions": "Ενέργειες αρχείου",
|
||||
"File added successfully.": "Το αρχείο προστέθηκε με επιτυχία.",
|
||||
"File browser": "Εξερεύνηση αρχείων",
|
||||
"File changes": "",
|
||||
"File changes": "Αλλαγές αρχείου",
|
||||
"File content": "Περιεχόμενο αρχείου",
|
||||
"File content updated successfully.": "Το περιεχόμενο του αρχείου ενημερώθηκε με επιτυχία.",
|
||||
"File count limit": "Όριο πλήθους αρχείων",
|
||||
"File created": "Το αρχείο δημιουργήθηκε",
|
||||
"File deleted successfully.": "Το αρχείο διαγράφηκε με επιτυχία.",
|
||||
"File differences": "Διαφορές αρχείων",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "Δεν επιτρέπεται η εγγραφή στο αρχείο.",
|
||||
"File Mode": "Λειτουργία Αρχείου",
|
||||
"File moved.": "Το αρχείο μετακινήθηκε.",
|
||||
"File name": "Όνομα αρχείου",
|
||||
|
|
@ -1486,9 +1486,9 @@
|
|||
"Get information on {{name}} in the UI": "Προβολή πληροφοριών για το μοντέλο {{name}} στη διεπαφή",
|
||||
"Get started": "Ξεκινήστε",
|
||||
"Get started with {{WEBUI_NAME}}": "Ξεκινήστε με {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Αλλαγές Git",
|
||||
"Git unavailable": "Το Git δεν είναι διαθέσιμο",
|
||||
"Give me ideas": "Δώστε μου ιδέες",
|
||||
"give me tips": "δώστε μου συμβουλές",
|
||||
"Global": "Καθολικό",
|
||||
|
|
@ -1516,7 +1516,7 @@
|
|||
"H1": "Επικεφαλίδα 1",
|
||||
"H2": "Επικεφαλίδα 2",
|
||||
"H3": "Επικεφαλίδα 3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Κλάδος προέλευσης",
|
||||
"Headers": "Κεφαλίδες",
|
||||
"Headers must be a valid JSON object": "Οι κεφαλίδες πρέπει να είναι ένα έγκυρο αντικείμενο JSON",
|
||||
"Height": "Ύψος",
|
||||
|
|
@ -1533,13 +1533,13 @@
|
|||
"Hide": "Απόκρυψη",
|
||||
"Hide All": "Απόκρυψη όλων",
|
||||
"Hide conversation": "Απόκρυψη συνομιλίας",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Απόκρυψη σύγκρισης",
|
||||
"Hide from Sidebar": "Απόκρυψη από την πλευρική μπάρα",
|
||||
"Hide Hidden Files": "Απόκρυψη κρυφών αρχείων",
|
||||
"Hide Model": "Απόκρυψη Μοντέλου",
|
||||
"Hide preview": "Απόκρυψη προεπισκόπησης",
|
||||
"Hide sub-agents": "Απόκρυψη υποπρακτόρων",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Απόκρυψη καρτελών",
|
||||
"Hide whitespace": "Απόκρυψη κενών διαστημάτων",
|
||||
"High": "Υψηλή",
|
||||
"History": "Ιστορικό",
|
||||
|
|
@ -1678,7 +1678,7 @@
|
|||
"Knowledge source updated.": "Η πηγή γνώσης ενημερώθηκε.",
|
||||
"Knowledge updated successfully": "Το Knowledge ενημερώθηκε με επιτυχία",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (περιηγητής)",
|
||||
"Labels": "",
|
||||
"Labels": "Ετικέτες",
|
||||
"Last 12 months": "Τελευταίοι 12 μήνες",
|
||||
"Last 24 hours": "Τελευταίες 24 ώρες",
|
||||
"Last 30 days": "Τελευταίες 30 ημέρες",
|
||||
|
|
@ -1774,7 +1774,7 @@
|
|||
"March": "Μάρτιος",
|
||||
"Mark all as read": "Σήμανση όλων ως αναγνωσμένων",
|
||||
"Mark as unread": "Σήμανση ως μη αναγνωσμένη",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Σήμανση ως έτοιμου για έλεγχο",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Αγορά",
|
||||
"Matching tabs: {{count}}_one": "Καρτέλες που ταιριάζουν: {{count}}",
|
||||
|
|
@ -1805,21 +1805,21 @@
|
|||
"Mention someone": "Αναφορά σε κάποιον",
|
||||
"Mentions only": "Μόνο αναφορές",
|
||||
"Menu": "Μενού",
|
||||
"Merge": "",
|
||||
"Merge": "Συγχώνευση",
|
||||
"Merge Responses": "Συγχώνευση Απαντήσεων",
|
||||
"Merged Response": "Συγχωνευμένη απάντηση",
|
||||
"Message": "Μήνυμα",
|
||||
"Message counts and response timestamps": "Πλήθος μηνυμάτων και χρονοσφραγίδες απαντήσεων",
|
||||
"Message counts are based on assistant responses.": "Ο αριθμός των μηνυμάτων βασίζεται στις απαντήσεις του βοηθού.",
|
||||
"Message exceeds the 16 KiB limit.": "Το μήνυμα υπερβαίνει το όριο των 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Αριθμός μηνύματος",
|
||||
"Message rating should be enabled to use this feature": "Η αξιολόγηση μηνυμάτων πρέπει να είναι ενεργοποιημένη για να χρησιμοποιήσετε αυτή τη λειτουργία",
|
||||
"Message share": "Ποσοστό μηνυμάτων",
|
||||
"Message text...": "Κείμενο μηνύματος...",
|
||||
"messages": "μηνύματα",
|
||||
"Messages": "Μηνύματα",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Τα μηνύματα κρυπτογραφούνται από άκρο σε άκρο και δεν αποθηκεύονται.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Τα μηνύματα εξαφανίζονται όταν κλείσετε αυτή την καρτέλα.",
|
||||
"Metadata Field": "Πεδίο μεταδεδομένων",
|
||||
"Microphone off": "Μικρόφωνο απενεργοποιημένο",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1833,7 +1833,7 @@
|
|||
"Mistral OCR Parameters": "Παράμετροι Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "Δε",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Προβολή κινητού",
|
||||
"Model": "Μοντέλο",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Το μοντέλο '{{modelName}}' κατεβάστηκε με επιτυχία.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Το μοντέλο '{{modelTag}}' βρίσκεται ήδη στην ουρά για λήψη.",
|
||||
|
|
@ -1888,7 +1888,7 @@
|
|||
"Models imported successfully": "Τα μοντέλα εισήχθησαν με επιτυχία",
|
||||
"Models Public Sharing": "Δημόσια κοινή χρήση μοντέλων",
|
||||
"Models Sharing": "Κοινή χρήση μοντέλων",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Μοντέλα στα οποία αυτό το μοντέλο μπορεί να αναθέτει εργασίες. Οι χρήστες πρέπει να έχουν πρόσβαση σε αυτά. Αφήστε κενό για να χρησιμοποιείται το τρέχον μοντέλο.",
|
||||
"Modified": "Τροποποιημένα",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Δευ",
|
||||
|
|
@ -1924,7 +1924,7 @@
|
|||
"Navigate to Previous Chat": "Μετάβαση στην προηγούμενη συνομιλία",
|
||||
"Never": "Ποτέ",
|
||||
"New": "Νέα",
|
||||
"New branch": "",
|
||||
"New branch": "Νέος κλάδος",
|
||||
"New Button": "Νέο κουμπί",
|
||||
"New calendar": "Νέο ημερολόγιο",
|
||||
"New Calendar": "Νέο ημερολόγιο",
|
||||
|
|
@ -1939,14 +1939,14 @@
|
|||
"New Group": "Νέα ομάδα",
|
||||
"New Note": "Νέα σημείωση",
|
||||
"New Password": "Νέος Κωδικός",
|
||||
"New pull request": "",
|
||||
"New pull request": "Νέο αίτημα ενσωμάτωσης",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Οι νέες δεξιότητες και τα αντίγραφα είναι ιδιωτικά. Η αντικατάσταση αποθηκεύει μια νέα έκδοση και διατηρεί την υπάρχουσα κοινή χρήση.",
|
||||
"New tab": "",
|
||||
"New tab": "Νέα καρτέλα",
|
||||
"New Temporary Chat": "Νέα προσωρινή συνομιλία",
|
||||
"New Terminal": "Νέο τερματικό",
|
||||
"New Tool": "Νέο Εργαλείο",
|
||||
"New Webhook": "Νέο webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Νέο δέντρο εργασίας",
|
||||
"new-channel": "νέο-κανάλι",
|
||||
"Next": "Επόμενο",
|
||||
"Next change": "Επόμενη αλλαγή",
|
||||
|
|
@ -1966,7 +1966,7 @@
|
|||
"No apps connected.": "Δεν υπάρχουν συνδεδεμένες εφαρμογές.",
|
||||
"No authentication": "Χωρίς ταυτοποίηση",
|
||||
"No automations found": "Δεν βρέθηκαν αυτοματισμοί",
|
||||
"No changes": "",
|
||||
"No changes": "Δεν υπάρχουν αλλαγές",
|
||||
"No channels": "Δεν υπάρχουν κανάλια",
|
||||
"No chat alerts": "Χωρίς ειδοποιήσεις συνομιλίας",
|
||||
"No chat history": "Δεν υπάρχει ιστορικό συνομιλιών",
|
||||
|
|
@ -1976,9 +1976,9 @@
|
|||
"No chats found": "Δεν βρέθηκαν συνομιλίες",
|
||||
"No chats found for this user.": "Δεν βρέθηκαν συνομιλίες για αυτόν τον χρήστη.",
|
||||
"No chats found.": "Δεν βρέθηκαν συνομιλίες.",
|
||||
"No checks": "",
|
||||
"No checks": "Δεν υπάρχουν έλεγχοι",
|
||||
"No comments yet": "Δεν υπάρχουν ακόμη σχόλια",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Δεν υπάρχουν ακόμη καταχωρίσεις αλλαγών",
|
||||
"No content": "Χωρίς περιεχόμενο",
|
||||
"No content available": "Δεν υπάρχει διαθέσιμο περιεχόμενο",
|
||||
"No content found": "Δεν βρέθηκε περιεχόμενο",
|
||||
|
|
@ -2037,7 +2037,7 @@
|
|||
"No previous usage": "Δεν υπάρχει προηγούμενη χρήση",
|
||||
"No prompts found": "Δεν βρέθηκαν προτροπές",
|
||||
"No prompts yet": "Δεν υπάρχουν ακόμη προτροπές",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "Δεν υπάρχουν αιτήματα ενσωμάτωσης",
|
||||
"No Repeat": "Χωρίς επανάληψη",
|
||||
"No results": "Δεν βρέθηκαν αποτελέσματα",
|
||||
"No results found": "Δεν βρέθηκαν αποτελέσματα",
|
||||
|
|
@ -2055,7 +2055,7 @@
|
|||
"No Terminal connection configured.": "Δεν έχει ρυθμιστεί σύνδεση τερματικού.",
|
||||
"No terminal connections configured.": "Δεν έχουν ρυθμιστεί συνδέσεις τερματικού.",
|
||||
"No terminal servers available": "Δεν υπάρχουν διαθέσιμοι διακομιστές τερματικού",
|
||||
"No text changes": "",
|
||||
"No text changes": "Δεν υπάρχουν αλλαγές κειμένου",
|
||||
"No text differences": "Δεν υπάρχουν διαφορές κειμένου",
|
||||
"No tool server connections configured.": "Δεν έχουν ρυθμιστεί συνδέσεις διακομιστών εργαλείων.",
|
||||
"No tools accessible": "Κανένα προσβάσιμο εργαλείο",
|
||||
|
|
@ -2068,7 +2068,7 @@
|
|||
"No valves to update": "Δεν υπάρχουν βαλβίδες για ενημέρωση",
|
||||
"No webhooks yet": "Δεν υπάρχουν ακόμη webhook",
|
||||
"Node Ids": "IDs Κόμβων",
|
||||
"none": "",
|
||||
"none": "Δεν υπάρχουν",
|
||||
"None": "Κανένα",
|
||||
"None reported": "Δεν αναφέρθηκε κανένα στοιχείο",
|
||||
"Not configured": "Δεν έχει ρυθμιστεί",
|
||||
|
|
@ -2131,14 +2131,14 @@
|
|||
"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.": "Ωχ! Χρησιμοποιείτε μια μη υποστηριζόμενη μέθοδο (μόνο frontend). Παρακαλώ σερβίρετε το WebUI από το backend.",
|
||||
"Open": "Άνοιγμα",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Ανοίξτε μια καρτέλα χρησιμοποιώντας το μενού +.",
|
||||
"Open automation": "Άνοιγμα αυτοματισμού",
|
||||
"Open chat": "Άνοιγμα συνομιλίας",
|
||||
"Open create menu": "Άνοιγμα μενού δημιουργίας",
|
||||
"Open file": "Άνοιγμα αρχείου",
|
||||
"Open Folder": "Άνοιγμα φακέλου",
|
||||
"Open in full screen": "Άνοιγμα σε πλήρη οθόνη",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Άνοιγμα στο GitHub",
|
||||
"Open in new tab": "Άνοιγμα σε νέα καρτέλα",
|
||||
"Open link": "Άνοιγμα συνδέσμου",
|
||||
"Open modal to configure connection": "Άνοιγμα παραθύρου διαλόγου για διαχείριση σύνδεσης",
|
||||
|
|
@ -2198,7 +2198,7 @@
|
|||
"parameter": "παραμέτρου",
|
||||
"Parameter": "Παράμετρος",
|
||||
"Parameters": "Παράμετροι",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Γονικός κατάλογος",
|
||||
"Parent group": "Γονική ομάδα",
|
||||
"Parent message not found": "Το γονικό μήνυμα δεν βρέθηκε",
|
||||
"Parent page": "Γονική σελίδα",
|
||||
|
|
@ -2266,7 +2266,7 @@
|
|||
"Please select a reason": "Παρακαλώ επιλέξτε έναν λόγο",
|
||||
"Please select a valid JSON file": "Παρακαλώ επιλέξτε ένα έγκυρο αρχείο JSON",
|
||||
"Please select at least one user for Direct Message channel.": "Παρακαλώ επιλέξτε τουλάχιστον έναν χρήστη για το κανάλι «Άμεσο μήνυμα».",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Παρακαλώ περιμένετε να ολοκληρωθεί το ανέβασμα των αρχείων.",
|
||||
"Please wait until all files are uploaded.": "Παρακαλώ περιμένετε μέχρι να ανέβουν όλα τα αρχεία.",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP ή GIF. Έως 5 MiB και 25 megapixel.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Οι αλλαγές πολιτικής ισχύουν για τα τερματικά που δημιουργούνται στο εξής. Ανανεώστε τα αντίστοιχα τερματικά για να εφαρμοστούν και στα υπάρχοντα τερματικά.",
|
||||
|
|
@ -2323,15 +2323,15 @@
|
|||
"Provider": "Πάροχος",
|
||||
"Provider context": "Παράθυρο συμφραζομένων παρόχου",
|
||||
"Provider details": "Λεπτομέρειες παρόχου",
|
||||
"Proxy": "",
|
||||
"Proxy": "Διακομιστής μεσολάβησης",
|
||||
"Public": "Δημόσιο",
|
||||
"Public key": "Δημόσιο κλειδί",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Τραβήξτε \"{{searchValue}}\" από το Ollama.com",
|
||||
"Pull a model from Ollama.com": "Τραβήξτε ένα μοντέλο από το Ollama.com",
|
||||
"Pull Model": "Λήψη μοντέλου",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Ενέργειες αιτήματος ενσωμάτωσης",
|
||||
"Pull request description": "Περιγραφή αιτήματος ενσωμάτωσης",
|
||||
"Pull request title": "Τίτλος αιτήματος ενσωμάτωσης",
|
||||
"Punctuation": "Σημεία στίξης",
|
||||
"Pyodide file browser": "Εξερεύνηση αρχείων Pyodide",
|
||||
"Quality": "Ποιότητα",
|
||||
|
|
@ -2352,7 +2352,7 @@
|
|||
"Read the docs": "Διαβάστε την τεκμηρίωση",
|
||||
"Read-only": "Μόνο για ανάγνωση",
|
||||
"Read-Only Access": "Πρόσβαση μόνο για ανάγνωση",
|
||||
"Ready": "",
|
||||
"Ready": "Σήμανση ως έτοιμου για έλεγχο",
|
||||
"Realtime": "Πραγματικού χρόνου",
|
||||
"Realtime Voice": "Φωνή πραγματικού χρόνου",
|
||||
"Reason": "Λόγος",
|
||||
|
|
@ -2366,7 +2366,7 @@
|
|||
"Recommended": "Προτείνεται",
|
||||
"Reconnect": "Επανασύνδεση",
|
||||
"Reconnected": "Η σύνδεση αποκαταστάθηκε",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Επανασύνδεση…",
|
||||
"Record": "Ηχογράφηση",
|
||||
"Record voice": "Εγγραφή φωνής",
|
||||
"Recorded duration": "Καταγεγραμμένη διάρκεια",
|
||||
|
|
@ -2425,11 +2425,11 @@
|
|||
"Removing {{count}} stale files..._one": "Αφαίρεση {{count}} παρωχημένου αρχείου...",
|
||||
"Removing {{count}} stale files..._other": "Αφαίρεση {{count}} παρωχημένων αρχείων...",
|
||||
"Rename": "Μετονομασία",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Μετονομασία κλάδου",
|
||||
"Rename page": "Μετονομασία σελίδας",
|
||||
"Renamed to {{name}}": "Μετονομάστηκε σε {{name}}",
|
||||
"Rendered preview": "Μορφοποιημένη προεπισκόπηση",
|
||||
"Reopen": "",
|
||||
"Reopen": "Εκ νέου άνοιγμα",
|
||||
"Reorder": "Αναδιάταξη",
|
||||
"Repeat": "Επανάληψη",
|
||||
"Replace": "Αντικατάσταση",
|
||||
|
|
@ -2441,7 +2441,7 @@
|
|||
"Reply to thread...": "Απάντηση στο νήμα συζήτησης...",
|
||||
"Replying to {{NAME}}": "Απάντηση προς {{NAME}}",
|
||||
"Reported by the provider.": "Αναφέρονται από τον πάροχο.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Αίτημα αλλαγών",
|
||||
"Requested scopes": "Ζητούμενα scope",
|
||||
"Require an authenticator for all users": "Απαίτηση εφαρμογής ταυτοποίησης για όλους τους χρήστες",
|
||||
"required": "απαιτείται",
|
||||
|
|
@ -2456,7 +2456,7 @@
|
|||
"Reset to Defaults": "Επαναφορά προεπιλογών",
|
||||
"Reset view": "Επαναφορά προβολής",
|
||||
"Reset zoom": "Επαναφορά ζουμ",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Αλλαγή μεγέθους πλαισίου Git",
|
||||
"Resize panel": "Αλλαγή μεγέθους πλαισίου",
|
||||
"Resolved": "Επιλύθηκε",
|
||||
"Response": "Απάντηση",
|
||||
|
|
@ -2467,7 +2467,7 @@
|
|||
"Responses": "Responses",
|
||||
"responses with recorded usage": "απαντήσεις με καταγεγραμμένη χρήση",
|
||||
"Restart": "Επανεκκίνηση",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Επανεκκινήστε όλα τα στιγμιότυπα Open WebUI για να εφαρμοστούν οι αλλαγές στις ρυθμίσεις σύνδεσης του παρόχου.",
|
||||
"Restricted": "Περιορισμένη πρόσβαση",
|
||||
"Result": "Αποτέλεσμα",
|
||||
"RESULT": "Αποτέλεσμα",
|
||||
|
|
@ -2478,13 +2478,13 @@
|
|||
"Retrieved {{count}} sources_other": "Ανακτήθηκαν {{count}} πηγές",
|
||||
"Retrieved 1 source": "Ανακτήθηκε 1 πηγή",
|
||||
"Retry": "Επανάληψη",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Επανάληψη εντοπισμού Git",
|
||||
"Retry setup": "Επανάληψη ρύθμισης",
|
||||
"Return to call": "Επιστροφή στην κλήση",
|
||||
"Return to conversation": "Επιστροφή στη συνομιλία",
|
||||
"Review": "Έλεγχος",
|
||||
"Review the scopes this app is requesting before adding it.": "Ελέγξτε τα scope που ζητά αυτή η εφαρμογή πριν την προσθέσετε.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Ελεγκτές",
|
||||
"Revised": "Αναθεωρημένο",
|
||||
"Rewrite the selected text.": "Αναδιατυπώστε το επιλεγμένο κείμενο.",
|
||||
"Role": "Ρόλος",
|
||||
|
|
@ -2510,7 +2510,7 @@
|
|||
"Save & Create": "Αποθήκευση & Δημιουργία",
|
||||
"Save & Update": "Αποθήκευση & Ενημέρωση",
|
||||
"Save and send": "Αποθήκευση και αποστολή",
|
||||
"Save As": "",
|
||||
"Save As": "Αποθήκευση ως",
|
||||
"Save As Copy": "Αποθήκευση ως Αντιγραφή",
|
||||
"Save Chat": "Αποθήκευση Συνομιλίας",
|
||||
"Save draft as copy": "Αποθήκευση προσχεδίου ως αντιγράφου",
|
||||
|
|
@ -2537,7 +2537,7 @@
|
|||
"Search actions": "Αναζήτηση ενεργειών",
|
||||
"Search all emojis": "Αναζήτησε όλα τα emojis",
|
||||
"Search Automations": "Αναζήτηση αυτοματισμών",
|
||||
"Search branches": "",
|
||||
"Search branches": "Αναζήτηση κλάδων",
|
||||
"Search built-in tools": "Αναζήτηση ενσωματωμένων εργαλείων",
|
||||
"Search channels": "Αναζήτηση καναλιών",
|
||||
"Search Chats": "Αναζήτηση Συνομιλιών",
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
"Search or add pattern": "Αναζήτηση ή προσθήκη μοτίβου",
|
||||
"Search parent groups": "Αναζήτηση γονικών ομάδων",
|
||||
"Search Prompts": "Αναζήτηση Προτροπών",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Αναζήτηση αιτημάτων ενσωμάτωσης",
|
||||
"Search results": "Αποτελέσματα αναζήτησης",
|
||||
"Search scopes": "Αναζήτηση scope",
|
||||
"Search sessions": "Αναζήτηση περιόδων σύνδεσης",
|
||||
|
|
@ -2580,7 +2580,7 @@
|
|||
"Search users or groups": "Αναζήτηση χρηστών ή ομάδων",
|
||||
"Search workspace": "Αναζήτηση χώρου εργασίας",
|
||||
"Search workspace…": "Αναζήτηση χώρου εργασίας…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Αναζήτηση δέντρων εργασίας",
|
||||
"Search your workspace": "Αναζήτηση του χώρου εργασίας σας",
|
||||
"Searched {{count}} sites": "Αναζητήθηκαν {{count}} ιστοσελίδες",
|
||||
"Searching": "Αναζητώντας",
|
||||
|
|
@ -2607,11 +2607,11 @@
|
|||
"Select a model to isolate it.": "Επιλέξτε ένα μοντέλο για να εμφανίζεται μόνο αυτό.",
|
||||
"Select a pipeline": "Επιλέξτε ένα pipeline",
|
||||
"Select a pipeline url": "Επιλέξτε ένα pipeline url",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Επιλέξτε ένα αίτημα ενσωμάτωσης",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Επιλέξτε ένα εύρος για να φιλτράρετε τις περιόδους σύνδεσης. Περιλαμβάνονται και οι μερικές καταγραφές χρήσης.",
|
||||
"Select a reranking model engine": "Επιλέξτε μηχανή μοντέλου επαναταξινόμησης",
|
||||
"Select a role": "Επιλέξτε έναν ρόλο",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Επιλέξτε ένα τερματικό για να ανοίξετε URL localhost.",
|
||||
"Select a theme": "Επιλέξτε ένα θέμα",
|
||||
"Select a tool": "Επιλέξτε ένα εργαλείο",
|
||||
"Select a voice": "Επιλέξτε μια φωνή",
|
||||
|
|
@ -2635,9 +2635,9 @@
|
|||
"Select loaded files": "Επιλογή των φορτωμένων αρχείων",
|
||||
"Select Method": "Επιλέξτε μέθοδο",
|
||||
"Select model": "Επιλέξτε μοντέλο",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Επιλέξτε μόνο ένα μοντέλο",
|
||||
"Select only one model to call": "Επιλέξτε μόνο ένα μοντέλο για κλήση",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Επιλέξτε μόνο ένα μοντέλο για να ανοίξετε μια πλευρική συνομιλία.",
|
||||
"Select options": "Επιλέξτε τιμές",
|
||||
"Select Skill": "Επιλέξτε δεξιότητα",
|
||||
"Select to isolate model": "Επιλογή για προβολή μόνο αυτού του μοντέλου",
|
||||
|
|
@ -3339,8 +3339,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Ανάκτηση της τρέχουσας ώρας και εκτέλεση υπολογισμών ημερομηνίας/ώρας",
|
||||
"settings.admin.models.builtinTools.time.label": "Ώρα και υπολογισμοί",
|
||||
"settings.admin.models.builtinTools.title": "Ενσωματωμένα εργαλεία",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Δημιουργία εργαλείων Python στον χώρο εργασίας από τη συνομιλία",
|
||||
"settings.admin.models.builtinTools.tools.label": "Δημιουργία εργαλείων",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Παύση μιας απάντησης για να τεθεί στον χρήστη μια διευκρινιστική ερώτηση",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Ερώτηση στον χρήστη",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Αναζήτηση στο διαδίκτυο και ανάκτηση URL",
|
||||
|
|
@ -3859,7 +3859,7 @@
|
|||
"Show all {{count}} contributors": "Εμφάνιση και των {{count}} συντελεστών",
|
||||
"Show all {{count}} contributors_one": "Εμφάνιση του {{count}} συντελεστή",
|
||||
"Show all {{count}} contributors_other": "Εμφάνιση και των {{count}} συντελεστών",
|
||||
"Show diff": "",
|
||||
"Show diff": "Εμφάνιση σύγκρισης",
|
||||
"Show Files": "Εμφάνιση αρχείων",
|
||||
"Show Hidden Files": "Εμφάνιση κρυφών αρχείων",
|
||||
"Show image preview": "Εμφάνιση προεπισκόπησης εικόνας",
|
||||
|
|
@ -3875,7 +3875,7 @@
|
|||
"Show your support!": "Δείξτε την υποστήριξή σας!",
|
||||
"Showcased creativity": "Εμφανιζόμενη δημιουργικότητα",
|
||||
"Showing search match": "Εμφανίζεται αποτέλεσμα αναζήτησης",
|
||||
"Side chat": "",
|
||||
"Side chat": "Πλευρική συνομιλία",
|
||||
"Sidebar": "Πλευρική μπάρα",
|
||||
"Sign in": "Σύνδεση",
|
||||
"Sign in again": "Συνδεθείτε ξανά",
|
||||
|
|
@ -3932,9 +3932,9 @@
|
|||
"Speech-to-Text Language": "Γλώσσα μετατροπής ομιλίας σε κείμενο",
|
||||
"Split": "Διαιρεμένη",
|
||||
"Sponsor on GitHub": "Χορηγία στο GitHub",
|
||||
"SQL query": "",
|
||||
"SQL query": "Ερώτημα SQL",
|
||||
"Staan API Key": "Κλειδί API Staan",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Αλλαγές προς καταχώριση",
|
||||
"Standard": "Τυπική",
|
||||
"Start a new conversation": "Έναρξη νέας συνομιλίας",
|
||||
"Start a voice call using your microphone?": "Έναρξη φωνητικής κλήσης με το μικρόφωνό σας;",
|
||||
|
|
@ -3979,14 +3979,14 @@
|
|||
"Suggested": "Προτεινόμενα",
|
||||
"Suggested prompts": "Προτεινόμενες προτροπές",
|
||||
"Summarize this note.": "Συνοψίστε αυτή τη σημείωση.",
|
||||
"Summary": "",
|
||||
"Summary": "Σύνοψη",
|
||||
"Sun": "Κυρ",
|
||||
"Support": "Υποστήριξη",
|
||||
"Support this plugin:": "Υποστήριξη αυτού του plugin:",
|
||||
"Supported parameters": "Υποστηριζόμενες παράμετροι",
|
||||
"Swap": "Αντιμετάθεση",
|
||||
"Swap sides": "Αντιμετάθεση πλευρών",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Αλλαγή κλάδου",
|
||||
"Switch camera": "Εναλλαγή κάμερας",
|
||||
"Switch to Assistant role": "Αλλαγή σε ρόλο βοηθού",
|
||||
"Switch to JSON editor": "Μετάβαση στον επεξεργαστή JSON",
|
||||
|
|
@ -4008,7 +4008,7 @@
|
|||
"System Instructions": "Οδηγίες Συστήματος",
|
||||
"System Prompt": "Προτροπή Συστήματος",
|
||||
"Table": "Πίνακας",
|
||||
"Tabs": "",
|
||||
"Tabs": "Καρτέλες",
|
||||
"Tag": "Ετικέτα",
|
||||
"Tags": "Ετικέτες",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Η δειγματοληψία tail free χρησιμοποιείται για να μειώσει την επίδραση των λιγότερο πιθανών token στην έξοδο. Μια υψηλότερη τιμή (π.χ. 2.0) θα μειώσει περισσότερο την επίδραση, ενώ η τιμή 1.0 απενεργοποιεί αυτή τη ρύθμιση.",
|
||||
|
|
@ -4023,7 +4023,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Πείτε μου μια τυχαία ενδιαφέρουσα πληροφορία για τη Ρωμαϊκή Αυτοκρατορία",
|
||||
"Tell us more:": "Πείτε μας περισσότερα:",
|
||||
"Temporary": "Προσωρινή",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Προσωρινή συνομιλία",
|
||||
"Temporary Chat": "Προσωρινή Συνομιλία",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Προσωρινή: ενεργοποίηση/απενεργοποίηση προσωρινής συνομιλίας για αυτή τη νέα συνομιλία.",
|
||||
"Terminal": "Τερματικό",
|
||||
|
|
@ -4068,7 +4068,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Αυτή η ενέργεια δεν μπορεί να αναιρεθεί. Οι απαντήσεις θα παραμείνουν ορατές.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Αυτό το κανάλι δημιουργήθηκε στις {{createdAt}}. Αυτή είναι η αρχή του καναλιού {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Αυτή η συνομιλία δεν θα εμφανίζεται στο ιστορικό και τα μηνύματά σας δεν θα αποθηκευτούν.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Αυτό το αρχείο είναι ήδη ανοιχτό. Κλείστε την καρτέλα του ή επιλέξτε άλλο όνομα.",
|
||||
"This folder is empty": "Αυτός ο φάκελος είναι κενός",
|
||||
"This is a default user permission and will remain enabled.": "Αυτό είναι προεπιλεγμένο δικαίωμα χρήστη και θα παραμείνει ενεργοποιημένο.",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Αυτή είναι μια πειραματική λειτουργία, μπορεί να μην λειτουργεί όπως αναμένεται και υπόκειται σε αλλαγές οποιαδήποτε στιγμή.",
|
||||
|
|
@ -4206,8 +4206,8 @@
|
|||
"Unchanged lines omitted": "Οι γραμμές χωρίς αλλαγές παραλείπονται",
|
||||
"Underline": "Υπογράμμιση",
|
||||
"Undo": "Αναίρεση",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Αναίρεση τελευταίας καταχώρισης αλλαγών",
|
||||
"Undo the last commit and keep its changes staged?": "Αναίρεση της τελευταίας καταχώρισης αλλαγών και διατήρηση των αλλαγών της προς καταχώριση;",
|
||||
"Unified": "Ενοποιημένη",
|
||||
"Uninstall": "Απεγκατάσταση",
|
||||
"Uninstall app": "Απεγκατάσταση εφαρμογής",
|
||||
|
|
@ -4225,7 +4225,7 @@
|
|||
"Unmute to continue": "Καταργήστε τη σίγαση για να συνεχίσετε",
|
||||
"Unpin": "Ξεκαρφίτσωμα",
|
||||
"Unpin from Sidebar": "Ξεκαρφίτσωμα από την πλευρική μπάρα",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Δεν έχει αποσταλεί",
|
||||
"Unread": "Μη αναγνωσμένα",
|
||||
"Unsaved changes": "Μη αποθηκευμένες αλλαγές",
|
||||
"Unsaved changes to this version will be discarded.": "Οι μη αποθηκευμένες αλλαγές σε αυτή την έκδοση θα απορριφθούν.",
|
||||
|
|
@ -4242,7 +4242,7 @@
|
|||
"Update All Models": "Ενημέρωση όλων των μοντέλων",
|
||||
"Update and Copy Link": "Ενημέρωση και Αντιγραφή Συνδέσμου",
|
||||
"Update app": "Ενημέρωση εφαρμογής",
|
||||
"Update branch": "",
|
||||
"Update branch": "Ενημέρωση κλάδου",
|
||||
"Update for the latest features and improvements.": "Ενημερωθείτε για τις τελευταίες λειτουργίες και βελτιώσεις.",
|
||||
"Update your status": "Ενημέρωση της κατάστασής σας",
|
||||
"Updated": "Ενημερώθηκε",
|
||||
|
|
@ -4286,7 +4286,7 @@
|
|||
"Use default": "Χρήση προεπιλογής",
|
||||
"Use device vibration feedback on supported Android devices.": "Χρησιμοποιεί απόκριση δόνησης της συσκευής σε υποστηριζόμενες συσκευές Android.",
|
||||
"Use discovered scopes": "Χρήση των scope που ανακαλύφθηκαν",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Χρήση καρτελών πλήρους πλάτους",
|
||||
"Use global setting": "Χρήση καθολικής ρύθμισης",
|
||||
"Use groups to organize your users and assign permissions.": "Χρησιμοποιήστε ομάδες για να οργανώσετε τους χρήστες σας και να εκχωρήσετε δικαιώματα.",
|
||||
"Use in prompt": "Χρήση στην προτροπή",
|
||||
|
|
@ -4294,7 +4294,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Χρησιμοποιεί τμηματοποιημένη ανάκτηση για στοχευμένη και σχετική εξαγωγή περιεχομένου.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Χρησιμοποιεί τμηματοποιημένη ανάκτηση για στοχευμένα και σχετικά συμφραζόμενα.",
|
||||
"Use segmented retrieval for focused context.": "Χρησιμοποιεί τμηματοποιημένη ανάκτηση για στοχευμένα συμφραζόμενα.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Χρήση πλευρικών καρτελών",
|
||||
"Use these in model system prompts as {{example}}.": "Μπορείτε να τις χρησιμοποιήσετε στις προτροπές συστήματος των μοντέλων ως {{example}}.",
|
||||
"Use Web Search?": "Χρήση αναζήτησης στο διαδίκτυο;",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Χρησιμοποιείται στη λειτουργία εγγενούς κλήσης λειτουργιών. Οι ρυθμίσεις του χώρου εργασίας και τα δικαιώματα των χρηστών εξακολουθούν να ισχύουν.",
|
||||
|
|
@ -4348,11 +4348,11 @@
|
|||
"Video": "Βίντεο",
|
||||
"Video player": "Πρόγραμμα αναπαραγωγής βίντεο",
|
||||
"View": "Προβολή",
|
||||
"View changes": "",
|
||||
"View changes": "Προβολή αλλαγών",
|
||||
"View channel": "Προβολή καναλιού",
|
||||
"View chat": "Προβολή συνομιλίας",
|
||||
"View comment": "Προβολή σχολίου",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Προβολή στο {{platform}}",
|
||||
"View Replies": "Προβολή Απαντήσεων",
|
||||
"View Result from {{NAME}}": "Προβολή αποτελέσματος από το {{NAME}}",
|
||||
"View source": "Προβολή πηγαίου κώδικα",
|
||||
|
|
@ -4423,15 +4423,15 @@
|
|||
"Work": "Εργασία",
|
||||
"Working Directory": "Κατάλογος εργασίας",
|
||||
"Working Directory Context": "Συμφραζόμενα καταλόγου εργασίας",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Αλλαγές δέντρου εργασίας",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Λειτουργεί μαζί με το top-k. Μια υψηλότερη τιμή (π.χ. 0.95) θα οδηγήσει σε πιο ποικίλο κείμενο, ενώ μια χαμηλότερη τιμή (π.χ. 0.5) θα δημιουργήσει πιο εστιασμένο και συντηρητικό κείμενο.",
|
||||
"Workspace": "Χώρος Εργασίας",
|
||||
"Workspace Models": "Μοντέλα χώρου εργασίας",
|
||||
"Workspace Permissions": "Δικαιώματα Χώρου Εργασίας",
|
||||
"Workspace search": "Αναζήτηση χώρου εργασίας",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Κλάδος δέντρου εργασίας",
|
||||
"Worktree directory": "Κατάλογος δέντρου εργασίας",
|
||||
"Worktrees": "Δέντρα εργασίας",
|
||||
"Write": "Εγγραφή",
|
||||
"Write a prompt…": "Γράψτε μια προτροπή…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Γράψτε μια περίληψη σε 50 λέξεις που συνοψίζει {{topic}}.",
|
||||
|
|
@ -4460,7 +4460,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "Δεν έχετε δικαίωμα να ανεβάσετε αρχεία σε αυτή τη βάση γνώσης.",
|
||||
"You do not have permission to upload files.": "Δεν έχετε άδεια να ανεβάσετε αρχεία.",
|
||||
"You do not have permission to upload web content.": "Δεν έχετε δικαίωμα να ανεβάσετε περιεχόμενο από το διαδίκτυο.",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "Δεν έχετε δικαίωμα να χρησιμοποιήσετε την πλευρική συνομιλία.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Έχετε περισσότερους από 50 χρήστες, κάτι που συχνά σημαίνει ότι αυτός ο χώρος εργασίας εξυπηρετεί έναν οργανισμό. Το Open WebUI είναι δωρεάν για χρήση ως έχει, χωρίς περιορισμούς ή κρυφά όρια, και θέλουμε να παραμείνει έτσι.",
|
||||
"You have no archived conversations.": "Δεν έχετε αρχειοθετημένες συνομιλίες.",
|
||||
"You have no shared conversations.": "Δεν έχετε κοινόχρηστες συνομιλίες.",
|
||||
|
|
|
|||
|
|
@ -3303,6 +3303,12 @@
|
|||
"settings.admin.interface.toolsFunctionCallingPrompt.description": "Guides how the assistant formats tool and function calls.",
|
||||
"settings.admin.interface.toolsFunctionCallingPrompt.label": "Tools Function Calling Prompt",
|
||||
"settings.admin.interface.visibility.description": "Choose which controls appear for users. Hiding a control keeps its current setting and underlying feature available. Administrators always see available controls.",
|
||||
"settings.admin.interface.visibility.selectedCodeInterpreter.label": "Selected Code Interpreter",
|
||||
"settings.admin.interface.visibility.selectedFilters.label": "Selected Filters",
|
||||
"settings.admin.interface.visibility.selectedImageGeneration.label": "Selected Image Generation",
|
||||
"settings.admin.interface.visibility.selectedSkills.label": "Selected Skills",
|
||||
"settings.admin.interface.visibility.selectedTools.label": "Selected Tools",
|
||||
"settings.admin.interface.visibility.selectedWebSearch.label": "Selected Web Search",
|
||||
"settings.admin.interface.visibility.title": "Visible controls",
|
||||
"settings.admin.interface.voiceModePrompt.description": "Apply voice-specific instructions while voice mode is active.",
|
||||
"settings.admin.interface.voiceModePrompt.label": "Voice Mode Prompt",
|
||||
|
|
|
|||
|
|
@ -115,7 +115,7 @@
|
|||
"A chat run finished successfully.": "La ejecución de un chat ha finalizado correctamente.",
|
||||
"A collaboration channel where people join as members": "Canal colaborativo donde la gente se une como miembro",
|
||||
"A discussion channel where access is controlled by groups and permissions": "Un canal de discusión con el acceso controlado mediante grupos y permisos",
|
||||
"A file with this name already exists. Replace it?": "",
|
||||
"A file with this name already exists. Replace it?": "Ya existe un archivo con este nombre. ¿Reemplazarlo?",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "Nueva versión (v{{LATEST_VERSION}}) disponible.",
|
||||
"A page changed elsewhere. Your previous text is available to download.": "Se ha modificado una página en otro lugar. Tu texto anterior está disponible para descargar.",
|
||||
"A private conversation between you and selected users": "Conversación privada entre tú y los usuarios seleccionados",
|
||||
|
|
@ -253,7 +253,7 @@
|
|||
"Allow selecting hidden models as base models.": "Permite seleccionar modelos ocultos como modelos base.",
|
||||
"Allow Sharing With Groups": "Permitir Compartir con Grupos",
|
||||
"Allow Sharing With Users": "Permitir Compartir con Usuarios",
|
||||
"Allow Side Chat": "",
|
||||
"Allow Side Chat": "Permitir Chat Lateral",
|
||||
"Allow Speech to Text": "Permitir Transcribir Voz a Texto",
|
||||
"Allow Temporary Chat": "Permitir Chat Temporal",
|
||||
"Allow Text to Speech": "Permitir Leer Texto",
|
||||
|
|
@ -302,7 +302,7 @@
|
|||
"Apply functions that process messages before or after the model responds.": "Aplica funciones que procesan los mensajes antes o después de que el modelo responda.",
|
||||
"Apply to draft": "Aplicar al borrador",
|
||||
"Apply uses the proposed revision on the right. Save your draft afterward.": "Aplicar usa la revisión propuesta de la derecha. Guarda tu borrador después.",
|
||||
"Approve": "",
|
||||
"Approve": "Aprobar",
|
||||
"Approximate comparison": "Comparación aproximada",
|
||||
"Apps": "Aplicaciones",
|
||||
"April": "Abril",
|
||||
|
|
@ -335,7 +335,7 @@
|
|||
"Ask for approval": "Solicitar aprobación",
|
||||
"Ask or edit…": "Pregunta o edita…",
|
||||
"Ask this knowledge source a test question": "Haz una pregunta de prueba a esta fuente de conocimiento",
|
||||
"Assignees": "",
|
||||
"Assignees": "Responsables",
|
||||
"Assistance": "Asistencia",
|
||||
"assistant": "asistente",
|
||||
"Assistant": "Asistente",
|
||||
|
|
@ -363,7 +363,7 @@
|
|||
"Authenticator configured": "Autenticador configurado",
|
||||
"Authenticator not configured": "Autenticador no configurado",
|
||||
"Authenticator setup QR code": "Código QR para configurar el autenticador",
|
||||
"Author": "",
|
||||
"Author": "Autor",
|
||||
"Authorize OAuth": "Autorizar OAuth",
|
||||
"Auto": "Auto",
|
||||
"Auto (Random)": "Auto (Aleatorio)",
|
||||
|
|
@ -396,9 +396,9 @@
|
|||
"Azure AI Speech": "Voz Azure AI",
|
||||
"Azure OpenAI": "Azure OpenAI",
|
||||
"Back": "Volver",
|
||||
"Back to changes": "",
|
||||
"Back to changes": "Volver a los cambios",
|
||||
"Back to files": "Volver a los archivos",
|
||||
"Back to pull requests": "",
|
||||
"Back to pull requests": "Volver a las solicitudes de incorporación de cambios",
|
||||
"Back to sign in": "Volver al inicio de sesión",
|
||||
"Background Image": "Imagen de Fondo",
|
||||
"Background image must be at most 25 megapixels.": "La imagen de fondo debe tener como máximo 25 megapíxeles.",
|
||||
|
|
@ -408,7 +408,7 @@
|
|||
"Background sub-agent finished": "Subagente en segundo plano finalizado",
|
||||
"background sub-agents": "subagentes en segundo plano",
|
||||
"Bad Response": "Respuesta Errónea",
|
||||
"Base branch": "",
|
||||
"Base branch": "Rama base",
|
||||
"Base Model (From)": "Modelo Base (desde)",
|
||||
"Base Model is required.": "El Modelo Base es obligatorio.",
|
||||
"Base Models": "Modelos base",
|
||||
|
|
@ -419,17 +419,17 @@
|
|||
"before": "antes",
|
||||
"Being lazy": "Vaguear",
|
||||
"Binary file — text comparison is unavailable.": "Archivo binario: la comparación de texto no está disponible.",
|
||||
"Binary file changed": "",
|
||||
"Binary file changed": "Archivo binario modificado",
|
||||
"Binary file. Download to open.": "Archivo binario. Descárgalo para abrirlo.",
|
||||
"Bing": "Bing",
|
||||
"Block options": "Opciones del bloque",
|
||||
"Bold": "Negrita",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Impulsando o penalizando tokens específicos para respuestas restringidas. Los valores de sesgo se limitarán entre -100 y 100 (inclusive). (Por defecto: ninguno)",
|
||||
"Both files are required for comparison.": "Se necesitan ambos archivos para la comparación.",
|
||||
"Branch actions": "",
|
||||
"Branch actions": "Acciones de la rama",
|
||||
"Brave": "Brave",
|
||||
"Browser": "",
|
||||
"Browser options": "",
|
||||
"Browser": "Navegador",
|
||||
"Browser options": "Opciones del navegador",
|
||||
"build · {{hash}}": "compilación · {{hash}}",
|
||||
"Built-in": "Integrada",
|
||||
"Bullet List": "Lista de Viñetas",
|
||||
|
|
@ -466,7 +466,7 @@
|
|||
"Change folder icon": "Cambiar icono de la carpeta",
|
||||
"Change overview": "Resumen de cambios",
|
||||
"Change User Role": "Cambiar Rol del Usuario",
|
||||
"changed": "",
|
||||
"changed": "con cambios",
|
||||
"Changes sign out all devices. Users enroll on their next sign-in.": "Los cambios cierran la sesión en todos los dispositivos. Cada usuario configurará su autenticador en su próximo inicio de sesión.",
|
||||
"Channel": "Canal",
|
||||
"Channel deleted successfully": "Canal eliminado correctamente",
|
||||
|
|
@ -511,7 +511,7 @@
|
|||
"Check OAuth Discovery": "Comprobar OAuth Discovery",
|
||||
"Check what is running in this chat.": "Comprueba qué se está ejecutando en este chat.",
|
||||
"Checking for updates...": "Buscando actualizaciones...",
|
||||
"Checkout": "",
|
||||
"Checkout": "Cambiar a la rama",
|
||||
"Choose a date range to compare": "Elige un rango de fechas para comparar",
|
||||
"Choose a model before saving...": "Escoge un modelo antes de guardar...",
|
||||
"Choose a parent page. Subpages move with this page.": "Elige una página superior. Las subpáginas se mueven con esta página.",
|
||||
|
|
@ -573,7 +573,7 @@
|
|||
"Close modal": "Cerrar modal",
|
||||
"Close Modal": "Cerrar Modal",
|
||||
"Close pages": "Cerrar páginas",
|
||||
"Close pull request": "",
|
||||
"Close pull request": "Cerrar solicitud de incorporación de cambios",
|
||||
"Close search": "Cerrar búsqueda",
|
||||
"Close session details": "Cerrar detalles de la sesión",
|
||||
"Close Sidebar": "Cerrar Barra Lateral",
|
||||
|
|
@ -591,8 +591,8 @@
|
|||
"Collaborators": "Colaboradores",
|
||||
"Collapse": "Plegar",
|
||||
"Collapse {{name}}": "Plegar {{name}}",
|
||||
"Collapse Git panel": "",
|
||||
"Collapse sessions": "",
|
||||
"Collapse Git panel": "Plegar panel de Git",
|
||||
"Collapse sessions": "Plegar sesiones",
|
||||
"Collapse terminal": "Plegar terminal",
|
||||
"Collection": "Colección",
|
||||
"Collection Field": "Campo de la Colección",
|
||||
|
|
@ -610,11 +610,11 @@
|
|||
"Comment deleted": "Comentario eliminado",
|
||||
"Comments": "Comentarios",
|
||||
"Comments are no longer available.": "Los comentarios ya no están disponibles.",
|
||||
"Commit actions": "",
|
||||
"Commit actions": "Acciones de la confirmación",
|
||||
"Commit message": "Mensaje de confirmación",
|
||||
"Commit Message": "Corregir Mensaje",
|
||||
"Commit summary": "",
|
||||
"Commit to {{branch}}": "",
|
||||
"Commit summary": "Resumen de la confirmación",
|
||||
"Commit to {{branch}}": "Confirmar en {{branch}}",
|
||||
"Community Reviews": "Revisiones de la Comunidad",
|
||||
"Compact": "Compactar",
|
||||
"Compact: shorten older messages so this chat can keep going.": "Compactar: acorta los mensajes más antiguos para que este chat pueda continuar.",
|
||||
|
|
@ -643,18 +643,18 @@
|
|||
"Config imported successfully": "Configuración importada correctamente",
|
||||
"Configure": "Configurar",
|
||||
"Configure app": "Configurar aplicación",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "",
|
||||
"Configure chat files, valves, system prompt, and advanced parameters.": "Configura los archivos del chat, las válvulas, el prompt del sistema y los parámetros avanzados.",
|
||||
"Configure the realtime voice, voice avatar, and text-to-speech voice for this model.": "Configura la voz en tiempo real, el avatar de voz y la voz TTS de este modelo.",
|
||||
"Confirm": "Confirmar",
|
||||
"Confirm Password": "Confirma Contraseña",
|
||||
"Confirm Prompt from Embed": "Confirmar Prompt desde Contenido Incrustado",
|
||||
"Confirm pull request action": "",
|
||||
"Confirm pull request action": "Confirmar acción sobre la solicitud de incorporación de cambios",
|
||||
"Confirm recording": "Confirmar grabación",
|
||||
"Confirm your action": "Confirma tu acción",
|
||||
"Confirm your new password": "Confirma tu nueva contraseña",
|
||||
"Confirm Your Password": "Confirma Tu Contraseña",
|
||||
"Connect": "Conectar",
|
||||
"Connect and select a model first.": "",
|
||||
"Connect and select a model first.": "Conéctate y selecciona un modelo primero.",
|
||||
"Connect external apps to Open WebUI.": "Conecta aplicaciones externas a Open WebUI.",
|
||||
"Connect to an AI provider to start chatting": "Conectar a un proveedor de AI para comenzar a chatear",
|
||||
"Connect to Open Terminal instances. Admins and users granted access can use file browsing and terminal tools through these servers.": "Conéctate a instancias de Open Terminal. Los administradores y los usuarios con acceso concedido pueden usar la exploración de archivos y las herramientas de terminal a través de estos servidores.",
|
||||
|
|
@ -665,12 +665,12 @@
|
|||
"Connected apps": "Aplicaciones conectadas",
|
||||
"Connecting": "Conectando",
|
||||
"Connecting...": "Conectando...",
|
||||
"Connecting…": "",
|
||||
"Connecting…": "Conectando…",
|
||||
"Connection": "Conexión",
|
||||
"Connection failed": "Conexión fallida",
|
||||
"Connection ID": "ID de Conexión",
|
||||
"Connection ID cannot contain \":\" or \"|\" characters": "El ID de conexión no puede contener los caracteres \":\" o \"|\"",
|
||||
"Connection lost. Please retry.": "",
|
||||
"Connection lost. Please retry.": "Conexión perdida. Por favor, vuelve a intentarlo.",
|
||||
"Connection lost. Reconnecting...": "Conexión perdida, reconectando...",
|
||||
"Connection successful": "Conexión realizada",
|
||||
"Connection Type": "Tipo de Conexión",
|
||||
|
|
@ -709,10 +709,10 @@
|
|||
"Copy": "Copiar",
|
||||
"Copy {{name}} to clipboard": "Copiar {{name}} al portapapeles",
|
||||
"Copy API Key": "Copiar clave API",
|
||||
"Copy branch name": "",
|
||||
"Copy branch name": "Copiar nombre de la rama",
|
||||
"Copy change to original": "Copiar cambio al texto original",
|
||||
"Copy change to proposal": "Copiar cambio a la propuesta",
|
||||
"Copy commit hash": "",
|
||||
"Copy commit hash": "Copiar hash de la confirmación",
|
||||
"Copy content": "Copiar contenido",
|
||||
"Copy default": "Copiar valor predeterminado",
|
||||
"Copy Last Code Block": "Copiar el último Bloque de Código",
|
||||
|
|
@ -733,8 +733,8 @@
|
|||
"Copyright (c)": "Copyright (c)",
|
||||
"CORS must be properly configured by the provider to allow requests from Open WebUI.": "El protocolo CORS debe estar configurado correctamente por el proveedor para permitir solicitudes desde Open WebUI.",
|
||||
"Could not check for updates": "No se ha podido comprobar si hay actualizaciones",
|
||||
"Could not copy branch name": "",
|
||||
"Could not copy commit hash": "",
|
||||
"Could not copy branch name": "No se ha podido copiar el nombre de la rama",
|
||||
"Could not copy commit hash": "No se ha podido copiar el hash de la confirmación",
|
||||
"Could not copy to clipboard. Please try again.": "No se ha podido copiar al portapapeles. Por favor, inténtalo de nuevo.",
|
||||
"Could not determine the upload folder.": "No se ha podido determinar la carpeta de subida.",
|
||||
"Could not load avatar.": "No se pudo cargar el avatar.",
|
||||
|
|
@ -759,7 +759,7 @@
|
|||
"Create Account": "Crear Cuenta",
|
||||
"Create Admin Account": "Crear Cuenta Administrativa",
|
||||
"Create announcements shown to users in the app.": "Crea anuncios que se muestran a los usuarios en la aplicación.",
|
||||
"Create branch": "",
|
||||
"Create branch": "Crear rama",
|
||||
"Create Channel": "Crear Canal",
|
||||
"Create copy": "Crear copia",
|
||||
"Create Folder": "Crear Carpeta",
|
||||
|
|
@ -770,7 +770,7 @@
|
|||
"Create scheduled prompts that run automatically on a recurring basis.": "Crea prompts programados para que se ejecuten automáticamente de forma recurrente.",
|
||||
"Create skill": "Crear habilidad",
|
||||
"Create skill: create a reusable terminal skill from this chat.": "Crear habilidad: crea una habilidad de terminal reutilizable a partir de este chat.",
|
||||
"Create worktree": "",
|
||||
"Create worktree": "Crear árbol de trabajo",
|
||||
"Create your first note from the Create menu.": "Crea tu primera nota desde el menú Crear.",
|
||||
"Created": "Creado",
|
||||
"Created at": "Creado en",
|
||||
|
|
@ -797,7 +797,7 @@
|
|||
"Custom Parameter Value": "Valor del Parámetro Personalizado",
|
||||
"Custom permissions": "Permisos personalizados",
|
||||
"Custom range": "Rango personalizado",
|
||||
"Custom schedule": "",
|
||||
"Custom schedule": "Programación personalizada",
|
||||
"Customize": "Personalizar",
|
||||
"Daily": "Diario",
|
||||
"Daily at": "Diariamente a las",
|
||||
|
|
@ -807,7 +807,7 @@
|
|||
"Data": "Datos",
|
||||
"Database": "Base de datos",
|
||||
"Datalab Marker API": "API de Datalab Marker",
|
||||
"Date": "",
|
||||
"Date": "Fecha",
|
||||
"Date Added": "Fecha de Adición",
|
||||
"Date is required": "La fecha es obligatoria",
|
||||
"Date Modified": "Fecha Modificada",
|
||||
|
|
@ -855,8 +855,8 @@
|
|||
"Delete all contents inside this folder": "Eliminar todo el contenido de esta carpeta",
|
||||
"Delete API Key?": "¿Eliminar la Clave API?",
|
||||
"Delete automation?": "¿Eliminar automatización?",
|
||||
"Delete branch": "",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "",
|
||||
"Delete branch": "Eliminar rama",
|
||||
"Delete branch {{branch}}? Unmerged branches will be kept.": "¿Eliminar la rama {{branch}}? Se conservarán las ramas sin fusionar.",
|
||||
"Delete calendar": "Eliminar calendario",
|
||||
"Delete Calendar": "Eliminar Calendario",
|
||||
"Delete Chat": "Eliminar Chat",
|
||||
|
|
@ -906,12 +906,12 @@
|
|||
"Description": "Descripción",
|
||||
"Description ({{language}})": "Descripción ({{language}})",
|
||||
"Deselect": "Deseleccionar",
|
||||
"Desktop": "",
|
||||
"Desktop access denied. Reopen this tab.": "",
|
||||
"Desktop audio": "",
|
||||
"Desktop audio is not supported by this browser.": "",
|
||||
"Desktop audio unavailable.": "",
|
||||
"Desktop connection failed.": "",
|
||||
"Desktop": "Escritorio",
|
||||
"Desktop access denied. Reopen this tab.": "Acceso al escritorio denegado. Vuelve a abrir esta pestaña.",
|
||||
"Desktop audio": "Audio del escritorio",
|
||||
"Desktop audio is not supported by this browser.": "El audio del escritorio no es compatible con este navegador.",
|
||||
"Desktop audio unavailable.": "Audio del escritorio no disponible.",
|
||||
"Desktop connection failed.": "Fallo en la conexión al escritorio.",
|
||||
"Destination": "Destino",
|
||||
"Detected Variables": "Variables Detectadas",
|
||||
"dev build": "compilación de desarrollo",
|
||||
|
|
@ -937,7 +937,7 @@
|
|||
"Discard comparison changes?": "¿Descartar los cambios de la comparación?",
|
||||
"Discard unsaved changes?": "¿Descartar los cambios sin guardar?",
|
||||
"Discard unsaved skill changes?": "¿Descartar los cambios sin guardar de la habilidad?",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "",
|
||||
"Discard unsaved working-tree changes to this file? This cannot be undone.": "¿Descartar los cambios sin guardar de este archivo en el árbol de trabajo? Esta acción no se puede deshacer.",
|
||||
"Disconnect OAuth": "Desconectar OAuth",
|
||||
"Disconnected": "Desconectado",
|
||||
"Discover a function": "Descubrir Funciónes",
|
||||
|
|
@ -986,7 +986,7 @@
|
|||
"Downloading \"{{name}}\"": "Descargando \"{{name}}\"",
|
||||
"Downloading \"{{searchValue}}\"": "Descargando \"{{searchValue}}\"",
|
||||
"Downloading stats...": "Descargando estadísticas...",
|
||||
"Draft": "",
|
||||
"Draft": "Borrador",
|
||||
"Drag and Drop Container": "Zona de arrastrar y soltar",
|
||||
"Drag or use the up and down arrow keys to reorder": "Arrastra o usa las teclas de flecha arriba y abajo para reordenar",
|
||||
"Drag to move": "Arrastra para mover",
|
||||
|
|
@ -1086,14 +1086,14 @@
|
|||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Asegúrese de que su archivo CSV incluya 4 columnas en este orden: Nombre, Correo Electrónico, Contraseña, Rol.",
|
||||
"Enter {{role}} message here": "Ingresar mensaje {{role}} aquí",
|
||||
"Enter a Connection ID to register.": "Ingresa un ID de conexión para registrar el cliente.",
|
||||
"Enter a file name without slashes.": "",
|
||||
"Enter a file name without slashes.": "Introduce un nombre de archivo sin barras.",
|
||||
"Enter a name, content, and a valid command.": "Introduce un nombre, un contenido y un comando válido.",
|
||||
"Enter a title for the pending user info overlay. Leave empty for default.": "Ingresar un título para la sobrecapa informativa de usuario pendiente. Dejar vacío para usar el predeterminado.",
|
||||
"Enter a watermark for the response. Leave empty for none.": "Ingresar una marca de agua para la respuesta. Déjalo vacío para ninguna",
|
||||
"Enter additional headers in JSON format": "Ingresar encabezados adicionales en formato JSON",
|
||||
"Enter additional headers in JSON format (e.g. {\"X-Custom-Header\": \"value\"}": "Ingresar encabezados adicionales en formato JSON (ej. {\"X-Custom-Header\": \"value\"})",
|
||||
"Enter additional parameters in JSON format": "Ingresar parámetros adicionales en formato JSON",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "",
|
||||
"Enter an HTTP or HTTPS URL without credentials.": "Introduce una URL HTTP o HTTPS sin credenciales.",
|
||||
"Enter api auth string (e.g. username:password)": "Ingresar campo de autorización de la api (p.ej. nombre:contraseña)",
|
||||
"Enter Application DN": "Ingresar el DN de la Aplicación",
|
||||
"Enter Application DN Password": "Ingresar la Contraseña del DN de la Aplicación",
|
||||
|
|
@ -1280,12 +1280,12 @@
|
|||
"Execute code for analysis": "Ejecutar código para análisis",
|
||||
"Executing {{NAME}}...": "Ejecutando {{NAME}}...",
|
||||
"Execution timeline": "Cronología de ejecución",
|
||||
"Exit full screen": "",
|
||||
"Exit full screen": "Salir de pantalla completa",
|
||||
"Expand": "Expandir",
|
||||
"Expand {{name}}": "Expandir {{name}}",
|
||||
"Expand Git panel": "",
|
||||
"Expand Git panel": "Expandir panel de Git",
|
||||
"Expand input": "Expandir entrada",
|
||||
"Expand sessions": "",
|
||||
"Expand sessions": "Expandir sesiones",
|
||||
"Expand terminal": "Expandir terminal",
|
||||
"Experience": "Experiencia",
|
||||
"Experimental": "Experimental",
|
||||
|
|
@ -1342,7 +1342,7 @@
|
|||
"Failed to import models": "Fallo al importar modelos",
|
||||
"Failed to load chat": "Fallo al cargar el chat",
|
||||
"Failed to load chat preview": "Fallo al cargar la previsualización del chat",
|
||||
"Failed to load directory": "",
|
||||
"Failed to load directory": "Fallo al cargar el directorio",
|
||||
"Failed to load DOCX file. Please try downloading it instead.": "Fallo al cargar el archivo DOCX. Por favor, en su lugar intente descargarlo",
|
||||
"Failed to load Excel/CSV file. Please try downloading it instead.": "Fallo al cargar el archivo Excel/CSV. Por favor, en su lugar intente descargarlo.",
|
||||
"Failed to load file content.": "Fallo al cargar el contenido del archivo",
|
||||
|
|
@ -1368,7 +1368,7 @@
|
|||
"Failed to save connections": "Fallo al guardar las conexiones",
|
||||
"Failed to save conversation": "Fallo al guardar la conversación",
|
||||
"Failed to save file": "Fallo al guardar el archivo",
|
||||
"Failed to save file. Your changes are still in the editor.": "",
|
||||
"Failed to save file. Your changes are still in the editor.": "Fallo al guardar el archivo. Tus cambios siguen en el editor.",
|
||||
"Failed to save model": "Fallo al guardar el modelo",
|
||||
"Failed to save models configuration": "Fallo al guardar la configuración de los modelos",
|
||||
"Failed to save policy: {{error}}": "Fallo al guardar las normas: {{error}}",
|
||||
|
|
@ -1400,14 +1400,14 @@
|
|||
"File actions": "Acciones del archivo",
|
||||
"File added successfully.": "Archivo añadido correctamente.",
|
||||
"File browser": "Navegador de ficheros",
|
||||
"File changes": "",
|
||||
"File changes": "Cambios del archivo",
|
||||
"File content": "Contenido del archivo",
|
||||
"File content updated successfully.": "Contenido del archivo actualizado correctamente.",
|
||||
"File count limit": "Límite de número de archivos",
|
||||
"File created": "Archivo creado",
|
||||
"File deleted successfully.": "Archivo eliminado correctamente.",
|
||||
"File differences": "Diferencias entre archivos",
|
||||
"File is not writable.": "",
|
||||
"File is not writable.": "No se puede escribir en el archivo.",
|
||||
"File Mode": "Modo de Archivo",
|
||||
"File moved.": "Archivo movido",
|
||||
"File name": "Nombre del archivo",
|
||||
|
|
@ -1504,9 +1504,9 @@
|
|||
"Get information on {{name}} in the UI": "Obtener información sobre {{name}} en la IU",
|
||||
"Get started": "Empezar",
|
||||
"Get started with {{WEBUI_NAME}}": "Empezar con {{WEBUI_NAME}}",
|
||||
"Git": "",
|
||||
"Git changes": "",
|
||||
"Git unavailable": "",
|
||||
"Git": "Git",
|
||||
"Git changes": "Cambios de Git",
|
||||
"Git unavailable": "Git no disponible",
|
||||
"Give me ideas": "Dame ideas",
|
||||
"give me tips": "dame consejos",
|
||||
"Global": "Global",
|
||||
|
|
@ -1534,7 +1534,7 @@
|
|||
"H1": "H1",
|
||||
"H2": "H2",
|
||||
"H3": "H3",
|
||||
"Head branch": "",
|
||||
"Head branch": "Rama de origen",
|
||||
"Headers": "Encabezados",
|
||||
"Headers must be a valid JSON object": "El Encabezado debe ser un objeto JSON válido",
|
||||
"Height": "Altura",
|
||||
|
|
@ -1551,13 +1551,13 @@
|
|||
"Hide": "Esconder",
|
||||
"Hide All": "Ocultar Todo",
|
||||
"Hide conversation": "Ocultar conversación",
|
||||
"Hide diff": "",
|
||||
"Hide diff": "Ocultar comparación",
|
||||
"Hide from Sidebar": "Ocultar Panel Lateral",
|
||||
"Hide Hidden Files": "Ocultar Archivos Ocultos",
|
||||
"Hide Model": "Ocultar Modelo",
|
||||
"Hide preview": "Ocultar vista previa",
|
||||
"Hide sub-agents": "Ocultar subagentes",
|
||||
"Hide tabs": "",
|
||||
"Hide tabs": "Ocultar pestañas",
|
||||
"Hide whitespace": "Ocultar espacios en blanco",
|
||||
"High": "Alto",
|
||||
"History": "Historial",
|
||||
|
|
@ -1696,7 +1696,7 @@
|
|||
"Knowledge source updated.": "Fuente de conocimiento actualizada.",
|
||||
"Knowledge updated successfully": "Conocimiento actualizado correctamente.",
|
||||
"Kokoro.js (Browser)": "Kokoro.js (Navegador)",
|
||||
"Labels": "",
|
||||
"Labels": "Etiquetas",
|
||||
"Last 12 months": "Últimos 12 meses",
|
||||
"Last 24 hours": "Últimas 24 horas",
|
||||
"Last 30 days": "Útimos 30 días",
|
||||
|
|
@ -1792,7 +1792,7 @@
|
|||
"March": "Marzo",
|
||||
"Mark all as read": "Marcar todo como leído",
|
||||
"Mark as unread": "Marcar como no leído",
|
||||
"Mark ready": "",
|
||||
"Mark ready": "Marcar como lista",
|
||||
"Markdown": "Markdown",
|
||||
"Market": "Mercado",
|
||||
"Matching tabs: {{count}}_one": "Pestañas coincidentes: {{count}}",
|
||||
|
|
@ -1824,21 +1824,21 @@
|
|||
"Mention someone": "Mencionar a alguien",
|
||||
"Mentions only": "Solo menciones",
|
||||
"Menu": "Menú",
|
||||
"Merge": "",
|
||||
"Merge": "Fusionar",
|
||||
"Merge Responses": "Fusionar Respuestas",
|
||||
"Merged Response": "Respuesta combinada",
|
||||
"Message": "Mensaje",
|
||||
"Message counts and response timestamps": "Recuento de mensajes y marcas de tiempo de la respuesta",
|
||||
"Message counts are based on assistant responses.": "El recuento de mensajes está basado en las respuestas del asistente",
|
||||
"Message exceeds the 16 KiB limit.": "El mensaje supera el límite de 16 KiB.",
|
||||
"Message number": "",
|
||||
"Message number": "Número de mensaje",
|
||||
"Message rating should be enabled to use this feature": "Para usar esta función debe estar habilitada la calificación de mensajes",
|
||||
"Message share": "Porcentaje de mensajes",
|
||||
"Message text...": "Mensaje de texto...",
|
||||
"messages": "mensajes",
|
||||
"Messages": "Mensajes",
|
||||
"Messages are end-to-end encrypted and aren’t saved.": "Los mensajes están cifrados de extremo a extremo y no se guardan.",
|
||||
"Messages disappear when you close this tab.": "",
|
||||
"Messages disappear when you close this tab.": "Los mensajes desaparecen al cerrar esta pestaña.",
|
||||
"Metadata Field": "Campo de Metadatos",
|
||||
"Microphone off": "Micrófono desactivado",
|
||||
"Microsoft OneDrive": "Microsoft OneDrive",
|
||||
|
|
@ -1852,7 +1852,7 @@
|
|||
"Mistral OCR Parameters": "Parámetros de Mistral OCR",
|
||||
"MistralAI": "MistralAI",
|
||||
"Mo_day_of_week": "los lunes",
|
||||
"Mobile view": "",
|
||||
"Mobile view": "Vista móvil",
|
||||
"Model": "Modelo",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Modelo '{{modelName}}' se ha descargado correctamente.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Modelo '{{modelTag}}' ya está en cola para descargar.",
|
||||
|
|
@ -1907,7 +1907,7 @@
|
|||
"Models imported successfully": "Modelos importados correctamente",
|
||||
"Models Public Sharing": "Compartir Modelos Públicamente",
|
||||
"Models Sharing": "Compartir Modelos",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "",
|
||||
"Models this model can delegate to. Users must have access to them. Leave empty to use the current model.": "Modelos en los que este modelo puede delegar. Los usuarios deben tener acceso a ellos. Déjalo vacío para usar el modelo actual.",
|
||||
"Modified": "Modificadas",
|
||||
"Mojeek": "Mojeek",
|
||||
"Mon": "Lun",
|
||||
|
|
@ -1943,7 +1943,7 @@
|
|||
"Navigate to Previous Chat": "Ir al Chat Anterior",
|
||||
"Never": "Nunca",
|
||||
"New": "Nuevo",
|
||||
"New branch": "",
|
||||
"New branch": "Nueva rama",
|
||||
"New Button": "Nuevo Botón",
|
||||
"New calendar": "Nuevo calendario",
|
||||
"New Calendar": "Nuevo Calendario",
|
||||
|
|
@ -1958,14 +1958,14 @@
|
|||
"New Group": "Nuevo Grupo",
|
||||
"New Note": "Nueva Nota",
|
||||
"New Password": "Nueva Contraseña",
|
||||
"New pull request": "",
|
||||
"New pull request": "Nueva solicitud de incorporación de cambios",
|
||||
"New skills and copies are private. Replace saves a new version and preserves existing sharing.": "Las habilidades nuevas y las copias son privadas. Reemplazar guarda una nueva versión y conserva los permisos de uso compartido existentes.",
|
||||
"New tab": "",
|
||||
"New tab": "Nueva pestaña",
|
||||
"New Temporary Chat": "Nuevo Chat Temporal",
|
||||
"New Terminal": "Nuevo Terminal",
|
||||
"New Tool": "Nueva Herramienta",
|
||||
"New Webhook": "Nuevo Webhook",
|
||||
"New worktree": "",
|
||||
"New worktree": "Nuevo árbol de trabajo",
|
||||
"new-channel": "nuevo-canal",
|
||||
"Next": "Siguiente",
|
||||
"Next change": "Siguiente cambio",
|
||||
|
|
@ -1985,7 +1985,7 @@
|
|||
"No apps connected.": "No hay aplicaciones conectadas.",
|
||||
"No authentication": "Sin Autentificación",
|
||||
"No automations found": "No se encontró ninguna automatización",
|
||||
"No changes": "",
|
||||
"No changes": "Sin cambios",
|
||||
"No channels": "Sin canales",
|
||||
"No chat alerts": "Sin alertas de chat",
|
||||
"No chat history": "Sin historial de chat",
|
||||
|
|
@ -1995,9 +1995,9 @@
|
|||
"No chats found": "No se encontró ningún chat",
|
||||
"No chats found for this user.": "No se encontró ningún chat de este usuario",
|
||||
"No chats found.": "No se encontró ningún chat",
|
||||
"No checks": "",
|
||||
"No checks": "Sin comprobaciones",
|
||||
"No comments yet": "Aún no hay comentarios",
|
||||
"No commits yet": "",
|
||||
"No commits yet": "Aún no hay confirmaciones",
|
||||
"No content": "Sin contenido",
|
||||
"No content available": "No hay contenido disponible",
|
||||
"No content found": "No se encontró contenido",
|
||||
|
|
@ -2056,7 +2056,7 @@
|
|||
"No previous usage": "Sin uso previo",
|
||||
"No prompts found": "No se encontraron prompts",
|
||||
"No prompts yet": "Aún no hay prompts",
|
||||
"No pull requests": "",
|
||||
"No pull requests": "No hay solicitudes de incorporación de cambios",
|
||||
"No Repeat": "Sin Repetición",
|
||||
"No results": "No se encontraron resultados",
|
||||
"No results found": "No se encontraron resultados",
|
||||
|
|
@ -2074,7 +2074,7 @@
|
|||
"No Terminal connection configured.": "Ninguna conexión configurada a Terminal",
|
||||
"No terminal connections configured.": "No hay conexiones a terminal configuradas.",
|
||||
"No terminal servers available": "No hay servidores de terminal disponibles",
|
||||
"No text changes": "",
|
||||
"No text changes": "Sin cambios en el texto",
|
||||
"No text differences": "No hay diferencias de texto",
|
||||
"No tool server connections configured.": "No hay conexiones a servidores de herramientas configuradas",
|
||||
"No tools accessible": "Ninguna herramienta accesible",
|
||||
|
|
@ -2087,7 +2087,7 @@
|
|||
"No valves to update": "No hay válvulas para actualizar",
|
||||
"No webhooks yet": "Todavía no hay webhooks",
|
||||
"Node Ids": "IDs de Nodo",
|
||||
"none": "",
|
||||
"none": "sin elementos",
|
||||
"None": "Ninguno",
|
||||
"None reported": "Sin elementos indicados",
|
||||
"Not configured": "Sin configurar",
|
||||
|
|
@ -2150,14 +2150,14 @@
|
|||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "¡vaya! Parece que la URL es inválida. Por favor, revisala y reintenta de nuevo.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "¡vaya! Estás usando un método no soportado (solo interfaz frontal-frontend). Por favor sirve WebUI desde el interfaz trasero (servidor backend).",
|
||||
"Open": "Abrir",
|
||||
"Open a tab using the + menu.": "",
|
||||
"Open a tab using the + menu.": "Abre una pestaña desde el menú +.",
|
||||
"Open automation": "Abrir automatización",
|
||||
"Open chat": "Abrir chat",
|
||||
"Open create menu": "Abrir el menú Crear",
|
||||
"Open file": "Abrir archivo",
|
||||
"Open Folder": "Abrir Carpeta",
|
||||
"Open in full screen": "Abrir en pantalla completa",
|
||||
"Open in GitHub": "",
|
||||
"Open in GitHub": "Abrir en GitHub",
|
||||
"Open in new tab": "Abrir en pestaña nueva",
|
||||
"Open link": "Abrir enlace",
|
||||
"Open modal to configure connection": "Abrir modal para configurar la conexión",
|
||||
|
|
@ -2217,7 +2217,7 @@
|
|||
"parameter": "parámetro",
|
||||
"Parameter": "Parámetro",
|
||||
"Parameters": "Parámetros",
|
||||
"Parent directory": "",
|
||||
"Parent directory": "Directorio superior",
|
||||
"Parent group": "Grupo padre",
|
||||
"Parent message not found": "Mensaje padre no encontrado",
|
||||
"Parent page": "Página superior",
|
||||
|
|
@ -2285,7 +2285,7 @@
|
|||
"Please select a reason": "Por favor selecciona un motivo",
|
||||
"Please select a valid JSON file": "Por favor selecciona un archivo JSON válido",
|
||||
"Please select at least one user for Direct Message channel.": "Por favor selecciona al menos un usuario para el canal de Mensajes Directos",
|
||||
"Please wait for files to finish uploading.": "",
|
||||
"Please wait for files to finish uploading.": "Por favor, espera a que los archivos se acaben de subir.",
|
||||
"Please wait until all files are uploaded.": "Por favor, espera a que todos los archivos se acaben de subir",
|
||||
"PNG, JPEG, WebP, or GIF. Up to 5 MiB and 25 megapixels.": "PNG, JPEG, WebP o GIF. Hasta 5 MiB y 25 megapíxeles.",
|
||||
"Policy changes apply to newly provisioned terminals. Refresh matching terminals to apply them to existing terminals.": "Los cambios en las normas se aplican a los terminales aprovisionados a partir de ahora. Actualiza los terminales coincidentes para aplicarlos a los terminales existentes.",
|
||||
|
|
@ -2342,15 +2342,15 @@
|
|||
"Provider": "Proveedor",
|
||||
"Provider context": "Ventana de contexto del proveedor",
|
||||
"Provider details": "Detalles del proveedor",
|
||||
"Proxy": "",
|
||||
"Proxy": "Servidor proxy",
|
||||
"Public": "Público",
|
||||
"Public key": "Clave pública",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" desde Ollama.com",
|
||||
"Pull a model from Ollama.com": "Extraer un modelo desde Ollama.com",
|
||||
"Pull Model": "Extraer Modelo",
|
||||
"Pull request actions": "",
|
||||
"Pull request description": "",
|
||||
"Pull request title": "",
|
||||
"Pull request actions": "Acciones de la solicitud de incorporación de cambios",
|
||||
"Pull request description": "Descripción de la solicitud de incorporación de cambios",
|
||||
"Pull request title": "Título de la solicitud de incorporación de cambios",
|
||||
"Punctuation": "Puntuación",
|
||||
"Pyodide file browser": "Navegador de archivos de Pyodide",
|
||||
"Quality": "Calidad",
|
||||
|
|
@ -2371,7 +2371,7 @@
|
|||
"Read the docs": "Leer la documentación",
|
||||
"Read-only": "Solo lectura",
|
||||
"Read-Only Access": "Acceso Solo-Lectura",
|
||||
"Ready": "",
|
||||
"Ready": "Marcar como lista",
|
||||
"Realtime": "Tiempo real",
|
||||
"Realtime Voice": "Voz en Tiempo Real",
|
||||
"Reason": "Razonamiento",
|
||||
|
|
@ -2385,7 +2385,7 @@
|
|||
"Recommended": "Recomendado",
|
||||
"Reconnect": "Reconectar",
|
||||
"Reconnected": "Reconectado",
|
||||
"Reconnecting…": "",
|
||||
"Reconnecting…": "Reconectando…",
|
||||
"Record": "Grabar",
|
||||
"Record voice": "Grabar voz",
|
||||
"Recorded duration": "Duración registrada",
|
||||
|
|
@ -2446,11 +2446,11 @@
|
|||
"Removing {{count}} stale files..._many": "Eliminando {{count}} archivos huérfanos...",
|
||||
"Removing {{count}} stale files..._other": "Eliminando {{count}} archivos huérfanos...",
|
||||
"Rename": "Renombrar",
|
||||
"Rename branch": "",
|
||||
"Rename branch": "Renombrar rama",
|
||||
"Rename page": "Renombrar página",
|
||||
"Renamed to {{name}}": "Renombrado como {{name}}",
|
||||
"Rendered preview": "Vista previa con formato",
|
||||
"Reopen": "",
|
||||
"Reopen": "Reabrir",
|
||||
"Reorder": "Reordenar",
|
||||
"Repeat": "Repetir",
|
||||
"Replace": "Reemplazar",
|
||||
|
|
@ -2462,7 +2462,7 @@
|
|||
"Reply to thread...": "Responder al hilo...",
|
||||
"Replying to {{NAME}}": "Responder a {{NAME}}",
|
||||
"Reported by the provider.": "Información proporcionada por el proveedor.",
|
||||
"Request changes": "",
|
||||
"Request changes": "Solicitar cambios",
|
||||
"Requested scopes": "Ámbitos solicitados",
|
||||
"Require an authenticator for all users": "Exigir un autenticador a todos los usuarios",
|
||||
"required": "requerido",
|
||||
|
|
@ -2477,7 +2477,7 @@
|
|||
"Reset to Defaults": "Restablecer a los Valores Predeterminados",
|
||||
"Reset view": "Restablecer la vista",
|
||||
"Reset zoom": "Restablecer el zoom",
|
||||
"Resize Git panel": "",
|
||||
"Resize Git panel": "Cambiar tamaño del panel de Git",
|
||||
"Resize panel": "Cambiar el tamaño del panel",
|
||||
"Resolved": "Resuelto",
|
||||
"Response": "Respuesta",
|
||||
|
|
@ -2488,7 +2488,7 @@
|
|||
"Responses": "Respuestas",
|
||||
"responses with recorded usage": "respuestas con uso registrado",
|
||||
"Restart": "Reiniciar",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "",
|
||||
"Restart all Open WebUI instances to apply changes to the provider connection settings.": "Reinicia todas las instancias de Open WebUI para aplicar los cambios en los ajustes de conexión del proveedor.",
|
||||
"Restricted": "Restringido",
|
||||
"Result": "Resultado",
|
||||
"RESULT": "Resultado",
|
||||
|
|
@ -2500,13 +2500,13 @@
|
|||
"Retrieved {{count}} sources_other": "Recuperadas {{count}} fuentes",
|
||||
"Retrieved 1 source": "Recuperada una fuente",
|
||||
"Retry": "Reintentar",
|
||||
"Retry Git detection": "",
|
||||
"Retry Git detection": "Reintentar detección de Git",
|
||||
"Retry setup": "Reintentar configuración",
|
||||
"Return to call": "Volver a la llamada",
|
||||
"Return to conversation": "Volver a la conversación",
|
||||
"Review": "Revisar",
|
||||
"Review the scopes this app is requesting before adding it.": "Revisa los ámbitos que solicita esta aplicación antes de añadirla.",
|
||||
"Reviewers": "",
|
||||
"Reviewers": "Revisores",
|
||||
"Revised": "Revisado",
|
||||
"Rewrite the selected text.": "Reescribe el texto seleccionado.",
|
||||
"Role": "Rol",
|
||||
|
|
@ -2532,7 +2532,7 @@
|
|||
"Save & Create": "Guardar y Crear",
|
||||
"Save & Update": "Guardar y Actualizar",
|
||||
"Save and send": "Guardar y enviar",
|
||||
"Save As": "",
|
||||
"Save As": "Guardar como",
|
||||
"Save As Copy": "Guardar como Copia",
|
||||
"Save Chat": "Guardar Chat",
|
||||
"Save draft as copy": "Guardar borrador como copia",
|
||||
|
|
@ -2559,7 +2559,7 @@
|
|||
"Search actions": "Buscar acciones",
|
||||
"Search all emojis": "Buscar todos los emojis",
|
||||
"Search Automations": "Buscar Automatizaciones",
|
||||
"Search branches": "",
|
||||
"Search branches": "Buscar ramas",
|
||||
"Search built-in tools": "Buscar herramientas integradas",
|
||||
"Search channels": "Buscar canales",
|
||||
"Search Chats": "Buscar Chats",
|
||||
|
|
@ -2588,7 +2588,7 @@
|
|||
"Search or add pattern": "Buscar o añadir un patrón",
|
||||
"Search parent groups": "Buscar grupos padre",
|
||||
"Search Prompts": "Buscar Prompts",
|
||||
"Search pull requests": "",
|
||||
"Search pull requests": "Buscar solicitudes de incorporación de cambios",
|
||||
"Search results": "Resultados de búsqueda",
|
||||
"Search scopes": "Buscar ámbitos",
|
||||
"Search sessions": "Buscar sesiones",
|
||||
|
|
@ -2602,7 +2602,7 @@
|
|||
"Search users or groups": "Buscar usuarios o grupos",
|
||||
"Search workspace": "Buscar en el espacio de trabajo",
|
||||
"Search workspace…": "Buscar en el espacio de trabajo…",
|
||||
"Search worktrees": "",
|
||||
"Search worktrees": "Buscar árboles de trabajo",
|
||||
"Search your workspace": "Buscar en tu espacio de trabajo",
|
||||
"Searched {{count}} sites": "{{count}} sitios buscados",
|
||||
"Searching": "Buscando",
|
||||
|
|
@ -2629,11 +2629,11 @@
|
|||
"Select a model to isolate it.": "Selecciona un modelo para mostrarlo por separado.",
|
||||
"Select a pipeline": "Seleccionar un pipeline",
|
||||
"Select a pipeline url": "Seleccionar una url de pipeline",
|
||||
"Select a pull request": "",
|
||||
"Select a pull request": "Selecciona una solicitud de incorporación de cambios",
|
||||
"Select a range to filter sessions. Partial usage is included.": "Selecciona un intervalo para filtrar las sesiones. Se incluye el uso parcial.",
|
||||
"Select a reranking model engine": "Seleccionar un motor de modelos de reclasificación",
|
||||
"Select a role": "Seleccionar un rol",
|
||||
"Select a terminal to open localhost URLs.": "",
|
||||
"Select a terminal to open localhost URLs.": "Selecciona un terminal para abrir URL de localhost.",
|
||||
"Select a theme": "Seleccionar un tema",
|
||||
"Select a tool": "Seleccionar una herramienta",
|
||||
"Select a voice": "Seleccionar una voz",
|
||||
|
|
@ -2657,9 +2657,9 @@
|
|||
"Select loaded files": "Seleccionar los archivos cargados",
|
||||
"Select Method": "Seleccionar Método",
|
||||
"Select model": "Seleccionar modelo",
|
||||
"Select only one model": "",
|
||||
"Select only one model": "Selecciona solo un modelo",
|
||||
"Select only one model to call": "Seleccionar sólo un modelo a llamar",
|
||||
"Select only one model to open a side chat.": "",
|
||||
"Select only one model to open a side chat.": "Selecciona solo un modelo para abrir un chat lateral.",
|
||||
"Select options": "Seleccionar opciones",
|
||||
"Select Skill": "Seleccionar Habilidad",
|
||||
"Select to isolate model": "Seleccionar para mostrar el modelo por separado",
|
||||
|
|
@ -3361,8 +3361,8 @@
|
|||
"settings.admin.models.builtinTools.time.description": "Obtener la hora actual y realizar cálculos de fecha y hora",
|
||||
"settings.admin.models.builtinTools.time.label": "Tiempo y Cálculo",
|
||||
"settings.admin.models.builtinTools.title": "Herramientas Integradas",
|
||||
"settings.admin.models.builtinTools.tools.description": "",
|
||||
"settings.admin.models.builtinTools.tools.label": "",
|
||||
"settings.admin.models.builtinTools.tools.description": "Crear herramientas en Python en el espacio de trabajo desde el chat",
|
||||
"settings.admin.models.builtinTools.tools.label": "Creación de Herramientas",
|
||||
"settings.admin.models.builtinTools.userInput.description": "Pausar una respuesta para hacerle al usuario una pregunta aclaratoria",
|
||||
"settings.admin.models.builtinTools.userInput.label": "Preguntar al Usuario",
|
||||
"settings.admin.models.builtinTools.webSearch.description": "Buscar en la web y obtener URLs",
|
||||
|
|
@ -3883,7 +3883,7 @@
|
|||
"Show all {{count}} contributors_one": "Mostrar {{count}} autor de las aportaciones",
|
||||
"Show all {{count}} contributors_many": "Mostrar los {{count}} autores de las aportaciones",
|
||||
"Show all {{count}} contributors_other": "Mostrar los {{count}} autores de las aportaciones",
|
||||
"Show diff": "",
|
||||
"Show diff": "Mostrar comparación",
|
||||
"Show Files": "Mostrar Archivos",
|
||||
"Show Hidden Files": "Mostrar Archivos Ocultos",
|
||||
"Show image preview": "Mostrar previsualización de imagen",
|
||||
|
|
@ -3899,7 +3899,7 @@
|
|||
"Show your support!": "¡Muestra tu apoyo!",
|
||||
"Showcased creativity": "Creatividad exhibida",
|
||||
"Showing search match": "Mostrando coincidencia de búsqueda",
|
||||
"Side chat": "",
|
||||
"Side chat": "Chat lateral",
|
||||
"Sidebar": "Barra Lateral",
|
||||
"Sign in": "Iniciar Sesión",
|
||||
"Sign in again": "Volver a iniciar sesión",
|
||||
|
|
@ -3956,9 +3956,9 @@
|
|||
"Speech-to-Text Language": "Idioma para Voz a Texto",
|
||||
"Split": "En paralelo",
|
||||
"Sponsor on GitHub": "Patrocinar en GitHub",
|
||||
"SQL query": "",
|
||||
"SQL query": "Consulta SQL",
|
||||
"Staan API Key": "Clave API de Staan",
|
||||
"Staged changes": "",
|
||||
"Staged changes": "Cambios preparados",
|
||||
"Standard": "Estándar",
|
||||
"Start a new conversation": "Comenzar una conversación nueva",
|
||||
"Start a voice call using your microphone?": "¿Iniciar una llamada de voz con tu micrófono?",
|
||||
|
|
@ -4004,14 +4004,14 @@
|
|||
"Suggested": "Sugerido",
|
||||
"Suggested prompts": "Prompts sugeridos",
|
||||
"Summarize this note.": "Resume esta nota.",
|
||||
"Summary": "",
|
||||
"Summary": "Resumen",
|
||||
"Sun": "Dom",
|
||||
"Support": "Soportar",
|
||||
"Support this plugin:": "Apoya este plugin:",
|
||||
"Supported parameters": "Parámetros compatibles",
|
||||
"Swap": "Intercambiar",
|
||||
"Swap sides": "Intercambiar lados",
|
||||
"Switch branch": "",
|
||||
"Switch branch": "Cambiar de rama",
|
||||
"Switch camera": "Cambiar de cámara",
|
||||
"Switch to Assistant role": "Cambiar al rol de Asistente",
|
||||
"Switch to JSON editor": "Cambiar a editor JSON",
|
||||
|
|
@ -4033,7 +4033,7 @@
|
|||
"System Instructions": "Instrucciones del sistema",
|
||||
"System Prompt": "Prompt del sistema",
|
||||
"Table": "Tabla",
|
||||
"Tabs": "",
|
||||
"Tabs": "Pestañas",
|
||||
"Tag": "Etiqueta",
|
||||
"Tags": "Etiquetas",
|
||||
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "El Muestreo de cola libre(TFS_Z) es usado para reducir el impacto de los tokens menos probables en la salida. Un valor más alto (p.ej. 2.0) reduce más fuertemente el impacto, mientras que un valor de 1.0 deshabilita este ajuste.",
|
||||
|
|
@ -4048,7 +4048,7 @@
|
|||
"Tell me a random fun fact about the Roman Empire": "Dime un dato curioso al azar sobre el Imperio romano",
|
||||
"Tell us more:": "Dinos algo más:",
|
||||
"Temporary": "Temporal",
|
||||
"Temporary chat": "",
|
||||
"Temporary chat": "Chat temporal",
|
||||
"Temporary Chat": "Chat Temporal",
|
||||
"Temporary: toggle temporary chat for this new chat.": "Temporal: activa o desactiva el chat temporal para este chat nuevo.",
|
||||
"Terminal": "Terminal",
|
||||
|
|
@ -4093,7 +4093,7 @@
|
|||
"This cannot be undone. Replies will remain visible.": "Esto no se puede deshacer. Las respuestas seguirán siendo visibles.",
|
||||
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Este canal fue creado el {{createdAt}}. Este es el comienzo del canal {{channelName}}.",
|
||||
"This chat won't appear in history and your messages will not be saved.": "Este chat no aparecerá en el historial y los mensajes no se guardarán.",
|
||||
"This file is already open. Close its tab or choose another name.": "",
|
||||
"This file is already open. Close its tab or choose another name.": "Este archivo ya está abierto. Cierra su pestaña o elige otro nombre.",
|
||||
"This folder is empty": "Esta carpeta está vacía",
|
||||
"This is a default user permission and will remain enabled.": "Este es un permiso predeterminado y se mantendrá activo ",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Esta es una característica experimental, por lo que puede no funcionar como se esperaba y está sujeta a cambios en cualquier momento.",
|
||||
|
|
@ -4231,8 +4231,8 @@
|
|||
"Unchanged lines omitted": "Líneas sin cambios omitidas",
|
||||
"Underline": "Subrayado",
|
||||
"Undo": "Deshacer",
|
||||
"Undo last commit": "",
|
||||
"Undo the last commit and keep its changes staged?": "",
|
||||
"Undo last commit": "Deshacer última confirmación",
|
||||
"Undo the last commit and keep its changes staged?": "¿Deshacer la última confirmación y mantener sus cambios preparados?",
|
||||
"Unified": "Unificada",
|
||||
"Uninstall": "Desinstalar",
|
||||
"Uninstall app": "Desinstalar aplicación",
|
||||
|
|
@ -4250,7 +4250,7 @@
|
|||
"Unmute to continue": "Reactiva el micrófono para continuar",
|
||||
"Unpin": "Desfijar",
|
||||
"Unpin from Sidebar": "Desfijar de la Barra LAteral",
|
||||
"Unpushed": "",
|
||||
"Unpushed": "Sin enviar",
|
||||
"Unread": "No leído",
|
||||
"Unsaved changes": "Cambios sin guardar",
|
||||
"Unsaved changes to this version will be discarded.": "Se descartarán los cambios sin guardar de esta versión.",
|
||||
|
|
@ -4267,7 +4267,7 @@
|
|||
"Update All Models": "Actualizar Todos los Modelos",
|
||||
"Update and Copy Link": "Actualizar y Copiar Enlace",
|
||||
"Update app": "Actualizar aplicación",
|
||||
"Update branch": "",
|
||||
"Update branch": "Actualizar rama",
|
||||
"Update for the latest features and improvements.": "Actualizar para las últimas características y mejoras.",
|
||||
"Update your status": "Actualizar tu estado",
|
||||
"Updated": "Actualizado",
|
||||
|
|
@ -4311,7 +4311,7 @@
|
|||
"Use default": "Predeterminado",
|
||||
"Use device vibration feedback on supported Android devices.": "Usa la vibración del dispositivo en los dispositivos Android compatibles.",
|
||||
"Use discovered scopes": "Usar los ámbitos detectados",
|
||||
"Use full-width tabs": "",
|
||||
"Use full-width tabs": "Usar pestañas a ancho completo",
|
||||
"Use global setting": "Usar ajuste global",
|
||||
"Use groups to organize your users and assign permissions.": "Usar grupos para organizar tus usuarios y asignar permisos",
|
||||
"Use in prompt": "Usar en el prompt",
|
||||
|
|
@ -4319,7 +4319,7 @@
|
|||
"Use segmented retrieval for focused and relevant content extraction.": "Usa la recuperación segmentada para una extracción de contenido selectiva y relevante.",
|
||||
"Use segmented retrieval for focused and relevant context.": "Usa la recuperación segmentada para obtener un contexto selectivo y relevante.",
|
||||
"Use segmented retrieval for focused context.": "Usa la recuperación segmentada para obtener un contexto selectivo.",
|
||||
"Use side tabs": "",
|
||||
"Use side tabs": "Usar pestañas laterales",
|
||||
"Use these in model system prompts as {{example}}.": "Úsalas en los prompts del sistema del modelo como {{example}}.",
|
||||
"Use Web Search?": "¿Usar la Búsqueda Web?",
|
||||
"Used in native function calling mode. Workspace settings and user permissions still apply.": "Se usa en el modo de llamada a funciones nativa. Los ajustes del espacio de trabajo y los permisos de usuario siguen aplicándose.",
|
||||
|
|
@ -4373,11 +4373,11 @@
|
|||
"Video": "Vídeo",
|
||||
"Video player": "Reproductor de vídeo",
|
||||
"View": "Vista",
|
||||
"View changes": "",
|
||||
"View changes": "Ver cambios",
|
||||
"View channel": "Ver el canal",
|
||||
"View chat": "Ver el chat",
|
||||
"View comment": "Ver comentario",
|
||||
"View on {{platform}}": "",
|
||||
"View on {{platform}}": "Ver en {{platform}}",
|
||||
"View Replies": "Ver Respuestas",
|
||||
"View Result from {{NAME}}": "Ver el Resultado de {{NAME}}",
|
||||
"View source": "Ver código fuente",
|
||||
|
|
@ -4448,15 +4448,15 @@
|
|||
"Work": "Trabajo",
|
||||
"Working Directory": "Directorio de Trabajo",
|
||||
"Working Directory Context": "Contexto del Directorio de Trabajo",
|
||||
"Working tree changes": "",
|
||||
"Working tree changes": "Cambios del árbol de trabajo",
|
||||
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Trabaja conjuntamente con top-k. Un valor más alto (p.ej. 0.95) dará lugar a un texto más diverso, mientras que un valor más bajo (p.ej. 0.5) generará un texto más centrado y conservador.",
|
||||
"Workspace": "Espacio de Trabajo",
|
||||
"Workspace Models": "Modelos del espacio de trabajo",
|
||||
"Workspace Permissions": "Permisos del Espacio de Trabajo",
|
||||
"Workspace search": "Búsqueda en el espacio de trabajo",
|
||||
"Worktree branch": "",
|
||||
"Worktree directory": "",
|
||||
"Worktrees": "",
|
||||
"Worktree branch": "Rama del árbol de trabajo",
|
||||
"Worktree directory": "Directorio del árbol de trabajo",
|
||||
"Worktrees": "Árboles de trabajo",
|
||||
"Write": "Escribir",
|
||||
"Write a prompt…": "Escribe un prompt…",
|
||||
"Write a summary in 50 words that summarizes {{topic}}.": "Escribe un resumen en 50 palabras que resuma {{topic}}.",
|
||||
|
|
@ -4485,7 +4485,7 @@
|
|||
"You do not have permission to upload files to this knowledge base.": "No tienes permiso para subir archivos a esta base de conocimiento.",
|
||||
"You do not have permission to upload files.": "No tienes permiso para subir archivos.",
|
||||
"You do not have permission to upload web content.": "No tienes permiso para subir contenido web",
|
||||
"You do not have permission to use side chat.": "",
|
||||
"You do not have permission to use side chat.": "No tienes permiso para usar el chat lateral.",
|
||||
"You have more than 50 users, which often means this workspace is supporting organizational use. Open WebUI is free to use as-is, with no restrictions or hidden limits, and we want to keep it that way.": "Tienes más de 50 usuarios, lo que suele significar que este espacio de trabajo da soporte a un uso organizativo. Open WebUI es de uso gratuito tal cual, sin restricciones ni límites ocultos, y queremos que siga siendo así.",
|
||||
"You have no archived conversations.": "No tienes conversaciones archivadas.",
|
||||
"You have no shared conversations.": "No tienes conversaciones compartidas",
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue