corrected project, added mcp, litellm, fastapi yet

This commit is contained in:
G0DSEND016 2026-05-18 08:23:37 +02:00
parent d400215596
commit 03ef7118f0
130 changed files with 9539 additions and 10531 deletions

View File

@ -1,8 +1,12 @@
# Git # ===== Git =====
.git .git
.gitignore .gitignore
# Python # ===== OS =====
.DS_Store
Thumbs.db
# ===== Python =====
__pycache__/ __pycache__/
*.py[cod] *.py[cod]
*.pyo *.pyo
@ -13,38 +17,29 @@ __pycache__/
dist/ dist/
build/ build/
# Virtual envs # ===== Virtual envs =====
.venv .venv
venv venv
env/ env/
# Env files # ===== Env files =====
.env .env
.env.* .env.*
!.env.example !.env.example
# Editors # ===== Editors =====
.vscode/ .vscode/
.idea/ .idea/
# Tests # ===== Tests =====
tests/ tests/
test/ test/
# Node # ===== Docker =====
node_modules/
frontend/node_modules/
.next/
frontend/.next/
npm-debug.log*
yarn-error.log*
# Docker
Dockerfile Dockerfile
docker-compose.yml docker-compose.yml
.dockerignore .dockerignore
# ===== Chainlit =====
.files/ .files/
.chainlit/translations/* *.log
!.chainlit/translations/en-US.json

29
.env.example Normal file
View File

@ -0,0 +1,29 @@
# .env
# ----- API KEYS -----
GROQ_API_KEY=...
GEMINI_API_KEY=...
CEREBRAS_API_KEY=...
OPENROUTER_API_KEY=...
LITELLM_API_KEY=sk-anything
OPENAI_API_KEY=sk-anything
# ----- URLS -----
MCP_SERVER_URL=http://mcp:8002/mcp
LITELLM_BASE_URL=http://litellm:4000/v1
BACKEND_BASE_URL=http://backend:8001/api/run
JUSTICE_API_BASE=https://obcan.justice.sk/pilot/api/ress-isu-service/v1
# ----- DATABASE -----
POSTGRES_USER=chainlit
POSTGRES_PASSWORD=supersecret
POSTGRES_DB=chainlit_db
CHAINLIT_DATABASE_URL=postgresql+asyncpg://chainlit:supersecret@db:5432/chainlit_db
# ----- AUTH -----
AUTH_USER=admin
AUTH_PASS=admin
CHAINLIT_AUTH_SECRET=nUf~IB=m~Qi8mkh?3quIU>G:rfqMp$,UIgZs6MV%UmZi4.S$cukRHb?d$>tOy/9B
# ----- IGNORE KEY -----
cukRHb=ignore

24
.gitignore vendored
View File

@ -30,6 +30,7 @@ nosetests.xml
# ===== Env ===== # ===== Env =====
.env .env
.env.test
!.env.example !.env.example
!.env.local !.env.local
!.env.local.example !.env.local.example
@ -40,25 +41,6 @@ nosetests.xml
# ===== VS Code ===== # ===== VS Code =====
.vscode/ .vscode/
# ===== Node / Next.js =====
node_modules/
.next/
out/
coverage/
.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
*.tsbuildinfo
next-env.d.ts
# ===== Misc ===== # ===== Misc =====
.DS_Store .DS_Store
*.pem *.pem
@ -66,3 +48,7 @@ next-env.d.ts
*.log *.log
*.spec *.spec
*.manifest *.manifest
# ===== Chainlit =====
.files/
.chainlit/translations/

232
README.md
View File

@ -1,15 +1,18 @@
# Právny AI Asistent integrácia s API # Právny AI Asistent integrácia s API
![Uvítacia obrazovka](frontend/public/frontend_start.png)
## Popis ## Popis
Právny AI Asistent je inteligentný asistent integrovaný s oficiálnymi verejnými API Ministerstva spravodlivosti Slovenskej republiky. Systém poskytuje užívateľom prístup k štruktúrovaným právnym informáciám prostredníctvom prirodzeného jazyka. Právny AI Asistent je inteligentný asistent integrovaný s oficiálnymi verejnými API Ministerstva spravodlivosti Slovenskej republiky (obcan.justice.sk). Systém umožňuje používateľom pristupovať k štruktúrovaným právnym informáciám prostredníctvom prirodzeného jazyka v reálnom čase.
**Hlavné funkcie:** **Hlavné funkcie:**
- Interpretácia užívateľských otázok v prirodzenom jazyku - Vyhľadávanie súdov, sudcov, rozhodnutí, zmlúv a konaní
- Automatická extrakcia a validácia parametrov - Automatická extrakcia a validácia parametrov zo vstupných otázok
- Načítavanie dát výlučne cez oficiálne API - Načítavanie dát výlučne cez oficiálne API Ministerstva spravodlivosti SR
- Prezentácia výsledkov v zrozumiteľnom formáte v slovenskom jazyku - Prezentácia výsledkov v zrozumiteľnom formáte v slovenskom jazyku
- Streamovanie odpovedí v reálnom čase token po tokene
--- ---
@ -17,15 +20,15 @@ Právny AI Asistent je inteligentný asistent integrovaný s oficiálnymi verejn
### Jadro aplikácie ### Jadro aplikácie
| Technológia | Účel | | Technológia | Verzia | Účel |
|---|---| |---|---|---|
| **Python 3.11** | Hlavný programovací jazyk | | **Python** | 3.11 | Hlavný programovací jazyk |
| **openai-agents** | Tvorba AI agentov a streamovanie odpovedí | | **openai-agents** | 0.6.3 | Tvorba AI agentov a streamovanie odpovedí |
| **openai** | Python klient pre OpenAI / Ollama API | | **FastAPI** | ≥ 0.136.0 | Backend REST API a SSE streaming |
| **Chainlit** | Framework pre chat rozhranie | | **Chainlit** | 2.11.0 | Framework pre chat rozhranie (frontend) |
| **Ollama** | Lokálne spúšťanie AI modelov | | **FastMCP** | ≥ 2.7.0 | MCP server pre nástroje Justice API |
| **Docker** | Kontajnerizácia aplikácie | | **LiteLLM** | | Proxy pre viacero LLM modelov |
| **python-dotenv** | Načítavanie premenných prostredia zo súboru `.env` | | **Docker** | | Kontajnerizácia aplikácie |
### API a sieť ### API a sieť
@ -35,6 +38,7 @@ Právny AI Asistent je inteligentný asistent integrovaný s oficiálnymi verejn
| **pydantic** | Validácia a serializácia vstupných parametrov (schémy) | | **pydantic** | Validácia a serializácia vstupných parametrov (schémy) |
| **cachetools** | TTL cache pre API odpovede | | **cachetools** | TTL cache pre API odpovede |
| **tenacity** | Automatické opakovanie požiadaviek pri chybách (retry) | | **tenacity** | Automatické opakovanie požiadaviek pri chybách (retry) |
| **aiohttp** | HTTP komunikácia na strane frontendu (Chainlit) |
### Testovanie ### Testovanie
@ -42,113 +46,167 @@ Právny AI Asistent je inteligentný asistent integrovaný s oficiálnymi verejn
|---|---| |---|---|
| **pytest** | Testovací framework | | **pytest** | Testovací framework |
| **pytest-asyncio** | Podpora asynchrónnych testov | | **pytest-asyncio** | Podpora asynchrónnych testov |
| **respx** | Mockovanie HTTP požiadaviek (httpx) |
| **pytest-html** | Generovanie HTML reportov z testov | | **pytest-html** | Generovanie HTML reportov z testov |
| **pytest-cov** | Meranie pokrytia kódu testami |
--- ---
## Štruktúra projektu ## Štruktúra projektu
``` ```
ai-lawyer-agent/ legal-ai-assistant/
├── .chainlit/ # Konfigurácia Chainlit ├── backend/ # Backendová logika
├── api/ # API logika │ ├── agent/ # AI agent
│ ├── __init__.py │ │ ├── agent.py # Inicializácia agenta
│ ├── fetch_api_data.py # Spracovanie API │ │ ├── hooks.py # Sledovanie behu agenta
│ ├── config.py # Konfigurácia API │ │ ├── response.py # Streamovanie SSE odpovedí
│ ├── schemas.py # Pydantic schémy │ │ └── sys_prompt.py # Systémový prompt
│ └── tools.py # API nástroje (function tools pre agenta) │ ├── routers/ # FastAPI routery
├── core/ │ │ ├── health.py # Health check endpoint
│ ├── __init__.py │ │ ├── info.py # Informácie o aplikácii
│ ├── config.py # Konfigurácia agenta (modely, parametre) │ │ └── run_agent.py # Hlavný endpoint /api/run
│ ├── init_agent.py # Inicializácia AI agenta │ ├── tools/
│ ├── stream_response.py # Streamovanie odpovedí │ │ ├── api/
│ └── system_prompt.py # Systémový prompt │ │ │ ├── http_request_handler.py # HTTP komunikácia s API
├── public/ # Verejné zdroje │ │ │ └── schemas.py # Pydantic schémy pre každý endpoint
├── testing/ # Testy a testovacie nástroje │ │ └── mcp/
│ ├── tests/ │ │ ├── factory.py # Továrňa na MCP nástroje
│ │ ├── test_api.py # Integračné testy voči reálnemu API │ │ └── server.py # FastMCP server (všetky nástroje)
│ │ ├── test_fetch.py # Unit testy pre fetch_api_data │ ├── logger.py # Logovanie
│ │ ├── test_llm_compare.py # LLM benchmark testy │ └── main.py # FastAPI aplikácia
│ │ ├── test_project.py # LLM extrakcia parametrov (DB testy) ├── frontend/ # Frontendová logika
│ │ ├── test_schemas.py # Unit testy Pydantic schém │ ├── services/
│ │ ├── test_sys_prompt.py # Unit testy systémového promptu │ │ ├── agent_client.py # HTTP komunikácia s backendom
│ │ └── test_tools.py # Unit testy API nástrojov │ │ └── tool_steps.py # Zobrazovanie krokov nástrojov v UI
│ ├── charts/ # Výstupné reporty a coverage (generované) │ ├── public/ # Verejné zdroje (ikony, CSS, logo)
│ ├── test_cases.db # SQLite databáza testovacích prípadov │ ├── .chainlit/
│ └── run_tests.py # Spúšťač testov (pytest + HTML report + coverage) │ │ ├── config.toml # Konfigurácia Chainlit
├── app.py # Hlavný súbor aplikácie (Chainlit + spracovanie API) │ │ └── translations/ # Preklady UI
├── chainlit.md # Uvítacia obrazovka (default Chainlit) │ └── app.py # Hlavná Chainlit aplikácia
└── chainlit_en-US.md # Uvítacia obrazovka (Legal AI Assistant) ├── tests/ # Testy
├── configs.py # Globálna konfigurácia (modely, URL, konštanty)
├── litellm-config.yaml # Konfigurácia LiteLLM proxy
├── compose.yaml # Docker Compose
└── pyproject.toml # Závislosti projektu
``` ```
---
## Opis konfigurácie kontajnerov
Aplikácia beží ako sada Docker kontajnerov definovaných v `compose.yaml`.
| Kontajner | Port | Popis |
|---|---|---|
| **frontend** | `8000` | Chainlit chat rozhranie |
| **backend** | `8001` | FastAPI server spracovanie požiadaviek a agent |
| **mcp** | `8002` | FastMCP server nástroje pre Justice API |
| **litellm** | `4000` | LiteLLM proxy routing LLM modelov |
| **db** | `5432` | PostgreSQL ukladanie histórie konverzácií |
Každý kontajner má nastavený `healthcheck`. Backend čaká na LiteLLM a MCP, frontend čaká na backend a databázu.
Premenné prostredia (API kľúče, databázové pripojenie atď.) sa načítavajú zo súboru `.env`.
--- ---
## Testovanie ## Testovanie
Projekt obsahuje automatizované testy pokrývajúce unit testy schém, API nástrojov, fetchovania dát, systémového promptu a integračné testy voči reálnemu API Ministerstva spravodlivosti. LLM testy overujú správnosť extrakcie parametrov z prirodzeného jazyka oproti 54 referenčným prípadom uloženým v SQLite databáze. Projekt obsahuje tri vrstvy testov:
![Test Report](testing/images/coverage_and_test_session.png) **Unit testy** (`tests/unit/`) — overujú Pydantic schémy (validácia, normalizácia ID), HTTP handler (cachovanie, chybové stavy), továrňu MCP nástrojov a systémový prompt.
**Integračné testy** (`tests/integration/`) — overujú správanie FastAPI endpointov (`/`, `/info`, `/api/run`), formát SSE odpovede a štruktúru správ histórie.
**Eval testy** (`tests/evals/`) — LLM-as-Judge hodnotenie agenta: presnosť výberu nástrojov (F1), grounding voči API dátam, bezpečnosť (žiadne právne rady) a detekcia halucinácie. Výsledky sa ukladajú ako JSON, heatmapa, tabuľka a radar chart do `tests/results/`.
### Štruktúra testov
```
tests/
├── e2e/ # End-to-end testy agenta (LLM-as-Judge hodnotenie)
│ ├── test_hallucination.py # Testy detekcie halucinácie
│ ├── test_not_found.py # Testy správania pri nenájdených výsledkoch
│ └── test_safety.py # Testy bezpečnosti (žiadne právne rady)
├── evals/ # Eval scenáre pre manuálne spustenie
│ ├── requests.json # Referenčné požiadavky pre eval scenáre
│ └── test_scenarios.py # Spúšťač eval scenárov
├── integration/ # Integračné testy
│ ├── test_format.py # Testy FastAPI endpointov a SSE formátu
│ ├── test_mcp_server.py # Testy registrácie MCP nástrojov
│ ├── test_results.py # Testy štruktúry API odpovedí
│ └── test_tools.py # Testy volania a parametrov MCP nástrojov
├── reports/ # Generované testovacie reporty (HTML)
├── unit/ # Unit testy
│ ├── test_http.py # Testy HTTP handlera (cache, chyby)
│ ├── test_prompt.py # Testy systémového promptu
│ └── test_schemas.py # Testy Pydantic schém (validácia, normalizácia)
├── __init__.py
└── conftest.py # Zdieľané fixtures pre všetky testy
```
### Spustiť testy
### Spustiť testovanie
```bash ```bash
python -m testing.run_tests # Unit testy
./scripts/testctl.sh unit
# Integračné testy
./scripts/testctl.sh integration
# Eval testy (vyžaduje bežiaci backend)
MODEL=gemini-2.5-flash ./scripts/testctl.sh evals
``` ```
--- ---
## Inštrukcia pre inštaláciu ## Návod na použitie
### Inštalácia cez Git ### Požiadavky
#### 1. Naklonovanie repozitára - Docker a Docker Compose
- API kľúče pre LLM modely (Groq, Gemini, OpenRouter, Cerebras)
### Spustenie aplikácie
**1. Naklonovanie repozitára**
```bash ```bash
git clone git@git.kemt.fei.tuke.sk:od059jr/ai-lawyer-agent.git git clone <url-repozitara>
cd legal-ai-assistant
``` ```
#### 2. Vytvorenie virtuálneho prostredia **2. Vytvorenie virtuálneho prostredia (voliteľné, pre lokálny vývoj)**
**Windows:**
```bash ```bash
python -m venv venv ./scripts/install.sh
venv\Scripts\activate ```
Skript vytvorí `venv` a nainštaluje všetky závislosti. Ak prostredie už existuje, skript sa zastaví.
**3. Zostavenie a spustenie**
```bash
./scripts/appctl.sh --build
``` ```
**macOS / Linux:** **4. Otvorenie aplikácie**
```bash
python3 -m venv venv
source venv/bin/activate
```
#### 3. Inštalácia závislostí Aplikácia je dostupná na: [http://localhost:8000](http://localhost:8000)
### Ďalšie príkazy
```bash ```bash
pip install -r requirements.txt ./scripts/appctl.sh --start # Spustiť (bez zostavenia)
``` ./scripts/appctl.sh --stop # Zastaviť
./scripts/appctl.sh --logs # Zobraziť logy
#### 4. Stiahnutie inštalátora Ollama ./scripts/appctl.sh --clean # Vyčistiť Docker cache
Stiahnite si Ollama z oficiálnej stránky: https://ollama.com/download
#### 5. Stiahnutie modelov
```bash
ollama pull qwen3.5:cloud
```
```bash
ollama pull gpt-oss:20b-cloud
``` ```
--- ---
### Inštalácia cez Docker ## Zdroje
#### 1. Inštalácia Docker a Docker Desktop - [Chainlit dokumentácia](https://docs.chainlit.io)
- [openai-agents dokumentácia](https://openai.github.io/openai-agents-python/)
Stiahnite a nainštalujte Docker Desktop: https://www.docker.com/products/docker-desktop - [FastMCP dokumentácia](https://gofastmcp.com)
- [LiteLLM dokumentácia](https://docs.litellm.ai)
#### 2. Nainštalujte a spustite aplikáciu - [API Ministerstva spravodlivosti SR](https://obcan.justice.sk)
- [LiteLLM modely Groq](https://docs.litellm.ai/docs/providers/groq)
Obraz je dostupný na Docker Hub: https://hub.docker.com/r/alexgott0616/ai-lawyer-agent - [LiteLLM modely Gemini](https://docs.litellm.ai/docs/providers/gemini)
- [LiteLLM modely OpenRouter](https://docs.litellm.ai/docs/providers/openrouter)

View File

@ -1,15 +1,16 @@
FROM python:3.11-slim # backend/Dockerfile
FROM python:3.11.9-slim
WORKDIR /app WORKDIR /app
RUN apt-get update && apt-get install -y gcc \ RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
&& apt-get clean && rm -rf /var/lib/apt/lists/*
COPY pyproject.toml . COPY pyproject.toml .
RUN pip install -e "." RUN pip install --no-cache-dir -e ".[backend]"
COPY backend/ ./backend/ COPY backend/ ./backend/
COPY configs.py .
EXPOSE 8000 EXPOSE 8001
CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8001"]
CMD ["uvicorn", "backend.main:app", "--host", "0.0.0.0", "--port", "8000"]

View File

@ -0,0 +1 @@
# backend/__init__.py

View File

@ -0,0 +1,4 @@
# backend/agent/__init__.py
from .agent import build_agent, make_mcp_server
from .response import stream_response
from .sys_prompt import get_system_prompt

59
backend/agent/agent.py Normal file
View File

@ -0,0 +1,59 @@
from agents import Agent, OpenAIChatCompletionsModel, AsyncOpenAI, ModelSettings
from agents.mcp import MCPServerStreamableHttp
from backend.agent.sys_prompt import get_system_prompt
from backend.agent.hooks import LegalAssistantHooks
from configs import (
LITELLM_BASE_URL,
LITELLM_API_KEY,
LLM_TIMEOUT,
MCP_SERVER_URL,
AGENT_TEMPERATURE,
DEFAULT_MODEL
)
def make_client() -> AsyncOpenAI:
"""Async client pointing to LiteLLM proxy."""
return AsyncOpenAI (
base_url=LITELLM_BASE_URL,
api_key=LITELLM_API_KEY,
timeout=LLM_TIMEOUT,
max_retries=0
)
def make_mcp_server() -> MCPServerStreamableHttp:
"""MCP server exposing Slovak Justice API tools."""
return MCPServerStreamableHttp(
name="Slovak Justice API",
params={"url": MCP_SERVER_URL},
cache_tools_list=True
)
def build_agent(mcp_server: MCPServerStreamableHttp, model_name: str = DEFAULT_MODEL) -> Agent:
"""
Build and return a Legal AI Assistant agent.
Args:
model_name: Model identifier routed through LiteLLM.
Returns:
Configured Agent ready to run.
"""
return Agent (
name="Legal AI Assistant",
instructions=get_system_prompt(),
model=OpenAIChatCompletionsModel(
model=model_name,
openai_client=make_client()
),
model_settings=ModelSettings(
temperature=AGENT_TEMPERATURE,
tool_choice="auto",
parallel_tool_calls=False,
include_usage=True
),
mcp_servers=[mcp_server],
tool_use_behavior="run_llm_again",
reset_tool_choice=True,
hooks=LegalAssistantHooks()
)

33
backend/agent/hooks.py Normal file
View File

@ -0,0 +1,33 @@
import time
from backend.logger import setup_logger
from agents import AgentHooks, RunContextWrapper, Agent
logger = setup_logger(__name__)
class LegalAssistantHooks(AgentHooks):
"""Tracks execution time, tool calls and token usage per agent run."""
def __init__(self):
self.start_time: float = 0
self.tool_calls: int = 0
async def on_start(self, ctx: RunContextWrapper, agent: Agent) -> None:
"""Resets counters and logs agent start."""
self.start_time = time.time()
self.tool_calls = 0
logger.info(f"[AGENT {agent.name} STARTED]")
async def on_tool_start(self, ctx: RunContextWrapper, agent: Agent, tool) -> None:
"""Logs each tool invocation."""
self.tool_calls += 1
logger.info(f"[TOOL {tool.name} CALLED]")
async def on_tool_end(self, ctx: RunContextWrapper, agent: Agent, tool, result) -> None:
"""Marker indicating the end of the tool invocation."""
logger.info(f"[TOOL {tool.name} ENDED]")
async def on_end(self, ctx: RunContextWrapper, agent: Agent, output) -> None:
"""Logs elapsed time and total tokens used."""
elapsed = time.time() - self.start_time
logger.info(f"[AGENT {agent.name} ENDED] | tools_called={self.tool_calls} | elapsed={elapsed:.2f}s")

73
backend/agent/response.py Normal file
View File

@ -0,0 +1,73 @@
from typing import AsyncGenerator
from agents import Agent, Runner, RunItemStreamEvent
from openai.types.responses import ResponseTextDeltaEvent
import asyncio
import time
from backend.logger import setup_logger
logger = setup_logger(__name__)
def parse_run_item_event(event: RunItemStreamEvent, last_tool_name: str | None) -> tuple[dict | None, str | None]:
"""Parses run item event into SSE payload and updated tool name."""
match event.name:
case "reasoning_item_created":
summary = event.item.raw_item.summary
if summary and summary[0].text:
return {
"type": "reasoning",
"data": summary[0].text
}, last_tool_name
return None, last_tool_name
case "tool_called":
last_tool_name = event.item.raw_item.name
return {
"type": "tool_start",
"tool": last_tool_name,
"input": event.item.raw_item.arguments,
}, last_tool_name
case "tool_output":
return {
"type": "tool_result",
"tool": last_tool_name,
"output": event.item.output,
}, last_tool_name
case _:
return None, last_tool_name
async def stream_response(agent: Agent, prompt: list[dict] | str) -> AsyncGenerator[dict, None]:
"""Stream agent response token by token."""
last_tool_name = None
start_perf_time = time.time()
try:
result = Runner.run_streamed(agent, input=prompt)
async for event in result.stream_events():
if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
yield {"type": "text", "data": event.data.delta}
await asyncio.sleep(0.03)
elif event.type == "run_item_stream_event":
payload, last_tool_name = parse_run_item_event(event, last_tool_name)
if payload:
yield payload
pure_elapsed = time.time() - start_perf_time
usage = getattr(result.context_wrapper, "usage", None)
if usage:
yield {
"type": "usage",
"input_tokens": getattr(usage, "input_tokens", 0),
"output_tokens": getattr(usage, "output_tokens", 0),
"pure_duration": pure_elapsed
}
except (asyncio.CancelledError, GeneratorExit):
pass
except Exception as e:
logger.error(f"[RUN STREAMED ERROR] | {str(e)}", exc_info=True)
yield {"type": "error", "data": str(e)}

120
backend/agent/sys_prompt.py Normal file
View File

@ -0,0 +1,120 @@
def get_system_prompt() -> str:
"""System prompt for AI Legal Assistant"""
return f"""
You are a Legal AI Assistant integrated with the official public API
of the Ministry of Justice of the Slovak Republic (obcan.justice.sk).
You extract structured parameters from user queries, call the correct
API tools, and present results clearly in Slovak.
You are an API data interpreter not a legal advisor.
<data_source>
Use ONLY data returned by the Justice API tools. Never use training
knowledge to answer legal questions, infer missing data, or speculate.
When the API returns no results, say so clearly and suggest alternatives.
</data_source>
<supported_domains>
Courts (Súdy), Judges (Sudcovia), Decisions (Rozhodnutia),
Contracts (Zmluvy), Civil Proceedings (Občianske konania),
Administrative Proceedings (Správne konania), Executor(Exekutor).
Each domain has three tools: search, by_id, autocomplete.
Always prefer autocomplete for name-based lookups it is faster
and bypasses alphabetical pagination.
</supported_domains>
<tool_selection_rules>
Name search -> autocomplete first, then by_id if ID returned
Known ID -> use by_id directly
Filter/browse -> use search with appropriate facets
Court mentioned -> resolve court ID via court_autocomplete first,
then pass guidSud to the next tool call
</tool_selection_rules>
<input_normalization>
Before any tool call, fix common input errors automatically:
- Diacritics: try correct form first (Novák), then without (Novak)
- Dates: "január 2024" -> Od="01.01.2024" Do="31.01.2024"
- IDs: "175" -> "sud_175"; "sudca 42" -> "sudca_42"
- Regions: "Bratislava" -> "Bratislavský kraj"
- Courts: "Okresný súd v Košice" -> "Okresný súd Košice I"
- Page numbering starts at 0, not 1
</input_normalization>
<date_fields_per_domain>
Civil proceedings : pojednavaniaOd / pojednavaniaDo
Decisions : vydaniaOd / vydaniaDo
Contracts : datumZverejeneniaOd / datumZverejeneniaDo
Admin proceedings : datumPravoplatnostiOd / datumPravoplatnostiDo
Always pass date parameters when the user mentions any time period.
</date_fields_per_domain>
<error_handling>
API timeout (>10s) -> retry once, then: "Služba momentálne nedostupná. Skúste neskôr."
HTTP 404 -> "Záznam nebol nájdený."
HTTP 500 -> "Chyba servera. Skúste neskôr."
Empty results -> suggest: broader region, check diacritics, visit obcan.justice.sk
Empty tool results (numFound: 0) = "Záznam nebol nájdený".
NEVER report 500/Server Error unless explicitly returned by the tool.
</error_handling>
<response_rules>
Language: always Slovak
Internal (never shown to user): tool names, IDs, raw JSON, parameter names
User-facing: names, dates, counts, status, court names
Dates: DD.MM.YYYY
Numbers: Slovak locale (1 234, not 1,234)
For 1 result: show all relevant fields (name, role, court, status)
For 25 results: short numbered list
For 6+ results: show count, first 5, suggest filtering by region or court
When results are paginated, always state the total count
</response_rules>
<few_shot_examples>
Example 1 name search:
User: "Nájdi sudcu Novák v Bratislave"
Steps: judge_autocomplete(query="Novák", limit=10)
-> if results: judge_by_id for each
-> if empty: judge_search(query="Novák",
krajFacetFilter=["Bratislavský kraj"], size=50)
Output: "Našiel som 2 sudcov s menom Novák..."
Example 2 court + domain chaining:
User: "Zmluvy Krajského súdu v Bratislave"
Steps: court_autocomplete(query="Krajský súd Bratislava") -> sud_7
contract_search(guidSud="sud_7")
Output: "Krajský súd v Bratislave má 143 zmlúv. Zobrazujem prvých 20."
Example 3 not found:
User: "Sudca Novak Košice"
Steps: judge_autocomplete(query="Novak") -> empty
judge_autocomplete(query="Novák") -> empty
judge_search(query="Novák",
krajFacetFilter=["Košický kraj"], size=50)
Output: "Nenašiel som sudcu Novák v Košickom kraji.
Skúste rozšíriť hľadanie na celú SR alebo overte diakritiku."
Example 4 ambiguity:
User: "Sudca Kováč"
Steps: judge_autocomplete(query="Kováč", limit=10) -> 8 results across 4 regions
Output: "Našiel som 8 sudcov s menom Kováč. Upresnite región:
Bratislavský kraj, Košický kraj, Žilinský kraj, Prešovský kraj?"
Example 5 date filter:
User: "Rozhodnutia Okresného súdu Bratislava I za január 2024"
Steps: court_autocomplete(query="Okresný súd Bratislava I") -> sud_3
decision_search(guidSud="sud_3",
vydaniaOd="01.01.2024",
vydaniaDo="31.01.2024", page=0)
Output: "Okresný súd Bratislava I vydal v januári 2024 celkom 47 rozhodnutí.
Zobrazujem prvých 5."
</few_shot_examples>
<boundaries>
You do not explain legal advice history beyond API data or search outside the Ministry of Justice API.
Never give advice or use "Odporúčam/Mali by ste". Always start with a disclaimer and use neutral phrases like "Je možné sa obrátiť na...".
If asked, you may briefly explain your AI model and its capabilities.
</boundaries>
"""

View File

@ -1,8 +0,0 @@
import os
JUSTICE_API_BASE = os.getenv("JUSTICE_API_BASE", "https://obcan.justice.sk/pilot/api/ress-isu-service")
HTTP_TIMEOUT = float(os.getenv("HTTP_TIMEOUT", "10.0"))
HTTP_MAX_CONNECTIONS = int(os.getenv("HTTP_MAX_CONNECTIONS", "20"))
HTTP_MAX_KEEPALIVE = int(os.getenv("HTTP_MAX_KEEPALIVE", "10"))
CACHE_TTL = int(os.getenv("CACHE_TTL", "300"))
CACHE_MAX_SIZE = int(os.getenv("CACHE_MAX_SIZE", "256"))

View File

@ -1,78 +0,0 @@
import httpx
import logging
import json
from cachetools import TTLCache
from typing import Callable
from tenacity import retry, stop_after_attempt, wait_exponential
from backend.api.config import HTTP_TIMEOUT, HTTP_MAX_CONNECTIONS, HTTP_MAX_KEEPALIVE, CACHE_TTL, CACHE_MAX_SIZE
logger = logging.getLogger(__name__)
logger.handlers.clear()
logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter(
fmt='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%H:%M:%S'
))
logger.addHandler(handler)
logger.propagate = False
httpx_logger = logging.getLogger("httpx")
httpx_logger.handlers.clear()
httpx_logger.setLevel(logging.INFO)
httpx_logger.addHandler(handler)
httpx_logger.propagate = False
_cache = TTLCache(maxsize=CACHE_MAX_SIZE, ttl=CACHE_TTL)
_client = httpx.AsyncClient(
timeout=httpx.Timeout(HTTP_TIMEOUT),
limits=httpx.Limits(max_connections=HTTP_MAX_CONNECTIONS,
max_keepalive_connections=HTTP_MAX_KEEPALIVE),
)
_log_callback: Callable[[str], None] | None = None
def set_log_callback(cb: Callable[[str], None] | None):
global _log_callback
_log_callback = cb
def _log(msg: str):
logger.info(msg)
if _log_callback is not None:
_log_callback(msg)
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=5))
async def fetch_api_data(icon: str, url: str, params: dict, remove_keys: list = None) -> dict:
try:
cache_key = f"{url}:{sorted(params.items())}"
if cache_key in _cache:
_log(f"💾 {icon} Cache hit")
return _cache[cache_key]
_log(f"🔨 {icon} Input parameters:\n{json.dumps(params, ensure_ascii=False, indent=2)}")
response = await _client.get(url, params=params)
response.raise_for_status()
_log(f"🖇️ {icon} Request URL: {response.url}")
data = response.json()
if remove_keys and isinstance(data, dict):
for key in remove_keys:
data.pop(key, None)
_cache[cache_key] = data
_log(f"{icon} Success: {url}")
return data
except httpx.HTTPStatusError as e:
_log(f"{icon}HTTP error: {e.response.status_code} - {e.response.text}")
return {"error": "http_error", "status_code": e.response.status_code}
except httpx.RequestError as e:
_log(f"{icon}Request error: {str(e)}")
return {"error": "request_error", "status_code": str(e)}
except Exception as e:
_log(f"{icon}Unexpected error: {str(e)}")
return {"error": "unexpected_error", "status_code": str(e)}

View File

@ -1,342 +0,0 @@
from typing import Annotated, List, Literal, Optional
from pydantic import BaseModel, Field, field_validator
class SortableMixin(BaseModel):
sortProperty: Annotated[
Optional[str],
Field(default=None, description="Atribút, podľa ktorého budú záznamy zoradené")
] = None
sortDirection: Annotated[
Literal["ASC", "DESC"],
Field(default="ASC", description="Smer zoradenia (ASC alebo DESC)")
] = "ASC"
class PaginatedRequest(SortableMixin):
page: Annotated[
Optional[int],
Field(default=None, ge=0, description="Číslo stránky (začína od 0, nie od 1!)")
] = None
size: Annotated[
Optional[int],
Field(default=None, ge=1, description="Počet záznamov na stránku")
] = None
####################################################################################################################
# .../v1/sud
####################################################################################################################
class CourtSearch(PaginatedRequest):
"""Zoznam súdov s voliteľnými filtrami. GET /v1/sud"""
query: Annotated[
Optional[str],
Field(default=None, description="Hľadané slovo alebo slovné spojenie")
] = None
typSuduFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Typ súdu (fazetový filter), napr. ['Okresný súd', 'Krajský súd']")
] = None
krajFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Kraj (fazetový filter), napr. ['Bratislavský kraj']")
] = None
okresFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Okres (fazetový filter), napr. ['Okres Bratislava I']")
] = None
zahrnutZaniknuteSudy: Annotated[
Optional[bool],
Field(default=None, description="True = zahrnúť zaniknuté súdy, False = len aktívne")
] = None
indexDatumOd: Annotated[
Optional[str],
Field(default=None, description="Dátum indexácie od")
] = None
indexDatumDo: Annotated[
Optional[str],
Field(default=None, description="Dátum indexácie do")
] = None
class CourtByID(BaseModel):
"""Jeden súd podľa ID. GET /v1/sud/{id}"""
id: Annotated[str, Field(description="Identifikátor súdu, napr. 'sud_175'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"sud_{v}" if v.isdigit() else v
class CourtAutocomplete(BaseModel):
"""Autocomplete pre názvy súdov. GET /v1/sud/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None
####################################################################################################################
# .../v1/sudca
####################################################################################################################
class JudgeSearch(BaseModel):
"""Zoznam sudcov s voliteľnými filtrami. GET /v1/sudca"""
query: Annotated[
Optional[str],
Field(default=None, description="Hľadané slovo alebo slovné spojenie")
] = None
funkciaFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Funkcia (fazetový filter), napr. ['Sudca', 'Predseda', 'Podpredseda']")
] = None
typSuduFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Typ súdu (fazetový filter)")
] = None
krajFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Kraj (fazetový filter), napr. ['Bratislavský kraj']")
] = None
okresFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Okres (fazetový filter)")
] = None
stavZapisuFacetFilter: Annotated[
Optional[List[str]],
Field(
default=None,
description=(
"Stav zápisu — neprekladať hodnoty: "
"'label.sudca.aktivny', 'label.sudca.odvolany', "
"'label.sudca.vymazany', "
"'label.sudca.prerusenie vykonu - poberatel', "
"'label.sudca.prerusenie vykonu - ina funkce'"
)
)
] = None
guidSud: Annotated[
Optional[str],
Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")
] = None
indexDatumOd: Annotated[
Optional[str],
Field(default=None, description="Dátum indexácie od")
] = None
indexDatumDo: Annotated[
Optional[str],
Field(default=None, description="Dátum indexácie do")
] = None
page: Annotated[
Optional[int],
Field(default=None, ge=0, description="Číslo stránky (začína od 0)")
] = None
size: Annotated[
Optional[int],
Field(default=None, ge=1, description="Počet záznamov na stránku")
] = None
class JudgeByID(BaseModel):
"""Jeden sudca podľa ID. GET /v1/sudca/{id}"""
id: Annotated[str, Field(description="Identifikátor sudcu, napr. 'sudca_1'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"sudca_{v}" if v.isdigit() else v
class JudgeAutocomplete(BaseModel):
"""
Autocomplete pre mená sudcov. GET /v1/sudca/autocomplete
PREFEROVANÝ nástroj pri hľadaní sudcu podľa mena použiť pred JudgeSearch!
"""
query: Annotated[
Optional[str],
Field(default=None, description="Čiastočné meno sudcu")
] = None
guidSud: Annotated[
Optional[str],
Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")
] = None
limit: Annotated[
Optional[int],
Field(default=None, ge=1, description="Maximálny počet návrhov")
] = None
####################################################################################################################
# .../v1/rozhodnutie
####################################################################################################################
class DecisionSearch(PaginatedRequest):
"""Zoznam rozhodnutí s voliteľnými filtrami. GET /v1/rozhodnutie"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None
typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter)")] = None
krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Kraj (fazetový filter)")] = None
okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Okres (fazetový filter)")] = None
oblastPravnejUpravyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Oblasť právnej úpravy (fazetový filter)")
] = None
podOblastPravnejUpravyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Podoblasť právnej úpravy (fazetový filter)")
] = None
formaRozhodnutiaFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Forma rozhodnutia, napr. ['Uznesenie', 'Rozsudok', 'Platobný rozkaz']")
] = None
povahaRozhodnutiaFacetFilter: Annotated[
Optional[str],
Field(default=None, description="Povaha rozhodnutia")
] = None
odkazovanePredpisy: Annotated[
Optional[str],
Field(default=None, description="Odkazované predpisy")
] = None
vydaniaOd: Annotated[Optional[str], Field(default=None, description="Vydanie od (DD.MM.YYYY)")] = None
vydaniaDo: Annotated[Optional[str], Field(default=None, description="Vydanie do (DD.MM.YYYY)")] = None
ecli: Annotated[Optional[str], Field(default=None, description="ECLI identifikátor, napr. 'ECLI:SK:OSPO:1965:8114010264.1'")] = None
spisovaZnacka: Annotated[Optional[str], Field(default=None, description="Spisová značka, napr. '7C/221/1991'")] = None
cisloSpisu: Annotated[Optional[str], Field(default=None, description="Identifikačné číslo spisu")] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu, napr. 'sudca_1'")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None
class DecisionByID(BaseModel):
"""Jedno rozhodnutie podľa ID. GET /v1/rozhodnutie/{id}"""
id: Annotated[str, Field(description="Identifikátor rozhodnutia")]
class DecisionAutocomplete(BaseModel):
"""Autocomplete pre rozhodnutia. GET /v1/rozhodnutie/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None
####################################################################################################################
# .../v1/zmluvy
####################################################################################################################
class ContractSearch(PaginatedRequest):
"""Zoznam zmlúv s voliteľnými filtrami. GET /v1/zmluvy"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None
typDokumentuFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Typ dokumentu, napr. ['FAKTURA', 'OBJEDNAVKA', 'ZMLUVA', 'DODATOK']")
] = None
odberatelFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Odberateľ (súd), napr. ['Krajský súd v Bratislave']")
] = None
dodavatelFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Dodávateľ, napr. ['Slovak Telekom, a.s.']")
] = None
hodnotaZmluvyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Hodnota zmluvy: '0-1000', '1000-20000', '20000-100000', '100000-500000', 'Viac ako 500000'")
] = None
datumZverejeneniaOd: Annotated[Optional[str], Field(default=None, description="Dátum zverejnenia od")] = None
datumZverejeneniaDo: Annotated[Optional[str], Field(default=None, description="Dátum zverejnenia do")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None
class ContractByID(BaseModel):
"""Jedna zmluva podľa ID. GET /v1/zmluvy/{idZmluvy}"""
idZmluvy: Annotated[str, Field(description="Identifikátor zmluvy, napr. '2156252'")]
class ContractAutocomplete(BaseModel):
"""Autocomplete pre zmluvy. GET /v1/zmluvy/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None
####################################################################################################################
# .../v1/obcianPojednavania
####################################################################################################################
class CivilProceedingsSearch(PaginatedRequest):
"""Zoznam občianskych pojednávaní. GET /v1/obcianPojednavania"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None
typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Typ súdu (fazetový filter)")] = None
krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Kraj (fazetový filter)")] = None
okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Okres (fazetový filter)")] = None
usekFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Úsek (fazetový filter), napr. ['C', 'O', 'S']")
] = None
formaUkonuFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Forma úkonu, napr. ['Pojednávanie bez rozhodnutia', 'Pojednávanie a rozhodnutie']")
] = None
pojednavaniaOd: Annotated[Optional[str], Field(default=None, description="Pojednávania od (DD.MM.YYYY)")] = None
pojednavaniaDo: Annotated[Optional[str], Field(default=None, description="Pojednávania do (DD.MM.YYYY)")] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu, napr. 'sudca_1'")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu, napr. 'sud_100'")] = None
spisovaZnacka: Annotated[Optional[str], Field(default=None, description="Spisová značka, napr. '7C/221/1991'")] = None
verejneVyhlasenie: Annotated[Optional[bool], Field(default=None, description="Verejné vyhlásenie")] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Dátum indexácie od")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Dátum indexácie do")] = None
class CivilProceedingsByID(BaseModel):
"""Jedno pojednávanie podľa ID. GET /v1/obcianPojednavania/{id}"""
id: Annotated[str, Field(description="Identifikátor, napr. '121e4d31-695e-41e1-9191-7c9ad5d8d484'")]
class CivilProceedingsAutocomplete(BaseModel):
"""Autocomplete pre občianske pojednávania. GET /v1/obcianPojednavania/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Identifikátor súdu")] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Identifikátor sudcu")] = None
verejneVyhlasenie: Annotated[Optional[bool], Field(default=None, description="Verejné vyhlásenie")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None
####################################################################################################################
# .../v1/spravneKonanie
####################################################################################################################
class AdminProceedingsSearch(PaginatedRequest):
"""Zoznam správnych konaní. GET /v1/spravneKonanie"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo alebo slovné spojenie")] = None
druhFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Druh konania (fazetový filter)")
] = None
datumPravoplatnostiOd: Annotated[
Optional[str],
Field(default=None, description="Dátum právoplatnosti od (DD.MM.YYYY)")
] = None
datumPravoplatnostiDo: Annotated[
Optional[str],
Field(default=None, description="Dátum právoplatnosti do (DD.MM.YYYY)")
] = None
class AdminProceedingsByID(BaseModel):
"""Jedno správne konanie podľa ID. GET /v1/spravneKonanie/{id}"""
id: Annotated[str, Field(description="Identifikátor, napr. 'spravneKonanie_103'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"spravneKonanie_{v}" if v.isdigit() else v
class AdminProceedingsAutocomplete(BaseModel):
"""Autocomplete pre správne konania. GET /v1/spravneKonanie/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Hľadané slovo")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximálny počet výsledkov")] = None

View File

@ -1,284 +0,0 @@
from agents import function_tool
from backend.api.fetch_api_data import fetch_api_data
from backend.api.schemas import (
CourtSearch, CourtByID, CourtAutocomplete,
JudgeSearch, JudgeByID, JudgeAutocomplete,
DecisionSearch, DecisionByID, DecisionAutocomplete,
ContractSearch, ContractByID, ContractAutocomplete,
CivilProceedingsSearch, CivilProceedingsByID, CivilProceedingsAutocomplete,
AdminProceedingsSearch, AdminProceedingsByID, AdminProceedingsAutocomplete,
)
from backend.api.config import JUSTICE_API_BASE
####################################################################################################################
# .../v1/sud
####################################################################################################################
@function_tool
async def court_search(params: CourtSearch) -> dict:
"""
Fetch a list of courts from the Justice API with optional filtering.
Args:
params (CourtSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of courts and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/sud"
return await fetch_api_data(icon="🏛️️", url=url, params=params.model_dump(exclude_none=True))
@function_tool
async def court_id(params: CourtByID) -> dict:
"""
Fetch detailed information about a specific court by its identifier.
Args:
params (CourtByID): Unique identifier of the court.
Returns:
dict: Details of the specified court.
"""
url = f"{JUSTICE_API_BASE}/v1/sud/{params.id}"
return await fetch_api_data(icon="🏛️️", url=url, params={}, remove_keys=['foto'])
@function_tool
async def court_autocomplete(params: CourtAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for court names.
Args:
params (CourtAutocomplete): Parameters for autocomplete.
Returns:
dict: Suggested court names matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/sud/autocomplete"
return await fetch_api_data(icon="🏛️️", url=url, params=params.model_dump(exclude_none=True))
####################################################################################################################
# .../v1/sudca
####################################################################################################################
@function_tool
async def judge_search(params: JudgeSearch) -> dict:
"""
Fetch a list of judges from the Justice API with optional filtering.
Args:
params (JudgeSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of judges and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/sudca"
return await fetch_api_data(icon="🧑‍⚖️", url=url, params=params.model_dump(exclude_none=True), remove_keys=['sudcaMapList'])
@function_tool
async def judge_id(params: JudgeByID) -> dict:
"""
Fetch detailed information about a specific judge by their identifier.
Args:
params (JudgeByID): Unique identifier of the judge.
Returns:
dict: Details of the specified judge.
"""
url = f"{JUSTICE_API_BASE}/v1/sudca/{params.id}"
return await fetch_api_data(icon="🧑‍⚖️", url=url, params={})
@function_tool
async def judge_autocomplete(params: JudgeAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for judges' names.
Args:
params (JudgeAutocomplete): Parameters for autocomplete query (e.g., partial name).
Returns:
dict: Suggested judge names matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/sudca/autocomplete"
return await fetch_api_data(icon="🧑‍⚖️", url=url, params=params.model_dump(exclude_none=True))
####################################################################################################################
# .../v1/rozhodnutie
####################################################################################################################
@function_tool
async def decision_search(params: DecisionSearch) -> dict:
"""
Fetch a list of decisions from the Justice API with optional filtering.
Args:
params (DecisionSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of decisions and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/rozhodnutie"
return await fetch_api_data(icon="⚖️️", url=url, params=params.model_dump(exclude_none=True))
@function_tool
async def decision_id(params: DecisionByID) -> dict:
"""
Fetch detailed information about a specific decision by its identifier.
Args:
params (DecisionByID): Unique identifier of the decision.
Returns:
dict: Details of the specified decision.
"""
url = f"{JUSTICE_API_BASE}/v1/rozhodnutie/{params.id}"
return await fetch_api_data(icon="⚖️️", url=url, params={})
@function_tool
async def decision_autocomplete(params: DecisionAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for decision-related search terms.
Args:
params (DecisionAutocomplete): Parameters for autocomplete.
Returns:
dict: Suggested values matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/rozhodnutie/autocomplete"
return await fetch_api_data(icon="⚖️️", url=url, params=params.model_dump(exclude_none=True))
####################################################################################################################
# .../v1/zmluvy
####################################################################################################################
@function_tool
async def contract_search(params: ContractSearch) -> dict:
"""
Fetch a list of contracts from the Justice API with optional filtering.
Args:
params (ContractSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of contracts and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/zmluvy"
return await fetch_api_data(icon="📃", url=url, params=params.model_dump(exclude_none=True))
@function_tool
async def contract_id(params: ContractByID) -> dict:
"""
Fetch detailed information about a specific contract by its identifier.
Args:
params (ContractByID): Unique identifier of the contract.
Returns:
dict: Details of the specified contract.
"""
url = f"{JUSTICE_API_BASE}/v1/zmluvy/{params.idZmluvy}"
return await fetch_api_data(icon="📃", url=url, params={})
@function_tool
async def contract_autocomplete(params: ContractAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for contract-related search terms.
Args:
params (ContractAutocomplete): Parameters for autocomplete query (e.g., partial text).
Returns:
dict: Suggested values matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/zmluvy/autocomplete"
return await fetch_api_data(icon="📃", url=url, params=params.model_dump(exclude_none=True))
####################################################################################################################
# .../v1/obcianPojednavania
####################################################################################################################
@function_tool
async def civil_proceedings_search(params: CivilProceedingsSearch) -> dict:
"""
Fetch a list of civil proceedings and publicly announced judgments
from the Justice API with optional filtering.
Args:
params (CivilProceedingsSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of civil proceedings and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/obcianPojednavania"
return await fetch_api_data(icon="🖊️", url=url, params=params.model_dump(exclude_none=True))
@function_tool
async def civil_proceedings_id(params: CivilProceedingsByID) -> dict:
"""
Fetch detailed information about a specific civil proceeding
and publicly announced judgment by its identifier.
Args:
params (CivilProceedingsByID): Unique identifier of the civil proceeding.
Returns:
dict: Details of the specified civil proceeding and judgment.
"""
url = f"{JUSTICE_API_BASE}/v1/obcianPojednavania/{params.id}"
return await fetch_api_data(icon="🖊️", url=url, params={})
@function_tool
async def civil_proceedings_autocomplete(params: CivilProceedingsAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for civil proceeding search terms.
Args:
params (CivilProceedingsAutocomplete): Parameters for autocomplete query (e.g., partial text).
Returns:
dict: Suggested values matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/obcianPojednavania/autocomplete"
return await fetch_api_data(icon="🖊️", url=url, params=params.model_dump(exclude_none=True))
####################################################################################################################
# .../v1/spravneKonanie
####################################################################################################################
@function_tool
async def admin_proceedings_search(params: AdminProceedingsSearch) -> dict:
"""
Fetch a list of administrative proceedings from the Justice API with optional filtering.
Args:
params (AdminProceedingsSearch): Filtering and pagination parameters.
Returns:
dict: A dictionary containing a list of administrative proceedings and related metadata.
"""
url = f"{JUSTICE_API_BASE}/v1/spravneKonanie"
return await fetch_api_data(icon="✒️", url=url, params=params.model_dump(exclude_none=True))
@function_tool
async def admin_proceedings_id(params: AdminProceedingsByID) -> dict:
"""
Fetch detailed information about a specific administrative proceeding by its identifier.
Args:
params (AdminProceedingsByID): Unique identifier of the administrative proceeding.
Returns:
dict: Details of the specified administrative proceeding.
"""
url = f"{JUSTICE_API_BASE}/v1/spravneKonanie/{params.id}"
return await fetch_api_data(icon="✒️", url=url, params={})
@function_tool
async def admin_proceedings_autocomplete(params: AdminProceedingsAutocomplete) -> dict:
"""
Fetch autocomplete suggestions for administrative proceeding search terms.
Args:
params (AdminProceedingsAutocomplete): Parameters for autocomplete query (e.g., partial text).
Returns:
dict: Suggested values matching the input query.
"""
url = f"{JUSTICE_API_BASE}/v1/spravneKonanie/autocomplete"
return await fetch_api_data(icon="✒️", url=url, params=params.model_dump(exclude_none=True))
ALL_TOOLS = [
court_search, court_id, court_autocomplete,
judge_search, judge_id, judge_autocomplete,
decision_search, decision_id, decision_autocomplete,
contract_search, contract_id, contract_autocomplete,
civil_proceedings_search, civil_proceedings_id, civil_proceedings_autocomplete,
admin_proceedings_search, admin_proceedings_id, admin_proceedings_autocomplete,
]

View File

@ -1,23 +0,0 @@
model_list:
# GROQ
- model_name: llama-3.3-70b
litellm_params:
model: groq/llama-3.3-70b-versatile
api_key: os.environ/GROQ_API_KEY
- model_name: qwen-qwq-32b
litellm_params:
model: groq/qwen-qwq-32b
api_key: os.environ/GROQ_API_KEY
# Google AI Studio
- model_name: gemini-flash
litellm_params:
model: gemini/gemini-2.0-flash
api_key: os.environ/GEMINI_API_KEY
litellm_settings:
drop_params: true
request_timeout: 60
num_retries: 2
convert_input_to_str: true

View File

@ -1,43 +0,0 @@
from agents import Agent, OpenAIChatCompletionsModel, AsyncOpenAI, ModelSettings, set_tracing_disabled
from agents.mcp import MCPServerStreamableHttp
from backend.core.config import LITELLM_BASE_URL, LITELLM_API_KEY, AGENT_TEMPERATURE, LLM_TIMEOUT, DEFAULT_MODEL, MCP_SERVER_URL
from backend.core.system_prompt import get_system_prompt
#from api.tools import ALL_TOOLS
def _make_client() -> AsyncOpenAI:
return AsyncOpenAI (
base_url=LITELLM_BASE_URL,
api_key=LITELLM_API_KEY,
timeout=LLM_TIMEOUT,
max_retries=0
)
def get_mcp_server() -> MCPServerStreamableHttp:
return MCPServerStreamableHttp(
name="Slovak Justice API",
params={"url": MCP_SERVER_URL},
cache_tools_list=True
)
def assistant_agent(model_name: str = DEFAULT_MODEL) -> Agent:
"""Initialize the assistant agent for legal work"""
client = _make_client()
model = OpenAIChatCompletionsModel(
model=model_name,
openai_client=client
)
return Agent(
name="AI Lawyer Assistant",
instructions=get_system_prompt(model_name),
model=model,
model_settings=ModelSettings(
temperature=AGENT_TEMPERATURE,
tool_choice="auto",
parallel_tool_calls=False
),
tool_use_behavior="run_llm_again",
reset_tool_choice=True,
mcp_servers=[get_mcp_server()],
)

View File

@ -1,13 +0,0 @@
import os
LITELLM_BASE_URL = os.getenv("LITELLM_BASE_URL", "http://localhost:4000/v1")
LITELLM_API_KEY = os.getenv("LITELLM_API_KEY", "sk-anything")
MCP_SERVER_URL = os.getenv("MCP_SERVER_URL", "http://localhost:8001/mcp")
DEFAULT_MODEL = os.getenv("DEFAULT_MODEL", "llama-3.3-70b")
MAX_HISTORY = int(os.getenv("MAX_HISTORY", "20"))
AGENT_TEMPERATURE = float(os.getenv("AGENT_TEMPERATURE", "0.3"))
LLM_TIMEOUT = float(os.getenv("LLM_TIMEOUT", "60.0"))
ALL_MODELS = { "llama-3.3-70b", "qwen-qwq-32b", "gemini-flash" }

View File

@ -1,15 +0,0 @@
from typing import AsyncGenerator
from agents import Agent, Runner
from openai.types.responses import ResponseTextDeltaEvent
async def stream_response(agent: Agent, prompt: list[dict] | str) -> AsyncGenerator[str, None]:
"""Stream agent response and update the UI."""
try:
async with agent.mcp_servers[0]:
result = Runner.run_streamed(agent, input=prompt)
async for event in result.stream_events():
if event.type == "raw_response_event" and isinstance(event.data, ResponseTextDeltaEvent):
yield event.data.delta # <-- sends the next piece of response text
except Exception as e:
yield f"⚠️🖨 Error: {e}"

View File

@ -1,190 +0,0 @@
def get_system_prompt(model_name: str) -> str:
return f"""
# Legal AI Assistant Slovak Ministry of Justice API
**Powered by:** {model_name}
## Role
You are a Legal AI Assistant integrated with the official public APIs of the Ministry of Justice of the Slovak Republic.
You extract structured parameters from natural-language queries, call the correct API tools, and present results clearly in Slovak.
You are strictly an API data interpreter not a legal advisor.
---
## Operational Constraints
- Use ONLY data returned by official Ministry of Justice APIs
- You may briefly explain your AI model and how it differs from others
- You may list what you are not allowed to disclose
- Do NOT use external legal knowledge or training data to answer legal questions
- Do NOT infer, speculate, or fill gaps beyond API responses
- Do NOT mention APIs, tools, schemas, function names, or internal logic in final answers
- Do NOT expose pagination details, raw JSON, or technical errors to the user
---
## Supported Legal Domains
Judges (Sudcovia) : search, search by ID, autocomplete
Courts (Súdy) : search, search by ID, autocomplete
Decisions (Rozhodnutia) : search, search by ID, autocomplete
Contracts (Zmluvy) : search, search by ID, autocomplete
Civil Proceedings (Občianske konania) : search, search by ID, autocomplete
Administrative Proceedings (Správne konania) : search, search by ID, autocomplete
**Rule:** Always use the most specific tool available. Prefer autocomplete for name-based lookups.
---
## Mandatory Processing Workflow
### Step 1 — Intent Detection
Identify the legal domain and intent:
- Searching by name use autocomplete first
- Searching by known ID use ID-specific tool
- Broad search with filters use general search
### Step 2 — Input Normalization
Automatically fix common user errors BEFORE calling any tool:
- Slovak diacritics: `Novak` try both `Novak` AND `Novák`; `Kos` `Košice`
- Court names: `Okresný súd v Košice` `Okresný súd Košice I`
- Dates: `12 decembra 2024` `12.12.2024`; `december 2024` `01.12.2024` to `31.12.2024`; `január 2024` `01.01.2024` to `31.01.2024`
- IDs: `175` `sud_175`; `sudca 42` `sudca_42`
- Region names: always use full form with "kraj": `Bratislava` `Bratislavský kraj`
### Step 3 — Name Search Strategy (CRITICAL)
When searching by person name, ALWAYS follow this order:
1. **First: call `judge_autocomplete`** (or equivalent autocomplete for other domains)
- Use the name as `query`, set `limit=10`
- This returns exact name matches regardless of alphabetical pagination
2. **If autocomplete returns results:** use the returned IDs to call `judge_by_id` for full details
3. **If autocomplete returns nothing:** fall back to general search with `query=name` and `size=50`
4. **Never** rely on page 0 of general search results when looking for a specific name results are alphabetical and the person may be on page 10+
### Step 4 — Court-to-Filter Chaining (CRITICAL)
When a user mentions a specific court by name AND requests data from another domain (judges, contracts, proceedings):
1. First call `court_autocomplete` to find the court and get its ID (e.g. `sud_123`)
2. Then pass that ID as `guidSud` in the next search call
3. NEVER search judges/contracts/proceedings without `guidSud` when the user specified a court
Example:
- User: "Zmluvy Krajského súdu v Bratislave"
- Step 1: court_autocomplete(query="Krajský súd v Bratislave") returns id: "sud_7"
- Step 2: contract_search(guidSud="sud_7")
- WRONG: contract_search() without guidSud
### Step 5 — Diacritics Handling (CRITICAL)
Slovak names with special characters (á, é, í, ó, ú, ý, ä, č, ď, ě, ľ, ĺ, ň, ô, ŕ, š, ť, ž) must be handled carefully:
- Always attempt the search with the diacritics-correct form first: `Novák`, not `Novak`
- If no results, retry without diacritics: `Novak`
- If still no results, try common variants: `Nováková`, `Novakova`
- Inform the user which variant was used
### Step 6 — Pagination Handling (CRITICAL)
- **page starts at 0, NOT 1. First page = page=0. Second page = page=1.**
- Default API page size is 20. Total results may be 2365+ for broad queries.
- When total results > available results shown, always inform the user there are more
- Suggest filtering by region (kraj), court type, or status to narrow results
- Never silently show only page 0 without mentioning it's a subset
### Step 7 — Date Parameters (CRITICAL)
Always extract AND pass date parameters when the user mentions any time period:
- "v januári 2024" `pojednavaniaOd="01.01.2024"`, `pojednavaniaDo="31.01.2024"`
- "december 2024" `vydaniaOd="01.12.2024"`, `vydaniaDo="31.12.2024"`
- "v roku 2023" use full year range Od="01.01.2023", Do="31.12.2023"
- NEVER ignore a date or time period mentioned by the user
- Each endpoint uses a different date field use the correct one per domain:
- Civil proceedings: `pojednavaniaOd` / `pojednavaniaDo`
- Decisions: `vydaniaOd` / `vydaniaDo`
- Contracts: `datumZverejeneniaOd` / `datumZverejeneniaDo`
- Administrative proceedings: `datumPravoplatnostiOd` / `datumPravoplatnostiDo`
### Step 8 — Parameter Validation
Before calling any tool, validate:
- Date formats match the expected format for that endpoint (DD.MM.YYYY check per tool)
- IDs follow the correct prefix pattern (sud_, sudca_, spravneKonanie_, etc.)
- Facet filter values are from known valid options (e.g. region names are exact API values)
- `page` starts at 0 never use negative values
### Step 9 — Tool Invocation
Call the appropriate tool with validated, normalized parameters.
If a parameter is uncertain (e.g., user gave an ambiguous court name), either:
- Ask the user to confirm before calling, OR
- Use autocomplete to find the correct value first
### Step 10 — Result Handling
Results found : Summarize clearly, show structured list
Empty results : Explain calmly, suggest alternatives
📄 Partial results (paginated) : Show what was found, mention total count, suggest filtering
API error : Inform user politely, suggest retry
### Step 11 — Response Generation
Always respond in **Slovak**. Format rules:
- Use numbered lists for multiple results
- Show: name, role/function, court, region, status (active/inactive)
- Keep responses concise do not dump raw data
- Use emojis sparingly ( 🔍 only)
- Never show IDs, URLs, parameter names, or technical details
---
## Error Recovery Playbook
Name not found on page 0 -> Use autocomplete, do NOT report "not found"
Diacritics mismatch -> Try both forms, report which was used
Too many results (>100) -> Ask user to specify region, court, or time period
Unknown court name -> Use court autocomplete to find correct name
Date format unclear -> Ask user to confirm or infer from context
ID format wrong -> Normalize automatically (add prefix)
Court mentioned but guidSud missing -> Always resolve court ID via autocomplete first
Date mentioned but not passed -> Always extract and pass date parameters
---
## Response Format Examples
**Single judge found:**
```
Našiel som sudcu Novák:
Meno: JUDr. Ján Novák
Funkcia: Sudca
Súd: Okresný súd Bratislava I
Kraj: Bratislavský kraj
Stav: aktívny
```
**Multiple results:**
```
Našiel som 5 sudcov s menom Novák (zobrazujem všetkých 5):
1. JUDr. Ján Novák Okresný súd Bratislava I (aktívny)
2. JUDr. Peter Novák Krajský súd Košice (aktívny)
...
```
**Paginated results:**
```
Celkovo: 2 365 výsledkov. Zobrazujem prvých 20.
Pre presnejšie výsledky uveďte kraj alebo typ súdu.
1. JUDr. Alena Adamcová Najvyšší súd SR (aktívny)
...
```
**Not found:**
```
Nenašiel som sudcu s menom "Novak" v Bratislavskom kraji.
Možné dôvody:
Meno môže mať diakritiku: skúste "Novák"
Sudca môže pôsobiť v inom kraji
Skúste rozšíriť vyhľadávanie na celú SR
Chcete, aby som hľadal "Novák" namiesto "Novak"?
```
---
## What You Are NOT
- Not a lawyer do not give legal advice
- Not a historian do not explain legal history beyond API data
- Not a search engine only search within Ministry of Justice API
- Not multilingual by default always respond in Slovak unless explicitly asked otherwise
"""

13
backend/logger.py Normal file
View File

@ -0,0 +1,13 @@
import logging
def setup_logger(name: str) -> logging.Logger:
logger = logging.getLogger(name)
handler = logging.StreamHandler()
formatter = logging.Formatter(
fmt="\n%(asctime)s | %(levelname)s | %(name)s | %(message)s",
datefmt="%H:%M:%S"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)
return logger

View File

@ -1,54 +1,16 @@
import os
from fastapi import FastAPI from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel from backend.routers import health, info, run_agent
from fastapi.responses import StreamingResponse
from backend.core.agent import assistant_agent
from backend.core.streaming import stream_response
from backend.core.config import ALL_MODELS, DEFAULT_MODEL
import json
app = FastAPI(title="Legal AI Assistant") app = FastAPI()
app.add_middleware( app.add_middleware(
CORSMiddleware, CORSMiddleware,
allow_origins=["http://localhost:3000"], allow_origins=["*"],
allow_methods=["*"], allow_methods=["*"],
allow_headers=["*"], allow_headers=["*"],
) )
class Message(BaseModel): app.include_router(health.router)
role: str app.include_router(info.router)
content: str app.include_router(run_agent.router)
class Request(BaseModel):
messages: list[Message]
model: str = DEFAULT_MODEL
@app.get("/")
async def health_check():
return {"status": "ok"}
@app.get("/api/models")
async def get_models():
return {"models": list(ALL_MODELS)}
@app.post("/api/chat")
async def chat(request: Request):
agent = assistant_agent(request.model)
messages = [{"role": ms.role, "content": ms.content} for ms in request.messages]
async def stream():
async for token in stream_response(agent, messages):
chunk = json.dumps({"type": "text-delta", "textDelta": token})
yield f"data: {chunk}\n\n"
yield "data: [DONE]\n\n"
return StreamingResponse(
stream(),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"X-Accel-Buffering": "no",
}
)

View File

@ -1,17 +0,0 @@
from fastmcp import FastMCP
from backend.mcp_server.tools.judges import register_judge_tools
mcp = FastMCP(
name="Slovak Justice API",
instructions="""
Tento MCP server poskytuje prístup k verejným API
Ministerstva spravodlivosti Slovenskej republiky.
Obsahuje nástroje pre vyhľadávanie súdov, sudcov,
rozhodnutí, zmlúv a konaní.
"""
)
register_judge_tools(mcp)
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="0.0.0.0", port=8001)

View File

@ -1,76 +0,0 @@
# mcp_server/tools/judges.py
import httpx
import json
from fastmcp import FastMCP
from typing import Optional
JUSTICE_API = "https://obcan.justice.sk/pilot/api/ress-isu-service"
HEADERS = {
"User-Agent": "Mozilla/5.0",
"Accept": "application/json",
"Accept-Language": "sk-SK,sk;q=0.9",
}
async def _get(path: str, params: dict) -> dict:
clean = {k: v for k, v in params.items() if v is not None}
async with httpx.AsyncClient(timeout=10.0) as client:
r = await client.get(
f"{JUSTICE_API}{path}",
params=clean,
headers=HEADERS
)
r.raise_for_status()
return r.json()
def register_judge_tools(mcp: FastMCP):
@mcp.tool()
async def judge_autocomplete(
query: str,
court_id: Optional[str] = None,
limit: int = 10,
) -> str:
"""
Autocomplete pre mená sudcov použiť AKO PRVÝ krok
pri hľadaní sudcu podľa mena.
"""
result = await _get("/v1/sudca/autocomplete", {
"query": query,
"guidSud": court_id,
"limit": limit,
})
return json.dumps(result, ensure_ascii=False)
@mcp.tool()
async def judge_search(
query: Optional[str] = None,
kraj: Optional[str] = None,
court_id: Optional[str] = None,
status: Optional[str] = None,
page: int = 0,
size: int = 20,
) -> str:
"""
Vyhľadávanie sudcov s filtrami.
Používať ak autocomplete nevráti výsledky.
"""
result = await _get("/v1/sudca", {
"query": query,
"krajFacetFilter": kraj,
"guidSud": court_id,
"stavZapisuFacetFilter": status,
"page": page,
"size": size,
})
return json.dumps(result, ensure_ascii=False)
@mcp.tool()
async def judge_by_id(judge_id: str) -> str:
"""
Detailné informácie o konkrétnom sudcovi podľa ID.
judge_id: ID sudcu (napr. "sudca_42")
"""
if judge_id.isdigit():
judge_id = f"sudca_{judge_id}"
result = await _get(f"/v1/sudca/{judge_id}", {})
return json.dumps(result, ensure_ascii=False)

View File

@ -0,0 +1 @@
# backend/routers/__init__.py

View File

@ -0,0 +1,8 @@
from fastapi import APIRouter
router = APIRouter()
@router.get("/")
async def health_check():
"""Returns service health status."""
return {"status": "ok"}

33
backend/routers/info.py Normal file
View File

@ -0,0 +1,33 @@
from fastapi import APIRouter
from datetime import datetime
from configs import (
DEFAULT_MODEL,
ALL_MODELS,
MCP_SERVER_URL,
LITELLM_BASE_URL,
JUSTICE_API_BASE
)
router = APIRouter()
@router.get("/info")
async def info():
"""Application metadata and configuration."""
return {
"service": "Legal AI Assistant",
"version": "0.4.0",
"description": "AI Assistant for Slovak Ministry of Justice API",
"timestamp": datetime.now().isoformat(),
"endpoints": {
"chat": "/chat",
"models": "/api/models",
"health": "/",
},
"config": {
"default_model": DEFAULT_MODEL,
"available_models": [m["id"] for m in ALL_MODELS],
"api_url": JUSTICE_API_BASE,
"mcp_server": MCP_SERVER_URL,
"litellm": LITELLM_BASE_URL,
}
}

View File

@ -0,0 +1,79 @@
import json
import asyncio
from typing import AsyncIterator
from pydantic import BaseModel
from fastapi import APIRouter
from fastapi.responses import StreamingResponse
from backend.agent import build_agent, make_mcp_server, stream_response
from configs import DEFAULT_MODEL
from backend.logger import setup_logger
logger = setup_logger(__name__)
router = APIRouter()
class Message(BaseModel):
role: str
content: str
class Query(BaseModel):
query: str
model: str = DEFAULT_MODEL
history: list[Message] = []
def build_messages(query: Query) -> list[dict]:
"""Converts Query history and current query into messages list."""
messages = [{"role": m.role, "content": m.content} for m in query.history]
messages.append({"role": "user", "content": query.query})
return messages
async def run_agent_task(query: Query, queue: asyncio.Queue, messages: list[dict]) -> None:
"""Connects MCP, builds agent and streams events into queue."""
mcp_server = make_mcp_server()
try:
async with mcp_server:
logger.info("[MCP CONNECTED]")
agent = build_agent(mcp_server=mcp_server, model_name=query.model)
logger.info(f"[AGENT MODEL] | {query.model}")
async for event in stream_response(agent, messages):
await queue.put(event)
except Exception as e:
logger.error(f"[AGENT TASK ERROR] | {e}", exc_info=True)
await queue.put({"type": "error", "data": f"\u26A0 {str(e)}"})
finally:
await queue.put(None)
async def generate_response(queue: Query, task: asyncio.Task[None]) -> AsyncIterator[str]:
"""Reads events from queue and yields SSE formatted strings."""
try:
while True:
token = await queue.get()
if token is None:
yield "data: [DONE]\n\n"
break
yield f"data: {json.dumps(token)}\n\n"
except asyncio.CancelledError:
task.cancel()
finally:
await asyncio.gather(task, return_exceptions=True)
@router.post("/api/run")
async def run_agent(query: Query) -> StreamingResponse:
"""
Run Legal AI Assistant and stream response.
Args:
query: User query and model identifier (e.g. 'llama-3.1-8b').
Returns:
SSE stream of response tokens.
"""
logger.info(f"[REQUEST] | query={query.query} | model={query.model}")
messages = build_messages(query)
queue = asyncio.Queue()
task = asyncio.create_task(run_agent_task(query, queue, messages))
return StreamingResponse(
generate_response(queue, task),
media_type="text/event-stream",
headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
)

View File

@ -0,0 +1 @@
# backend/tools/__init__.py

View File

@ -0,0 +1 @@
# backend/tools/api/__init__.py

View File

@ -0,0 +1,84 @@
import httpx
from cachetools import TTLCache
from tenacity import retry, stop_after_attempt, wait_exponential
import urllib.parse
from backend.logger import setup_logger
from configs import (
JUSTICE_API_BASE,
HTTP_TIMEOUT,
HTTP_MAX_CONNECTIONS,
HTTP_MAX_KEEPALIVE,
CACHE_TTL,
CACHE_MAX_SIZE,
RETRY_ATTEMPTS,
RETRY_MAX_WAIT,
RETRY_MIN_WAIT,
RETRY_MULTIPLIER,
)
WAIT_EXPONENTIAL = wait_exponential(
multiplier=RETRY_MULTIPLIER,
min=RETRY_MIN_WAIT,
max=RETRY_MAX_WAIT
)
STOP_AFTER_ATTEMPT = stop_after_attempt(RETRY_ATTEMPTS)
CACHE = TTLCache(maxsize=CACHE_MAX_SIZE, ttl=CACHE_TTL)
TIMEOUT = httpx.Timeout(HTTP_TIMEOUT)
LIMITS = httpx.Limits(
max_connections=HTTP_MAX_CONNECTIONS,
max_keepalive_connections=HTTP_MAX_KEEPALIVE
)
logger = setup_logger(__name__)
def get_client() -> httpx.AsyncClient:
return httpx.AsyncClient(timeout=TIMEOUT, limits=LIMITS)
@retry(stop=STOP_AFTER_ATTEMPT, wait=WAIT_EXPONENTIAL)
async def http_request(route: str, params: dict | None, remove_keys: list[str] | None = None) -> dict:
"""Sends an HTTP GET request and returns the parsed JSON response."""
url = f"{JUSTICE_API_BASE}{route}"
params_tuple = tuple(sorted(params.items())) if params else ()
cache_key = f"{url}:{params_tuple}"
if cache_key in CACHE:
return CACHE[cache_key]
returned_url = url
try:
logger.info(f"[HTTP REQUEST] | {url} | params={params}")
async with get_client() as client:
if params:
query_string = urllib.parse.urlencode(
params,
doseq=True,
quote_via=urllib.parse.quote
)
final_url = f"{url}?{query_string}"
response = await client.get(final_url)
else:
response = await client.get(url)
response.raise_for_status()
logger.info(f"[HTTP SUCCESS] | {url} | status={response.status_code}")
returned_url = str(response.url)
data = response.json()
if remove_keys and isinstance(data, dict):
for key in remove_keys:
data.pop(key, None)
result = {"url": returned_url, "data": data}
CACHE[cache_key] = result
return result
except httpx.HTTPError as e:
logger.error(f"[HTTP ERROR] | {returned_url} | {str(e)}")
return {"error": "http_error", "detail": str(e)}
except Exception as e:
logger.error(f"[UNEXPECTED ERROR] | {returned_url} | {str(e)}")
return {"error": "unexpected_error", "detail": str(e)}

View File

@ -0,0 +1,421 @@
from typing import Annotated, List, Literal, Optional
from pydantic import BaseModel, Field, field_validator
class SortableMixin(BaseModel):
sortProperty: Annotated[
Optional[str],
Field(default=None, description="Attribute to sort records by")
] = None
sortDirection: Annotated[
Literal["ASC", "DESC"],
Field(default="ASC", description="Sort direction: 'ASC' (default) or 'DESC'")
] = "ASC"
class PaginatedRequest(SortableMixin):
page: Annotated[
Optional[int],
Field(default=None, ge=0, description="Page number, starts at 0 (not 1)")
] = None
size: Annotated[
Optional[int],
Field(default=None, ge=1, description="Number of records per page")
] = None
####################################################################################################################
# .../v1/sud — Courts
####################################################################################################################
class CourtSearch(PaginatedRequest):
"""List of courts with optional filters. GET /v1/sud"""
query: Annotated[
Optional[str],
Field(default=None, description="Search term or phrase")
] = None
typSuduFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Court type facet filter, e.g. ['Okresný súd', 'Krajský súd']")
] = None
krajFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Region facet filter, e.g. ['Bratislavský kraj']")
] = None
okresFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="District facet filter, e.g. ['Okres Bratislava I']")
] = None
zahrnutZaniknuteSudy: Annotated[
Optional[bool],
Field(default=None, description="True = include dissolved courts, False = active only")
] = None
indexDatumOd: Annotated[
Optional[str],
Field(default=None, description="Index date from, format DD.MM.YYYY")
] = None
indexDatumDo: Annotated[
Optional[str],
Field(default=None, description="Index date to, format DD.MM.YYYY")
] = None
class CourtByID(BaseModel):
"""Single court by ID. GET /v1/sud/{id}"""
id: Annotated[str, Field(description="Court identifier, e.g. 'sud_175'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"sud_{v}" if v.isdigit() else v
class CourtAutocomplete(BaseModel):
"""Autocomplete for court names. GET /v1/sud/autocomplete
PREFERRED tool when searching court by name use before CourtSearch.
"""
query: Annotated[Optional[str], Field(default=None, description="Partial court name")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None
####################################################################################################################
# .../v1/sudca — Judges
####################################################################################################################
class JudgeSearch(PaginatedRequest):
"""List of judges with optional filters. GET /v1/sudca"""
query: Annotated[
Optional[str],
Field(default=None, description="Search term or phrase")
] = None
funkciaFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Function facet filter, e.g. ['Sudca', 'Predseda', 'Podpredseda']")
] = None
typSuduFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Court type facet filter")
] = None
krajFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Region facet filter, e.g. ['Bratislavský kraj']")
] = None
okresFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="District facet filter")
] = None
stavZapisuFacetFilter: Annotated[
Optional[List[str]],
Field(
default=None,
description=(
"Registration status filter. Do not translate values: "
"'label.sudca.aktivny', 'label.sudca.odvolany', "
"'label.sudca.vymazany', "
"'label.sudca.prerusenie vykonu - poberatel', "
"'label.sudca.prerusenie vykonu - ina funkce'"
)
)
] = None
guidSud: Annotated[
Optional[str],
Field(default=None, description="Court identifier, e.g. 'sud_100'")
] = None
indexDatumOd: Annotated[
Optional[str],
Field(default=None, description="Index date from, format DD.MM.YYYY")
] = None
indexDatumDo: Annotated[
Optional[str],
Field(default=None, description="Index date to, format DD.MM.YYYY")
] = None
class JudgeByID(BaseModel):
"""Single judge by ID. GET /v1/sudca/{id}"""
id: Annotated[str, Field(description="Judge identifier, e.g. 'sudca_1'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"sudca_{v}" if v.isdigit() else v
class JudgeAutocomplete(BaseModel):
"""Autocomplete for judge names. GET /v1/sudca/autocomplete
PREFERRED tool when searching judge by name use before JudgeSearch.
"""
query: Annotated[
Optional[str],
Field(default=None, description="Partial judge name")
] = None
guidSud: Annotated[
Optional[str],
Field(default=None, description="Court identifier to narrow results, e.g. 'sud_100'")
] = None
limit: Annotated[
Optional[int],
Field(default=None, ge=1, description="Maximum number of results")
] = None
####################################################################################################################
# .../v1/rozhodnutie — Decisions
####################################################################################################################
class DecisionSearch(PaginatedRequest):
"""List of court decisions with optional filters. GET /v1/rozhodnutie"""
query: Annotated[Optional[str], Field(default=None, description="Search term or phrase")] = None
typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Court type facet filter")] = None
krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Region facet filter")] = None
okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="District facet filter")] = None
oblastPravnejUpravyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Legal area facet filter")
] = None
podOblastPravnejUpravyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Legal sub-area facet filter")
] = None
formaRozhodnutiaFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Decision form facet filter, e.g. ['Uznesenie', 'Rozsudok', 'Platobný rozkaz']")
] = None
povahaRozhodnutiaFacetFilter: Annotated[
Optional[str],
Field(default=None, description="Decision nature facet filter")
] = None
odkazovanePredpisy: Annotated[
Optional[str],
Field(default=None, description="Referenced legal regulations")
] = None
vydaniaOd: Annotated[Optional[str], Field(default=None, description="Issued date from, format YYYY-MM-DD")] = None
vydaniaDo: Annotated[Optional[str], Field(default=None, description="Issued date to, format YYYY-MM-DD")] = None
ecli: Annotated[
Optional[str],
Field(default=None, description="ECLI identifier, e.g. 'ECLI:SK:OSPO:1965:8114010264.1'")
] = None
spisovaZnacka: Annotated[
Optional[str],
Field(default=None, description="Case reference number, e.g. '7C/221/1991'")
] = None
cisloSpisu: Annotated[Optional[str], Field(default=None, description="Case file number")] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Judge identifier, e.g. 'sudca_1'")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Index date from, format DD.MM.YYYY")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Index date to, format DD.MM.YYYY")] = None
class DecisionByID(BaseModel):
"""Single court decision by ID. GET /v1/rozhodnutie/{id}"""
id: Annotated[str, Field(description="Decision identifier")]
class DecisionAutocomplete(BaseModel):
"""Autocomplete for court decisions. GET /v1/rozhodnutie/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Search term")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None
####################################################################################################################
# .../v1/zmluvy — Contracts
####################################################################################################################
class ContractSearch(PaginatedRequest):
"""List of court contracts with optional filters. GET /v1/zmluvy"""
query: Annotated[Optional[str], Field(default=None, description="Search term or phrase")] = None
typDokumentuFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Document type facet filter, e.g. ['FAKTURA', 'OBJEDNAVKA', 'ZMLUVA', 'DODATOK']")
] = None
odberatelFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Recipient (court) facet filter, e.g. ['Krajský súd v Bratislave']")
] = None
dodavatelFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Supplier facet filter, e.g. ['Slovak Telekom, a.s.']")
] = None
hodnotaZmluvyFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Contract value range filter: '0-1000', '1000-20000', '20000-100000', '100000-500000', 'Viac ako 500000'")
] = None
datumZverejeneniaOd: Annotated[
Optional[str],
Field(default=None, description="Publication date from, format DD.MM.YYYY")
] = None
datumZverejeneniaDo: Annotated[
Optional[str],
Field(default=None, description="Publication date to, format DD.MM.YYYY")
] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Index date from, format DD.MM.YYYY")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Index date to, format DD.MM.YYYY")] = None
class ContractByID(BaseModel):
"""Single contract by ID. GET /v1/zmluvy/{idZmluvy}"""
idZmluvy: Annotated[str, Field(description="Contract identifier, e.g. '2156252'")]
class ContractAutocomplete(BaseModel):
"""Autocomplete for contracts. GET /v1/zmluvy/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Search term")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None
####################################################################################################################
# .../v1/obcianPojednavania — Civil Proceedings
####################################################################################################################
class CivilProceedingsSearch(PaginatedRequest):
"""List of civil court hearings and publicly announced judgments. GET /v1/obcianPojednavania"""
query: Annotated[Optional[str], Field(default=None, description="Search term or phrase")] = None
typSuduFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Court type facet filter")] = None
krajFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="Region facet filter")] = None
okresFacetFilter: Annotated[Optional[List[str]], Field(default=None, description="District facet filter")] = None
usekFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Section facet filter, e.g. ['C', 'O', 'S']")
] = None
formaUkonuFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Action form facet filter, e.g. ['Pojednávanie bez rozhodnutia', 'Pojednávanie a rozhodnutie']")
] = None
pojednavaniaOd: Annotated[
Optional[str],
Field(default=None, description="Hearing date from, format YYYY-MM-DD")
] = None
pojednavaniaDo: Annotated[
Optional[str],
Field(default=None, description="Hearing date to, format YYYY-MM-DD")
] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Judge identifier, e.g. 'sudca_1'")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
spisovaZnacka: Annotated[
Optional[str],
Field(default=None, description="Case reference number, e.g. '7C/221/1991'")
] = None
verejneVyhlasenie: Annotated[
Optional[bool],
Field(default=None, description="True = publicly announced judgment only")
] = None
indexDatumOd: Annotated[Optional[str], Field(default=None, description="Index date from, format DD.MM.YYYY")] = None
indexDatumDo: Annotated[Optional[str], Field(default=None, description="Index date to, format DD.MM.YYYY")] = None
class CivilProceedingsByID(BaseModel):
"""Single civil hearing by ID. GET /v1/obcianPojednavania/{id}"""
id: Annotated[str, Field(description="Hearing identifier, e.g. '121e4d31-695e-41e1-9191-7c9ad5d8d484'")]
class CivilProceedingsAutocomplete(BaseModel):
"""Autocomplete for civil proceedings. GET /v1/obcianPojednavania/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Search term")] = None
guidSud: Annotated[Optional[str], Field(default=None, description="Court identifier, e.g. 'sud_100'")] = None
guidSudca: Annotated[Optional[str], Field(default=None, description="Judge identifier, e.g. 'sudca_1'")] = None
verejneVyhlasenie: Annotated[
Optional[bool],
Field(default=None, description="True = publicly announced judgment only")
] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None
####################################################################################################################
# .../v1/spravneKonanie — Administrative Proceedings
####################################################################################################################
class AdminProceedingsSearch(PaginatedRequest):
"""List of administrative proceedings. GET /v1/spravneKonanie"""
query: Annotated[Optional[str], Field(default=None, description="Search term or phrase")] = None
druhFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Proceeding type facet filter")
] = None
datumPravoplatnostiOd: Annotated[
Optional[str],
Field(default=None, description="Legal force date from, format YYYY-MM-DD")
] = None
datumPravoplatnostiDo: Annotated[
Optional[str],
Field(default=None, description="Legal force date to, format YYYY-MM-DD")
] = None
class AdminProceedingsByID(BaseModel):
"""Single administrative proceeding by ID. GET /v1/spravneKonanie/{id}"""
id: Annotated[str, Field(description="Proceeding identifier, e.g. 'spravneKonanie_103'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"spravneKonanie_{v}" if v.isdigit() else v
class AdminProceedingsAutocomplete(BaseModel):
"""Autocomplete for administrative proceedings. GET /v1/spravneKonanie/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Search term")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None
####################################################################################################################
# .../v1/exekutor — Executor
####################################################################################################################
class ExecutorSearch(PaginatedRequest):
"""List of bailiffs (exekútori). GET /v1/exekutor"""
query: Annotated[Optional[str], Field(default=None, description="Search term or phrase")] = None
sudFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Court facet filter, e.g. 'Krajský súd v Trenčíne'")
] = None
krajFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Region facet filter, e.g. 'Košický kraj'")
] = None
okresFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="District facet filter")
] = None
obecFacetFilter: Annotated[
Optional[List[str]],
Field(default=None, description="Municipality facet filter")
] = None
stavZapisuFacetFilter: Annotated[
Optional[List[str]],
Field(
default=None,
description=(
"Registration status filter. Do not translate values: "
"'label.zapis_stav.aktivny', 'label.zapis_stav.neaktivny'"
)
)
] = None
class ExecutorByID(BaseModel):
"""Single bailiff by ID. GET /v1/exekutor/{id}"""
id: Annotated[str, Field(description="Bailiff identifier, e.g. 'exekutor_154'")]
@field_validator("id")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
return f"exekutor_{v}" if v.isdigit() else v
class ExecutorByECE(BaseModel):
"""Single bailiff by ECE registration number. GET /v1/exekutor/ec/{ece}"""
ece: Annotated[str, Field(description="Bailiff ECE registration number, e.g. '089'")]
@field_validator("ece")
@classmethod
def normalize(cls, v: str) -> str:
v = v.strip()
if not v:
raise ValueError("ece cannot be empty")
return v
class ExecutorAutocomplete(BaseModel):
"""Autocomplete for bailiffs. GET /v1/exekutor/autocomplete"""
query: Annotated[Optional[str], Field(default=None, description="Search term")] = None
limit: Annotated[Optional[int], Field(default=None, ge=1, description="Maximum number of results")] = None

View File

@ -9,7 +9,8 @@ COPY pyproject.toml .
RUN pip install -e ".[mcp]" RUN pip install -e ".[mcp]"
COPY backend/ ./backend/ COPY backend/ ./backend/
COPY configs.py .
EXPOSE 8001 EXPOSE 8002
CMD ["python", "-m", "backend.mcp_server.mcp_server"] CMD ["python", "-m", "backend.tools.mcp.server"]

View File

@ -0,0 +1 @@
# backend/tools/mcp/__init__.py

View File

@ -0,0 +1,38 @@
from backend.tools.api.http_request_handler import http_request
from inspect import Signature, Parameter
from pydantic import BaseModel
from pydantic_core import PydanticUndefined
def create_tool(route: str, schema: type[BaseModel], remove_keys: list[str] | None = None):
"""Creates an MCP tool that calls an API route with Pydantic params."""
async def tool(**kwargs):
resolved_route = route.format(**kwargs)
filtered_kwargs = {k: v for k, v in kwargs.items() if f"{{{k}}}" not in route}
if not filtered_kwargs:
return await http_request(route=resolved_route, params={}, remove_keys=remove_keys)
parsed = schema(**filtered_kwargs)
return await http_request(
route=resolved_route,
params=parsed.model_dump(exclude_none=True),
remove_keys=remove_keys
)
params = []
for field_name, field_info in schema.model_fields.items():
default = field_info.default
params.append(
Parameter(
name=field_name,
kind=Parameter.KEYWORD_ONLY,
annotation=field_info.annotation,
default=default if default is not PydanticUndefined else Parameter.empty,
))
tool.__name__ = schema.__name__
tool.__doc__ = schema.__doc__
tool.__signature__ = Signature(params)
tool.__annotations__ = {f: i.annotation for f, i in schema.model_fields.items()}
return tool

View File

@ -0,0 +1,74 @@
from fastmcp import FastMCP
from backend.tools.mcp.factory import create_tool
from backend.tools.api.schemas import (
CourtSearch, CourtByID, CourtAutocomplete,
JudgeSearch, JudgeByID, JudgeAutocomplete,
DecisionSearch, DecisionByID, DecisionAutocomplete,
ContractSearch, ContractByID, ContractAutocomplete,
CivilProceedingsSearch, CivilProceedingsByID, CivilProceedingsAutocomplete,
AdminProceedingsSearch, AdminProceedingsByID, AdminProceedingsAutocomplete,
ExecutorSearch, ExecutorByID, ExecutorByECE, ExecutorAutocomplete,
)
TOOLS = [
# .../v1/sud — Courts
{"name": "court_search", "route": "/sud", "schema": CourtSearch, "remove_keys": None},
{"name": "court_id", "route": "/sud/{id}", "schema": CourtByID, "remove_keys": ["foto"]},
{"name": "court_autocomplete", "route": "/sud/autocomplete", "schema": CourtAutocomplete, "remove_keys": None},
# .../v1/sudca — Judges
{"name": "judge_search", "route": "/sudca", "schema": JudgeSearch, "remove_keys": ["sudcaMapList"]},
{"name": "judge_id", "route": "/sudca/{id}", "schema": JudgeByID, "remove_keys": None},
{"name": "judge_autocomplete", "route": "/sudca/autocomplete", "schema": JudgeAutocomplete, "remove_keys": None},
# .../v1/rozhodnutie — Decisions
{"name": "decision_search", "route": "/rozhodnutie", "schema": DecisionSearch, "remove_keys": None},
{"name": "decision_id", "route": "/rozhodnutie/{id}", "schema": DecisionByID, "remove_keys": None},
{"name": "decision_autocomplete", "route": "/rozhodnutie/autocomplete","schema": DecisionAutocomplete, "remove_keys": None},
# .../v1/zmluvy — Contracts
{"name": "contract_search", "route": "/zmluvy", "schema": ContractSearch, "remove_keys": None},
{"name": "contract_id", "route": "/zmluvy/{idZmluvy}", "schema": ContractByID, "remove_keys": None},
{"name": "contract_autocomplete", "route": "/zmluvy/autocomplete", "schema": ContractAutocomplete, "remove_keys": None},
# .../v1/obcianPojednavania — Civil Proceedings
{"name": "civil_proceedings_search", "route": "/obcianPojednavania", "schema": CivilProceedingsSearch, "remove_keys": None},
{"name": "civil_proceedings_id", "route": "/obcianPojednavania/{id}", "schema": CivilProceedingsByID, "remove_keys": None},
{"name": "civil_proceedings_autocomplete", "route": "/obcianPojednavania/autocomplete","schema": CivilProceedingsAutocomplete, "remove_keys": None},
# .../v1/spravneKonanie — Administrative Proceedings
{"name": "admin_proceedings_search", "route": "/spravneKonanie", "schema": AdminProceedingsSearch, "remove_keys": None},
{"name": "admin_proceedings_id", "route": "/spravneKonanie/{id}", "schema": AdminProceedingsByID, "remove_keys": None},
{"name": "admin_proceedings_autocomplete", "route": "/spravneKonanie/autocomplete","schema": AdminProceedingsAutocomplete, "remove_keys": None},
# .../v1/exekutor — Executor
{"name": "executor_search", "route": "/exekutor", "schema": ExecutorSearch, "remove_keys": None},
{"name": "executor_ece", "route": "/exekutor/ec/{ece}", "schema": ExecutorByECE, "remove_keys": None},
{"name": "executor_id", "route": "/exekutor/{id}", "schema": ExecutorByID, "remove_keys": None},
{"name": "executor_autocomplete", "route": "/exekutor/autocomplete","schema": ExecutorAutocomplete, "remove_keys": None},
]
mcp = FastMCP(
name="Slovak Justice API",
instructions="""
This MCP server provides access to public APIs of the
Ministry of Justice of the Slovak Republic.
It contains tools for searching for courts, judges,
decisions, contracts and proceedings.
"""
)
def register_tools():
for tool in TOOLS:
tool_function = create_tool(
route=tool["route"],
schema=tool["schema"],
remove_keys=tool.get("remove_keys")
)
mcp.tool(name=tool["name"])(tool_function)
register_tools()
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="0.0.0.0", port=8002)

View File

@ -1,36 +1,66 @@
name: "legal-ai-assistant" name: "legal-ai-assistant"
services: services:
frontend:
build:
context: ./frontend
dockerfile: Dockerfile
restart: unless-stopped
ports:
- "3000:3000"
environment:
- NODE_ENV=production
depends_on:
backend:
condition: service_started
backend: backend:
container_name: backend
build: build:
context: . context: .
dockerfile: backend/Dockerfile dockerfile: backend/Dockerfile
restart: unless-stopped restart: unless-stopped
ports: ports:
- "8000:8000" - "8001:8001"
environment: env_file:
- PYTHONUNBUFFERED=1 - .env
- LITELLM_BASE_URL=http://litellm:4000/v1
- LITELLM_API_KEY=sk-anything
- MCP_SERVER_URL=http://mcp:8001/mcp
- DEFAULT_MODEL=llama-3.3-70b
depends_on: depends_on:
litellm: litellm:
condition: service_started condition: service_healthy
mcp: mcp:
condition: service_started condition: service_started
healthcheck:
test: curl --fail http://localhost:8001/ || exit 1
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
frontend:
container_name: frontend
build:
context: .
dockerfile: frontend/Dockerfile
restart: unless-stopped
ports:
- "8000:8000"
env_file:
- .env
depends_on:
backend:
condition: service_healthy
db:
condition: service_healthy
db:
image: postgres:16-alpine
container_name: db
restart: unless-stopped
ports:
- "5432:5432"
env_file:
- .env
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- db_data:/var/lib/postgresql/data
- ./frontend/schema.sql:/docker-entrypoint-initdb.d/schema.sql
healthcheck:
test: ["CMD-SHELL", "sh -c 'pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}'"]
interval: 10s
timeout: 5s
retries: 5
start_period: 10s
litellm: litellm:
image: ghcr.io/berriai/litellm:main-stable image: ghcr.io/berriai/litellm:main-stable
@ -39,18 +69,28 @@ services:
ports: ports:
- "4000:4000" - "4000:4000"
env_file: env_file:
- backend/.env - .env
volumes: volumes:
- ./backend/config.yaml:/app/config.yaml:ro - ./litellm-config.yaml:/app/config.yaml
command: ['--config', '/app/config.yaml', '--port', '4000'] command: ['--config', '/app/config.yaml', '--port', '4000']
healthcheck:
test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')\""]
interval: 15s
timeout: 10s
retries: 5
start_period: 60s
mcp: mcp:
container_name: mcp
build: build:
context: . context: .
dockerfile: backend/mcp_server/Dockerfile dockerfile: backend/tools/mcp/Dockerfile
restart: unless-stopped restart: unless-stopped
ports: ports:
- "8001:8001" - "8002:8002"
environment: env_file:
- JUSTICE_API_BASE=https://obcan.justice.sk/pilot/api/ress-isu-service - .env
volumes:
db_data:
name: db_data

63
configs.py Normal file
View File

@ -0,0 +1,63 @@
import os
# ----- BACKEND -----
BACKEND_BASE_URL = os.getenv("BACKEND_BASE_URL", "http://backend:8001/api/run")
# ----- LiteLLM -----
LITELLM_BASE_URL = os.getenv("LITELLM_BASE_URL", "http://litellm:4000/v1")
LITELLM_API_KEY = os.getenv("LITELLM_API_KEY")
# ----- MCP SERVER -----
MCP_SERVER_URL = os.getenv("MCP_SERVER_URL", "http://mcp:8002/mcp")
JUSTICE_API_BASE = os.getenv("JUSTICE_API_BASE")
# ----- HTTP FOR TOOLS -----
HTTP_TIMEOUT = 10.0
HTTP_MAX_CONNECTIONS = 20
HTTP_MAX_KEEPALIVE = 10
# ----- HTTP FOR CHAINLIT CLIENT -----
HTTP_TIMEOUT_TOTAL = 300.0
HTTP_TIMEOUT_CONNECT = 10.0
# ----- CACHE -----
CACHE_TTL = 300
CACHE_MAX_SIZE = 256
# ----- RETRY -----
RETRY_ATTEMPTS = 3
RETRY_MULTIPLIER = 1
RETRY_MIN_WAIT = 1
RETRY_MAX_WAIT = 5
# ----- LLM MODELS -----
ALL_MODELS = [
{"id": "gpt-oss-120b", "desc": "Uses **openrouter/openai/gpt-oss-120b**", "icon": "gpt.svg"},
{"id": "llama-3.1-8b", "desc": "Uses **groq/llama-3.1-8b-instant**", "icon": "ollama.svg"},
{"id": "qwen-qwq-32b", "desc": "Uses **groq/qwen/qwen3-32b**", "icon": "qwen.svg"},
{"id": "qwen3-235b", "desc": "Uses **cerebras/qwen-3-235b**", "icon": "qwen.svg"},
{"id": "gemini-2.5-flash", "desc": "Uses **gemini/gemini-2.5-flash**", "icon": "gemini.svg"},
{"id": "gemini-2.5-pro", "desc": "Uses **gemini/gemini-2.5-pro**", "icon": "gemini.svg"},
{"id": "deepseek-r1", "desc": "Uses **openrouter/deepseek/deepseek-r1**", "icon": "deepseek.svg"},
]
# ----- AI AGENT -----
DEFAULT_MODEL= "gpt-oss-120b"
AGENT_TEMPERATURE = 0.3
LLM_TIMEOUT = 120.0
# ----- CHAINLIT DATABASE -----
CHAINLIT_DATABASE_URL = os.getenv("CHAINLIT_DATABASE_URL")
CHAINLIT_AUTH_SECRET = os.getenv("CHAINLIT_AUTH_SECRET")
# ----- CHAINLIT AUTH -----
AUTH_USER = os.getenv("AUTH_USER")
AUTH_PASS = os.getenv("AUTH_PASS")
# ----- CHAINLIT STARTERS -----
ALL_STARTERS = [
{"label": "Legal Data Search", "prompt": "What legal data can the agent find?", "icon": "magnifying-glass.svg"},
{"label": "Restricted Actions List", "prompt": "What is the agent not allowed to do or use?", "icon": "ban.svg"},
{"label": "Agent Data Sources", "prompt": "What data sources does the agent rely on?", "icon": "database.svg"},
{"label": "Example Legal Case", "prompt": "Give me an example of a legal question you can answer.", "icon": "scale-balanced.svg"},
]

View File

@ -0,0 +1,59 @@
[project]
# Duration (in seconds) during which the session is saved when the connection is lost
session_timeout = 3600
# Duration (in seconds) of the user session expiry
user_session_timeout = 1296000 # 15 days
# Disable third party caching
cache = false
# Authorized origins
allow_origins = ["*"]
[features]
# Disable HTML rendering for security
unsafe_allow_html = false
# Disable LaTeX
latex = false
# Enable markdown in user messages
user_message_markdown = true
# Allow users to edit their own messages
edit_message = true
# Disable file uploads
[features.spontaneous_file_upload]
enabled = false
# Disable audio
[features.audio]
enabled = false
# MCP is handled via Python code, not UI
[features.mcp]
enabled = false
[UI]
# Assistant display name
name = "Legal AI Assistant"
# Default dark theme
default_theme = "dark"
# Ask user confirmation before clearing chat
confirm_new_chat = true
# Show only tool calls in Chain of Thought
cot = "full"
# Custom CSS
custom_css = "/public/custom.css"
# The style of alert boxes.
alert_style = "modern"
[meta]
generated_by = "2.11.1"

View File

@ -0,0 +1,259 @@
{
"common": {
"actions": {
"cancel": "\u0625\u0644\u063a\u0627\u0621",
"confirm": "\u062a\u0623\u0643\u064a\u062f",
"continue": "\u0645\u062a\u0627\u0628\u0639\u0629",
"goBack": "\u0631\u062c\u0648\u0639",
"reset": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646",
"submit": "\u0625\u0631\u0633\u0627\u0644"
},
"status": {
"loading": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644...",
"error": {
"default": "\u062d\u062f\u062b \u062e\u0637\u0623",
"serverConnection": "\u062a\u0639\u0630\u0631 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645"
}
}
},
"auth": {
"login": {
"title": "\u0642\u0645 \u0628\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062a\u0637\u0628\u064a\u0642",
"form": {
"email": {
"label": "\u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a",
"required": "\u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a \u062d\u0642\u0644 \u0625\u0644\u0632\u0627\u0645\u064a",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631",
"required": "\u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u062d\u0642\u0644 \u0625\u0644\u0632\u0627\u0645\u064a"
},
"actions": {
"signin": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644"
},
"alternativeText": {
"or": "\u0623\u0648"
}
},
"errors": {
"default": "\u062a\u0639\u0630\u0631 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644",
"signin": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"oauthSignin": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"redirectUriMismatch": "\u0639\u0646\u0648\u0627\u0646 URI \u0644\u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u0644\u0627 \u064a\u062a\u0637\u0627\u0628\u0642 \u0645\u0639 \u062a\u0643\u0648\u064a\u0646 \u062a\u0637\u0628\u064a\u0642 OAuth",
"oauthCallback": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"oauthCreateAccount": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"emailCreateAccount": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"callback": "\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u062d\u0633\u0627\u0628 \u0622\u062e\u0631",
"oauthAccountNotLinked": "\u0644\u062a\u0623\u0643\u064a\u062f \u0647\u0648\u064a\u062a\u0643\u060c \u0642\u0645 \u0628\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0628\u0646\u0641\u0633 \u0627\u0644\u062d\u0633\u0627\u0628 \u0627\u0644\u0630\u064a \u0627\u0633\u062a\u062e\u062f\u0645\u062a\u0647 \u0641\u064a \u0627\u0644\u0623\u0635\u0644",
"emailSignin": "\u062a\u0639\u0630\u0631 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0628\u0631\u064a\u062f \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a",
"emailVerify": "\u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0628\u0631\u064a\u062f\u0643 \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a\u060c \u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0628\u0631\u064a\u062f \u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a \u062c\u062f\u064a\u062f",
"credentialsSignin": "\u0641\u0634\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644. \u062a\u062d\u0642\u0642 \u0645\u0646 \u0635\u062d\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0642\u062f\u0645\u0629",
"sessionRequired": "\u064a\u0631\u062c\u0649 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629"
}
},
"provider": {
"continue": "\u0645\u062a\u0627\u0628\u0639\u0629 \u0645\u0639 {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "\u0627\u0643\u062a\u0628 \u0631\u0633\u0627\u0644\u062a\u0643 \u0647\u0646\u0627...",
"actions": {
"send": "\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629",
"stop": "\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0647\u0645\u0629",
"attachFiles": "\u0625\u0631\u0641\u0627\u0642 \u0645\u0644\u0641\u0627\u062a"
}
},
"favorites": {
"use": "\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0631\u0633\u0627\u0644\u0629 \u0645\u0641\u0636\u0644\u0629",
"headline": "\u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0645\u0641\u0636\u0644\u0629",
"empty": {
"title": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0631\u0633\u0627\u0626\u0644 \u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0639\u062f",
"description": "\u0627\u0628\u062f\u0623 \u0628\u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629 \u0648\u0642\u0645 \u0628\u062a\u0645\u064a\u064a\u0632\u0647\u0627 \u0628\u0646\u062c\u0645\u0629 \u0623\u0648 \u0645\u064a\u0651\u0632 \u0631\u0633\u0627\u0644\u0629 \u0645\u0646 \u0645\u062d\u0627\u062f\u062b\u0627\u062a\u0643 \u0627\u0644\u0633\u0627\u0628\u0642\u0629"
}
},
"commands": {
"button": "\u0623\u062f\u0648\u0627\u062a",
"changeTool": "\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u0623\u062f\u0627\u0629",
"availableTools": "\u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0645\u062a\u0627\u062d\u0629"
},
"speech": {
"start": "\u0628\u062f\u0621 \u0627\u0644\u062a\u0633\u062c\u064a\u0644",
"stop": "\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u062a\u0633\u062c\u064a\u0644",
"connecting": "\u062c\u0627\u0631\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644"
},
"fileUpload": {
"dragDrop": "\u0627\u0633\u062d\u0628 \u0648\u0623\u0641\u0644\u062a \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0647\u0646\u0627",
"browse": "\u062a\u0635\u0641\u062d \u0627\u0644\u0645\u0644\u0641\u0627\u062a",
"sizeLimit": "\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0649:",
"errors": {
"failed": "\u0641\u0634\u0644 \u0627\u0644\u062a\u062d\u0645\u064a\u0644",
"cancelled": "\u062a\u0645 \u0625\u0644\u063a\u0627\u0621 \u062a\u062d\u0645\u064a\u0644"
},
"actions": {
"cancelUpload": "\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062a\u062d\u0645\u064a\u0644",
"removeAttachment": "\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0645\u0631\u0641\u0642"
}
},
"messages": {
"status": {
"using": "\u064a\u0633\u062a\u062e\u062f\u0645",
"used": "\u0645\u0633\u062a\u062e\u062f\u0645"
},
"actions": {
"copy": {
"button": "\u0646\u0633\u062e \u0625\u0644\u0649 \u0627\u0644\u062d\u0627\u0641\u0638\u0629",
"success": "\u062a\u0645 \u0627\u0644\u0646\u0633\u062e!"
}
},
"feedback": {
"positive": "\u0645\u0641\u064a\u062f",
"negative": "\u063a\u064a\u0631 \u0645\u0641\u064a\u062f",
"edit": "\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u062a\u0639\u0644\u064a\u0642",
"dialog": {
"title": "\u0625\u0636\u0627\u0641\u0629 \u062a\u0639\u0644\u064a\u0642",
"submit": "\u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062a\u0639\u0644\u064a\u0642",
"yourFeedback": "\u0631\u0623\u064a\u0643..."
},
"status": {
"updating": "\u062c\u0627\u0631\u064a \u0627\u0644\u062a\u062d\u062f\u064a\u062b",
"updated": "\u062a\u0645 \u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062a\u0639\u0644\u064a\u0642"
}
}
},
"history": {
"title": "\u0627\u0644\u0645\u062f\u062e\u0644\u0627\u062a \u0627\u0644\u0623\u062e\u064a\u0631\u0629",
"empty": "\u0641\u0627\u0631\u063a \u062a\u0645\u0627\u0645\u0627\u064b...",
"show": "\u0639\u0631\u0636 \u0627\u0644\u0633\u062c\u0644"
},
"settings": {
"title": "\u0644\u0648\u062d\u0629 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a",
"customize": "\u062e\u0635\u0635 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0647\u0646\u0627"
},
"watermark": "\u0642\u062f \u062a\u062e\u0637\u0626 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0645\u0647\u0645\u0629."
},
"threadHistory": {
"sidebar": {
"title": "\u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0627\u062a \u0627\u0644\u0633\u0627\u0628\u0642\u0629",
"filters": {
"search": "\u0628\u062d\u062b",
"placeholder": "\u0627\u0644\u0628\u062d\u062b \u0641\u064a \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0627\u062a..."
},
"timeframes": {
"today": "\u0627\u0644\u064a\u0648\u0645",
"yesterday": "\u0623\u0645\u0633",
"previous7days": "\u0622\u062e\u0631 7 \u0623\u064a\u0627\u0645",
"previous30days": "\u0622\u062e\u0631 30 \u064a\u0648\u0645\u0627\u064b"
},
"empty": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0645\u062d\u0627\u062f\u062b\u0627\u062a",
"actions": {
"close": "\u0625\u063a\u0644\u0627\u0642 \u0627\u0644\u0634\u0631\u064a\u0637 \u0627\u0644\u062c\u0627\u0646\u0628\u064a",
"open": "\u0641\u062a\u062d \u0627\u0644\u0634\u0631\u064a\u0637 \u0627\u0644\u062c\u0627\u0646\u0628\u064a"
}
},
"thread": {
"untitled": "\u0645\u062d\u0627\u062f\u062b\u0629 \u0628\u062f\u0648\u0646 \u0639\u0646\u0648\u0627\u0646",
"menu": {
"rename": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629",
"share": "\u0645\u0634\u0627\u0631\u0643\u0629",
"delete": "\u062d\u0630\u0641"
},
"actions": {
"share": {
"title": "\u0645\u0634\u0627\u0631\u0643\u0629 \u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629",
"button": "\u0645\u0634\u0627\u0631\u0643\u0629",
"status": {
"copied": "\u062a\u0645 \u0646\u0633\u062e \u0627\u0644\u0631\u0627\u0628\u0637",
"created": "\u062a\u0645 \u0625\u0646\u0634\u0627\u0621 \u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629!",
"unshared": "\u062a\u0645 \u062a\u0639\u0637\u064a\u0644 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629"
},
"error": {
"create": "\u0641\u0634\u0644 \u0625\u0646\u0634\u0627\u0621 \u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629",
"unshare": "\u0641\u0634\u0644 \u062a\u0639\u0637\u064a\u0644 \u0645\u0634\u0627\u0631\u0643\u0629 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629"
}
},
"delete": {
"title": "\u062a\u0623\u0643\u064a\u062f \u0627\u0644\u062d\u0630\u0641",
"description": "\u0633\u064a\u0624\u062f\u064a \u0647\u0630\u0627 \u0625\u0644\u0649 \u062d\u0630\u0641 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0645\u0639 \u0631\u0633\u0627\u0626\u0644\u0647\u0627 \u0648\u0639\u0646\u0627\u0635\u0631\u0647\u0627. \u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u062a\u0631\u0627\u062c\u0639 \u0639\u0646 \u0647\u0630\u0627 \u0627\u0644\u0625\u062c\u0631\u0627\u0621",
"success": "\u062a\u0645 \u062d\u0630\u0641 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629",
"inProgress": "\u062c\u0627\u0631\u064a \u062d\u0630\u0641 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629"
},
"rename": {
"title": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629",
"description": "\u0623\u062f\u062e\u0644 \u0627\u0633\u0645\u0627\u064b \u062c\u062f\u064a\u062f\u0627\u064b \u0644\u0647\u0630\u0647 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629",
"form": {
"name": {
"label": "\u0627\u0644\u0627\u0633\u0645",
"placeholder": "\u0623\u062f\u062e\u0644 \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u062c\u062f\u064a\u062f"
}
},
"success": "\u062a\u0645\u062a \u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629!",
"inProgress": "\u062c\u0627\u0631\u064a \u0625\u0639\u0627\u062f\u0629 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0645\u062d\u0627\u062f\u062b\u0629",
"readme": "\u0627\u0642\u0631\u0623\u0646\u064a",
"theme": {
"light": "\u0627\u0644\u0633\u0645\u0629 \u0627\u0644\u0641\u0627\u062a\u062d\u0629",
"dark": "\u0627\u0644\u0633\u0645\u0629 \u0627\u0644\u062f\u0627\u0643\u0646\u0629",
"system": "\u0645\u062a\u0627\u0628\u0639\u0629 \u0627\u0644\u0646\u0638\u0627\u0645"
}
},
"newChat": {
"button": "\u0645\u062d\u0627\u062f\u062b\u0629 \u062c\u062f\u064a\u062f\u0629",
"dialog": {
"title": "\u0625\u0646\u0634\u0627\u0621 \u0645\u062d\u0627\u062f\u062b\u0629 \u062c\u062f\u064a\u062f\u0629",
"description": "\u0633\u064a\u0624\u062f\u064a \u0647\u0630\u0627 \u0625\u0644\u0649 \u0645\u0633\u062d \u0633\u062c\u0644 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629 \u0627\u0644\u062d\u0627\u0644\u064a. \u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0627\u0644\u0645\u062a\u0627\u0628\u0639\u0629\u061f",
"tooltip": "\u0645\u062d\u0627\u062f\u062b\u0629 \u062c\u062f\u064a\u062f\u0629"
}
},
"user": {
"menu": {
"settings": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a",
"settingsKey": "S",
"apiKeys": "\u0645\u0641\u0627\u062a\u064a\u062d API",
"logout": "\u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062e\u0631\u0648\u062c"
}
}
},
"apiKeys": {
"title": "\u0645\u0641\u0627\u062a\u064a\u062d API \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629",
"description": "\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0647\u0630\u0627 \u0627\u0644\u062a\u0637\u0628\u064a\u0642\u060c \u0645\u0641\u0627\u062a\u064a\u062d API \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0645\u0637\u0644\u0648\u0628\u0629. \u064a\u062a\u0645 \u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d \u0641\u064a \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0645\u062d\u0644\u064a \u0644\u062c\u0647\u0627\u0632\u0643.",
"success": {
"saved": "\u062a\u0645 \u0627\u0644\u062d\u0641\u0638 \u0628\u0646\u062c\u0627\u062d"
}
},
"alerts": {
"info": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a",
"note": "\u0645\u0644\u0627\u062d\u0638\u0629",
"tip": "\u0646\u0635\u064a\u062d\u0629",
"important": "\u0645\u0647\u0645",
"warning": "\u062a\u062d\u0630\u064a\u0631",
"caution": "\u062a\u0646\u0628\u064a\u0647",
"debug": "\u062a\u0635\u062d\u064a\u062d",
"example": "\u0645\u062b\u0627\u0644",
"success": "\u0646\u062c\u0627\u062d",
"help": "\u0645\u0633\u0627\u0639\u062f\u0629",
"idea": "\u0641\u0643\u0631\u0629",
"pending": "\u0642\u064a\u062f \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631",
"security": "\u0623\u0645\u0627\u0646",
"beta": "\u062a\u062c\u0631\u064a\u0628\u064a",
"best-practice": "\u0623\u0641\u0636\u0644 \u0645\u0645\u0627\u0631\u0633\u0629"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0627\u062e\u062a\u0631..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0627\u062e\u062a\u0631 \u062a\u0627\u0631\u064a\u062e\u0627\u064b",
"range": "\u0627\u062e\u062a\u0631 \u0646\u0637\u0627\u0642\u0627\u064b \u0645\u0646 \u0627\u0644\u062a\u0648\u0627\u0631\u064a\u062e"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
"confirm": "\u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
"continue": "\u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8",
"goBack": "\u09aa\u09bf\u099b\u09a8\u09c7 \u09af\u09be\u09a8",
"reset": "\u09b0\u09bf\u09b8\u09c7\u099f \u0995\u09b0\u09c1\u09a8",
"submit": "\u099c\u09ae\u09be \u09a6\u09bf\u09a8"
},
"status": {
"loading": "\u09b2\u09cb\u09a1 \u09b9\u099a\u09cd\u099b\u09c7...",
"error": {
"default": "\u098f\u0995\u099f\u09bf \u09a4\u09cd\u09b0\u09c1\u099f\u09bf \u0998\u099f\u09c7\u099b\u09c7",
"serverConnection": "\u09b8\u09be\u09b0\u09cd\u09ad\u09be\u09b0\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09af\u09be\u099a\u09cd\u099b\u09c7 \u09a8\u09be"
}
}
},
"auth": {
"login": {
"title": "\u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09b2\u0997\u0987\u09a8 \u0995\u09b0\u09c1\u09a8",
"form": {
"email": {
"label": "\u0987\u09ae\u09c7\u0987\u09b2 \u09a0\u09bf\u0995\u09be\u09a8\u09be",
"required": "\u0987\u09ae\u09c7\u0987\u09b2 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0",
"placeholder": "me@example.com"
},
"password": {
"label": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1",
"required": "\u09aa\u09be\u09b8\u0993\u09af\u09bc\u09be\u09b0\u09cd\u09a1 \u098f\u0995\u099f\u09bf \u0986\u09ac\u09b6\u09cd\u09af\u0995 \u0995\u09cd\u09b7\u09c7\u09a4\u09cd\u09b0"
},
"actions": {
"signin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8"
},
"alternativeText": {
"or": "\u0985\u09a5\u09ac\u09be"
}
},
"errors": {
"default": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be \u09b8\u09ae\u09cd\u09ad\u09ac \u09b9\u099a\u09cd\u099b\u09c7 \u09a8\u09be",
"signin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"oauthSignin": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"redirectUriMismatch": "\u09b0\u09bf\u09a1\u09be\u0987\u09b0\u09c7\u0995\u09cd\u099f URI \u0993\u0986\u09a5 \u0985\u09cd\u09af\u09be\u09aa \u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8\u09c7\u09b0 \u09b8\u09be\u09a5\u09c7 \u09ae\u09bf\u09b2\u099b\u09c7 \u09a8\u09be",
"oauthCallback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"oauthCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"emailCreateAccount": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"callback": "\u0985\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09be\u09b0 \u099a\u09c7\u09b7\u09cd\u099f\u09be \u0995\u09b0\u09c1\u09a8",
"oauthAccountNotLinked": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09b0\u09bf\u099a\u09af\u09bc \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09a4\u09c7, \u0986\u09aa\u09a8\u09bf \u09af\u09c7 \u0985\u09cd\u09af\u09be\u0995\u09be\u0989\u09a8\u09cd\u099f\u099f\u09bf \u09ae\u09c2\u09b2\u09a4 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c7\u099b\u09bf\u09b2\u09c7\u09a8 \u09b8\u09c7\u099f\u09bf \u09a6\u09bf\u09af\u09bc\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8",
"emailSignin": "\u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09af\u09be\u09af\u09bc\u09a8\u09bf",
"emailVerify": "\u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u0987\u09ae\u09c7\u0987\u09b2 \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8, \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u0987\u09ae\u09c7\u0987\u09b2 \u09aa\u09be\u09a0\u09be\u09a8\u09cb \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
"credentialsSignin": "\u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7\u0964 \u0986\u09aa\u09a8\u09be\u09b0 \u09a6\u09c7\u0993\u09af\u09bc\u09be \u09a4\u09a5\u09cd\u09af \u09b8\u09a0\u09bf\u0995 \u0995\u09bf\u09a8\u09be \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09c1\u09a8",
"sessionRequired": "\u098f\u0987 \u09aa\u09c3\u09b7\u09cd\u09a0\u09be \u09a6\u09c7\u0996\u09a4\u09c7 \u0985\u09a8\u09c1\u0997\u09cd\u09b0\u09b9 \u0995\u09b0\u09c7 \u09b8\u09be\u0987\u09a8 \u0987\u09a8 \u0995\u09b0\u09c1\u09a8"
}
},
"provider": {
"continue": "{{provider}} \u09a6\u09bf\u09af\u09bc\u09c7 \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09be\u09a8"
}
},
"chat": {
"input": {
"placeholder": "\u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u098f\u0996\u09be\u09a8\u09c7 \u099f\u09be\u0987\u09aa \u0995\u09b0\u09c1\u09a8...",
"actions": {
"send": "\u09ac\u09be\u09b0\u09cd\u09a4\u09be \u09aa\u09be\u09a0\u09be\u09a8",
"stop": "\u0995\u09be\u099c \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
"attachFiles": "\u09ab\u09be\u0987\u09b2 \u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4 \u0995\u09b0\u09c1\u09a8"
}
},
"speech": {
"start": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8",
"stop": "\u09b0\u09c7\u0995\u09b0\u09cd\u09a1\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
"connecting": "\u09b8\u0982\u09af\u09cb\u0997 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7"
},
"favorites": {
"use": "\u098f\u0995\u099f\u09bf \u09aa\u099b\u09a8\u09cd\u09a6\u09c7\u09b0 \u09ae\u09c7\u09b8\u09c7\u099c \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
"headline": "\u09aa\u099b\u09a8\u09cd\u09a6\u09c7\u09b0 \u09ae\u09c7\u09b8\u09c7\u099c",
"remove": "\u09aa\u099b\u09a8\u09cd\u09a6 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
"empty": {
"title": "\u098f\u0996\u09a8\u0993 \u0995\u09cb\u09a8\u09cb \u09aa\u09cd\u09b0\u09ae\u09cd\u09aa\u099f \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09a8\u09c7\u0987",
"description": "\u098f\u0995\u099f\u09bf \u09aa\u09cd\u09b0\u09ae\u09cd\u09aa\u099f \u09aa\u09be\u09a0\u09bf\u09af\u09bc\u09c7 \u098f\u09ac\u0982 \u09a4\u09be\u09a4\u09c7 \u09a4\u09be\u09b0\u0995\u09be \u099a\u09bf\u09b9\u09cd\u09a8 \u09a6\u09bf\u09af\u09bc\u09c7 \u09b6\u09c1\u09b0\u09c1 \u0995\u09b0\u09c1\u09a8 \u09ac\u09be \u0986\u0997\u09c7\u09b0 \u099a\u09cd\u09af\u09be\u099f \u09a5\u09c7\u0995\u09c7 \u098f\u0995\u099f\u09bf \u09aa\u09cd\u09b0\u09ae\u09cd\u09aa\u099f\u09c7 \u09a4\u09be\u09b0\u0995\u09be \u099a\u09bf\u09b9\u09cd\u09a8 \u09a6\u09bf\u09a8"
}
},
"commands": {
"button": "\u099f\u09c1\u09b2\u09b8",
"changeTool": "\u099f\u09c1\u09b2 \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8",
"availableTools": "\u0989\u09aa\u09b2\u09ac\u09cd\u09a7 \u099f\u09c1\u09b2\u09b8"
},
"fileUpload": {
"dragDrop": "\u098f\u0996\u09be\u09a8\u09c7 \u09ab\u09be\u0987\u09b2 \u099f\u09c7\u09a8\u09c7 \u0986\u09a8\u09c1\u09a8",
"browse": "\u09ab\u09be\u0987\u09b2 \u09ac\u09cd\u09b0\u09be\u0989\u099c \u0995\u09b0\u09c1\u09a8",
"sizeLimit": "\u09b8\u09c0\u09ae\u09be:",
"errors": {
"failed": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5 \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
"cancelled": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
},
"actions": {
"cancelUpload": "\u0986\u09aa\u09b2\u09cb\u09a1 \u09ac\u09be\u09a4\u09bf\u09b2 \u0995\u09b0\u09c1\u09a8",
"removeAttachment": "\u09b8\u0982\u09af\u09c1\u0995\u09cd\u09a4\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09c1\u09a8"
}
},
"messages": {
"status": {
"using": "\u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u099b\u09c7",
"used": "\u09ac\u09cd\u09af\u09ac\u09b9\u09c3\u09a4"
},
"actions": {
"copy": {
"button": "\u0995\u09cd\u09b2\u09bf\u09aa\u09ac\u09cb\u09b0\u09cd\u09a1\u09c7 \u0995\u09aa\u09bf \u0995\u09b0\u09c1\u09a8",
"success": "\u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!"
}
},
"feedback": {
"positive": "\u09b8\u09b9\u09be\u09af\u09bc\u0995",
"negative": "\u09b8\u09b9\u09be\u09af\u09bc\u0995 \u09a8\u09af\u09bc",
"edit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b8\u09ae\u09cd\u09aa\u09be\u09a6\u09a8\u09be \u0995\u09b0\u09c1\u09a8",
"dialog": {
"title": "\u09ae\u09a8\u09cd\u09a4\u09ac\u09cd\u09af \u09af\u09cb\u0997 \u0995\u09b0\u09c1\u09a8",
"submit": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u099c\u09ae\u09be \u09a6\u09bf\u09a8",
"yourFeedback": "\u0986\u09aa\u09a8\u09be\u09b0 \u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be..."
},
"status": {
"updating": "\u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7",
"updated": "\u09aa\u09cd\u09b0\u09a4\u09bf\u0995\u09cd\u09b0\u09bf\u09af\u09bc\u09be \u09b9\u09be\u09b2\u09a8\u09be\u0997\u09be\u09a6 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
}
}
},
"history": {
"title": "\u09b8\u09b0\u09cd\u09ac\u09b6\u09c7\u09b7 \u0987\u09a8\u09aa\u09c1\u099f",
"empty": "\u0995\u09cb\u09a8\u09cb \u09a4\u09a5\u09cd\u09af \u09a8\u09c7\u0987...",
"show": "\u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09a6\u09c7\u0996\u09c1\u09a8"
},
"settings": {
"title": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u09aa\u09cd\u09af\u09be\u09a8\u09c7\u09b2",
"customize": "\u098f\u0996\u09be\u09a8\u09c7 \u0986\u09aa\u09a8\u09be\u09b0 \u099a\u09cd\u09af\u09be\u099f \u09b8\u09c7\u099f\u09bf\u0982\u09b8 \u0995\u09be\u09b8\u09cd\u099f\u09ae\u09be\u0987\u099c \u0995\u09b0\u09c1\u09a8"
},
"watermark": "\u098f\u09b2\u098f\u09b2\u098f\u09ae \u09ad\u09c1\u09b2 \u0995\u09b0\u09a4\u09c7 \u09aa\u09be\u09b0\u09c7\u0964 \u0997\u09c1\u09b0\u09c1\u09a4\u09cd\u09ac\u09aa\u09c2\u09b0\u09cd\u09a3 \u09a4\u09a5\u09cd\u09af \u09af\u09be\u099a\u09be\u0987 \u0995\u09b0\u09be\u09b0 \u0995\u09a5\u09be \u09ac\u09bf\u09ac\u09c7\u099a\u09a8\u09be \u0995\u09b0\u09c1\u09a8\u0964"
},
"threadHistory": {
"sidebar": {
"title": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09ac\u09b0\u09cd\u09a4\u09c0 \u099a\u09cd\u09af\u09be\u099f",
"filters": {
"search": "\u0985\u09a8\u09c1\u09b8\u09a8\u09cd\u09a7\u09be\u09a8",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0986\u099c",
"yesterday": "\u0997\u09a4\u0995\u09be\u09b2",
"previous7days": "\u0997\u09a4 \u09ed \u09a6\u09bf\u09a8",
"previous30days": "\u0997\u09a4 \u09e9\u09e6 \u09a6\u09bf\u09a8"
},
"empty": "\u0995\u09cb\u09a8\u09cb \u09a5\u09cd\u09b0\u09c7\u09a1 \u09aa\u09be\u0993\u09af\u09bc\u09be \u09af\u09be\u09af\u09bc\u09a8\u09bf",
"actions": {
"close": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09c1\u09a8",
"open": "\u09b8\u09be\u0987\u09a1\u09ac\u09be\u09b0 \u0996\u09c1\u09b2\u09c1\u09a8"
}
},
"thread": {
"untitled": "\u09b6\u09bf\u09b0\u09cb\u09a8\u09be\u09ae\u09b9\u09c0\u09a8 \u0986\u09b2\u09cb\u099a\u09a8\u09be",
"menu": {
"rename": "\u09aa\u09c1\u09a8\u0983\u09a8\u09be\u09ae\u0995\u09b0\u09a3",
"share": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0",
"delete": "Delete"
},
"actions": {
"share": {
"title": "\u099a\u09cd\u09af\u09be\u099f\u09c7\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u0995\u09b0\u09c1\u09a8",
"button": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0",
"status": {
"copied": "\u09b2\u09bf\u0999\u09cd\u0995 \u0995\u09aa\u09bf \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
"created": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09c8\u09b0\u09bf \u09b9\u09af\u09bc\u09c7\u099b\u09c7!",
"unshared": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u09b6\u09c7\u09af\u09bc\u09be\u09b0\u09bf\u0982 \u0985\u0995\u09cd\u09b7\u09ae \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
},
"error": {
"create": "\u09b6\u09c7\u09af\u09bc\u09be\u09b0 \u09b2\u09bf\u0999\u09cd\u0995 \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5",
"unshare": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09b6\u09c7\u09af\u09bc\u09be\u09b0\u09bf\u0982 \u09ac\u09a8\u09cd\u09a7 \u0995\u09b0\u09a4\u09c7 \u09ac\u09cd\u09af\u09b0\u09cd\u09a5"
}
},
"delete": {
"title": "\u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09a8\u09bf\u09b6\u09cd\u099a\u09bf\u09a4 \u0995\u09b0\u09c1\u09a8",
"description": "\u098f\u099f\u09bf \u09a5\u09cd\u09b0\u09c7\u09a1 \u098f\u09ac\u0982 \u098f\u09b0 \u09ac\u09be\u09b0\u09cd\u09a4\u09be \u0993 \u0989\u09aa\u09be\u09a6\u09be\u09a8\u0997\u09c1\u09b2\u09bf \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u098f\u0987 \u0995\u09be\u099c\u099f\u09bf \u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09ac\u09b8\u09cd\u09a5\u09be\u09af\u09bc \u09ab\u09c7\u09b0\u09be\u09a8\u09cb \u09af\u09be\u09ac\u09c7 \u09a8\u09be",
"success": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7",
"inProgress": "\u099a\u09cd\u09af\u09be\u099f \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09be \u09b9\u099a\u09cd\u099b\u09c7"
},
"rename": {
"title": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09c1\u09a8",
"description": "\u098f\u0987 \u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u099c\u09a8\u09cd\u09af \u098f\u0995\u099f\u09bf \u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09a6\u09bf\u09a8",
"form": {
"name": {
"label": "\u09a8\u09be\u09ae",
"placeholder": "\u09a8\u09a4\u09c1\u09a8 \u09a8\u09be\u09ae \u09b2\u09bf\u0996\u09c1\u09a8"
}
},
"success": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u09af\u09bc\u09c7\u099b\u09c7!",
"inProgress": "\u09a5\u09cd\u09b0\u09c7\u09a1\u09c7\u09b0 \u09a8\u09be\u09ae \u09aa\u09b0\u09bf\u09ac\u09b0\u09cd\u09a4\u09a8 \u0995\u09b0\u09be \u09b9\u099a\u09cd\u099b\u09c7"
}
}
}
},
"navigation": {
"header": {
"chat": "\u099a\u09cd\u09af\u09be\u099f",
"readme": "\u09b0\u09bf\u09a1\u09ae\u09bf",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f",
"dialog": {
"title": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09c1\u09a8",
"description": "\u098f\u099f\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09ac\u09b0\u09cd\u09a4\u09ae\u09be\u09a8 \u099a\u09cd\u09af\u09be\u099f \u0987\u09a4\u09bf\u09b9\u09be\u09b8 \u09ae\u09c1\u099b\u09c7 \u09ab\u09c7\u09b2\u09ac\u09c7\u0964 \u0986\u09aa\u09a8\u09bf \u0995\u09bf \u099a\u09be\u09b2\u09bf\u09af\u09bc\u09c7 \u09af\u09c7\u09a4\u09c7 \u099a\u09be\u09a8?",
"tooltip": "\u09a8\u09a4\u09c1\u09a8 \u099a\u09cd\u09af\u09be\u099f"
}
},
"user": {
"menu": {
"settings": "\u09b8\u09c7\u099f\u09bf\u0982\u09b8",
"settingsKey": "S",
"apiKeys": "\u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0",
"logout": "\u09b2\u0997\u0986\u0989\u099f"
}
}
},
"apiKeys": {
"title": "\u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u09c0\u09af\u09bc \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0",
"description": "\u098f\u0987 \u0985\u09cd\u09af\u09be\u09aa\u09cd\u09b2\u09bf\u0995\u09c7\u09b6\u09a8 \u09ac\u09cd\u09af\u09ac\u09b9\u09be\u09b0 \u0995\u09b0\u09a4\u09c7 \u09a8\u09bf\u09ae\u09cd\u09a8\u09b2\u09bf\u0996\u09bf\u09a4 \u098f\u09aa\u09bf\u0986\u0987 \u0995\u09c0 \u09aa\u09cd\u09b0\u09af\u09bc\u09cb\u099c\u09a8\u0964 \u0995\u09c0\u0997\u09c1\u09b2\u09bf \u0986\u09aa\u09a8\u09be\u09b0 \u09a1\u09bf\u09ad\u09be\u0987\u09b8\u09c7\u09b0 \u09b2\u09cb\u0995\u09be\u09b2 \u09b8\u09cd\u099f\u09cb\u09b0\u09c7\u099c\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09a5\u09be\u0995\u09c7\u0964",
"success": {
"saved": "\u09b8\u09ab\u09b2\u09ad\u09be\u09ac\u09c7 \u09b8\u0982\u09b0\u0995\u09cd\u09b7\u09bf\u09a4 \u09b9\u09af\u09bc\u09c7\u099b\u09c7"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u098f\u0995\u099f\u09bf \u09a4\u09be\u09b0\u09bf\u0996 \u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8",
"range": "\u09a4\u09be\u09b0\u09bf\u0996\u09c7\u09b0 \u09aa\u09b0\u09bf\u09b8\u09c0\u09ae\u09be \u09ac\u09c7\u099b\u09c7 \u09a8\u09bf\u09a8"
}
}
}
}

View File

@ -0,0 +1,259 @@
{
"common": {
"actions": {
"cancel": "Annuller",
"confirm": "Bekr\u00e6ft",
"continue": "Forts\u00e6t",
"goBack": "G\u00e5 tilbage",
"reset": "Nulstil",
"submit": "Indsend"
},
"status": {
"loading": "Indl\u00e6ser...",
"error": {
"default": "Der opstod en fejl",
"serverConnection": "Kunne ikke n\u00e5 serveren"
}
}
},
"auth": {
"login": {
"title": "Log ind for at f\u00e5 adgang til appen",
"form": {
"email": {
"label": "E-mailadresse",
"required": "e-mail er et p\u00e5kr\u00e6vet felt",
"placeholder": "me@example.com"
},
"password": {
"label": "Adgangskode",
"required": "adgangskode er et p\u00e5kr\u00e6vet felt"
},
"actions": {
"signin": "Log ind"
},
"alternativeText": {
"or": "ELLER"
}
},
"errors": {
"default": "Kunne ikke logge ind",
"signin": "Pr\u00f8v at logge ind med en anden konto",
"oauthSignin": "Pr\u00f8v at logge ind med en anden konto",
"redirectUriMismatch": "Omdirigerings-URI'en matcher ikke oauth-app konfigurationen",
"oauthCallback": "Pr\u00f8v at logge ind med en anden konto",
"oauthCreateAccount": "Pr\u00f8v at logge ind med en anden konto",
"emailCreateAccount": "Pr\u00f8v at logge ind med en anden konto",
"callback": "Pr\u00f8v at logge ind med en anden konto",
"oauthAccountNotLinked": "For at bekr\u00e6fte din identitet, log ind med samme konto, som du oprindeligt brugte",
"emailSignin": "E-mailen kunne ikke sendes",
"emailVerify": "Bekr\u00e6ft venligst din e-mail, en ny e-mail er blevet sendt",
"credentialsSignin": "Login mislykkedes. Kontroller at de angivne oplysninger er korrekte",
"sessionRequired": "Log venligst ind for at f\u00e5 adgang til denne side"
}
},
"provider": {
"continue": "Forts\u00e6t med {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Skriv din besked her...",
"actions": {
"send": "Send besked",
"stop": "Stop opgave",
"attachFiles": "Vedh\u00e6ft filer"
}
},
"favorites": {
"use": "Brug en favorit besked",
"headline": "Favorit beskeder",
"empty": {
"title": "Ingen gemte prompts endnu",
"description": "Start med at sende en prompt og markere den med en stjerne, eller v\u00e6lg en prompt fra tidligere samtaler"
}
},
"commands": {
"button": "V\u00e6rkt\u00f8jer",
"changeTool": "Skift v\u00e6rkt\u00f8j",
"availableTools": "Tilg\u00e6ngelige v\u00e6rkt\u00f8jer"
},
"speech": {
"start": "Start optagelse",
"stop": "Stop optagelse",
"connecting": "Forbinder"
},
"fileUpload": {
"dragDrop": "Tr\u00e6k og slip filer her",
"browse": "Gennemse filer",
"sizeLimit": "Gr\u00e6nse:",
"errors": {
"failed": "Upload mislykkedes",
"cancelled": "Annullerede upload af"
},
"actions": {
"cancelUpload": "Annullere upload",
"removeAttachment": "Fjern vedh\u00e6ftning"
}
},
"messages": {
"status": {
"using": "Bruger",
"used": "Brugte"
},
"actions": {
"copy": {
"button": "Kopier til udklipsholder",
"success": "Kopieret!"
}
},
"feedback": {
"positive": "Hj\u00e6lpsom",
"negative": "Ikke hj\u00e6lpsom",
"edit": "Rediger feedback",
"dialog": {
"title": "Tilf\u00f8j en kommentar",
"submit": "Indsend feedback",
"yourFeedback": "Din feedback..."
},
"status": {
"updating": "Opdaterer",
"updated": "Feedback opdateret"
}
}
},
"history": {
"title": "Seneste input",
"empty": "S\u00e5 tomt...",
"show": "Vis historik"
},
"settings": {
"title": "Indstillingspanel",
"customize": "Tilpas dine chatindstillinger her"
},
"watermark": "Bygget med"
},
"threadHistory": {
"sidebar": {
"title": "Tidligere samtaler",
"filters": {
"search": "S\u00f8g",
"placeholder": "S\u00f8g i samtaler..."
},
"timeframes": {
"today": "I dag",
"yesterday": "I g\u00e5r",
"previous7days": "Seneste 7 dage",
"previous30days": "Seneste 30 dage"
},
"empty": "Ingen tr\u00e5de fundet",
"actions": {
"close": "Luk sidepanel",
"open": "\u00c5bn sidepanel"
}
},
"thread": {
"untitled": "Unavngivet samtale",
"menu": {
"rename": "Omd\u00f8b",
"share": "Del",
"delete": "Slet"
},
"actions": {
"share": {
"title": "Del link til chat",
"button": "Del",
"status": {
"copied": "Link kopieret",
"created": "Delingslink oprettet!",
"unshared": "Deling deaktiveret for denne tr\u00e5d"
},
"error": {
"create": "Kunne ikke oprette delingslink",
"unshare": "Kunne ikke fjerne deling af tr\u00e5d"
}
},
"delete": {
"title": "Bekr\u00e6ft sletning",
"description": "Dette vil slette tr\u00e5den samt dens beskeder og elementer. Denne handling kan ikke fortrydes",
"success": "Chat slettet",
"inProgress": "Sletter chat"
},
"rename": {
"title": "Omd\u00f8b tr\u00e5d",
"description": "Indtast et nyt navn til denne tr\u00e5d",
"form": {
"name": {
"label": "Navn",
"placeholder": "Indtast nyt navn"
}
},
"success": "Tr\u00e5d omd\u00f8bt!",
"inProgress": "Omd\u00f8ber tr\u00e5d"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "\ud83d\udcd6",
"theme": {
"light": "Lyst tema",
"dark": "M\u00f8rkt tema",
"system": "F\u00f8lg system"
}
},
"newChat": {
"button": "Ny chat",
"dialog": {
"title": "Opret ny chat",
"description": "Dette vil rydde din nuv\u00e6rende chathistorik. Er du sikker p\u00e5, at du vil forts\u00e6tte?",
"tooltip": "Ny chat"
}
},
"user": {
"menu": {
"settings": "Indstillinger",
"settingsKey": "S",
"apiKeys": "API-n\u00f8gler",
"logout": "Log ud"
}
}
},
"apiKeys": {
"title": "P\u00e5kr\u00e6vede API-n\u00f8gler",
"description": "For at bruge denne app kr\u00e6ves f\u00f8lgende API-n\u00f8gler. N\u00f8glerne gemmes p\u00e5 din enheds lokale lager.",
"success": {
"saved": "Gemt succesfuldt"
}
},
"alerts": {
"info": "Info",
"note": "Bem\u00e6rk",
"tip": "Tip",
"important": "Vigtigt",
"warning": "Advarsel",
"caution": "Forsigtig",
"debug": "Fejlfinding",
"example": "Eksempel",
"success": "Succes",
"help": "Hj\u00e6lp",
"idea": "Id\u00e9",
"pending": "Afventer",
"security": "Sikkerhed",
"beta": "Beta",
"best-practice": "Bedste praksis"
},
"components": {
"MultiSelectInput": {
"placeholder": "V\u00e6lg..."
},
"DatePickerInput": {
"placeholder": {
"single": "V\u00e6lg en dato",
"range": "V\u00e6lg et datointerval"
}
}
}
}

View File

@ -0,0 +1,254 @@
{
"common": {
"actions": {
"cancel": "Abbrechen",
"confirm": "Best\u00e4tigen",
"continue": "Fortfahren",
"goBack": "Zur\u00fcck",
"reset": "Zur\u00fccksetzen",
"submit": "Absenden"
},
"status": {
"loading": "L\u00e4dt...",
"error": {
"default": "Ein Fehler ist aufgetreten",
"serverConnection": "Server konnte nicht erreicht werden"
}
}
},
"auth": {
"login": {
"title": "Melde dich an, um auf die App zuzugreifen",
"form": {
"email": {
"label": "E-Mail Adresse",
"required": "E-Mail Adresse ist ein Pflichtfeld",
"placeholder": "me@example.com"
},
"password": {
"label": "Passwort",
"required": "Passwort ist ein Pflichtfeld"
},
"actions": {
"signin": "Anmelden"
},
"alternativeText": {
"or": "ODER"
}
},
"errors": {
"default": "Anmeldung fehlgeschlagen",
"signin": "Versuche dich mit einem anderen Konto anzumelden",
"oauthSignin": "Versuche dich mit einem anderen Konto anzumelden",
"redirectUriMismatch": "Der Redirect-URI stimmt nicht mit der Konfiguration der Oauth-Anwendung \u00fcberein",
"oauthCallback": "Versuche dich mit einem anderen Konto anzumelden",
"oauthCreateAccount": "Versuche dich mit einem anderen Konto anzumelden",
"emailCreateAccount": "Versuche dich mit einem anderen Konto anzumelden",
"callback": "Versuche dich mit einem anderen Konto anzumelden",
"oauthAccountNotLinked": "Um die Identit\u00e4t zu best\u00e4tigen, melde dich mit demselben Konto an, das du urspr\u00fcnglich verwendet hast",
"emailSignin": "Die E-Mail konnte nicht gesendet werden",
"emailVerify": "Es wurde eine neue E-Mail versandt. Bitte \u00fcberpr\u00fcfe dein E-Mail Postfach",
"credentialsSignin": "Anmeldung fehlgeschlagen. \u00dcberpr\u00fcfe, ob die angegebenen Benutzerdaten korrekt sind",
"sessionRequired": "Bitte melde dich an, um auf diese Seite zuzugreifen"
}
},
"provider": {
"continue": "Fortfahren mit {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Nachricht eingeben...",
"actions": {
"send": "Nachricht senden",
"stop": "Aufgabe stoppen",
"attachFiles": "Dateien anh\u00e4ngen"
}
},
"favorites": {
"use": "Eine favorisierte Nachricht verwenden",
"headline": "Favorisierte Nachrichten",
"remove": "Favorit entfernen",
"empty": {
"title": "Noch keine Prompts gespeichert",
"description": "Beginne, indem du einen Prompt sendest und mit einem Stern markierst oder markiere einen Prompt aus vorherigen Chats"
}
},
"commands": {
"button": "Tools",
"changeTool": "Tool wechseln",
"availableTools": "Verf\u00fcgbare Tools"
},
"speech": {
"start": "Aufnahme starten",
"stop": "Aufnahme stoppen",
"connecting": "Verbinde"
},
"fileUpload": {
"dragDrop": "Ziehe deine Dateien hierher",
"browse": "Dateien durchsuchen",
"sizeLimit": "Limit:",
"errors": {
"failed": "Hochladen fehlgeschlagen",
"cancelled": "Abbruch des hochladens von"
},
"actions": {
"cancelUpload": "Upload abbrechen",
"removeAttachment": "Anhang entfernen"
}
},
"messages": {
"status": {
"using": "Verwendet",
"used": "Verwendete"
},
"actions": {
"copy": {
"button": "In Zwischenablage kopieren",
"success": "Kopiert!"
}
},
"feedback": {
"positive": "Hilfreich",
"negative": "Nicht hilfreich",
"edit": "Feedback editieren",
"dialog": {
"title": "F\u00fcge einen Kommentar hinzu",
"submit": "Feedback absenden",
"yourFeedback": "Dein Feedback..."
},
"status": {
"updating": "Aktualisiert",
"updated": "Feedback aktualisiert"
}
}
},
"history": {
"title": "Vergangene Eingaben",
"empty": "Leer...",
"show": "Historie anzeigen"
},
"settings": {
"title": "Einstellungen",
"customize": "Passe die Chat Einstellungen hier an"
},
"watermark": "LLMs k\u00f6nnen Fehler machen. \u00dcberpr\u00fcfe bitte stets die Inhalte."
},
"threadHistory": {
"sidebar": {
"title": "Vergangene Chats",
"filters": {
"search": "Suche",
"placeholder": "Suche konversationen..."
},
"timeframes": {
"today": "Heute",
"yesterday": "Gestern",
"previous7days": "Vor 7 Tagen",
"previous30days": "Vor 30 Tagen"
},
"empty": "Kein Chat gefunden",
"actions": {
"close": "Seitenleiste schlie\u00dfen",
"open": "Seitenleiste \u00f6ffnen"
}
},
"thread": {
"untitled": "Unbenannter Thread",
"menu": {
"rename": "Umbenennen",
"share": "Teilen",
"delete": "L\u00f6schen"
},
"actions": {
"share": {
"title": "Thread l\u00f6schen best\u00e4tigen",
"button": "Teilen",
"status": {
"copied": "Link kopiert",
"created": "Freigabelink erstellt!",
"unshared": "Teilen ist f\u00fcr diesen Thread deaktiviert"
},
"error": {
"create": "Fehler beim Erstellen des Freigabelinks",
"unshare": "Freigabe des Threads konnte nicht aufgehoben werden"
}
},
"delete": {
"title": "L\u00f6schen best\u00e4tigen",
"description": "Dies wird den Thread sowie seine Nachrichten und Elemente l\u00f6schen. Dies kann nicht r\u00fcckg\u00e4ngig gemacht werden",
"success": "Chat gel\u00f6scht",
"inProgress": "Chat wird gel\u00f6scht"
},
"rename": {
"title": "Thread umbenennen",
"description": "Gebe einen neuen Namen f\u00fcr den Thread ein",
"form": {
"name": {
"label": "Name",
"placeholder": "Neuen Namen eingeben"
}
},
"success": "Thread umbenannt!",
"inProgress": "Thread wird umbenannt"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "Anleitung",
"theme": {
"light": "Helles Design",
"dark": "Dunkles Design",
"system": "System Design"
}
},
"newChat": {
"button": "Neuer Chat",
"dialog": {
"title": "M\u00f6chtest du einen neuen Chat erstellen?",
"description": "Es werden die aktuellen Nachrichten gel\u00f6scht und ein neuer Chat ge\u00f6ffnet.",
"tooltip": "Neuer Chat"
}
},
"user": {
"menu": {
"settings": "Einstellungen",
"settingsKey": "S",
"apiKeys": "API Schl\u00fcssel",
"logout": "Abmelden"
}
}
},
"apiKeys": {
"title": "Ben\u00f6tigte API Schl\u00fcssel",
"description": "Um diese App zu nutzen, werden die folgenden API Schl\u00fcssel ben\u00f6tigt. Die Schl\u00fcssel werden im lokalen Speicher Ihres Ger\u00e4ts gespeichert.",
"success": {
"saved": "Erfolgreich gespeichert"
}
},
"alerts": {
"info": "Info",
"note": "Hinweis",
"tip": "Tipp",
"important": "Wichtig",
"warning": "Warnung",
"caution": "Vorsicht",
"debug": "Debug",
"example": "Beispiel",
"success": "Erfolg",
"help": "Hilfe",
"idea": "Idee",
"pending": "Ausstehend",
"security": "Sicherheit",
"beta": "Beta",
"best-practice": "Bew\u00e4hrte Praxis"
},
"components": {
"MultiSelectInput": {
"placeholder": "W\u00e4hle aus..."
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0386\u03ba\u03c5\u03c1\u03bf",
"confirm": "\u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7",
"continue": "\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1",
"goBack": "\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae",
"reset": "\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac",
"submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae"
},
"status": {
"loading": "\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7...",
"error": {
"default": "\u03a0\u03b1\u03c1\u03bf\u03c5\u03c3\u03b9\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5 \u03c3\u03c6\u03ac\u03bb\u03bc\u03b1",
"serverConnection": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b5\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03b4\u03b9\u03b1\u03ba\u03bf\u03bc\u03b9\u03c3\u03c4\u03ae"
}
}
},
"auth": {
"login": {
"title": "\u03a3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae",
"form": {
"email": {
"label": "\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5",
"required": "\u03a4\u03bf email \u03b5\u03af\u03bd\u03b1\u03b9 \u03c5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf",
"placeholder": "me@example.com"
},
"password": {
"label": "\u039a\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
"required": "\u039f \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c5\u03c0\u03bf\u03c7\u03c1\u03b5\u03c9\u03c4\u03b9\u03ba\u03cc \u03c0\u03b5\u03b4\u03af\u03bf"
},
"actions": {
"signin": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
},
"alternativeText": {
"or": "\u03ae"
}
},
"errors": {
"default": "\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7",
"signin": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"oauthSignin": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"redirectUriMismatch": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03b1\u03bd\u03b1\u03ba\u03b1\u03c4\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7\u03c2 \u03b4\u03b5\u03bd \u03c4\u03b1\u03b9\u03c1\u03b9\u03ac\u03b6\u03b5\u03b9 \u03bc\u03b5 \u03c4\u03b7 \u03c1\u03cd\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03b7\u03c2 \u03b1\u03c5\u03b8\u03b5\u03bd\u03c4\u03b9\u03ba\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae\u03c2",
"oauthCallback": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"oauthCreateAccount": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"emailCreateAccount": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"callback": "\u0394\u03bf\u03ba\u03b9\u03bc\u03ac\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03b4\u03b9\u03b1\u03c6\u03bf\u03c1\u03b5\u03c4\u03b9\u03ba\u03cc \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc",
"oauthAccountNotLinked": "\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03b9\u03ce\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c5\u03c4\u03cc\u03c4\u03b7\u03c4\u03ac \u03c3\u03b1\u03c2, \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03bc\u03b5 \u03c4\u03bf\u03bd \u03af\u03b4\u03b9\u03bf \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03cc \u03c0\u03bf\u03c5 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b1\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b9\u03ba\u03ac",
"emailSignin": "\u0394\u03b5\u03bd \u03ae\u03c4\u03b1\u03bd \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b1\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03c4\u03bf\u03c5 email",
"emailVerify": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03c0\u03b1\u03bb\u03b7\u03b8\u03b5\u03cd\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03b7\u03bb\u03b5\u03ba\u03c4\u03c1\u03bf\u03bd\u03b9\u03ba\u03bf\u03cd \u03c4\u03b1\u03c7\u03c5\u03b4\u03c1\u03bf\u03bc\u03b5\u03af\u03bf\u03c5 \u03c3\u03b1\u03c2, \u03ad\u03bd\u03b1 \u03bd\u03ad\u03bf email \u03c3\u03b1\u03c2 \u03ad\u03c7\u03b5\u03b9 \u03c3\u03c4\u03b1\u03bb\u03b5\u03af",
"credentialsSignin": "\u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5. \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c0\u03bf\u03c5 \u03b4\u03ce\u03c3\u03b1\u03c4\u03b5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c9\u03c3\u03c4\u03ac",
"sessionRequired": "\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03c3\u03c5\u03bd\u03b4\u03b5\u03b8\u03b5\u03af\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03c0\u03bf\u03ba\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7 \u03c3\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7 \u03c3\u03b5\u03bb\u03af\u03b4\u03b1"
}
},
"provider": {
"continue": "\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1 \u03bc\u03b5 {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "\u03a0\u03bb\u03b7\u03ba\u03c4\u03c1\u03bf\u03bb\u03bf\u03b3\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03bc\u03ae\u03bd\u03c5\u03bc\u03ac \u03c3\u03b1\u03c2 \u03b5\u03b4\u03ce...",
"actions": {
"send": "\u0391\u03c0\u03bf\u03c3\u03c4\u03bf\u03bb\u03ae \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03bf\u03c2",
"stop": "\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2",
"attachFiles": "\u0395\u03c0\u03b9\u03c3\u03cd\u03bd\u03b1\u03c8\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd"
}
},
"favorites": {
"use": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03b1\u03b3\u03b1\u03c0\u03b7\u03bc\u03ad\u03bd\u03bf \u03bc\u03ae\u03bd\u03c5\u03bc\u03b1",
"headline": "\u0391\u03b3\u03b1\u03c0\u03b7\u03bc\u03ad\u03bd\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03b1",
"remove": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b1\u03b3\u03b1\u03c0\u03b7\u03bc\u03ad\u03bd\u03bf\u03c5",
"empty": {
"title": "\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c0\u03c1\u03bf\u03c4\u03c1\u03bf\u03c0\u03ad\u03c2 \u03b1\u03ba\u03cc\u03bc\u03b1",
"description": "\u039e\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03c4\u03b5 \u03c3\u03c4\u03ad\u03bb\u03bd\u03bf\u03bd\u03c4\u03b1\u03c2 \u03bc\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c4\u03c1\u03bf\u03c0\u03ae \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c3\u03c4\u03b1 \u03b1\u03b3\u03b1\u03c0\u03b7\u03bc\u03ad\u03bd\u03b1 \u03ae \u03c0\u03c1\u03bf\u03c3\u03b8\u03ad\u03c3\u03c4\u03b5 \u03bc\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c4\u03c1\u03bf\u03c0\u03ae \u03b1\u03c0\u03cc \u03c0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b5\u03c2"
}
},
"commands": {
"button": "\u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1",
"changeTool": "\u0391\u03bb\u03bb\u03b1\u03b3\u03ae \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf\u03c5",
"availableTools": "\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1 \u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1"
},
"speech": {
"start": "\u0388\u03bd\u03b1\u03c1\u03be\u03b7 \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
"stop": "\u0394\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae \u03b5\u03b3\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
"connecting": "\u03a3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
},
"fileUpload": {
"dragDrop": "\u03a3\u03cd\u03c1\u03b5\u03c4\u03b5 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 \u03b5\u03b4\u03ce",
"browse": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd",
"sizeLimit": "\u038c\u03c1\u03b9\u03bf:",
"errors": {
"failed": "\u0397 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5",
"cancelled": "\u0391\u03ba\u03c5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b5 \u03b7 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5"
},
"actions": {
"cancelUpload": "\u0391\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7 \u03bc\u03b5\u03c4\u03b1\u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2",
"removeAttachment": "\u0391\u03c6\u03b1\u03af\u03c1\u03b5\u03c3\u03b7 \u03b5\u03c0\u03b9\u03c3\u03cd\u03bd\u03b1\u03c8\u03b7\u03c2"
}
},
"messages": {
"status": {
"using": "\u039c\u03b5 \u03c4\u03b7 \u03c7\u03c1\u03ae\u03c3\u03b7",
"used": "\u03a7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5"
},
"actions": {
"copy": {
"button": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c4\u03bf \u03c0\u03c1\u03cc\u03c7\u03b5\u03b9\u03c1\u03bf",
"success": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5!"
}
},
"feedback": {
"positive": "\u03a7\u03c1\u03ae\u03c3\u03b9\u03bc\u03bf\u03c2",
"negative": "\u039c\u03b7 \u03c7\u03c1\u03ae\u03c3\u03b9\u03bc\u03bf\u03c2",
"edit": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03c7\u03bf\u03bb\u03af\u03c9\u03bd",
"dialog": {
"title": "\u03a0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03c3\u03c7\u03bf\u03bb\u03af\u03bf\u03c5",
"submit": "\u03a5\u03c0\u03bf\u03b2\u03bf\u03bb\u03ae \u03c3\u03c7\u03bf\u03bb\u03af\u03c9\u03bd",
"yourFeedback": "\u0397 \u03b3\u03bd\u03ce\u03bc\u03b7 \u03c3\u03b1\u03c2"
},
"status": {
"updating": "\u0395\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03bd\u03b5\u03c4\u03b1\u03b9",
"updated": "\u03a4\u03b1 \u03c3\u03c7\u03cc\u03bb\u03b9\u03b1 \u03b5\u03bd\u03b7\u03bc\u03b5\u03c1\u03ce\u03b8\u03b7\u03ba\u03b1\u03bd"
}
}
},
"history": {
"title": "\u03a4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03b5\u03c2 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ad\u03c2",
"empty": "\u03a4\u03cc\u03c3\u03bf \u03ac\u03b4\u03b5\u03b9\u03bf...",
"show": "\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03bf\u03cd"
},
"settings": {
"title": "\u03a0\u03af\u03bd\u03b1\u03ba\u03b1\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03c9\u03bd",
"customize": "\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae"
},
"watermark": "\u03a4\u03b1 \u039c\u0393\u039c \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03ba\u03ac\u03bd\u03bf\u03c5\u03bd \u03bb\u03ac\u03b8\u03b7. \u0395\u03bb\u03ad\u03b3\u03be\u03c4\u03b5 \u03c3\u03b7\u03bc\u03b1\u03bd\u03c4\u03b9\u03ba\u03ad\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2."
},
"threadHistory": {
"sidebar": {
"title": "\u03a0\u03b1\u03bb\u03b1\u03b9\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b5\u03c2",
"filters": {
"search": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7",
"placeholder": "\u0391\u03bd\u03b1\u03b6\u03ae\u03c4\u03b7\u03c3\u03b7 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03b9\u03ce\u03bd..."
},
"timeframes": {
"today": "\u03a3\u03ae\u03bc\u03b5\u03c1\u03b1",
"yesterday": "\u03a7\u03b8\u03b5\u03c2",
"previous7days": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 7 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2",
"previous30days": "\u03a0\u03c1\u03bf\u03b7\u03b3\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 30 \u03b7\u03bc\u03ad\u03c1\u03b5\u03c2"
},
"empty": "\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03bd\u03ae\u03bc\u03b1\u03c4\u03b1",
"actions": {
"close": "\u039a\u03bb\u03b5\u03af\u03c3\u03b9\u03bc\u03bf \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2",
"open": "\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c0\u03bb\u03b1\u03ca\u03bd\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2"
}
},
"thread": {
"untitled": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03c4\u03af\u03c4\u03bb\u03bf",
"menu": {
"rename": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1",
"share": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
"delete": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae"
},
"actions": {
"share": {
"title": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2",
"button": "\u039a\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
"status": {
"copied": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5",
"created": "\u039f \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03bc\u03bf\u03c2 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03ae\u03b8\u03b7\u03ba\u03b5!",
"unshared": "\u0397 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03b1\u03c0\u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03b8\u03b7\u03ba\u03b5 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1"
},
"error": {
"create": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1\u03c2 \u03c3\u03c5\u03bd\u03b4\u03ad\u03c3\u03bc\u03bf\u03c5 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2",
"unshare": "\u0391\u03c0\u03bf\u03c4\u03c5\u03c7\u03af\u03b1 \u03b4\u03b9\u03b1\u03ba\u03bf\u03c0\u03ae\u03c2 \u03ba\u03bf\u03b9\u03bd\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7\u03c2 \u03bd\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2"
}
},
"delete": {
"title": "\u0395\u03c0\u03b9\u03b2\u03b5\u03b2\u03b1\u03af\u03c9\u03c3\u03b7 \u03b4\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2",
"description": "\u0391\u03c5\u03c4\u03cc \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03b9 \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1 \u03ba\u03b1\u03b8\u03ce\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b1 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03b1 \u03ba\u03b1\u03b9 \u03c4\u03b1 \u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03c4\u03bf\u03c5. \u0391\u03c5\u03c4\u03ae \u03b7 \u03b5\u03bd\u03ad\u03c1\u03b3\u03b5\u03b9\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03b1\u03b9\u03c1\u03b5\u03b8\u03b5\u03af.",
"success": "\u0397 \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5",
"inProgress": "\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2"
},
"rename": {
"title": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 \u039d\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
"description": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03bd\u03ad\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc \u03c4\u03bf \u03bd\u03ae\u03bc\u03b1",
"form": {
"name": {
"label": "\u038c\u03bd\u03bf\u03bc\u03b1",
"placeholder": "\u0395\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03bd\u03ad\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1"
}
},
"success": "\u03a4\u03bf \u03bd\u03ae\u03bc\u03b1 \u03bc\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03ac\u03c3\u03c4\u03b7\u03ba\u03b5!",
"inProgress": "\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 \u039d\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2"
}
}
}
},
"navigation": {
"header": {
"chat": "\u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
"readme": "\u0394\u03b9\u03ac\u03b2\u03b1\u03c3\u03ad \u03bc\u03b5",
"theme": {
"light": "\u03a6\u03c9\u03c4\u03b5\u03b9\u03bd\u03cc \u0398\u03ad\u03bc\u03b1",
"dark": "\u03a3\u03ba\u03bf\u03c4\u03b5\u03b9\u03bd\u03cc \u03b8\u03ad\u03bc\u03b1",
"system": "\u0391\u03ba\u03bf\u03bb\u03bf\u03c5\u03b8\u03ae\u03c3\u03c4\u03b5 \u03c4\u03bf \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1"
}
},
"newChat": {
"button": "\u039d\u03ad\u03b1 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1",
"dialog": {
"title": "\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1 \u039d\u03ad\u03b1\u03c2 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2",
"description": "\u0391\u03c5\u03c4\u03cc \u03b8\u03b1 \u03b4\u03b9\u03b1\u03b3\u03c1\u03ac\u03c8\u03b5\u03b9 \u03c4\u03bf \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd \u03b9\u03c3\u03c4\u03bf\u03c1\u03b9\u03ba\u03cc \u03c3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1\u03c2 \u03c3\u03b1\u03c2. \u0395\u03af\u03c3\u03c4\u03b5 \u03b2\u03ad\u03b2\u03b1\u03b9\u03bf\u03b9 \u03cc\u03c4\u03b9 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c3\u03c5\u03bd\u03b5\u03c7\u03af\u03c3\u03b5\u03c4\u03b5;",
"tooltip": "\u039d\u03ad\u03b1 \u03a3\u03c5\u03bd\u03bf\u03bc\u03b9\u03bb\u03af\u03b1"
}
},
"user": {
"menu": {
"settings": "\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2",
"settingsKey": "S",
"apiKeys": "\u039a\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API",
"logout": "\u0391\u03c0\u03bf\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7"
}
}
},
"apiKeys": {
"title": "\u0391\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API",
"description": "\u0393\u03b9\u03b1 \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03b1\u03c5\u03c4\u03ae\u03bd \u03c4\u03b7\u03bd \u03b5\u03c6\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae, \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 \u03c4\u03b1 \u03b1\u03ba\u03cc\u03bb\u03bf\u03c5\u03b8\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac API. \u03a4\u03b1 \u03ba\u03bb\u03b5\u03b9\u03b4\u03b9\u03ac \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf\u03bd \u03c4\u03bf\u03c0\u03b9\u03ba\u03cc \u03c7\u03ce\u03c1\u03bf \u03b1\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7\u03c2 \u03c4\u03b7\u03c2 \u03c3\u03c5\u03c3\u03ba\u03b5\u03c5\u03ae\u03c2 \u03c3\u03b1\u03c2.",
"success": {
"saved": "\u0391\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b5 \u03bc\u03b5 \u03b5\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1"
}
},
"alerts": {
"info": "\u03a0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2",
"note": "\u03a3\u03b7\u03bc\u03b5\u03af\u03c9\u03c3\u03b7",
"tip": "\u03a3\u03c5\u03bc\u03b2\u03bf\u03c5\u03bb\u03ae",
"important": "\u03a3\u03b7\u03bc\u03b1\u03bd\u03c4\u03b9\u03ba\u03cc",
"warning": "\u03a0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7",
"caution": "\u03a0\u03c1\u03bf\u03c3\u03bf\u03c7\u03ae",
"debug": "\u0395\u03bd\u03c4\u03bf\u03c0\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c3\u03c6\u03b1\u03bb\u03bc\u03ac\u03c4\u03c9\u03bd",
"example": "\u03a0\u03b1\u03c1\u03ac\u03b4\u03b5\u03b9\u03b3\u03bc\u03b1",
"success": "\u0395\u03c0\u03b9\u03c4\u03c5\u03c7\u03af\u03b1",
"help": "\u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1",
"idea": "\u0399\u03b4\u03ad\u03b1",
"pending": "\u03a3\u03b5 \u03b5\u03ba\u03ba\u03c1\u03b5\u03bc\u03cc\u03c4\u03b7\u03c4\u03b1",
"security": "\u0391\u03c3\u03c6\u03ac\u03bb\u03b5\u03b9\u03b1",
"beta": "Beta",
"best-practice": "\u0392\u03ad\u03bb\u03c4\u03b9\u03c3\u03c4\u03b7 \u03a0\u03c1\u03b1\u03ba\u03c4\u03b9\u03ba\u03ae"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03af\u03b1",
"range": "\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03b5\u03cd\u03c1\u03bf\u03c2 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bc\u03b7\u03bd\u03b9\u03ce\u03bd"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "Cancel",
"confirm": "Confirm",
"continue": "Continue",
"goBack": "Go Back",
"reset": "Reset",
"submit": "Submit"
},
"status": {
"loading": "Loading...",
"error": {
"default": "An error occurred",
"serverConnection": "Could not reach the server"
}
}
},
"auth": {
"login": {
"title": "Login to access the app",
"form": {
"email": {
"label": "Email address",
"required": "email is a required field",
"placeholder": "me@example.com"
},
"password": {
"label": "Password",
"required": "password is a required field"
},
"actions": {
"signin": "Sign In"
},
"alternativeText": {
"or": "OR"
}
},
"errors": {
"default": "Unable to sign in",
"signin": "Try signing in with a different account",
"oauthSignin": "Try signing in with a different account",
"redirectUriMismatch": "The redirect URI is not matching the oauth app configuration",
"oauthCallback": "Try signing in with a different account",
"oauthCreateAccount": "Try signing in with a different account",
"emailCreateAccount": "Try signing in with a different account",
"callback": "Try signing in with a different account",
"oauthAccountNotLinked": "To confirm your identity, sign in with the same account you used originally",
"emailSignin": "The e-mail could not be sent",
"emailVerify": "Please verify your email, a new email has been sent",
"credentialsSignin": "Sign in failed. Check the details you provided are correct",
"sessionRequired": "Please sign in to access this page"
}
},
"provider": {
"continue": "Continue with {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Type your message here...",
"actions": {
"send": "Send message",
"stop": "Stop Task",
"attachFiles": "Attach files"
}
},
"favorites": {
"use": "Use a favorite message",
"headline": "Favorite Messages",
"remove": "Remove favorite",
"empty": {
"title": "No Saved Prompts Yet",
"description": "Start by sending a prompt and star it or star a prompt from previous chats"
}
},
"commands": {
"button": "Tools",
"changeTool": "Change Tool",
"availableTools": "Available Tools"
},
"speech": {
"start": "Start recording",
"stop": "Stop recording",
"connecting": "Connecting"
},
"fileUpload": {
"dragDrop": "Drag and drop files here",
"browse": "Browse Files",
"sizeLimit": "Limit:",
"errors": {
"failed": "Failed to upload",
"cancelled": "Cancelled upload of"
},
"actions": {
"cancelUpload": "Cancel upload",
"removeAttachment": "Remove attachment"
}
},
"messages": {
"status": {
"using": "Using",
"used": "Used"
},
"actions": {
"copy": {
"button": "Copy to clipboard",
"success": "Copied!"
}
},
"feedback": {
"positive": "Helpful",
"negative": "Not helpful",
"edit": "Edit feedback",
"dialog": {
"title": "Add a comment",
"submit": "Submit feedback",
"yourFeedback": "Your feedback..."
},
"status": {
"updating": "Updating",
"updated": "Feedback updated"
}
}
},
"history": {
"title": "Last Inputs",
"empty": "Such empty...",
"show": "Show history"
},
"settings": {
"title": "Settings panel",
"customize": "Customize your chat settings here"
},
"watermark": "LLMs can make mistakes. Check important info."
},
"threadHistory": {
"sidebar": {
"title": "Past Chats",
"filters": {
"search": "Search",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "Today",
"yesterday": "Yesterday",
"previous7days": "Previous 7 days",
"previous30days": "Previous 30 days"
},
"empty": "No threads found",
"actions": {
"close": "Close sidebar",
"open": "Open sidebar"
}
},
"thread": {
"untitled": "Untitled Conversation",
"menu": {
"rename": "Rename",
"share": "Share",
"delete": "Delete"
},
"actions": {
"share": {
"title": "Share link to chat",
"button": "Share",
"status": {
"copied": "Link copied",
"created": "Share link created!",
"unshared": "Sharing disabled for this thread"
},
"error": {
"create": "Failed to create share link",
"unshare": "Failed to unshare thread"
}
},
"delete": {
"title": "Confirm deletion",
"description": "This will delete the thread as well as its messages and elements. This action cannot be undone",
"success": "Chat deleted",
"inProgress": "Deleting chat"
},
"rename": {
"title": "Rename Thread",
"description": "Enter a new name for this thread",
"form": {
"name": {
"label": "Name",
"placeholder": "Enter new name"
}
},
"success": "Thread renamed!",
"inProgress": "Renaming thread"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "Readme",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "New Chat",
"dialog": {
"title": "Create New Chat",
"description": "This will clear your current chat history. Are you sure you want to continue?",
"tooltip": "New Chat"
}
},
"user": {
"menu": {
"settings": "Settings",
"settingsKey": "S",
"apiKeys": "API Keys",
"logout": "Logout"
}
}
},
"apiKeys": {
"title": "Required API Keys",
"description": "To use this app, the following API keys are required. The keys are stored on your device's local storage.",
"success": {
"saved": "Saved successfully"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "Select..."
},
"DatePickerInput": {
"placeholder": {
"single": "Pick a date",
"range": "Pick a date range"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "Cancelar",
"confirm": "Confirmar",
"continue": "Continuar",
"goBack": "Volver",
"reset": "Restablecer",
"submit": "Enviar"
},
"status": {
"loading": "Cargando...",
"error": {
"default": "Ocurri\u00f3 un error",
"serverConnection": "No se pudo conectar con el servidor"
}
}
},
"auth": {
"login": {
"title": "Inicia sesi\u00f3n para acceder a la aplicaci\u00f3n",
"form": {
"email": {
"label": "Correo electr\u00f3nico",
"required": "el correo electr\u00f3nico es obligatorio",
"placeholder": "me@example.com"
},
"password": {
"label": "Contrase\u00f1a",
"required": "la contrase\u00f1a es obligatoria"
},
"actions": {
"signin": "Iniciar sesi\u00f3n"
},
"alternativeText": {
"or": "O"
}
},
"errors": {
"default": "No se pudo iniciar sesi\u00f3n",
"signin": "Intenta iniciar sesi\u00f3n con otra cuenta",
"oauthSignin": "Intenta iniciar sesi\u00f3n con otra cuenta",
"redirectUriMismatch": "El URI de redirecci\u00f3n no coincide con la configuraci\u00f3n de la aplicaci\u00f3n OAuth",
"oauthCallback": "Intenta iniciar sesi\u00f3n con otra cuenta",
"oauthCreateAccount": "Intenta iniciar sesi\u00f3n con otra cuenta",
"emailCreateAccount": "Intenta iniciar sesi\u00f3n con otra cuenta",
"callback": "Intenta iniciar sesi\u00f3n con otra cuenta",
"oauthAccountNotLinked": "Para confirmar tu identidad, inicia sesi\u00f3n con la misma cuenta que usaste originalmente",
"emailSignin": "No se pudo enviar el correo electr\u00f3nico",
"emailVerify": "Por favor verifica tu correo, se ha enviado un nuevo correo",
"credentialsSignin": "Error al iniciar sesi\u00f3n. Verifica que los datos proporcionados sean correctos",
"sessionRequired": "Por favor inicia sesi\u00f3n para acceder a esta p\u00e1gina"
}
},
"provider": {
"continue": "Continuar con {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Escribe tu mensaje aqu\u00ed...",
"actions": {
"send": "Enviar mensaje",
"stop": "Detener tarea",
"attachFiles": "Adjuntar archivos"
}
},
"favorites": {
"use": "Usar un mensaje favorito",
"headline": "Mensajes favoritos",
"remove": "Eliminar favorito",
"empty": {
"title": "A\u00fan no hay prompts guardados",
"description": "Comienza enviando un prompt y m\u00e1rcalo con estrella o marca un prompt de chats anteriores"
}
},
"commands": {
"button": "Herramientas",
"changeTool": "Cambiar herramienta",
"availableTools": "Herramientas disponibles"
},
"speech": {
"start": "Comenzar grabaci\u00f3n",
"stop": "Detener grabaci\u00f3n",
"connecting": "Conectando"
},
"fileUpload": {
"dragDrop": "Arrastra y suelta archivos aqu\u00ed",
"browse": "Buscar archivos",
"sizeLimit": "L\u00edmite:",
"errors": {
"failed": "Error al subir",
"cancelled": "Carga cancelada de"
},
"actions": {
"cancelUpload": "Cancelar subida",
"removeAttachment": "Eliminar adjunto"
}
},
"messages": {
"status": {
"using": "Usando",
"used": "Usado"
},
"actions": {
"copy": {
"button": "Copiar al portapapeles",
"success": "\u00a1Copiado!"
}
},
"feedback": {
"positive": "\u00datil",
"negative": "No \u00fatil",
"edit": "Editar comentario",
"dialog": {
"title": "Agregar un comentario",
"submit": "Enviar comentario",
"yourFeedback": "Tu comentario..."
},
"status": {
"updating": "Actualizando",
"updated": "Comentario actualizado"
}
}
},
"history": {
"title": "\u00daltimas entradas",
"empty": "Tan vac\u00edo...",
"show": "Mostrar historial"
},
"settings": {
"title": "Panel de configuraci\u00f3n",
"customize": "Personaliza la configuraci\u00f3n de tu chat aqu\u00ed"
},
"watermark": "Los LLM pueden cometer errores. Verifica la informaci\u00f3n importante."
},
"threadHistory": {
"sidebar": {
"title": "Chats anteriores",
"filters": {
"search": "Buscar",
"placeholder": "Buscar conversaciones..."
},
"timeframes": {
"today": "Hoy",
"yesterday": "Ayer",
"previous7days": "\u00daltimos 7 d\u00edas",
"previous30days": "\u00daltimos 30 d\u00edas"
},
"empty": "No se encontraron conversaciones",
"actions": {
"close": "Cerrar barra lateral",
"open": "Abrir barra lateral"
}
},
"thread": {
"untitled": "Conversaci\u00f3n sin t\u00edtulo",
"menu": {
"rename": "Renombrar",
"share": "Compartir",
"delete": "Eliminar"
},
"actions": {
"share": {
"title": "Compartir enlace del chat",
"button": "Compartir",
"status": {
"copied": "Enlace copiado",
"created": "\u00a1Enlace de uso compartido creado!",
"unshared": "Uso compartido deshabilitado para este hilo"
},
"error": {
"create": "Error al crear el enlace de uso compartido",
"unshare": "Error al dejar de compartir el hilo"
}
},
"delete": {
"title": "Confirmar eliminaci\u00f3n",
"description": "Esto eliminar\u00e1 la conversaci\u00f3n, sus mensajes y elementos. Esta acci\u00f3n no se puede deshacer",
"success": "Chat eliminado",
"inProgress": "Eliminando chat"
},
"rename": {
"title": "Renombrar conversaci\u00f3n",
"description": "Ingresa un nuevo nombre para esta conversaci\u00f3n",
"form": {
"name": {
"label": "Nombre",
"placeholder": "Ingresa nuevo nombre"
}
},
"success": "\u00a1Conversaci\u00f3n renombrada!",
"inProgress": "Renombrando conversaci\u00f3n"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "L\u00e9eme",
"theme": {
"light": "Tema claro",
"dark": "Tema oscuro",
"system": "Seguir sistema"
}
},
"newChat": {
"button": "Nuevo chat",
"dialog": {
"title": "Crear nuevo chat",
"description": "Esto borrar\u00e1 tu historial de chat actual. \u00bfSeguro que quieres continuar?",
"tooltip": "Nuevo chat"
}
},
"user": {
"menu": {
"settings": "Configuraci\u00f3n",
"settingsKey": "S",
"apiKeys": "Claves API",
"logout": "Cerrar sesi\u00f3n"
}
}
},
"apiKeys": {
"title": "Claves API requeridas",
"description": "Para usar esta aplicaci\u00f3n, se requieren las siguientes claves API. Las claves se almacenan en el almacenamiento local de tu dispositivo.",
"success": {
"saved": "Guardado exitosamente"
}
},
"alerts": {
"info": "Informaci\u00f3n",
"note": "Nota",
"tip": "Consejo",
"important": "Importante",
"warning": "Advertencia",
"caution": "Precauci\u00f3n",
"debug": "Depuraci\u00f3n",
"example": "Ejemplo",
"success": "\u00c9xito",
"help": "Ayuda",
"idea": "Idea",
"pending": "Pendiente",
"security": "Seguridad",
"beta": "Beta",
"best-practice": "Mejor pr\u00e1ctica"
},
"components": {
"MultiSelectInput": {
"placeholder": "Seleccionar..."
},
"DatePickerInput": {
"placeholder": {
"single": "Elige una fecha",
"range": "Elige un rango de fechas"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "Annuler",
"confirm": "Confirmer",
"continue": "Continuer",
"goBack": "Retour",
"reset": "R\u00e9initialiser",
"submit": "Envoyer"
},
"status": {
"loading": "Chargement...",
"error": {
"default": "Une erreur est survenue",
"serverConnection": "Impossible de joindre le serveur"
}
}
},
"auth": {
"login": {
"title": "Connectez-vous pour acc\u00e9der \u00e0 l'application",
"form": {
"email": {
"label": "Adresse e-mail",
"required": "l'e-mail est un champ obligatoire",
"placeholder": "me@example.com"
},
"password": {
"label": "Mot de passe",
"required": "le mot de passe est un champ obligatoire"
},
"actions": {
"signin": "Se connecter"
},
"alternativeText": {
"or": "OU"
}
},
"errors": {
"default": "Impossible de se connecter",
"signin": "Essayez de vous connecter avec un autre compte",
"oauthSignin": "Essayez de vous connecter avec un autre compte",
"redirectUriMismatch": "L'URI de redirection ne correspond pas \u00e0 la configuration de l'application oauth",
"oauthCallback": "Essayez de vous connecter avec un autre compte",
"oauthCreateAccount": "Essayez de vous connecter avec un autre compte",
"emailCreateAccount": "Essayez de vous connecter avec un autre compte",
"callback": "Essayez de vous connecter avec un autre compte",
"oauthAccountNotLinked": "Pour confirmer votre identit\u00e9, connectez-vous avec le m\u00eame compte que vous avez utilis\u00e9 \u00e0 l'origine",
"emailSignin": "L'e-mail n'a pas pu \u00eatre envoy\u00e9",
"emailVerify": "Veuillez v\u00e9rifier votre e-mail, un nouvel e-mail a \u00e9t\u00e9 envoy\u00e9",
"credentialsSignin": "La connexion a \u00e9chou\u00e9. V\u00e9rifiez que les informations que vous avez fournies sont correctes",
"sessionRequired": "Veuillez vous connecter pour acc\u00e9der \u00e0 cette page"
}
},
"provider": {
"continue": "Continuer avec {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Tapez votre message ici...",
"actions": {
"send": "Envoyer le message",
"stop": "Arr\u00eater la t\u00e2che",
"attachFiles": "Joindre des fichiers"
}
},
"favorites": {
"use": "Utiliser un message favori",
"headline": "Messages favoris",
"remove": "Supprimer des favoris",
"empty": {
"title": "Aucun prompt enregistr\u00e9 pour le moment",
"description": "Commencez par envoyer un prompt et ajoutez-le aux favoris ou ajoutez un prompt de discussions pr\u00e9c\u00e9dentes aux favoris"
}
},
"commands": {
"button": "Outils",
"changeTool": "Changer d'outil",
"availableTools": "Outils disponibles"
},
"speech": {
"start": "D\u00e9marrer l'enregistrement",
"stop": "Arr\u00eater l'enregistrement",
"connecting": "Connexion en cours"
},
"fileUpload": {
"dragDrop": "Glissez et d\u00e9posez des fichiers ici",
"browse": "Parcourir les fichiers",
"sizeLimit": "Limite :",
"errors": {
"failed": "\u00c9chec du t\u00e9l\u00e9versement",
"cancelled": "T\u00e9l\u00e9versement annul\u00e9 de"
},
"actions": {
"cancelUpload": "Annuler le t\u00e9l\u00e9versement",
"removeAttachment": "Supprimer la pi\u00e8ce jointe"
}
},
"messages": {
"status": {
"using": "Utilise",
"used": "Utilis\u00e9"
},
"actions": {
"copy": {
"button": "Copier dans le presse-papiers",
"success": "Copi\u00e9 !"
}
},
"feedback": {
"positive": "Utile",
"negative": "Pas utile",
"edit": "Modifier le commentaire",
"dialog": {
"title": "Ajouter un commentaire",
"submit": "Envoyer le commentaire",
"yourFeedback": "Votre avis..."
},
"status": {
"updating": "Mise \u00e0 jour",
"updated": "Commentaire mis \u00e0 jour"
}
}
},
"history": {
"title": "Derni\u00e8res entr\u00e9es",
"empty": "Tellement vide...",
"show": "Afficher l'historique"
},
"settings": {
"title": "Panneau des param\u00e8tres",
"customize": "Personnalisez vos param\u00e8tres de chat ici"
},
"watermark": "Les LLMs peuvent se tromper. V\u00e9rifiez les r\u00e9ponses."
},
"threadHistory": {
"sidebar": {
"title": "Discussions pass\u00e9es",
"filters": {
"search": "Rechercher",
"placeholder": "Rechercher des conversations..."
},
"timeframes": {
"today": "Aujourd'hui",
"yesterday": "Hier",
"previous7days": "Les 7 derniers jours",
"previous30days": "Les 30 derniers jours"
},
"empty": "Aucun fil de discussion trouv\u00e9",
"actions": {
"close": "Fermer la barre lat\u00e9rale",
"open": "Ouvrir la barre lat\u00e9rale"
}
},
"thread": {
"untitled": "Conversation sans titre",
"menu": {
"rename": "Renommer",
"share": "Partager",
"delete": "Supprimer"
},
"actions": {
"share": {
"title": "Partager le lien de la discussion",
"button": "Partager",
"status": {
"copied": "Lien copi\u00e9",
"created": "Lien de partage cr\u00e9\u00e9 !",
"unshared": "Partage d\u00e9sactiv\u00e9 pour ce fil"
},
"error": {
"create": "\u00c9chec de la cr\u00e9ation du lien de partage",
"unshare": "\u00c9chec de la d\u00e9sactivation du partage du fil"
}
},
"delete": {
"title": "Confirmer la suppression",
"description": "Cela supprimera le fil de discussion ainsi que ses messages et \u00e9l\u00e9ments. Cette action ne peut pas \u00eatre annul\u00e9e",
"success": "Discussion supprim\u00e9e",
"inProgress": "Suppression de la discussion"
},
"rename": {
"title": "Renommer le fil de discussion",
"description": "Entrez un nouveau nom pour ce fil de discussion",
"form": {
"name": {
"label": "Nom",
"placeholder": "Entrez le nouveau nom"
}
},
"success": "Fil de discussion renomm\u00e9 !",
"inProgress": "Renommage du fil de discussion"
}
}
}
},
"navigation": {
"header": {
"chat": "Discussion",
"readme": "Lisez-moi",
"theme": {
"light": "Th\u00e8me clair",
"dark": "Th\u00e8me sombre",
"system": "Suivre le syst\u00e8me"
}
},
"newChat": {
"button": "Nouvelle discussion",
"dialog": {
"title": "Cr\u00e9er une nouvelle discussion",
"description": "Cela effacera votre historique de discussion actuel. \u00cates-vous s\u00fbr de vouloir continuer ?",
"tooltip": "Nouvelle discussion"
}
},
"user": {
"menu": {
"settings": "Param\u00e8tres",
"settingsKey": "S",
"apiKeys": "Cl\u00e9s API",
"logout": "Se d\u00e9connecter"
}
}
},
"apiKeys": {
"title": "Cl\u00e9s API requises",
"description": "Pour utiliser cette application, les cl\u00e9s API suivantes sont requises. Les cl\u00e9s sont stock\u00e9es dans le stockage local de votre appareil.",
"success": {
"saved": "Enregistr\u00e9 avec succ\u00e8s"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Astuce",
"important": "Important",
"warning": "Avertissement",
"caution": "Attention",
"debug": "D\u00e9bogage",
"example": "Exemple",
"success": "Succ\u00e8s",
"help": "Aide",
"idea": "Id\u00e9e",
"pending": "En attente",
"security": "S\u00e9curit\u00e9",
"beta": "B\u00eata",
"best-practice": "Meilleure pratique"
},
"components": {
"MultiSelectInput": {
"placeholder": "S\u00e9lectionner..."
},
"DatePickerInput": {
"placeholder": {
"single": "Choisir une date",
"range": "Choisir une plage de dates"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0ab0\u0aa6 \u0a95\u0ab0\u0acb",
"confirm": "\u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb",
"continue": "\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb",
"goBack": "\u0aaa\u0abe\u0a9b\u0abe \u0a9c\u0abe\u0a93",
"reset": "\u0ab0\u0ac0\u0ab8\u0ac7\u0a9f \u0a95\u0ab0\u0acb",
"submit": "\u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb"
},
"status": {
"loading": "\u0ab2\u0acb\u0aa1 \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7...",
"error": {
"default": "\u0a8f\u0a95 \u0aad\u0ac2\u0ab2 \u0aa5\u0a88",
"serverConnection": "\u0ab8\u0ab0\u0acd\u0ab5\u0ab0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0aaa\u0ab9\u0acb\u0a82\u0a9a\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0"
}
}
},
"auth": {
"login": {
"title": "\u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0ab2\u0ac9\u0a97\u0abf\u0aa8 \u0a95\u0ab0\u0acb",
"form": {
"email": {
"label": "\u0a88\u0aae\u0ac7\u0ab2 \u0a8f\u0aa1\u0acd\u0ab0\u0ac7\u0ab8",
"required": "\u0a88\u0aae\u0ac7\u0ab2 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1",
"required": "\u0aaa\u0abe\u0ab8\u0ab5\u0ab0\u0acd\u0aa1 \u0a86\u0ab5\u0ab6\u0acd\u0aaf\u0a95 \u0a9b\u0ac7"
},
"actions": {
"signin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb"
},
"alternativeText": {
"or": "\u0a85\u0aa5\u0ab5\u0abe"
}
},
"errors": {
"default": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0ac1\u0a82 \u0aa8\u0aa5\u0ac0",
"signin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"oauthSignin": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"redirectUriMismatch": "\u0ab0\u0ac0\u0aa1\u0abe\u0aaf\u0ab0\u0ac7\u0a95\u0acd\u0a9f URI oauth \u0a8d\u0aaa \u0a95\u0aa8\u0acd\u0aab\u0abf\u0a97\u0ab0\u0ac7\u0ab6\u0aa8 \u0ab8\u0abe\u0aa5\u0ac7 \u0aae\u0ac7\u0ab3 \u0a96\u0abe\u0aa4\u0acb \u0aa8\u0aa5\u0ac0",
"oauthCallback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"oauthCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"emailCreateAccount": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"callback": "\u0a85\u0ab2\u0a97 \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0ab5\u0abe\u0aa8\u0acb \u0aaa\u0acd\u0ab0\u0aaf\u0abe\u0ab8 \u0a95\u0ab0\u0acb",
"oauthAccountNotLinked": "\u0aa4\u0aae\u0abe\u0ab0\u0ac0 \u0a93\u0ab3\u0a96\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aae\u0ac2\u0ab3 \u0ab0\u0ac2\u0aaa\u0ac7 \u0ab5\u0abe\u0aaa\u0ab0\u0ac7\u0ab2\u0abe \u0a8f\u0a95\u0abe\u0a89\u0aa8\u0acd\u0a9f\u0aa5\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb",
"emailSignin": "\u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ac0 \u0ab6\u0a95\u0abe\u0aaf\u0acb \u0aa8\u0aa5\u0ac0",
"emailVerify": "\u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0a9a\u0a95\u0abe\u0ab8\u0acb, \u0aa8\u0ab5\u0acb \u0a88\u0aae\u0ac7\u0ab2 \u0aae\u0acb\u0a95\u0ab2\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0a86\u0ab5\u0acd\u0aaf\u0acb \u0a9b\u0ac7",
"credentialsSignin": "\u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3. \u0a86\u0aaa\u0ac7\u0ab2\u0ac0 \u0ab5\u0abf\u0a97\u0aa4\u0acb \u0ab8\u0abe\u0a9a\u0ac0 \u0a9b\u0ac7 \u0a95\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82 \u0aa4\u0ac7 \u0a9a\u0a95\u0abe\u0ab8\u0acb",
"sessionRequired": "\u0a86 \u0aaa\u0ac7\u0a9c\u0aa8\u0ac7 \u0a8d\u0a95\u0acd\u0ab8\u0ac7\u0ab8 \u0a95\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7 \u0a95\u0ac3\u0aaa\u0abe \u0a95\u0ab0\u0ac0 \u0ab8\u0abe\u0a87\u0aa8 \u0a87\u0aa8 \u0a95\u0ab0\u0acb"
}
},
"provider": {
"continue": "{{provider}} \u0ab8\u0abe\u0aa5\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb"
}
},
"chat": {
"input": {
"placeholder": "\u0a85\u0ab9\u0ac0\u0a82 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0ab2\u0a96\u0acb...",
"actions": {
"send": "\u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aae\u0acb\u0a95\u0ab2\u0acb",
"stop": "\u0a95\u0abe\u0ab0\u0acd\u0aaf \u0ab0\u0acb\u0a95\u0acb",
"attachFiles": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a9c\u0acb\u0aa1\u0acb"
}
},
"speech": {
"start": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0ab6\u0ab0\u0ac2 \u0a95\u0ab0\u0acb",
"stop": "\u0ab0\u0ac7\u0a95\u0acb\u0ab0\u0acd\u0aa1\u0abf\u0a82\u0a97 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
"connecting": "\u0a95\u0aa8\u0ac7\u0a95\u0acd\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7"
},
"favorites": {
"use": "\u0aae\u0aa8\u0aaa\u0ab8\u0a82\u0aa6 \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0aa8\u0acb \u0a89\u0aaa\u0aaf\u0acb\u0a97 \u0a95\u0ab0\u0acb",
"headline": "\u0aae\u0aa8\u0aaa\u0ab8\u0a82\u0aa6 \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93",
"remove": "\u0aae\u0aa8\u0aaa\u0ab8\u0a82\u0aa6 \u0ab8\u0a82\u0aa6\u0ac7\u0ab6 \u0aa6\u0ac2\u0ab0 \u0a95\u0ab0\u0acb",
"empty": {
"title": "\u0ab9\u0a9c\u0ac0 \u0ab8\u0ac1\u0aa7\u0ac0 \u0a95\u0acb\u0a88 \u0aaa\u0acd\u0ab0\u0acb\u0aae\u0acd\u0aaa\u0acd\u0a9f \u0ab8\u0abe\u0a9a\u0ab5\u0ac7\u0ab2 \u0aa8\u0aa5\u0ac0",
"description": "\u0a8f\u0a95 \u0aaa\u0acd\u0ab0\u0acb\u0aae\u0acd\u0aaa\u0acd\u0a9f \u0aae\u0acb\u0a95\u0ab2\u0ac0\u0aa8\u0ac7 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0ac7 \u0ab8\u0acd\u0a9f\u0abe\u0ab0 \u0a95\u0ab0\u0ac0\u0aa8\u0ac7 \u0ab6\u0ab0\u0ac2\u0a86\u0aa4 \u0a95\u0ab0\u0acb \u0a85\u0aa5\u0ab5\u0abe \u0a85\u0a97\u0abe\u0a89\u0aa8\u0ac0 \u0a9a\u0ac7\u0a9f\u0aae\u0abe\u0a82\u0aa5\u0ac0 \u0a95\u0acb\u0a88 \u0aaa\u0acd\u0ab0\u0acb\u0aae\u0acd\u0aaa\u0acd\u0a9f\u0aa8\u0ac7 \u0ab8\u0acd\u0a9f\u0abe\u0ab0 \u0a95\u0ab0\u0acb"
}
},
"commands": {
"button": "\u0a9f\u0ac2\u0ab2\u0acd\u0ab8",
"changeTool": "\u0a9f\u0ac2\u0ab2 \u0aac\u0aa6\u0ab2\u0acb",
"availableTools": "\u0a89\u0aaa\u0ab2\u0aac\u0acd\u0aa7 \u0a9f\u0ac2\u0ab2\u0acd\u0ab8"
},
"fileUpload": {
"dragDrop": "\u0a85\u0ab9\u0ac0\u0a82 \u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0a96\u0ac7\u0a82\u0a9a\u0acb \u0a85\u0aa8\u0ac7 \u0a9b\u0acb\u0aa1\u0acb",
"browse": "\u0aab\u0abe\u0a87\u0ab2\u0acd\u0ab8 \u0aac\u0acd\u0ab0\u0abe\u0a89\u0a9d \u0a95\u0ab0\u0acb",
"sizeLimit": "\u0aae\u0ab0\u0acd\u0aaf\u0abe\u0aa6\u0abe:",
"errors": {
"failed": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
"cancelled": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acd\u0aaf\u0ac1\u0a82"
},
"actions": {
"cancelUpload": "\u0a85\u0aaa\u0ab2\u0acb\u0aa1 \u0ab0\u0aa6 \u0a95\u0ab0\u0acb",
"removeAttachment": "\u0a9c\u0acb\u0aa1\u0abe\u0aa3 \u0aa6\u0ac2\u0ab0 \u0a95\u0ab0\u0acb"
}
},
"messages": {
"status": {
"using": "\u0ab5\u0abe\u0aaa\u0ab0\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac7",
"used": "\u0ab5\u0aaa\u0ab0\u0abe\u0aaf\u0ac7\u0ab2"
},
"actions": {
"copy": {
"button": "\u0a95\u0acd\u0ab2\u0abf\u0aaa\u0aac\u0acb\u0ab0\u0acd\u0aa1 \u0aaa\u0ab0 \u0a95\u0ac9\u0aaa\u0abf \u0a95\u0ab0\u0acb",
"success": "\u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0aaf\u0ac1\u0a82!"
}
},
"feedback": {
"positive": "\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
"negative": "\u0aac\u0abf\u0aa8\u0a89\u0aaa\u0aaf\u0acb\u0a97\u0ac0",
"edit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0a82\u0aaa\u0abe\u0aa6\u0abf\u0aa4 \u0a95\u0ab0\u0acb",
"dialog": {
"title": "\u0a9f\u0abf\u0aaa\u0acd\u0aaa\u0aa3\u0ac0 \u0a89\u0aae\u0ac7\u0ab0\u0acb",
"submit": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0ab8\u0aac\u0aae\u0abf\u0a9f \u0a95\u0ab0\u0acb",
"yourFeedback": "\u0aa4\u0aae\u0abe\u0ab0\u0acb \u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6..."
},
"status": {
"updating": "\u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0a88 \u0ab0\u0ab9\u0acd\u0aaf\u0ac1\u0a82 \u0a9b\u0ac7",
"updated": "\u0aaa\u0acd\u0ab0\u0aa4\u0abf\u0ab8\u0abe\u0aa6 \u0a85\u0aaa\u0aa1\u0ac7\u0a9f \u0aa5\u0aaf\u0acb"
}
}
},
"history": {
"title": "\u0a9b\u0ac7\u0ab2\u0acd\u0ab2\u0abe \u0a87\u0aa8\u0aaa\u0ac1\u0a9f\u0acd\u0ab8",
"empty": "\u0a96\u0abe\u0ab2\u0ac0 \u0a9b\u0ac7...",
"show": "\u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0aac\u0aa4\u0abe\u0ab5\u0acb"
},
"settings": {
"title": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0aaa\u0ac7\u0aa8\u0ab2",
"customize": "\u0aa4\u0aae\u0abe\u0ab0\u0abe \u0a9a\u0ac7\u0a9f \u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8 \u0a85\u0ab9\u0ac0\u0a82 \u0a95\u0ab8\u0acd\u0a9f\u0aae\u0abe\u0a87\u0a9d \u0a95\u0ab0\u0acb"
},
"watermark": "LLM \u0aad\u0ac2\u0ab2\u0acb \u0a95\u0ab0\u0ac0 \u0ab6\u0a95\u0ac7 \u0a9b\u0ac7. \u0aae\u0ab9\u0aa4\u0acd\u0ab5\u0aaa\u0ac2\u0ab0\u0acd\u0aa3 \u0aae\u0abe\u0ab9\u0abf\u0aa4\u0ac0 \u0aa4\u0aaa\u0abe\u0ab8\u0ab5\u0abe\u0aa8\u0ac1\u0a82 \u0ab5\u0abf\u0a9a\u0abe\u0ab0\u0acb."
},
"threadHistory": {
"sidebar": {
"title": "\u0aaa\u0abe\u0a9b\u0ab2\u0ac0 \u0a9a\u0ac7\u0a9f\u0acd\u0ab8",
"filters": {
"search": "\u0ab6\u0acb\u0aa7\u0acb",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0a86\u0a9c\u0ac7",
"yesterday": "\u0a97\u0a88\u0a95\u0abe\u0ab2\u0ac7",
"previous7days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 7 \u0aa6\u0abf\u0ab5\u0ab8",
"previous30days": "\u0aaa\u0abe\u0a9b\u0ab2\u0abe 30 \u0aa6\u0abf\u0ab5\u0ab8"
},
"empty": "\u0a95\u0acb\u0a88 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0acd\u0ab8 \u0aae\u0ab3\u0acd\u0aaf\u0abe \u0aa8\u0aa5\u0ac0",
"actions": {
"close": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0aac\u0a82\u0aa7 \u0a95\u0ab0\u0acb",
"open": "\u0ab8\u0abe\u0a87\u0aa1\u0aac\u0abe\u0ab0 \u0a96\u0acb\u0ab2\u0acb"
}
},
"thread": {
"untitled": "\u0ab6\u0ac0\u0ab0\u0acd\u0ab7\u0a95 \u0ab5\u0a97\u0ab0\u0aa8\u0ac0 \u0ab5\u0abe\u0aa4\u0a9a\u0ac0\u0aa4",
"menu": {
"rename": "\u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb",
"share": "\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
"delete": "Delete"
},
"actions": {
"share": {
"title": "\u0a9a\u0ac7\u0a9f\u0aa8\u0ac0 \u0ab2\u0abf\u0a82\u0a95 \u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
"button": "\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0acb",
"status": {
"copied": "\u0ab2\u0abf\u0a82\u0a95 \u0a95\u0ac9\u0aaa\u0abf \u0aa5\u0a88",
"created": "\u0ab6\u0ac7\u0ab0 \u0ab2\u0abf\u0a82\u0a95 \u0aac\u0aa8\u0abe\u0ab5\u0abe\u0a88!",
"unshared": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0ab6\u0ac7\u0ab0\u0abf\u0a82\u0a97 \u0aa8\u0abf\u0ab7\u0acd\u0a95\u0acd\u0ab0\u0abf\u0aaf \u0a9b\u0ac7"
},
"error": {
"create": "\u0ab6\u0ac7\u0ab0 \u0ab2\u0abf\u0a82\u0a95 \u0aac\u0aa8\u0abe\u0ab5\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3",
"unshare": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ab6\u0ac7\u0ab0 \u0a95\u0ab0\u0ab5\u0abe\u0aae\u0abe\u0a82 \u0aa8\u0abf\u0ab7\u0acd\u0aab\u0ab3"
}
},
"delete": {
"title": "\u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab5\u0abe\u0aa8\u0ac0 \u0aaa\u0ac1\u0ab7\u0acd\u0a9f\u0abf \u0a95\u0ab0\u0acb",
"description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0a85\u0aa8\u0ac7 \u0aa4\u0ac7\u0aa8\u0abe \u0ab8\u0a82\u0aa6\u0ac7\u0ab6\u0abe\u0a93 \u0a85\u0aa8\u0ac7 \u0aa4\u0aa4\u0acd\u0ab5\u0acb\u0aa8\u0ac7 \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ab6\u0ac7. \u0a86 \u0a95\u0acd\u0ab0\u0abf\u0aaf\u0abe \u0aaa\u0abe\u0a9b\u0ac0 \u0aab\u0ac7\u0ab0\u0ab5\u0ac0 \u0ab6\u0a95\u0abe\u0ab6\u0ac7 \u0aa8\u0ab9\u0ac0\u0a82",
"success": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0",
"inProgress": "\u0a9a\u0ac7\u0a9f \u0a95\u0abe\u0aa2\u0ac0 \u0aa8\u0abe\u0a96\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
},
"rename": {
"title": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0acb",
"description": "\u0a86 \u0aa5\u0acd\u0ab0\u0ac7\u0aa1 \u0aae\u0abe\u0a9f\u0ac7 \u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb",
"form": {
"name": {
"label": "\u0aa8\u0abe\u0aae",
"placeholder": "\u0aa8\u0ab5\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aa6\u0abe\u0a96\u0ab2 \u0a95\u0ab0\u0acb"
}
},
"success": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0abe\u0aaf\u0ac1\u0a82!",
"inProgress": "\u0aa5\u0acd\u0ab0\u0ac7\u0aa1\u0aa8\u0ac1\u0a82 \u0aa8\u0abe\u0aae \u0aac\u0aa6\u0ab2\u0ac0 \u0ab0\u0ab9\u0acd\u0aaf\u0abe \u0a9b\u0ac0\u0a8f"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0a9a\u0ac7\u0a9f",
"readme": "\u0ab5\u0abe\u0a82\u0a9a\u0acb",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f",
"dialog": {
"title": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f \u0aac\u0aa8\u0abe\u0ab5\u0acb",
"description": "\u0a86 \u0aa4\u0aae\u0abe\u0ab0\u0acb \u0ab5\u0ab0\u0acd\u0aa4\u0aae\u0abe\u0aa8 \u0a9a\u0ac7\u0a9f \u0a87\u0aa4\u0abf\u0ab9\u0abe\u0ab8 \u0ab8\u0abe\u0aab \u0a95\u0ab0\u0ab6\u0ac7. \u0ab6\u0ac1\u0a82 \u0aa4\u0aae\u0ac7 \u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0ab5\u0abe \u0aae\u0abe\u0a82\u0a97\u0acb \u0a9b\u0acb?",
"tooltip": "\u0aa8\u0ab5\u0ac0 \u0a9a\u0ac7\u0a9f"
}
},
"user": {
"menu": {
"settings": "\u0ab8\u0ac7\u0a9f\u0abf\u0a82\u0a97\u0acd\u0ab8",
"settingsKey": "S",
"apiKeys": "API \u0a95\u0ac0",
"logout": "\u0ab2\u0ac9\u0a97\u0a86\u0a89\u0a9f"
}
}
},
"apiKeys": {
"title": "\u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 API \u0a95\u0ac0",
"description": "\u0a86 \u0a8f\u0aaa\u0acd\u0ab2\u0abf\u0a95\u0ac7\u0ab6\u0aa8 \u0ab5\u0abe\u0aaa\u0ab0\u0ab5\u0abe \u0aae\u0abe\u0a9f\u0ac7, \u0aa8\u0ac0\u0a9a\u0ac7\u0aa8\u0ac0 API \u0a95\u0ac0 \u0a9c\u0ab0\u0ac2\u0ab0\u0ac0 \u0a9b\u0ac7. \u0a95\u0ac0 \u0aa4\u0aae\u0abe\u0ab0\u0abe \u0aa1\u0abf\u0ab5\u0abe\u0a87\u0ab8\u0aa8\u0abe \u0ab2\u0acb\u0a95\u0ab2 \u0ab8\u0acd\u0a9f\u0acb\u0ab0\u0ac7\u0a9c\u0aae\u0abe\u0a82 \u0ab8\u0a82\u0a97\u0acd\u0ab0\u0ab9\u0abf\u0aa4 \u0aa5\u0ab6\u0ac7.",
"success": {
"saved": "\u0ab8\u0aab\u0ab3\u0aa4\u0abe\u0aaa\u0ac2\u0ab0\u0acd\u0ab5\u0a95 \u0ab8\u0abe\u0a9a\u0ab5\u0acd\u0aaf\u0ac1\u0a82"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0aac\u0ac7\u0a82\u0a9a\u0ac0 \u0ab2\u0acb..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0aa4\u0abe\u0ab0\u0ac0\u0a96 \u0aaa\u0ab8\u0a82\u0aa6 \u0a95\u0ab0\u0acb",
"range": "\u0aa4\u0abe\u0ab0\u0ac0\u0a96\u0aa8\u0ac0 \u0ab6\u0acd\u0ab0\u0ac7\u0aa3\u0ac0 \u0aaa\u0ab8\u0a82\u0aa6 \u0a95\u0ab0\u0acb"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u05d1\u05d9\u05d8\u05d5\u05dc",
"confirm": "\u05d0\u05d9\u05e9\u05d5\u05e8",
"continue": "\u05d4\u05de\u05e9\u05da",
"goBack": "\u05d7\u05d6\u05d5\u05e8",
"reset": "\u05d0\u05d9\u05e4\u05d5\u05e1",
"submit": "\u05e9\u05dc\u05d7"
},
"status": {
"loading": "\u05d8\u05d5\u05e2\u05df...",
"error": {
"default": "\u05d0\u05d9\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4",
"serverConnection": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05dc\u05e9\u05e8\u05ea"
}
}
},
"auth": {
"login": {
"title": "\u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4",
"form": {
"email": {
"label": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
"required": "\u05e9\u05d3\u05d4 \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4",
"placeholder": "me@example.com"
},
"password": {
"label": "\u05e1\u05d9\u05e1\u05de\u05d4",
"required": "\u05e9\u05d3\u05d4 \u05d4\u05e1\u05d9\u05e1\u05de\u05d4 \u05d4\u05d5\u05d0 \u05e9\u05d3\u05d4 \u05d7\u05d5\u05d1\u05d4"
},
"actions": {
"signin": "\u05d4\u05ea\u05d7\u05d1\u05e8"
},
"alternativeText": {
"or": "\u05d0\u05d5"
}
},
"errors": {
"default": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8",
"signin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"oauthSignin": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"redirectUriMismatch": "\u05db\u05ea\u05d5\u05d1\u05ea \u05d4\u05d4\u05e4\u05e0\u05d9\u05d4 \u05d0\u05d9\u05e0\u05d4 \u05ea\u05d5\u05d0\u05de\u05ea \u05d0\u05ea \u05ea\u05e6\u05d5\u05e8\u05ea \u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d9\u05ea OAuth",
"oauthCallback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"oauthCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"emailCreateAccount": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"callback": "\u05e0\u05e1\u05d4 \u05dc\u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d7\u05e9\u05d1\u05d5\u05df \u05d0\u05d7\u05e8",
"oauthAccountNotLinked": "\u05db\u05d3\u05d9 \u05dc\u05d0\u05de\u05ea \u05d0\u05ea \u05d6\u05d4\u05d5\u05ea\u05da, \u05d4\u05ea\u05d7\u05d1\u05e8 \u05e2\u05dd \u05d0\u05d5\u05ea\u05d5 \u05d7\u05e9\u05d1\u05d5\u05df \u05d1\u05d5 \u05d4\u05e9\u05ea\u05de\u05e9\u05ea \u05d1\u05de\u05e7\u05d5\u05e8",
"emailSignin": "\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05d4\u05d9\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc",
"emailVerify": "\u05d0\u05e0\u05d0 \u05d0\u05de\u05ea \u05d0\u05ea \u05d4\u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05e9\u05dc\u05da, \u05e0\u05e9\u05dc\u05d7 \u05d0\u05d9\u05de\u05d9\u05d9\u05dc \u05d7\u05d3\u05e9",
"credentialsSignin": "\u05d4\u05d4\u05ea\u05d7\u05d1\u05e8\u05d5\u05ea \u05e0\u05db\u05e9\u05dc\u05d4. \u05d1\u05d3\u05d5\u05e7 \u05e9\u05d4\u05e4\u05e8\u05d8\u05d9\u05dd \u05e9\u05d4\u05d6\u05e0\u05ea \u05e0\u05db\u05d5\u05e0\u05d9\u05dd",
"sessionRequired": "\u05d0\u05e0\u05d0 \u05d4\u05ea\u05d7\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d2\u05e9\u05ea \u05dc\u05d3\u05e3 \u05d6\u05d4"
}
},
"provider": {
"continue": "\u05d4\u05de\u05e9\u05da \u05e2\u05dd {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "\u05d4\u05e7\u05dc\u05d3 \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d4 \u05e9\u05dc\u05da \u05db\u05d0\u05df...",
"actions": {
"send": "\u05e9\u05dc\u05d7 \u05d4\u05d5\u05d3\u05e2\u05d4",
"stop": "\u05e2\u05e6\u05d5\u05e8 \u05de\u05e9\u05d9\u05de\u05d4",
"attachFiles": "\u05e6\u05e8\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd"
}
},
"speech": {
"start": "\u05d4\u05ea\u05d7\u05dc \u05d4\u05e7\u05dc\u05d8\u05d4",
"stop": "\u05e2\u05e6\u05d5\u05e8 \u05d4\u05e7\u05dc\u05d8\u05d4",
"connecting": "\u05de\u05ea\u05d7\u05d1\u05e8"
},
"favorites": {
"use": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d4\u05d5\u05d3\u05e2\u05d4 \u05de\u05d5\u05e2\u05d3\u05e4\u05ea",
"headline": "\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05de\u05d5\u05e2\u05d3\u05e4\u05d5\u05ea",
"remove": "\u05d4\u05e1\u05e8 \u05de\u05d4\u05de\u05d5\u05e2\u05d3\u05e4\u05d9\u05dd",
"empty": {
"title": "\u05e2\u05d3\u05d9\u05d9\u05df \u05d0\u05d9\u05df \u05d4\u05e0\u05d7\u05d9\u05d5\u05ea \u05e9\u05de\u05d5\u05e8\u05d5\u05ea",
"description": "\u05d4\u05ea\u05d7\u05dc \u05d1\u05e9\u05dc\u05d9\u05d7\u05ea \u05d4\u05e0\u05d7\u05d9\u05d4 \u05d5\u05e1\u05de\u05df \u05d0\u05d5\u05ea\u05d4 \u05d1\u05db\u05d5\u05db\u05d1 \u05d0\u05d5 \u05e1\u05de\u05df \u05d4\u05e0\u05d7\u05d9\u05d4 \u05de\u05e9\u05d9\u05d7\u05d5\u05ea \u05e7\u05d5\u05d3\u05de\u05d5\u05ea"
}
},
"commands": {
"button": "\u05db\u05dc\u05d9\u05dd",
"changeTool": "\u05e9\u05e0\u05d4 \u05db\u05dc\u05d9",
"availableTools": "\u05db\u05dc\u05d9\u05dd \u05d6\u05de\u05d9\u05e0\u05d9\u05dd"
},
"fileUpload": {
"dragDrop": "\u05d2\u05e8\u05d5\u05e8 \u05d5\u05e9\u05d7\u05e8\u05e8 \u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d0\u05df",
"browse": "\u05e2\u05d9\u05d9\u05df \u05d1\u05e7\u05d1\u05e6\u05d9\u05dd",
"sizeLimit": "\u05de\u05d2\u05d1\u05dc\u05d4:",
"errors": {
"failed": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4",
"cancelled": "\u05d4\u05e2\u05dc\u05d0\u05d4 \u05d1\u05d5\u05d8\u05dc\u05d4 \u05e9\u05dc"
},
"actions": {
"cancelUpload": "\u05d1\u05d9\u05d8\u05d5\u05dc \u05d4\u05e2\u05dc\u05d0\u05d4",
"removeAttachment": "\u05d4\u05e1\u05e8\u05ea \u05e7\u05d5\u05d1\u05e5 \u05de\u05e6\u05d5\u05e8\u05e3"
}
},
"messages": {
"status": {
"using": "\u05de\u05e9\u05ea\u05de\u05e9 \u05d1",
"used": "\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1"
},
"actions": {
"copy": {
"button": "\u05d4\u05e2\u05ea\u05e7 \u05dc\u05dc\u05d5\u05d7",
"success": "\u05d4\u05d5\u05e2\u05ea\u05e7!"
}
},
"feedback": {
"positive": "\u05de\u05d5\u05e2\u05d9\u05dc",
"negative": "\u05dc\u05d0 \u05de\u05d5\u05e2\u05d9\u05dc",
"edit": "\u05e2\u05e8\u05d5\u05da \u05de\u05e9\u05d5\u05d1",
"dialog": {
"title": "\u05d4\u05d5\u05e1\u05e3 \u05ea\u05d2\u05d5\u05d1\u05d4",
"submit": "\u05e9\u05dc\u05d7 \u05de\u05e9\u05d5\u05d1",
"yourFeedback": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e9\u05dc\u05da..."
},
"status": {
"updating": "\u05de\u05e2\u05d3\u05db\u05df",
"updated": "\u05d4\u05de\u05e9\u05d5\u05d1 \u05e2\u05d5\u05d3\u05db\u05df"
}
}
},
"history": {
"title": "\u05e7\u05dc\u05d8\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
"empty": "\u05db\u05dc \u05db\u05da \u05e8\u05d9\u05e7...",
"show": "\u05d4\u05e6\u05d2 \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d4"
},
"settings": {
"title": "\u05e4\u05d0\u05e0\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
"customize": "\u05d4\u05ea\u05d0\u05dd \u05d0\u05d9\u05e9\u05d9\u05ea \u05d0\u05ea \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05e9\u05dc\u05da \u05db\u05d0\u05df"
},
"watermark": "\u05de\u05d5\u05d3\u05dc\u05d9 \u05e9\u05e4\u05d4 \u05d2\u05d3\u05d5\u05dc\u05d9\u05dd \u05e2\u05dc\u05d5\u05dc\u05d9\u05dd \u05dc\u05e2\u05e9\u05d5\u05ea \u05d8\u05e2\u05d5\u05d9\u05d5\u05ea. \u05db\u05d3\u05d0\u05d9 \u05dc\u05d1\u05d3\u05d5\u05e7 \u05de\u05d9\u05d3\u05e2 \u05d7\u05e9\u05d5\u05d1."
},
"threadHistory": {
"sidebar": {
"title": "\u05e6'\u05d0\u05d8\u05d9\u05dd \u05e7\u05d5\u05d3\u05de\u05d9\u05dd",
"filters": {
"search": "\u05d7\u05d9\u05e4\u05d5\u05e9",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u05d4\u05d9\u05d5\u05dd",
"yesterday": "\u05d0\u05ea\u05de\u05d5\u05dc",
"previous7days": "7 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd",
"previous30days": "30 \u05d9\u05de\u05d9\u05dd \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd"
},
"empty": "\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d5 \u05e9\u05d9\u05d7\u05d5\u05ea",
"actions": {
"close": "\u05e1\u05d2\u05d5\u05e8 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3",
"open": "\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d2\u05dc \u05e6\u05d3"
}
},
"thread": {
"untitled": "\u05e9\u05d9\u05d7\u05d4 \u05dc\u05dc\u05d0 \u05db\u05d5\u05ea\u05e8\u05ea",
"menu": {
"rename": "\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05dd",
"share": "\u05e9\u05d9\u05ea\u05d5\u05e3",
"delete": "Delete"
},
"actions": {
"share": {
"title": "\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e7\u05d9\u05e9\u05d5\u05e8 \u05dc\u05e9\u05d9\u05d7\u05d4",
"button": "\u05e9\u05d9\u05ea\u05d5\u05e3",
"status": {
"copied": "\u05d4\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05d5\u05e2\u05ea\u05e7",
"created": "\u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e0\u05d5\u05e6\u05e8!",
"unshared": "\u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05d1\u05d5\u05d8\u05dc \u05e2\u05d1\u05d5\u05e8 \u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5"
},
"error": {
"create": "\u05d9\u05e6\u05d9\u05e8\u05ea \u05e7\u05d9\u05e9\u05d5\u05e8 \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e0\u05db\u05e9\u05dc\u05d4",
"unshare": "\u05d1\u05d9\u05d8\u05d5\u05dc \u05d4\u05e9\u05d9\u05ea\u05d5\u05e3 \u05e9\u05dc \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e0\u05db\u05e9\u05dc"
}
},
"delete": {
"title": "\u05d0\u05e9\u05e8 \u05de\u05d7\u05d9\u05e7\u05d4",
"description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e9\u05d9\u05d7\u05d4 \u05d5\u05db\u05df \u05d0\u05ea \u05d4\u05d4\u05d5\u05d3\u05e2\u05d5\u05ea \u05d5\u05d4\u05d0\u05dc\u05de\u05e0\u05d8\u05d9\u05dd \u05e9\u05dc\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d1\u05d8\u05dc \u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5",
"success": "\u05d4\u05e6'\u05d0\u05d8 \u05e0\u05de\u05d7\u05e7",
"inProgress": "\u05de\u05d5\u05d7\u05e7 \u05e6'\u05d0\u05d8"
},
"rename": {
"title": "\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4",
"description": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 \u05dc\u05e9\u05d9\u05d7\u05d4 \u05d6\u05d5",
"form": {
"name": {
"label": "\u05e9\u05dd",
"placeholder": "\u05d4\u05d6\u05df \u05e9\u05dd \u05d7\u05d3\u05e9"
}
},
"success": "\u05e9\u05dd \u05d4\u05e9\u05d9\u05d7\u05d4 \u05e9\u05d5\u05e0\u05d4!",
"inProgress": "\u05de\u05e9\u05e0\u05d4 \u05e9\u05dd \u05e9\u05d9\u05d7\u05d4"
}
}
}
},
"navigation": {
"header": {
"chat": "\u05e6'\u05d0\u05d8",
"readme": "\u05e7\u05e8\u05d0 \u05d0\u05d5\u05ea\u05d9",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
"dialog": {
"title": "\u05e6\u05d5\u05e8 \u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9",
"description": "\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d6\u05d5 \u05ea\u05e0\u05e7\u05d4 \u05d0\u05ea \u05d4\u05d9\u05e1\u05d8\u05d5\u05e8\u05d9\u05d9\u05ea \u05d4\u05e6'\u05d0\u05d8 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05e9\u05dc\u05da. \u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da?",
"tooltip": "\u05e6'\u05d0\u05d8 \u05d7\u05d3\u05e9"
}
},
"user": {
"menu": {
"settings": "\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea",
"settingsKey": "\u05d4",
"apiKeys": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API",
"logout": "\u05d4\u05ea\u05e0\u05ea\u05e7"
}
}
},
"apiKeys": {
"title": "\u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd",
"description": "\u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d0\u05e4\u05dc\u05d9\u05e7\u05e6\u05d9\u05d4 \u05d6\u05d5, \u05e0\u05d3\u05e8\u05e9\u05d9\u05dd \u05de\u05e4\u05ea\u05d7\u05d5\u05ea API \u05d4\u05d1\u05d0\u05d9\u05dd. \u05d4\u05de\u05e4\u05ea\u05d7\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e1\u05e0\u05d9\u05dd \u05d1\u05d0\u05d7\u05e1\u05d5\u05df \u05d4\u05de\u05e7\u05d5\u05de\u05d9 \u05e9\u05dc \u05d4\u05de\u05db\u05e9\u05d9\u05e8 \u05e9\u05dc\u05da.",
"success": {
"saved": "\u05e0\u05e9\u05de\u05e8 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u05d1\u05d7\u05e8..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u05d1\u05d7\u05e8 \u05ea\u05d0\u05e8\u05d9\u05da",
"range": "\u05d1\u05d7\u05e8 \u05d8\u05d5\u05d5\u05d7 \u05ea\u05d0\u05e8\u05d9\u05db\u05d9\u05dd"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902",
"confirm": "\u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902",
"continue": "\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902",
"goBack": "\u0935\u093e\u092a\u0938 \u091c\u093e\u090f\u0902",
"reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u0947\u0902",
"submit": "\u091c\u092e\u093e \u0915\u0930\u0947\u0902"
},
"status": {
"loading": "\u0932\u094b\u0921 \u0939\u094b \u0930\u0939\u093e \u0939\u0948...",
"error": {
"default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u093f \u0939\u0941\u0908",
"serverConnection": "\u0938\u0930\u094d\u0935\u0930 \u0938\u0947 \u0938\u0902\u092a\u0930\u094d\u0915 \u0928\u0939\u0940\u0902 \u0939\u094b \u092a\u093e \u0930\u0939\u093e"
}
}
},
"auth": {
"login": {
"title": "\u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u0947\u0902",
"form": {
"email": {
"label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u093e",
"required": "\u0908\u092e\u0947\u0932 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948",
"placeholder": "me@example.com"
},
"password": {
"label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
"required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u090f\u0915 \u0906\u0935\u0936\u094d\u092f\u0915 \u092b\u093c\u0940\u0932\u094d\u0921 \u0939\u0948"
},
"actions": {
"signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902"
},
"alternativeText": {
"or": "\u092f\u093e"
}
},
"errors": {
"default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0905\u0938\u092e\u0930\u094d\u0925",
"signin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"oauthSignin": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI oauth \u0910\u092a \u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928 \u0938\u0947 \u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093e \u0930\u0939\u093e",
"oauthCallback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"oauthCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"emailCreateAccount": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"callback": "\u0915\u093f\u0938\u0940 \u0926\u0942\u0938\u0930\u0947 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0928\u0947 \u0915\u093e \u092a\u094d\u0930\u092f\u093e\u0938 \u0915\u0930\u0947\u0902",
"oauthAccountNotLinked": "\u0905\u092a\u0928\u0940 \u092a\u0939\u091a\u093e\u0928 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0909\u0938\u0940 \u0916\u093e\u0924\u0947 \u0938\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902 \u091c\u093f\u0938\u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0906\u092a\u0928\u0947 \u092e\u0942\u0932 \u0930\u0942\u092a \u0938\u0947 \u0915\u093f\u092f\u093e \u0925\u093e",
"emailSignin": "\u0908\u092e\u0947\u0932 \u0928\u0939\u0940\u0902 \u092d\u0947\u091c\u093e \u091c\u093e \u0938\u0915\u093e",
"emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0905\u092a\u0928\u093e \u0908\u092e\u0947\u0932 \u0938\u0924\u094d\u092f\u093e\u092a\u093f\u0924 \u0915\u0930\u0947\u0902, \u090f\u0915 \u0928\u092f\u093e \u0908\u092e\u0947\u0932 \u092d\u0947\u091c\u093e \u0917\u092f\u093e \u0939\u0948",
"credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0935\u093f\u092b\u0932\u0964 \u0906\u092a\u0915\u0947 \u0926\u094d\u0935\u093e\u0930\u093e \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u093f\u090f \u0917\u090f \u0935\u093f\u0935\u0930\u0923 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0947\u0902",
"sessionRequired": "\u0907\u0938 \u092a\u0943\u0937\u094d\u0920 \u0924\u0915 \u092a\u0939\u0941\u0902\u091a\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0947\u0902"
}
},
"provider": {
"continue": "{{provider}} \u0915\u0947 \u0938\u093e\u0925 \u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"
}
},
"chat": {
"input": {
"placeholder": "\u0905\u092a\u0928\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0939\u093e\u0902 \u091f\u093e\u0907\u092a \u0915\u0930\u0947\u0902...",
"actions": {
"send": "\u0938\u0902\u0926\u0947\u0936 \u092d\u0947\u091c\u0947\u0902",
"stop": "\u0915\u093e\u0930\u094d\u092f \u0930\u094b\u0915\u0947\u0902",
"attachFiles": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u0938\u0902\u0932\u0917\u094d\u0928 \u0915\u0930\u0947\u0902"
}
},
"speech": {
"start": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902",
"stop": "\u0930\u093f\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0930\u094b\u0915\u0947\u0902",
"connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948"
},
"fileUpload": {
"dragDrop": "\u092b\u093c\u093e\u0907\u0932\u094b\u0902 \u0915\u094b \u092f\u0939\u093e\u0902 \u0916\u0940\u0902\u091a\u0947\u0902 \u0914\u0930 \u091b\u094b\u0921\u093c\u0947\u0902",
"browse": "\u092b\u093c\u093e\u0907\u0932\u0947\u0902 \u092c\u094d\u0930\u093e\u0909\u091c\u093c \u0915\u0930\u0947\u0902",
"sizeLimit": "\u0938\u0940\u092e\u093e:",
"errors": {
"failed": "\u0905\u092a\u0932\u094b\u0921 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932",
"cancelled": "\u0915\u093e \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u093f\u092f\u093e \u0917\u092f\u093e"
},
"actions": {
"cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u0947\u0902",
"removeAttachment": "\u0938\u0902\u0932\u0917\u094d\u0928\u0915 \u0939\u091f\u093e\u090f\u0902"
}
},
"favorites": {
"use": "\u092a\u0938\u0902\u0926\u0940\u0926\u093e \u0938\u0902\u0926\u0947\u0936 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0947\u0902",
"headline": "\u092a\u0938\u0902\u0926\u0940\u0926\u093e \u0938\u0902\u0926\u0947\u0936",
"remove": "\u092a\u0938\u0902\u0926\u0940\u0926\u093e \u0939\u091f\u093e\u090f\u0902",
"empty": {
"title": "\u0905\u092d\u0940 \u0924\u0915 \u0915\u094b\u0908 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f \u0938\u0939\u0947\u091c\u093e \u0928\u0939\u0940\u0902 \u0917\u092f\u093e",
"description": "\u090f\u0915 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f \u092d\u0947\u091c\u0915\u0930 \u0914\u0930 \u0909\u0938\u0947 \u0938\u094d\u091f\u093e\u0930 \u0915\u0930\u0915\u0947 \u0936\u0941\u0930\u0942 \u0915\u0930\u0947\u0902 \u092f\u093e \u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f \u0938\u0947 \u0915\u093f\u0938\u0940 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f \u0915\u094b \u0938\u094d\u091f\u093e\u0930 \u0915\u0930\u0947\u0902"
}
},
"commands": {
"button": "\u0909\u092a\u0915\u0930\u0923",
"changeTool": "\u0909\u092a\u0915\u0930\u0923 \u092c\u0926\u0932\u0947\u0902",
"availableTools": "\u0909\u092a\u0932\u092c\u094d\u0927 \u0909\u092a\u0915\u0930\u0923"
},
"messages": {
"status": {
"using": "\u0909\u092a\u092f\u094b\u0917 \u0915\u0930 \u0930\u0939\u0947 \u0939\u0948\u0902",
"used": "\u0909\u092a\u092f\u094b\u0917 \u0915\u093f\u092f\u093e"
},
"actions": {
"copy": {
"button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921 \u092a\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u0947\u0902",
"success": "\u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e!"
}
},
"feedback": {
"positive": "\u0938\u0939\u093e\u092f\u0915",
"negative": "\u0938\u0939\u093e\u092f\u0915 \u0928\u0939\u0940\u0902",
"edit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u0947\u0902",
"dialog": {
"title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093c\u0947\u0902",
"submit": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u091c\u092e\u093e \u0915\u0930\u0947\u0902",
"yourFeedback": "\u0906\u092a\u0915\u0940 \u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e..."
},
"status": {
"updating": "\u0905\u092a\u0921\u0947\u091f \u0939\u094b \u0930\u0939\u093e \u0939\u0948",
"updated": "\u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e \u0905\u092a\u0921\u0947\u091f \u0915\u0940 \u0917\u0908"
}
}
},
"history": {
"title": "\u092a\u093f\u091b\u0932\u0947 \u0907\u0928\u092a\u0941\u091f",
"empty": "\u0915\u0941\u091b \u092d\u0940 \u0928\u0939\u0940\u0902 \u0939\u0948...",
"show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093f\u0916\u093e\u090f\u0902"
},
"settings": {
"title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u092a\u0948\u0928\u0932",
"customize": "\u0905\u092a\u0928\u0947 \u091a\u0948\u091f \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938 \u0915\u094b \u092f\u0939\u093e\u0902 \u0905\u0928\u0941\u0915\u0942\u0932\u093f\u0924 \u0915\u0930\u0947\u0902"
},
"watermark": "\u090f\u0932\u090f\u0932\u090f\u092e \u0917\u0932\u0924\u093f\u092f\u093e\u0902 \u0915\u0930 \u0938\u0915\u0924\u0947 \u0939\u0948\u0902\u0964 \u092e\u0939\u0924\u094d\u0935\u092a\u0942\u0930\u094d\u0923 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0915\u0940 \u091c\u093e\u0902\u091a \u0915\u0930\u0928\u0947 \u092a\u0930 \u0935\u093f\u091a\u093e\u0930 \u0915\u0930\u0947\u0902\u0964"
},
"threadHistory": {
"sidebar": {
"title": "\u092a\u093f\u091b\u0932\u0940 \u091a\u0948\u091f",
"filters": {
"search": "\u0916\u094b\u091c\u0947\u0902",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0906\u091c",
"yesterday": "\u0915\u0932",
"previous7days": "\u092a\u093f\u091b\u0932\u0947 7 \u0926\u093f\u0928",
"previous30days": "\u092a\u093f\u091b\u0932\u0947 30 \u0926\u093f\u0928"
},
"empty": "\u0915\u094b\u0908 \u0925\u094d\u0930\u0947\u0921 \u0928\u0939\u0940\u0902 \u092e\u093f\u0932\u093e",
"actions": {
"close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u0947\u0902",
"open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0916\u094b\u0932\u0947\u0902"
}
},
"thread": {
"untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0939\u0940\u0928 \u0935\u093e\u0930\u094d\u0924\u093e\u0932\u093e\u092a",
"menu": {
"rename": "\u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902",
"share": "\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
"delete": "Delete"
},
"actions": {
"share": {
"title": "\u091a\u0948\u091f \u0915\u093e \u0932\u093f\u0902\u0915 \u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
"button": "\u0938\u093e\u091d\u093e \u0915\u0930\u0947\u0902",
"status": {
"copied": "\u0932\u093f\u0902\u0915 \u0915\u0949\u092a\u0940 \u0915\u093f\u092f\u093e \u0917\u092f\u093e",
"created": "\u0936\u0947\u092f\u0930 \u0932\u093f\u0902\u0915 \u092c\u0928\u093e\u092f\u093e \u0917\u092f\u093e!",
"unshared": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u0938\u093e\u091d\u093e \u0915\u0930\u0928\u093e \u0928\u093f\u0937\u094d\u0915\u094d\u0930\u093f\u092f \u0939\u0948"
},
"error": {
"create": "\u0936\u0947\u092f\u0930 \u0932\u093f\u0902\u0915 \u092c\u0928\u093e\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932",
"unshare": "\u0925\u094d\u0930\u0947\u0921 \u0915\u094b \u0905\u0928\u0936\u0947\u092f\u0930 \u0915\u0930\u0928\u0947 \u092e\u0947\u0902 \u0935\u093f\u092b\u0932"
}
},
"delete": {
"title": "\u0939\u091f\u093e\u0928\u0947 \u0915\u0940 \u092a\u0941\u0937\u094d\u091f\u093f \u0915\u0930\u0947\u0902",
"description": "\u092f\u0939 \u0925\u094d\u0930\u0947\u0921 \u0914\u0930 \u0907\u0938\u0915\u0947 \u0938\u0902\u0926\u0947\u0936\u094b\u0902 \u0914\u0930 \u0924\u0924\u094d\u0935\u094b\u0902 \u0915\u094b \u0939\u091f\u093e \u0926\u0947\u0917\u093e\u0964 \u092f\u0939 \u0915\u094d\u0930\u093f\u092f\u093e \u0935\u093e\u092a\u0938 \u0928\u0939\u0940\u0902 \u0915\u0940 \u091c\u093e \u0938\u0915\u0924\u0940",
"success": "\u091a\u0948\u091f \u0939\u091f\u093e \u0926\u0940 \u0917\u0908",
"inProgress": "\u091a\u0948\u091f \u0939\u091f\u093e\u0908 \u091c\u093e \u0930\u0939\u0940 \u0939\u0948"
},
"rename": {
"title": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u0947\u0902",
"description": "\u0907\u0938 \u0925\u094d\u0930\u0947\u0921 \u0915\u0947 \u0932\u093f\u090f \u090f\u0915 \u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902",
"form": {
"name": {
"label": "\u0928\u093e\u092e",
"placeholder": "\u0928\u092f\u093e \u0928\u093e\u092e \u0926\u0930\u094d\u091c \u0915\u0930\u0947\u0902"
}
},
"success": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932 \u0926\u093f\u092f\u093e \u0917\u092f\u093e!",
"inProgress": "\u0925\u094d\u0930\u0947\u0921 \u0915\u093e \u0928\u093e\u092e \u092c\u0926\u0932\u093e \u091c\u093e \u0930\u0939\u093e \u0939\u0948"
}
}
}
},
"navigation": {
"header": {
"chat": "\u091a\u0948\u091f",
"readme": "\u0930\u0940\u0921\u092e\u0940",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0928\u0908 \u091a\u0948\u091f",
"dialog": {
"title": "\u0928\u0908 \u091a\u0948\u091f \u092c\u0928\u093e\u090f\u0902",
"description": "\u092f\u0939 \u0906\u092a\u0915\u093e \u0935\u0930\u094d\u0924\u092e\u093e\u0928 \u091a\u0948\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b\u093c \u0915\u0930 \u0926\u0947\u0917\u093e\u0964 \u0915\u094d\u092f\u093e \u0906\u092a \u091c\u093e\u0930\u0940 \u0930\u0916\u0928\u093e \u091a\u093e\u0939\u0924\u0947 \u0939\u0948\u0902?",
"tooltip": "\u0928\u0908 \u091a\u0948\u091f"
}
},
"user": {
"menu": {
"settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u0938",
"settingsKey": "S",
"apiKeys": "API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902",
"logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
}
}
},
"apiKeys": {
"title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902",
"description": "\u0907\u0938 \u0910\u092a \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f, \u0928\u093f\u092e\u094d\u0928\u0932\u093f\u0916\u093f\u0924 API \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u0935\u0936\u094d\u092f\u0915 \u0939\u0948\u0902\u0964 \u0915\u0941\u0902\u091c\u093f\u092f\u093e\u0902 \u0906\u092a\u0915\u0947 \u0921\u093f\u0935\u093e\u0907\u0938 \u0915\u0947 \u0938\u094d\u0925\u093e\u0928\u0940\u092f \u0938\u0902\u0917\u094d\u0930\u0939\u0923 \u092e\u0947\u0902 \u0938\u0902\u0917\u094d\u0930\u0939\u0940\u0924 \u0915\u0940 \u091c\u093e\u0924\u0940 \u0939\u0948\u0902\u0964",
"success": {
"saved": "\u0938\u092b\u0932\u0924\u093e\u092a\u0942\u0930\u094d\u0935\u0915 \u0938\u0939\u0947\u091c\u093e \u0917\u092f\u093e"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u091a\u0941\u0928\u0947\u0902..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u090f\u0915 \u0924\u093e\u0930\u0940\u0916 \u091a\u0941\u0928\u0947\u0902",
"range": "\u0924\u093e\u0930\u0940\u0916 \u0938\u0940\u092e\u093e \u091a\u0941\u0928\u0947\u0902"
}
}
}
}

View File

@ -0,0 +1,254 @@
{
"common": {
"actions": {
"cancel": "Cancella",
"confirm": "Conferma",
"continue": "Continua",
"goBack": "Ritorna",
"reset": "Reset",
"submit": "Invia"
},
"status": {
"loading": "Caricamento...",
"error": {
"default": "Si \u00e8 verificato un errore",
"serverConnection": "Impossibile connettersi al server"
}
}
},
"auth": {
"login": {
"title": "Accedi per utilizzare l'app",
"form": {
"email": {
"label": "Indirizzo email",
"required": "l'email \u00e8 un campo obbligatorio",
"placeholder": "me@example.com"
},
"password": {
"label": "Password",
"required": "la password \u00e8 un campo obbligatorio"
},
"actions": {
"signin": "Accedi"
},
"alternativeText": {
"or": "O"
}
},
"errors": {
"default": "Impossibile effettuare l'accesso",
"signin": "Prova ad accedere con un account diverso",
"oauthSignin": "Prova ad accedere con un account diverso",
"redirectUriMismatch": "L'URI di reindirizzamento non corrisponde alla configurazione dell'app OAuth",
"oauthCallback": "Prova ad accedere con un account diverso",
"oauthCreateAccount": "Prova ad accedere con un account diverso",
"emailCreateAccount": "Prova ad accedere con un account diverso",
"callback": "Prova ad accedere con un account diverso",
"oauthAccountNotLinked": "Per confermare la tua identit\u00e0, accedi con lo stesso account che hai usato in precedenza",
"emailSignin": "Impossibile inviare l'email",
"emailVerify": "Verifica la tua email, \u00e8 stata inviata una nuova email",
"credentialsSignin": "Accesso non riuscito. Verifica che i dati forniti siano corretti",
"sessionRequired": "Accedi per visualizzare questa pagina"
}
},
"provider": {
"continue": "Continua con {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Scrivi un messaggio...",
"actions": {
"send": "Invia messaggio",
"stop": "Interrompi attivit\u00e0",
"attachFiles": "Allega file"
}
},
"favorites": {
"use": "Usa un messaggio preferito",
"headline": "Messaggi preferiti",
"remove": "Rimuovi preferito",
"empty": {
"title": "Nessun prompt salvato ancora",
"description": "Inizia inviando un prompt e aggiungilo ai preferiti o aggiungi un prompt dalle chat precedenti"
}
},
"commands": {
"button": "Strumenti",
"changeTool": "Cambia strumento",
"availableTools": "Strumenti disponibili"
},
"speech": {
"start": "Inizia registrazione",
"stop": "Interrompi registrazione",
"connecting": "Connettendo"
},
"fileUpload": {
"dragDrop": "Trascina e rilascia i file qui",
"browse": "Sfoglia file",
"sizeLimit": "Limite:",
"errors": {
"failed": "Caricamento file non riuscito",
"cancelled": "Caricamento annullato di"
},
"actions": {
"cancelUpload": "Annulla caricamento",
"removeAttachment": "Rimuovi allegato"
}
},
"messages": {
"status": {
"using": "In uso",
"used": "Utilizzato"
},
"actions": {
"copy": {
"button": "Copia negli appunti",
"success": "Copiato!"
}
},
"feedback": {
"positive": "Utile",
"negative": "Non utile",
"edit": "Modifica feedback",
"dialog": {
"title": "Aggiungi un commento",
"submit": "Invia feedback",
"yourFeedback": "Il tuo feedback..."
},
"status": {
"updating": "Aggiornamento",
"updated": "Feedback aggiornato"
}
}
},
"history": {
"title": "Cronologia chat",
"empty": "Cos\u00ec vuoto...",
"show": "Mostra cronologia"
},
"settings": {
"title": "Impostazioni",
"customize": "Personalizza le impostazioni della tua chat qui"
},
"watermark": "Gli LLMS possono commettere errori. Verifica le info importanti."
},
"threadHistory": {
"sidebar": {
"title": "Chat precedenti",
"filters": {
"search": "Cerca",
"placeholder": "Cerca conversazioni..."
},
"timeframes": {
"today": "Oggi",
"yesterday": "Ieri",
"previous7days": "Ultimi 7 giorni",
"previous30days": "Ultimi 30 giorni"
},
"empty": "Nessuna chat trovata",
"actions": {
"close": "Chiudi barra laterale",
"open": "Apri barra laterale"
}
},
"thread": {
"untitled": "Conversazione senza titolo",
"menu": {
"rename": "Rinomina",
"share": "Condividi",
"delete": "Elimina"
},
"actions": {
"share": {
"title": "Condividi link conversazione",
"button": "Condividi",
"status": {
"copied": "Link copiato",
"created": "Link di condivisione creato!",
"unshared": "Condivisione disabilitata per questa chat"
},
"error": {
"create": "Impossibile creare il link di condivisione",
"unshare": "Impossibile annullare la condivisione della chat"
}
},
"delete": {
"title": "Conferma eliminazione",
"description": "Stai per eliminare la chat insieme ai suoi messaggi ed elementi. Questa azione non pu\u00f2 essere annullata",
"success": "Chat eliminata",
"inProgress": "Eliminazione chat"
},
"rename": {
"title": "Rinomina chat",
"description": "Inserisci un nuovo nome per questa conversazione",
"form": {
"name": {
"label": "Nome",
"placeholder": "Inserisci nuovo nome"
}
},
"success": "Chat rinominata!",
"inProgress": "Rinomina chat"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "Leggimi",
"theme": {
"light": "Tema Chiaro",
"dark": "Tema Scuro",
"system": "Usa tema di sistema"
}
},
"newChat": {
"button": "Nuova Chat",
"dialog": {
"title": "Crea Nuova Chat",
"description": "Sei sicuro di voler creare una nuova chat? La chat corrente verr\u00e0 chiusa.",
"tooltip": "Nuova Chat"
}
},
"user": {
"menu": {
"settings": "Impostazioni",
"settingsKey": "S",
"apiKeys": "Chiavi API",
"logout": "Disconnettiti"
}
}
},
"apiKeys": {
"title": "Chiavi API richieste",
"description": "Per utilizzare l'app, sono necessarie le seguenti chiavi API. Le chiavi sono salvate nella memoria locale del tuo dispositivo.",
"success": {
"saved": "Salvataggio riuscito"
}
},
"alerts": {
"info": "Info",
"note": "Nota",
"tip": "Suggerimento",
"important": "Importante",
"warning": "Avviso",
"caution": "Attenzione",
"debug": "Debug",
"example": "Esempio",
"success": "Successo",
"help": "Aiuto",
"idea": "Idea",
"pending": "In sospeso",
"security": "Sicurezza",
"beta": "Beta",
"best-practice": "Miglior Soluzione"
},
"components": {
"MultiSelectInput": {
"placeholder": "Seleziona..."
}
}
}

View File

@ -0,0 +1,259 @@
{
"common": {
"actions": {
"cancel": "\u30ad\u30e3\u30f3\u30bb\u30eb",
"confirm": "\u78ba\u8a8d",
"continue": "\u7d9a\u3051\u308b",
"goBack": "\u623b\u308b",
"reset": "\u30ea\u30bb\u30c3\u30c8",
"submit": "\u9001\u4fe1"
},
"status": {
"loading": "\u8aad\u307f\u8fbc\u307f\u4e2d...",
"error": {
"default": "\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f",
"serverConnection": "\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f"
}
}
},
"auth": {
"login": {
"title": "\u30a2\u30d7\u30ea\u306b\u30ed\u30b0\u30a4\u30f3",
"form": {
"email": {
"label": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9",
"required": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059",
"placeholder": "me@example.com"
},
"password": {
"label": "\u30d1\u30b9\u30ef\u30fc\u30c9",
"required": "\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5fc5\u9808\u9805\u76ee\u3067\u3059"
},
"actions": {
"signin": "\u30b5\u30a4\u30f3\u30a4\u30f3"
},
"alternativeText": {
"or": "\u307e\u305f\u306f"
}
},
"errors": {
"default": "\u30b5\u30a4\u30f3\u30a4\u30f3\u3067\u304d\u307e\u305b\u3093",
"signin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"oauthSignin": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"redirectUriMismatch": "\u30ea\u30c0\u30a4\u30ec\u30af\u30c8URI\u304cOAuth\u30a2\u30d7\u30ea\u306e\u8a2d\u5b9a\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093",
"oauthCallback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"oauthCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"emailCreateAccount": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"callback": "\u5225\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"oauthAccountNotLinked": "\u672c\u4eba\u78ba\u8a8d\u306e\u305f\u3081\u3001\u6700\u521d\u306b\u4f7f\u7528\u3057\u305f\u306e\u3068\u540c\u3058\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044",
"emailSignin": "\u30e1\u30fc\u30eb\u3092\u9001\u4fe1\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f",
"emailVerify": "\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u65b0\u3057\u3044\u30e1\u30fc\u30eb\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f",
"credentialsSignin": "\u30b5\u30a4\u30f3\u30a4\u30f3\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u5165\u529b\u3057\u305f\u60c5\u5831\u304c\u6b63\u3057\u3044\u304b\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044",
"sessionRequired": "\u3053\u306e\u30da\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u306b\u306f\u30b5\u30a4\u30f3\u30a4\u30f3\u3057\u3066\u304f\u3060\u3055\u3044"
}
},
"provider": {
"continue": "{{provider}}\u3067\u7d9a\u3051\u308b"
}
},
"chat": {
"input": {
"placeholder": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044...",
"actions": {
"send": "\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1",
"stop": "\u30bf\u30b9\u30af\u3092\u505c\u6b62",
"attachFiles": "\u30d5\u30a1\u30a4\u30eb\u3092\u6dfb\u4ed8"
}
},
"speech": {
"start": "\u9332\u97f3\u958b\u59cb",
"stop": "\u9332\u97f3\u505c\u6b62",
"connecting": "\u63a5\u7d9a\u4e2d"
},
"favorites": {
"use": "\u304a\u6c17\u306b\u5165\u308a\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u4f7f\u7528",
"headline": "\u304a\u6c17\u306b\u5165\u308a\u306e\u30e1\u30c3\u30bb\u30fc\u30b8",
"remove": "\u304a\u6c17\u306b\u5165\u308a\u3092\u524a\u9664",
"empty": {
"title": "\u4fdd\u5b58\u3055\u308c\u305f\u30d7\u30ed\u30f3\u30d7\u30c8\u304c\u307e\u3060\u3042\u308a\u307e\u305b\u3093",
"description": "\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u9001\u4fe1\u3057\u3066\u30b9\u30bf\u30fc\u3092\u4ed8\u3051\u308b\u304b\u3001\u4ee5\u524d\u306e\u30c1\u30e3\u30c3\u30c8\u304b\u3089\u30d7\u30ed\u30f3\u30d7\u30c8\u3092\u30b9\u30bf\u30fc\u3057\u3066\u304f\u3060\u3055\u3044"
}
},
"commands": {
"button": "\u30c4\u30fc\u30eb",
"changeTool": "\u30c4\u30fc\u30eb\u3092\u5909\u66f4",
"availableTools": "\u5229\u7528\u53ef\u80fd\u306a\u30c4\u30fc\u30eb"
},
"fileUpload": {
"dragDrop": "\u3053\u3053\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u30c9\u30e9\u30c3\u30b0\uff06\u30c9\u30ed\u30c3\u30d7",
"sizeLimit": "\u5236\u9650\uff1a",
"errors": {
"failed": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
"cancelled": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f\uff1a"
},
"actions": {
"cancelUpload": "\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb",
"removeAttachment": "\u6dfb\u4ed8\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664"
}
},
"messages": {
"status": {
"using": "\u4f7f\u7528\u4e2d",
"used": "\u4f7f\u7528\u6e08\u307f"
},
"actions": {
"copy": {
"button": "\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u306b\u30b3\u30d4\u30fc",
"success": "\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f\uff01"
}
},
"feedback": {
"positive": "\u5f79\u306b\u7acb\u3063\u305f",
"negative": "\u5f79\u306b\u7acb\u305f\u306a\u304b\u3063\u305f",
"edit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u7de8\u96c6",
"dialog": {
"title": "\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0",
"submit": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u9001\u4fe1",
"yourFeedback": "\u3042\u306a\u305f\u306e\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af..."
},
"status": {
"updating": "\u66f4\u65b0\u4e2d",
"updated": "\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f"
}
}
},
"history": {
"title": "\u6700\u8fd1\u306e\u5165\u529b",
"empty": "\u4f55\u3082\u3042\u308a\u307e\u305b\u3093...",
"show": "\u5c65\u6b74\u3092\u8868\u793a"
},
"settings": {
"title": "\u8a2d\u5b9a\u30d1\u30cd\u30eb",
"customize": "\u3053\u3053\u3067\u30c1\u30e3\u30c3\u30c8\u8a2d\u5b9a\u3092\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u307e\u3059"
},
"watermark": "\u5927\u898f\u6a21\u8a00\u8a9e\u30e2\u30c7\u30eb\u306f\u9593\u9055\u3044\u3092\u72af\u3059\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u91cd\u8981\u306a\u60c5\u5831\u306b\u3064\u3044\u3066\u306f\u78ba\u8a8d\u3092\u691c\u8a0e\u3057\u3066\u304f\u3060\u3055\u3044\u3002"
},
"threadHistory": {
"sidebar": {
"title": "\u904e\u53bb\u306e\u30c1\u30e3\u30c3\u30c8",
"filters": {
"search": "\u691c\u7d22",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u4eca\u65e5",
"yesterday": "\u6628\u65e5",
"previous7days": "\u904e\u53bb7\u65e5\u9593",
"previous30days": "\u904e\u53bb30\u65e5\u9593"
},
"empty": "\u30b9\u30ec\u30c3\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093",
"actions": {
"close": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u9589\u3058\u308b",
"open": "\u30b5\u30a4\u30c9\u30d0\u30fc\u3092\u958b\u304f"
}
},
"thread": {
"untitled": "\u7121\u984c\u306e\u4f1a\u8a71",
"menu": {
"rename": "\u540d\u524d\u3092\u5909\u66f4",
"share": "\u5171\u6709",
"delete": "\u524a\u9664"
},
"actions": {
"share": {
"title": "\u30c1\u30e3\u30c3\u30c8\u306e\u30ea\u30f3\u30af\u3092\u5171\u6709",
"button": "\u5171\u6709",
"status": {
"copied": "\u30ea\u30f3\u30af\u3092\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f",
"created": "\u5171\u6709\u30ea\u30f3\u30af\u3092\u4f5c\u6210\u3057\u307e\u3057\u305f\uff01",
"unshared": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u5171\u6709\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f"
},
"error": {
"create": "\u5171\u6709\u30ea\u30f3\u30af\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f",
"unshare": "\u30b9\u30ec\u30c3\u30c9\u306e\u5171\u6709\u89e3\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f"
}
},
"delete": {
"title": "\u524a\u9664\u306e\u78ba\u8a8d",
"description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u3068\u305d\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u8981\u7d20\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u64cd\u4f5c\u306f\u53d6\u308a\u6d88\u305b\u307e\u305b\u3093",
"success": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u3057\u307e\u3057\u305f",
"inProgress": "\u30c1\u30e3\u30c3\u30c8\u3092\u524a\u9664\u4e2d"
},
"rename": {
"title": "\u30b9\u30ec\u30c3\u30c9\u306e\u540d\u524d\u3092\u5909\u66f4",
"description": "\u3053\u306e\u30b9\u30ec\u30c3\u30c9\u306e\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044",
"form": {
"name": {
"label": "\u540d\u524d",
"placeholder": "\u65b0\u3057\u3044\u540d\u524d\u3092\u5165\u529b"
}
},
"success": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u3057\u307e\u3057\u305f\uff01",
"inProgress": "\u30b9\u30ec\u30c3\u30c9\u540d\u3092\u5909\u66f4\u4e2d"
}
}
}
},
"navigation": {
"header": {
"chat": "\u30c1\u30e3\u30c3\u30c8",
"readme": "\u8aac\u660e\u66f8",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8",
"dialog": {
"title": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8\u306e\u4f5c\u6210",
"description": "\u73fe\u5728\u306e\u30c1\u30e3\u30c3\u30c8\u5c65\u6b74\u304c\u30af\u30ea\u30a2\u3055\u308c\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b\uff1f",
"tooltip": "\u65b0\u898f\u30c1\u30e3\u30c3\u30c8"
}
},
"user": {
"menu": {
"settings": "\u8a2d\u5b9a",
"settingsKey": "S",
"apiKeys": "API\u30ad\u30fc",
"logout": "\u30ed\u30b0\u30a2\u30a6\u30c8"
}
}
},
"apiKeys": {
"title": "\u5fc5\u8981\u306aAPI\u30ad\u30fc",
"description": "\u3053\u306e\u30a2\u30d7\u30ea\u3092\u4f7f\u7528\u3059\u308b\u306b\u306f\u3001\u4ee5\u4e0b\u306eAPI\u30ad\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u30ad\u30fc\u306f\u304a\u4f7f\u3044\u306e\u30c7\u30d0\u30a4\u30b9\u306e\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u4fdd\u5b58\u3055\u308c\u307e\u3059\u3002",
"success": {
"saved": "\u4fdd\u5b58\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u9078\u629e..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u65e5\u4ed8\u3092\u9078\u629e",
"range": "\u65e5\u4ed8\u7bc4\u56f2\u3092\u9078\u629e"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0cae\u0cbe\u0ca1\u0cbf",
"confirm": "\u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf",
"continue": "\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf",
"goBack": "\u0cb9\u0cbf\u0c82\u0ca6\u0cc6 \u0cb9\u0ccb\u0c97\u0cbf",
"reset": "\u0cae\u0cb0\u0cc1\u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0cb8\u0cbf",
"submit": "\u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf"
},
"status": {
"loading": "\u0cb2\u0ccb\u0ca1\u0ccd \u0c86\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6...",
"error": {
"default": "\u0ca6\u0ccb\u0cb7 \u0cb8\u0c82\u0cad\u0cb5\u0cbf\u0cb8\u0cbf\u0ca6\u0cc6",
"serverConnection": "\u0cb8\u0cb0\u0ccd\u0cb5\u0cb0\u0ccd\u200c \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cb2\u0cc1\u0caa\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2"
}
}
},
"auth": {
"login": {
"title": "\u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb2\u0cbe\u0c97\u0cbf\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
"form": {
"email": {
"label": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0cb5\u0cbf\u0cb3\u0cbe\u0cb8",
"required": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd",
"required": "\u0caa\u0cbe\u0cb8\u0ccd\u200c\u0cb5\u0cb0\u0ccd\u0ca1\u0ccd \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c95\u0ccd\u0cb7\u0cc7\u0ca4\u0ccd\u0cb0"
},
"actions": {
"signin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
},
"alternativeText": {
"or": "\u0c85\u0ca5\u0cb5\u0cbe"
}
},
"errors": {
"default": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2",
"signin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"oauthSignin": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"redirectUriMismatch": "\u0cb0\u0cc0\u0ca1\u0cc8\u0cb0\u0cc6\u0c95\u0ccd\u0c9f\u0ccd URI \u0c93\u0ca5\u0ccd \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0c95\u0cbe\u0ca8\u0ccd\u0cab\u0cbf\u0c97\u0cb0\u0cc7\u0cb6\u0ca8\u0ccd\u200c\u0c97\u0cc6 \u0cb9\u0cca\u0c82\u0ca6\u0cbf\u0c95\u0cc6\u0caf\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb2\u0ccd\u0cb2",
"oauthCallback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"oauthCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"emailCreateAccount": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"callback": "\u0cac\u0cc7\u0cb0\u0cc6 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0caa\u0ccd\u0cb0\u0caf\u0ca4\u0ccd\u0ca8\u0cbf\u0cb8\u0cbf",
"oauthAccountNotLinked": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c97\u0cc1\u0cb0\u0cc1\u0ca4\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cc1, \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cca\u0ca6\u0cb2\u0cc1 \u0cac\u0cb3\u0cb8\u0cbf\u0ca6 \u0c85\u0ca6\u0cc7 \u0c96\u0cbe\u0ca4\u0cc6\u0caf\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
"emailSignin": "\u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbe\u0c97\u0cb2\u0cbf\u0cb2\u0ccd\u0cb2",
"emailVerify": "\u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf, \u0cb9\u0cca\u0cb8 \u0c87\u0cae\u0cc7\u0cb2\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"credentialsSignin": "\u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0c92\u0ca6\u0c97\u0cbf\u0cb8\u0cbf\u0ca6 \u0cb5\u0cbf\u0cb5\u0cb0\u0c97\u0cb3\u0cc1 \u0cb8\u0cb0\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0cb5\u0cc6\u0caf\u0cc7 \u0c8e\u0c82\u0ca6\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cbf",
"sessionRequired": "\u0c88 \u0caa\u0cc1\u0c9f\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0ccd\u0cb0\u0cb5\u0cc7\u0cb6\u0cbf\u0cb8\u0cb2\u0cc1 \u0ca6\u0caf\u0cb5\u0cbf\u0c9f\u0ccd\u0c9f\u0cc1 \u0cb8\u0cc8\u0ca8\u0ccd \u0c87\u0ca8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
}
},
"provider": {
"continue": "{{provider}} \u0ca8\u0cca\u0c82\u0ca6\u0cbf\u0c97\u0cc6 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cbf"
}
},
"chat": {
"input": {
"placeholder": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c9f\u0cc8\u0caa\u0ccd \u0cae\u0cbe\u0ca1\u0cbf...",
"actions": {
"send": "\u0cb8\u0c82\u0ca6\u0cc7\u0cb6 \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cbf",
"stop": "\u0c95\u0cbe\u0cb0\u0ccd\u0caf \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
"attachFiles": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb2\u0c97\u0ca4\u0ccd\u0ca4\u0cbf\u0cb8\u0cbf"
}
},
"favorites": {
"use": "\u0cae\u0cc6\u0c9a\u0ccd\u0c9a\u0cbf\u0ca8 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0cb3\u0cb8\u0cbf",
"headline": "\u0cae\u0cc6\u0c9a\u0ccd\u0c9a\u0cbf\u0ca8 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0c97\u0cb3\u0cc1",
"remove": "\u0cae\u0cc6\u0c9a\u0ccd\u0c9a\u0cbf\u0ca8 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cc6\u0c97\u0cc6\u0ca6\u0cc1\u0cb9\u0cbe\u0c95\u0cbf",
"empty": {
"title": "\u0c87\u0ca8\u0ccd\u0ca8\u0cc2 \u0caf\u0cbe\u0cb5\u0cc1\u0ca6\u0cc7 \u0caa\u0ccd\u0cb0\u0cbe\u0c82\u0caa\u0ccd\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c89\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0cb2\u0ccd\u0cb2",
"description": "\u0caa\u0ccd\u0cb0\u0cbe\u0c82\u0caa\u0ccd\u0c9f\u0ccd \u0c95\u0cb3\u0cc1\u0cb9\u0cbf\u0cb8\u0cbf \u0cae\u0ca4\u0ccd\u0ca4\u0cc1 \u0c85\u0ca6\u0c95\u0ccd\u0c95\u0cc6 \u0cb8\u0ccd\u0c9f\u0cbe\u0cb0\u0ccd \u0cae\u0cbe\u0ca1\u0cbf \u0c85\u0ca5\u0cb5\u0cbe \u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 \u0c9a\u0cbe\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0cbf\u0c82\u0ca6 \u0caa\u0ccd\u0cb0\u0cbe\u0c82\u0caa\u0ccd\u0c9f\u0ccd\u200c\u0c97\u0cc6 \u0cb8\u0ccd\u0c9f\u0cbe\u0cb0\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
}
},
"commands": {
"button": "\u0c89\u0caa\u0c95\u0cb0\u0ca3\u0c97\u0cb3\u0cc1",
"changeTool": "\u0c89\u0caa\u0c95\u0cb0\u0ca3\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ca6\u0cb2\u0cbf\u0cb8\u0cbf",
"availableTools": "\u0cb2\u0cad\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 \u0c89\u0caa\u0c95\u0cb0\u0ca3\u0c97\u0cb3\u0cc1"
},
"speech": {
"start": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0caa\u0ccd\u0cb0\u0cbe\u0cb0\u0c82\u0cad\u0cbf\u0cb8\u0cbf",
"stop": "\u0cb0\u0cc6\u0c95\u0cbe\u0cb0\u0ccd\u0ca1\u0cbf\u0c82\u0c97\u0ccd \u0ca8\u0cbf\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
"connecting": "\u0cb8\u0c82\u0caa\u0cb0\u0ccd\u0c95\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
},
"fileUpload": {
"dragDrop": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c87\u0cb2\u0ccd\u0cb2\u0cbf \u0c8e\u0cb3\u0cc6\u0ca6\u0cc1 \u0cac\u0cbf\u0ca1\u0cbf",
"browse": "\u0cab\u0cc8\u0cb2\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cac\u0ccd\u0cb0\u0ccc\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf",
"sizeLimit": "\u0cae\u0cbf\u0ca4\u0cbf:",
"errors": {
"failed": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"cancelled": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
},
"actions": {
"cancelUpload": "\u0c85\u0caa\u0ccd\u200c\u0cb2\u0ccb\u0ca1\u0ccd \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cbf",
"removeAttachment": "\u0c85\u0c9f\u0ccd\u0caf\u0cbe\u0c9a\u0ccd\u200c\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0c85\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca4\u0cc6\u0c97\u0cc6\u0ca6\u0cc1\u0cb9\u0cbe\u0c95\u0cbf"
}
},
"messages": {
"status": {
"using": "\u0cac\u0cb3\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0cb0\u0cc1\u0cb5\u0cc1\u0ca6\u0cc1",
"used": "\u0cac\u0cb3\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
},
"actions": {
"copy": {
"button": "\u0c95\u0ccd\u0cb2\u0cbf\u0caa\u0ccd\u200c\u0cac\u0ccb\u0cb0\u0ccd\u0ca1\u0ccd\u200c\u0c97\u0cc6 \u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cbf",
"success": "\u0ca8\u0c95\u0cb2\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!"
}
},
"feedback": {
"positive": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"negative": "\u0cb8\u0cb9\u0cbe\u0caf\u0c95\u0cb5\u0cbe\u0c97\u0cbf\u0cb2\u0ccd\u0cb2",
"edit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0c82\u0caa\u0cbe\u0ca6\u0cbf\u0cb8\u0cbf",
"dialog": {
"title": "\u0c95\u0cbe\u0cae\u0cc6\u0c82\u0c9f\u0ccd \u0cb8\u0cc7\u0cb0\u0cbf\u0cb8\u0cbf",
"submit": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0cb8\u0cb2\u0ccd\u0cb2\u0cbf\u0cb8\u0cbf",
"yourFeedback": "\u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6..."
},
"status": {
"updating": "\u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6",
"updated": "\u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6 \u0ca8\u0cb5\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
}
}
},
"history": {
"title": "\u0c95\u0cca\u0ca8\u0cc6\u0caf \u0c87\u0ca8\u0ccd\u200c\u0caa\u0cc1\u0c9f\u0ccd\u200c\u0c97\u0cb3\u0cc1",
"empty": "\u0c96\u0cbe\u0cb2\u0cbf\u0caf\u0cbe\u0c97\u0cbf\u0ca6\u0cc6...",
"show": "\u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8 \u0ca4\u0ccb\u0cb0\u0cbf\u0cb8\u0cbf"
},
"settings": {
"title": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3 \u0caa\u0ccd\u0caf\u0cbe\u0ca8\u0cc6\u0cb2\u0ccd",
"customize": "\u0c88\u0c97 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0c9a\u0cbe\u0c9f\u0ccd \u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c95\u0cb8\u0ccd\u0c9f\u0cae\u0cc8\u0cb8\u0ccd \u0cae\u0cbe\u0ca1\u0cbf"
},
"watermark": "LLM \u0c97\u0cb3\u0cc1 \u0ca4\u0caa\u0ccd\u0caa\u0cc1\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0cae\u0cbe\u0ca1\u0cac\u0cb9\u0cc1\u0ca6\u0cc1. \u0caa\u0ccd\u0cb0\u0cae\u0cc1\u0c96 \u0cae\u0cbe\u0cb9\u0cbf\u0ca4\u0cbf\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0cb0\u0cbf\u0cb6\u0cc0\u0cb2\u0cbf\u0cb8\u0cc1\u0cb5\u0cc1\u0ca6\u0ca8\u0ccd\u0ca8\u0cc1 \u0caa\u0cb0\u0cbf\u0c97\u0ca3\u0cbf\u0cb8\u0cbf."
},
"threadHistory": {
"sidebar": {
"title": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1",
"filters": {
"search": "\u0cb9\u0cc1\u0ca1\u0cc1\u0c95\u0cbf",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0c87\u0c82\u0ca6\u0cc1",
"yesterday": "\u0ca8\u0cbf\u0ca8\u0ccd\u0ca8\u0cc6",
"previous7days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 7 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1",
"previous30days": "\u0cb9\u0cbf\u0c82\u0ca6\u0cbf\u0ca8 30 \u0ca6\u0cbf\u0ca8\u0c97\u0cb3\u0cc1"
},
"empty": "\u0caf\u0cbe\u0cb5\u0cc1\u0ca6\u0cc7 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cb3\u0cc1 \u0c95\u0c82\u0ca1\u0cc1\u0cac\u0c82\u0ca6\u0cbf\u0cb2\u0ccd\u0cb2",
"actions": {
"close": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0cae\u0cc1\u0c9a\u0ccd\u0c9a\u0cbf",
"open": "\u0caa\u0c95\u0ccd\u0c95\u0ca6 \u0caa\u0c9f\u0ccd\u0c9f\u0cbf \u0ca4\u0cc6\u0cb0\u0cc6\u0caf\u0cbf\u0cb0\u0cbf"
}
},
"thread": {
"untitled": "\u0cb6\u0cc0\u0cb0\u0ccd\u0cb7\u0cbf\u0c95\u0cc6\u0cb0\u0cb9\u0cbf\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
"menu": {
"rename": "\u0cae\u0cb0\u0cc1\u0cb9\u0cc6\u0cb8\u0cb0\u0cbf\u0cb8\u0cbf",
"share": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
"delete": "\u0c85\u0cb3\u0cbf\u0cb8\u0cbf"
},
"actions": {
"share": {
"title": "\u0c9a\u0cbe\u0c9f\u0ccd\u200c\u0c97\u0cc6 \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
"button": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cca\u0cb3\u0ccd\u0cb3\u0cbf",
"status": {
"copied": "\u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0caa\u0ccd\u0cb0\u0ca4\u0cbf\u0cb2\u0cbf\u0caa\u0cbf \u0cae\u0cbe\u0ca1\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"created": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb0\u0c9a\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!",
"unshared": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6 \u0ca8\u0cbf\u0cb7\u0ccd\u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
},
"error": {
"create": "\u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf \u0cb2\u0cbf\u0c82\u0c95\u0ccd \u0cb0\u0c9a\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"unshare": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb9\u0c82\u0c9a\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1 \u0cae\u0cbe\u0ca1\u0cb2\u0cc1 \u0cb5\u0cbf\u0cab\u0cb2\u0cb5\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
}
},
"delete": {
"title": "\u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0cb5\u0cbf\u0c95\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca6\u0cc3\u0ca2\u0cc0\u0c95\u0cb0\u0cbf\u0cb8\u0cbf",
"description": "\u0c87\u0ca6\u0cc1 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb9\u0cbe\u0c97\u0cc2 \u0c85\u0ca6\u0cb0 \u0cb8\u0c82\u0ca6\u0cc7\u0cb6\u0c97\u0cb3\u0cc1 \u0cae\u0ca4\u0ccd\u0ca4\u0cc1 \u0c85\u0c82\u0cb6\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0c88 \u0c95\u0ccd\u0cb0\u0cbf\u0caf\u0cc6\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0cb0\u0ca6\u0ccd\u0ca6\u0cc1\u0c97\u0cca\u0cb3\u0cbf\u0cb8\u0cb2\u0cc1 \u0cb8\u0cbe\u0ca7\u0ccd\u0caf\u0cb5\u0cbf\u0cb2\u0ccd\u0cb2",
"success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6",
"inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0c85\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
},
"rename": {
"title": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cbf",
"description": "\u0c88 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0c97\u0cc6 \u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf",
"form": {
"name": {
"label": "\u0cb9\u0cc6\u0cb8\u0cb0\u0cc1",
"placeholder": "\u0cb9\u0cca\u0cb8 \u0cb9\u0cc6\u0cb8\u0cb0\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cae\u0cc2\u0ca6\u0cbf\u0cb8\u0cbf"
}
},
"success": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6!",
"inProgress": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0cb9\u0cc6\u0cb8\u0cb0\u0cc1 \u0cac\u0ca6\u0cb2\u0cbe\u0caf\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0cbf\u0ca6\u0cc6"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
"readme": "\u0c93\u0ca6\u0cbf",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6",
"dialog": {
"title": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6 \u0cb0\u0c9a\u0cbf\u0cb8\u0cbf",
"description": "\u0c87\u0ca6\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0caa\u0ccd\u0cb0\u0cb8\u0ccd\u0ca4\u0cc1\u0ca4 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6\u0caf \u0c87\u0ca4\u0cbf\u0cb9\u0cbe\u0cb8\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c85\u0cb3\u0cbf\u0cb8\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6. \u0ca8\u0cc0\u0cb5\u0cc1 \u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cc6\u0caf\u0cb2\u0cc1 \u0cac\u0caf\u0cb8\u0cc1\u0cb5\u0cbf\u0cb0\u0cbe?",
"tooltip": "\u0cb9\u0cca\u0cb8 \u0cb8\u0c82\u0cad\u0cbe\u0cb7\u0ca3\u0cc6"
}
},
"user": {
"menu": {
"settings": "\u0cb8\u0cc6\u0c9f\u0ccd\u0c9f\u0cbf\u0c82\u0c97\u0ccd\u200c\u0c97\u0cb3\u0cc1",
"settingsKey": "S",
"apiKeys": "API \u0c95\u0cc0\u0c97\u0cb3\u0cc1",
"logout": "\u0cb2\u0cbe\u0c97\u0ccd \u0c94\u0c9f\u0ccd"
}
}
},
"apiKeys": {
"title": "\u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0cb5 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1",
"description": "\u0c88 \u0c85\u0caa\u0ccd\u0cb2\u0cbf\u0c95\u0cc7\u0cb6\u0ca8\u0ccd \u0cac\u0cb3\u0cb8\u0cb2\u0cc1, \u0c88 \u0c95\u0cc6\u0cb3\u0c97\u0cbf\u0ca8 API \u0c95\u0cc0\u0c97\u0cb3\u0cc1 \u0c85\u0c97\u0ca4\u0ccd\u0caf\u0cb5\u0cbf\u0cb0\u0cc1\u0ca4\u0ccd\u0ca4\u0cb5\u0cc6. \u0c95\u0cc0\u0c97\u0cb3\u0ca8\u0ccd\u0ca8\u0cc1 \u0ca8\u0cbf\u0cae\u0ccd\u0cae \u0cb8\u0cbe\u0ca7\u0ca8\u0ca6 \u0cb8\u0ccd\u0ca5\u0cb3\u0cc0\u0caf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0ca3\u0cc6\u0caf\u0cb2\u0ccd\u0cb2\u0cbf \u0cb8\u0c82\u0c97\u0ccd\u0cb0\u0cb9\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cc1\u0ca4\u0ccd\u0ca4\u0ca6\u0cc6.",
"success": {
"saved": "\u0caf\u0cb6\u0cb8\u0ccd\u0cb5\u0cbf\u0caf\u0cbe\u0c97\u0cbf \u0c89\u0cb3\u0cbf\u0cb8\u0cb2\u0cbe\u0c97\u0cbf\u0ca6\u0cc6"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0c9a\u0cc1\u0ca8\u0cbe\u0caf\u0cbf\u0cb8\u0cbf..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0ca6\u0cbf\u0ca8\u0cbe\u0c82\u0c95\u0cb5\u0ca8\u0ccd\u0ca8\u0cc1 \u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf",
"range": "\u0ca6\u0cbf\u0ca8\u0cbe\u0c82\u0c95 \u0cb6\u0ccd\u0cb0\u0cc7\u0ca3\u0cbf\u0caf\u0ca8\u0ccd\u0ca8\u0cc1 \u0c86\u0caf\u0ccd\u0c95\u0cc6\u0cae\u0cbe\u0ca1\u0cbf"
}
}
}
}

View File

@ -0,0 +1,254 @@
{
"common": {
"actions": {
"cancel": "\ucde8\uc18c",
"confirm": "\ud655\uc778",
"continue": "\uacc4\uc18d",
"goBack": "\ub4a4\ub85c \uac00\uae30",
"reset": "\ucd08\uae30\ud654",
"submit": "\uc81c\ucd9c"
},
"status": {
"loading": "\ub85c\ub529 \uc911...",
"error": {
"default": "\uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4",
"serverConnection": "\uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4"
}
}
},
"auth": {
"login": {
"title": "\uc571\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ub85c\uadf8\uc778\ud558\uc138\uc694",
"form": {
"email": {
"label": "\uc774\uba54\uc77c \uc8fc\uc18c",
"required": "\uc774\uba54\uc77c\uc740 \ud544\uc218 \uc785\ub825 \ud56d\ubaa9\uc785\ub2c8\ub2e4",
"placeholder": "me@example.com"
},
"password": {
"label": "\ube44\ubc00\ubc88\ud638",
"required": "\ube44\ubc00\ubc88\ud638\ub294 \ud544\uc218 \uc785\ub825 \ud56d\ubaa9\uc785\ub2c8\ub2e4"
},
"actions": {
"signin": "\ub85c\uadf8\uc778"
},
"alternativeText": {
"or": "\ub610\ub294"
}
},
"errors": {
"default": "\ub85c\uadf8\uc778\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
"signin": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"oauthSignin": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"redirectUriMismatch": "\ub9ac\ub2e4\uc774\ub809\ud2b8 URI\uac00 OAuth \uc571 \uc124\uc815\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4",
"oauthCallback": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"oauthCreateAccount": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"emailCreateAccount": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"callback": "\ub2e4\ub978 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\ubcf4\uc138\uc694",
"oauthAccountNotLinked": "\uc2e0\uc6d0\uc744 \ud655\uc778\ud558\ub824\uba74 \uc6d0\ub798 \uc0ac\uc6a9\ud588\ub358 \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud558\uc138\uc694",
"emailSignin": "\uc774\uba54\uc77c\uc744 \ubcf4\ub0bc \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
"emailVerify": "\uc774\uba54\uc77c\uc744 \ud655\uc778\ud574\uc8fc\uc138\uc694. \uc0c8\ub85c\uc6b4 \uc774\uba54\uc77c\uc774 \ubc1c\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"credentialsSignin": "\ub85c\uadf8\uc778 \uc2e4\ud328. \uc81c\uacf5\ud55c \uc815\ubcf4\uac00 \uc62c\ubc14\ub978\uc9c0 \ud655\uc778\ud558\uc138\uc694",
"sessionRequired": "\uc774 \ud398\uc774\uc9c0\uc5d0 \uc811\uadfc\ud558\ub824\uba74 \ub85c\uadf8\uc778\ud574\uc8fc\uc138\uc694"
}
},
"provider": {
"continue": "{{provider}}\ub85c \uacc4\uc18d\ud558\uae30"
}
},
"chat": {
"input": {
"placeholder": "\uc5ec\uae30\uc5d0 \uba54\uc2dc\uc9c0\ub97c \uc785\ub825\ud558\uc138\uc694...",
"actions": {
"send": "\uba54\uc2dc\uc9c0 \ubcf4\ub0b4\uae30",
"stop": "\uc791\uc5c5 \uc911\uc9c0",
"attachFiles": "\ud30c\uc77c \ucca8\ubd80"
}
},
"favorites": {
"use": "\uc990\uaca8\ucc3e\uae30 \uba54\uc2dc\uc9c0 \uc0ac\uc6a9",
"headline": "\uc990\uaca8\ucc3e\uae30 \uba54\uc2dc\uc9c0",
"remove": "\uc990\uaca8\ucc3e\uae30 \uc81c\uac70",
"empty": {
"title": "\uc800\uc7a5\ub41c \ud504\ub86c\ud504\ud2b8\uac00 \uc544\uc9c1 \uc5c6\uc2b5\ub2c8\ub2e4",
"description": "\ud504\ub86c\ud504\ud2b8\ub97c \ubcf4\ub0b4\uace0 \ubcc4\ud45c\ub97c \ucd94\uac00\ud558\uac70\ub098 \uc774\uc804 \ub300\ud654\uc5d0\uc11c \ud504\ub86c\ud504\ud2b8\uc5d0 \ubcc4\ud45c\ub97c \ucd94\uac00\ud558\uc138\uc694"
}
},
"commands": {
"button": "\ub3c4\uad6c",
"changeTool": "\ub3c4\uad6c \ubcc0\uacbd",
"availableTools": "\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub3c4\uad6c"
},
"speech": {
"start": "\ub179\uc74c \uc2dc\uc791",
"stop": "\ub179\uc74c \uc911\uc9c0",
"connecting": "\uc5f0\uacb0 \uc911"
},
"fileUpload": {
"dragDrop": "\uc5ec\uae30\uc5d0 \ud30c\uc77c\uc744 \ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d\ud558\uc138\uc694",
"browse": "\ud30c\uc77c \ucc3e\uc544\ubcf4\uae30",
"sizeLimit": "\uc81c\ud55c:",
"errors": {
"failed": "\uc5c5\ub85c\ub4dc \uc2e4\ud328",
"cancelled": "\uc5c5\ub85c\ub4dc \ucde8\uc18c:"
},
"actions": {
"cancelUpload": "\uc5c5\ub85c\ub4dc \ucde8\uc18c",
"removeAttachment": "\ucca8\ubd80 \ud30c\uc77c \uc81c\uac70"
}
},
"messages": {
"status": {
"using": "\uc0ac\uc6a9 \uc911",
"used": "\uc0ac\uc6a9\ub428"
},
"actions": {
"copy": {
"button": "\ud074\ub9bd\ubcf4\ub4dc\ub85c \ubcf5\uc0ac",
"success": "\ubcf5\uc0ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4!"
}
},
"feedback": {
"positive": "\ub3c4\uc6c0\uc774 \ub418\uc5c8\uc74c",
"negative": "\ub3c4\uc6c0\uc774 \ub418\uc9c0 \uc54a\uc74c",
"edit": "\ud53c\ub4dc\ubc31 \uc218\uc815",
"dialog": {
"title": "\ub313\uae00 \ucd94\uac00",
"submit": "\ud53c\ub4dc\ubc31 \uc81c\ucd9c",
"yourFeedback": "\uadc0\ud558\uc758 \ud53c\ub4dc\ubc31..."
},
"status": {
"updating": "\uc5c5\ub370\uc774\ud2b8 \uc911",
"updated": "\ud53c\ub4dc\ubc31\uc774 \uc5c5\ub370\uc774\ud2b8\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
}
}
},
"history": {
"title": "\ucd5c\uadfc \uc785\ub825",
"empty": "\ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4...",
"show": "\uae30\ub85d \ud45c\uc2dc"
},
"settings": {
"title": "\uc124\uc815 \ud328\ub110",
"customize": "\uc5ec\uae30\uc5d0\uc11c \ucc44\ud305 \uc124\uc815\uc744 \uc0ac\uc6a9\uc790 \uc9c0\uc815\ud558\uc138\uc694"
},
"watermark": "LLM\uc740 \uc2e4\uc218\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc911\uc694\ud55c \uc815\ubcf4\ub294 \ud655\uc778\ud558\uc138\uc694."
},
"threadHistory": {
"sidebar": {
"title": "\uc774\uc804 \ucc44\ud305",
"filters": {
"search": "\uac80\uc0c9",
"placeholder": "\ub300\ud654 \uac80\uc0c9..."
},
"timeframes": {
"today": "\uc624\ub298",
"yesterday": "\uc5b4\uc81c",
"previous7days": "\uc9c0\ub09c 7\uc77c",
"previous30days": "\uc9c0\ub09c 30\uc77c"
},
"empty": "\uc2a4\ub808\ub4dc\ub97c \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
"actions": {
"close": "\uc0ac\uc774\ub4dc\ubc14 \ub2eb\uae30",
"open": "\uc0ac\uc774\ub4dc\ubc14 \uc5f4\uae30"
}
},
"thread": {
"untitled": "\uc81c\ubaa9 \uc5c6\ub294 \ub300\ud654",
"menu": {
"rename": "\uc774\ub984 \ubcc0\uacbd",
"share": "\uacf5\uc720",
"delete": "\uc0ad\uc81c"
},
"actions": {
"share": {
"title": "\ucc44\ud305 \ub9c1\ud06c \uacf5\uc720",
"button": "\uacf5\uc720",
"status": {
"copied": "\ub9c1\ud06c \ubcf5\uc0ac\ub428",
"created": "\uacf5\uc720 \ub9c1\ud06c\uac00 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4!",
"unshared": "\uc774 \uc2a4\ub808\ub4dc\uc758 \uacf5\uc720\uac00 \ube44\ud65c\uc131\ud654\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
},
"error": {
"create": "\uacf5\uc720 \ub9c1\ud06c \uc0dd\uc131 \uc2e4\ud328",
"unshare": "\uc2a4\ub808\ub4dc \uacf5\uc720 \ud574\uc81c \uc2e4\ud328"
}
},
"delete": {
"title": "\uc0ad\uc81c \ud655\uc778",
"description": "\uc774\ub807\uac8c \ud558\uba74 \uc2a4\ub808\ub4dc\uc640 \uadf8 \uba54\uc2dc\uc9c0 \ubc0f \uc694\uc18c\uac00 \uc0ad\uc81c\ub429\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc740 \ucde8\uc18c\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4",
"success": "\ucc44\ud305\uc774 \uc0ad\uc81c\ub418\uc5c8\uc2b5\ub2c8\ub2e4",
"inProgress": "\ucc44\ud305 \uc0ad\uc81c \uc911"
},
"rename": {
"title": "\uc2a4\ub808\ub4dc \uc774\ub984 \ubcc0\uacbd",
"description": "\uc774 \uc2a4\ub808\ub4dc\uc758 \uc0c8 \uc774\ub984\uc744 \uc785\ub825\ud558\uc138\uc694",
"form": {
"name": {
"label": "\uc774\ub984",
"placeholder": "\uc0c8 \uc774\ub984 \uc785\ub825"
}
},
"success": "\uc2a4\ub808\ub4dc \uc774\ub984\uc774 \ubcc0\uacbd\ub418\uc5c8\uc2b5\ub2c8\ub2e4!",
"inProgress": "\uc2a4\ub808\ub4dc \uc774\ub984 \ubcc0\uacbd \uc911"
}
}
}
},
"navigation": {
"header": {
"chat": "\ucc44\ud305",
"readme": "\uc77d\uc5b4\ubcf4\uae30",
"theme": {
"light": "\ubc1d\uc740 \ud14c\ub9c8",
"dark": "\uc5b4\ub450\uc6b4 \ud14c\ub9c8",
"system": "\uc2dc\uc2a4\ud15c \ub530\ub77c\uac00\uae30"
}
},
"newChat": {
"button": "\uc0c8 \ucc44\ud305",
"dialog": {
"title": "\uc0c8 \ucc44\ud305 \ub9cc\ub4e4\uae30",
"description": "\uc774\ub807\uac8c \ud558\uba74 \ud604\uc7ac \ucc44\ud305 \uae30\ub85d\uc774 \uc9c0\uc6cc\uc9d1\ub2c8\ub2e4. \uacc4\uc18d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?",
"tooltip": "\uc0c8 \ucc44\ud305"
}
},
"user": {
"menu": {
"settings": "\uc124\uc815",
"settingsKey": "S",
"apiKeys": "API \ud0a4",
"logout": "\ub85c\uadf8\uc544\uc6c3"
}
}
},
"apiKeys": {
"title": "\ud544\uc694\ud55c API \ud0a4",
"description": "\uc774 \uc571\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \ub2e4\uc74c API \ud0a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \ud0a4\ub294 \uae30\uae30\uc758 \ub85c\uceec \uc800\uc7a5\uc18c\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4.",
"success": {
"saved": "\uc131\uacf5\uc801\uc73c\ub85c \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4"
}
},
"alerts": {
"info": "\uc815\ubcf4",
"note": "\ucc38\uace0",
"tip": "\ud301",
"important": "\uc911\uc694",
"warning": "\uacbd\uace0",
"caution": "\uc8fc\uc758",
"debug": "\ub514\ubc84\uadf8",
"example": "\uc608\uc2dc",
"success": "\uc131\uacf5",
"help": "\ub3c4\uc6c0\ub9d0",
"idea": "\uc544\uc774\ub514\uc5b4",
"pending": "\ub300\uae30 \uc911",
"security": "\ubcf4\uc548",
"beta": "\ubca0\ud0c0",
"best-practice": "\ubaa8\ubc94 \uc0ac\ub840"
},
"components": {
"MultiSelectInput": {
"placeholder": "\uc120\ud0dd..."
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15",
"confirm": "\u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"continue": "\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15",
"goBack": "\u0d24\u0d3f\u0d30\u0d3f\u0d15\u0d46 \u0d2a\u0d4b\u0d15\u0d41\u0d15",
"reset": "\u0d2a\u0d41\u0d28\u0d03\u0d38\u0d1c\u0d4d\u0d1c\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d41\u0d15",
"submit": "\u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15"
},
"status": {
"loading": "\u0d32\u0d4b\u0d21\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41...",
"error": {
"default": "\u0d12\u0d30\u0d41 \u0d2a\u0d3f\u0d36\u0d15\u0d4d \u0d38\u0d02\u0d2d\u0d35\u0d3f\u0d1a\u0d4d\u0d1a\u0d41",
"serverConnection": "\u0d38\u0d46\u0d7c\u0d35\u0d31\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2c\u0d28\u0d4d\u0d27\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32"
}
}
},
"auth": {
"login": {
"title": "\u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d32\u0d4b\u0d17\u0d3f\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"form": {
"email": {
"label": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d35\u0d3f\u0d32\u0d3e\u0d38\u0d02",
"required": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d",
"required": "\u0d2a\u0d3e\u0d38\u0d4d\u200c\u0d35\u0d47\u0d21\u0d4d \u0d12\u0d30\u0d41 \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d2b\u0d40\u0d7d\u0d21\u0d4d \u0d06\u0d23\u0d4d"
},
"actions": {
"signin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b"
},
"alternativeText": {
"or": "\u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d"
}
},
"errors": {
"default": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32",
"signin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"oauthSignin": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"redirectUriMismatch": "\u0d31\u0d40\u0d21\u0d2f\u0d31\u0d15\u0d4d\u0d1f\u0d4d URI oauth \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d15\u0d4b\u0d7a\u0d2b\u0d3f\u0d17\u0d31\u0d47\u0d37\u0d28\u0d41\u0d2e\u0d3e\u0d2f\u0d3f \u0d2a\u0d4a\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d3f\u0d32\u0d4d\u0d32",
"oauthCallback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"oauthCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"emailCreateAccount": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"callback": "\u0d2e\u0d31\u0d4d\u0d31\u0d4a\u0d30\u0d41 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d36\u0d4d\u0d30\u0d2e\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"oauthAccountNotLinked": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d35\u0d4d\u0d2f\u0d15\u0d4d\u0d24\u0d3f\u0d24\u0d4d\u0d35\u0d02 \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d06\u0d26\u0d4d\u0d2f\u0d02 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a \u0d05\u0d24\u0d47 \u0d05\u0d15\u0d4d\u0d15\u0d57\u0d23\u0d4d\u0d1f\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"emailSignin": "\u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e\u0d3f\u0d32\u0d4d\u0d32",
"emailVerify": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15, \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d07\u0d2e\u0d46\u0d2f\u0d3f\u0d7d \u0d05\u0d2f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d4d\u0d1f\u0d41\u0d23\u0d4d\u0d1f\u0d4d",
"credentialsSignin": "\u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41. \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d7e \u0d28\u0d7d\u0d15\u0d3f\u0d2f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d36\u0d30\u0d3f\u0d2f\u0d3e\u0d23\u0d46\u0d28\u0d4d\u0d28\u0d4d \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"sessionRequired": "\u0d08 \u0d2a\u0d47\u0d1c\u0d4d \u0d06\u0d15\u0d4d\u0d38\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d3e\u0d7b \u0d26\u0d2f\u0d35\u0d3e\u0d2f\u0d3f \u0d38\u0d48\u0d7b \u0d07\u0d7b \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
}
},
"provider": {
"continue": "{{provider}} \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d4d \u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15"
}
},
"chat": {
"input": {
"placeholder": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d1f\u0d48\u0d2a\u0d4d\u0d2a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15...",
"actions": {
"send": "\u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d05\u0d2f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15",
"stop": "\u0d1f\u0d3e\u0d38\u0d4d\u0d15\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
"attachFiles": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
}
},
"favorites": {
"use": "\u0d2a\u0d4d\u0d30\u0d3f\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d02 \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"headline": "\u0d2a\u0d4d\u0d30\u0d3f\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d7e",
"remove": "\u0d07\u0d37\u0d4d\u0d1f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d24\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"empty": {
"title": "\u0d07\u0d24\u0d41\u0d35\u0d30\u0d46 \u0d38\u0d02\u0d30\u0d15\u0d4d\u0d37\u0d3f\u0d1a\u0d4d\u0d1a \u0d2a\u0d4d\u0d30\u0d4b\u0d02\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d33\u0d4a\u0d28\u0d4d\u0d28\u0d41\u0d2e\u0d3f\u0d32\u0d4d\u0d32",
"description": "\u0d12\u0d30\u0d41 \u0d2a\u0d4d\u0d30\u0d4b\u0d02\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d4d \u0d05\u0d2f\u0d1a\u0d4d\u0d1a\u0d4d \u0d05\u0d24\u0d3f\u0d28\u0d4d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d3e\u0d7c \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41\u0d15\u0d4a\u0d23\u0d4d\u0d1f\u0d4d \u0d06\u0d30\u0d02\u0d2d\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15 \u0d05\u0d32\u0d4d\u0d32\u0d46\u0d19\u0d4d\u0d15\u0d3f\u0d7d \u0d2e\u0d41\u0d7b \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d33\u0d3f\u0d7d \u0d28\u0d3f\u0d28\u0d4d\u0d28\u0d4d \u0d12\u0d30\u0d41 \u0d2a\u0d4d\u0d30\u0d4b\u0d02\u0d2a\u0d4d\u0d31\u0d4d\u0d31\u0d3f\u0d28\u0d4d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d3e\u0d7c \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
}
},
"commands": {
"button": "\u0d09\u0d2a\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e",
"changeTool": "\u0d09\u0d2a\u0d15\u0d30\u0d23\u0d02 \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15",
"availableTools": "\u0d32\u0d2d\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e"
},
"speech": {
"start": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d06\u0d30\u0d02\u0d2d\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"stop": "\u0d31\u0d46\u0d15\u0d4d\u0d15\u0d4b\u0d7c\u0d21\u0d3f\u0d02\u0d17\u0d4d \u0d28\u0d3f\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
"connecting": "\u0d2c\u0d28\u0d4d\u0d27\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41"
},
"fileUpload": {
"dragDrop": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d07\u0d35\u0d3f\u0d1f\u0d46 \u0d35\u0d32\u0d3f\u0d1a\u0d4d\u0d1a\u0d3f\u0d1f\u0d41\u0d15",
"browse": "\u0d2b\u0d2f\u0d32\u0d41\u0d15\u0d7e \u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15",
"sizeLimit": "\u0d2a\u0d30\u0d3f\u0d27\u0d3f:",
"errors": {
"failed": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41",
"cancelled": "\u0d05\u0d2a\u0d4d\u200c\u0d32\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d3e\u0d15\u0d4d\u0d15\u0d3f"
},
"actions": {
"cancelUpload": "\u0d05\u0d2a\u0d4d\u200c\u0cb2\u0d4b\u0d21\u0d4d \u0d31\u0d26\u0d4d\u0d26\u0d41\u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"removeAttachment": "\u0d05\u0d31\u0d4d\u0d31\u0d3e\u0d1a\u0d4d\u0d1a\u0d4d\u200c\u0d2e\u0d46\u0d28\u0d4d\u0d31\u0d4d \u0d28\u0d40\u0d15\u0d4d\u0d15\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
}
},
"messages": {
"status": {
"using": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d41",
"used": "\u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d1a\u0d4d\u0d1a\u0d41"
},
"actions": {
"copy": {
"button": "\u0d15\u0d4d\u0d32\u0d3f\u0d2a\u0d4d\u0d2a\u0d4d\u0d2c\u0d4b\u0d7c\u0d21\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d41\u0d15",
"success": "\u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f!"
}
},
"feedback": {
"positive": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d02",
"negative": "\u0d38\u0d39\u0d3e\u0d2f\u0d15\u0d30\u0d2e\u0d32\u0d4d\u0d32",
"edit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d0e\u0d21\u0d3f\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"dialog": {
"title": "\u0d12\u0d30\u0d41 \u0d15\u0d2e\u0d28\u0d4d\u0d31\u0d4d \u0d1a\u0d47\u0d7c\u0d15\u0d4d\u0d15\u0d41\u0d15",
"submit": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d38\u0d2e\u0d7c\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"yourFeedback": "\u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d2a\u0d4d\u0d30\u0d24\u0d3f\u0d15\u0d30\u0d23\u0d02..."
},
"status": {
"updating": "\u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41",
"updated": "\u0d2b\u0d40\u0d21\u0d4d\u0d2c\u0d3e\u0d15\u0d4d\u0d15\u0d4d \u0d05\u0d2a\u0d4d\u0d21\u0d47\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41"
}
}
},
"history": {
"title": "\u0d05\u0d35\u0d38\u0d3e\u0d28 \u0d07\u0d7b\u0d2a\u0d41\u0d1f\u0d4d\u0d1f\u0d41\u0d15\u0d7e",
"empty": "\u0d12\u0d28\u0d4d\u0d28\u0d41\u0d2e\u0d3f\u0d32\u0d4d\u0d32...",
"show": "\u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15"
},
"settings": {
"title": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d3e\u0d28\u0d7d",
"customize": "\u0d08 \u0d38\u0d2e\u0d2f\u0d02 \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e \u0d15\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d2e\u0d48\u0d38\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15"
},
"watermark": "LLM \u0d15\u0d7e\u0d15\u0d4d\u0d15\u0d4d \u0d24\u0d46\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e \u0d35\u0d30\u0d41\u0d24\u0d4d\u0d24\u0d3e\u0d02. \u0d2a\u0d4d\u0d30\u0d27\u0d3e\u0d28\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f \u0d35\u0d3f\u0d35\u0d30\u0d19\u0d4d\u0d19\u0d7e \u0d2a\u0d30\u0d3f\u0d36\u0d4b\u0d27\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d28\u0d4d\u0d28\u0d24\u0d4d \u0d2a\u0d30\u0d3f\u0d17\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15."
},
"threadHistory": {
"sidebar": {
"title": "\u0d2e\u0d41\u0d7b \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15\u0d7e",
"filters": {
"search": "\u0d24\u0d3f\u0d30\u0d2f\u0d41\u0d15",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0d07\u0d28\u0d4d\u0d28\u0d4d",
"yesterday": "\u0d07\u0d28\u0d4d\u0d28\u0d32\u0d46",
"previous7days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 7 \u0d26\u0d3f\u0d35\u0d38\u0d02",
"previous30days": "\u0d15\u0d34\u0d3f\u0d1e\u0d4d\u0d1e 30 \u0d26\u0d3f\u0d35\u0d38\u0d02"
},
"empty": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d15\u0d7e \u0d15\u0d23\u0d4d\u0d1f\u0d46\u0d24\u0d4d\u0d24\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32",
"actions": {
"close": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d05\u0d1f\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d15",
"open": "\u0d38\u0d48\u0d21\u0d4d\u0d2c\u0d3e\u0d7c \u0d24\u0d41\u0d31\u0d15\u0d4d\u0d15\u0d41\u0d15"
}
},
"thread": {
"untitled": "\u0d2a\u0d47\u0d30\u0d3f\u0d32\u0d4d\u0d32\u0d3e\u0d24\u0d4d\u0d24 \u0d38\u0d02\u0d2d\u0d3e\u0d37\u0d23\u0d02",
"menu": {
"rename": "\u0d2a\u0d47\u0d30\u0d4d \u0d2e\u0d3e\u0d31\u0d4d\u0d31\u0d41\u0d15",
"share": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
"delete": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d"
},
"actions": {
"share": {
"title": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d3f\u0d32\u0d47\u0d15\u0d4d\u0d15\u0d4d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
"button": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d41\u0d15",
"status": {
"copied": "\u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d2a\u0d15\u0d7c\u0d24\u0d4d\u0d24\u0d3f",
"created": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d1a\u0d4d\u0d1a\u0d41!",
"unshared": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d3e\u0d2f\u0d3f \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d05\u0d2a\u0d4d\u0d30\u0d3e\u0d2a\u0d4d\u0d24\u0d2e\u0d3e\u0d15\u0d4d\u0d15\u0d3f"
},
"error": {
"create": "\u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d32\u0d3f\u0d19\u0d4d\u0d15\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41",
"unshare": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d19\u0d4d\u0d15\u0d3f\u0d1f\u0d7d \u0d05\u0d35\u0d38\u0d3e\u0d28\u0d3f\u0d2a\u0d4d\u0d2a\u0d3f\u0d15\u0d4d\u0d15\u0d7d \u0d2a\u0d30\u0d3e\u0d1c\u0d2f\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d4d\u0d1f\u0d41"
}
},
"delete": {
"title": "\u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d4d\u0d25\u0d3f\u0d30\u0d40\u0d15\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"description": "\u0d07\u0d24\u0d4d \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d41\u0d02 \u0d05\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d38\u0d28\u0d4d\u0d26\u0d47\u0d36\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d18\u0d1f\u0d15\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d02 \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d02. \u0d08 \u0d2a\u0d4d\u0d30\u0d35\u0d7c\u0d24\u0d4d\u0d24\u0d3f \u0d2a\u0d34\u0d2f\u0d2a\u0d1f\u0d3f\u0d2f\u0d3e\u0d15\u0d4d\u0d15\u0d3e\u0d7b \u0d15\u0d34\u0d3f\u0d2f\u0d3f\u0d32\u0d4d\u0d32",
"success": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41",
"inProgress": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d21\u0d3f\u0d32\u0d40\u0d31\u0d4d\u0d31\u0d4d \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41"
},
"rename": {
"title": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d15",
"description": "\u0d08 \u0d24\u0d4d\u0d30\u0d46\u0d21\u0d3f\u0d28\u0d4d \u0d12\u0d30\u0d41 \u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15",
"form": {
"name": {
"label": "\u0d2a\u0d47\u0d30\u0d4d",
"placeholder": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d2a\u0d47\u0d30\u0d4d \u0d28\u0d7d\u0d15\u0d41\u0d15"
}
},
"success": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d24\u0d41!",
"inProgress": "\u0d24\u0d4d\u0d30\u0d46\u0d21\u0d4d \u0d2a\u0d41\u0d28\u0d7c\u0d28\u0d3e\u0d2e\u0d15\u0d30\u0d23\u0d02 \u0d1a\u0d46\u0d2f\u0d4d\u0d2f\u0d41\u0d28\u0d4d\u0d28\u0d41"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d",
"readme": "\u0d35\u0d3e\u0d2f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d",
"dialog": {
"title": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d38\u0d43\u0d37\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15",
"description": "\u0d07\u0d24\u0d4d \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d28\u0d3f\u0d32\u0d35\u0d3f\u0d32\u0d46 \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d \u0d39\u0d3f\u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d31\u0d3f \u0d2e\u0d3e\u0d2f\u0d4d\u0d15\u0d4d\u0d15\u0d41\u0d02. \u0d24\u0d41\u0d1f\u0d30\u0d3e\u0d7b \u0d24\u0d3e\u0d7d\u0d2a\u0d4d\u0d2a\u0d30\u0d4d\u0d2f\u0d2e\u0d41\u0d23\u0d4d\u0d1f\u0d4b?",
"tooltip": "\u0d2a\u0d41\u0d24\u0d3f\u0d2f \u0d1a\u0d3e\u0d31\u0d4d\u0d31\u0d4d"
}
},
"user": {
"menu": {
"settings": "\u0d15\u0d4d\u0d30\u0d2e\u0d40\u0d15\u0d30\u0d23\u0d19\u0d4d\u0d19\u0d7e",
"settingsKey": "S",
"apiKeys": "API \u0d15\u0d40\u0d15\u0d7e",
"logout": "\u0d32\u0d4b\u0d17\u0d4d\u0d14\u0d1f\u0d4d\u0d1f\u0d4d"
}
}
},
"apiKeys": {
"title": "\u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d2f API \u0d15\u0d40\u0d15\u0d7e",
"description": "\u0d08 \u0d06\u0d2a\u0d4d\u0d2a\u0d4d \u0d09\u0d2a\u0d2f\u0d4b\u0d17\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d7b, \u0d24\u0d3e\u0d34\u0d46\u0d2a\u0d4d\u0d2a\u0d31\u0d2f\u0d41\u0d28\u0d4d\u0d28 API \u0d15\u0d40\u0d15\u0d7e \u0d06\u0d35\u0d36\u0d4d\u0d2f\u0d2e\u0d3e\u0d23\u0d4d. \u0d15\u0d40\u0d15\u0d7e \u0d28\u0d3f\u0d19\u0d4d\u0d19\u0d33\u0d41\u0d1f\u0d46 \u0d09\u0d2a\u0d15\u0d30\u0d23\u0d24\u0d4d\u0d24\u0d3f\u0d28\u0d4d\u0d31\u0d46 \u0d32\u0d4b\u0d15\u0d4d\u0d15\u0d7d \u0d38\u0d4d\u0d31\u0d4d\u0d31\u0d4b\u0d31\u0d47\u0d1c\u0d3f\u0d7d \u0d38\u0d02\u0d2d\u0d30\u0d3f\u0d15\u0d4d\u0d15\u0d2a\u0d4d\u0d2a\u0d46\u0d1f\u0d41\u0d28\u0d4d\u0d28\u0d41.",
"success": {
"saved": "\u0d35\u0d3f\u0d1c\u0d2f\u0d15\u0d30\u0d2e\u0d3e\u0d2f\u0d3f \u0d38\u0d02\u0d30\u0d15\u0d4d\u0d37\u0d3f\u0d1a\u0d4d\u0d1a\u0d41"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0d1a\u0d42\u0d23\u0d4d\u0d1f\u0d3f\u0d15\u0d4d\u0d15\u0d3e\u0d23\u0d3f\u0d15\u0d4d\u0d15\u0d41\u0d15..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0d24\u0d40\u0d2f\u0d24\u0d3f \u0d24\u0d3f\u0d30\u0d1e\u0d4d\u0d1e\u0d46\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15",
"range": "\u0d24\u0d40\u0d2f\u0d24\u0d3f \u0d36\u0d4d\u0d30\u0d47\u0d23\u0d3f \u0d24\u0d3f\u0d30\u0d1e\u0d4d\u0d1e\u0d46\u0d1f\u0d41\u0d15\u0d4d\u0d15\u0d41\u0d15"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
"confirm": "\u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
"continue": "\u092a\u0941\u0922\u0947 \u091c\u093e",
"goBack": "\u092e\u093e\u0917\u0947 \u091c\u093e",
"reset": "\u0930\u0940\u0938\u0947\u091f \u0915\u0930\u093e",
"submit": "\u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e"
},
"status": {
"loading": "\u0932\u094b\u0921 \u0915\u0930\u0924 \u0906\u0939\u0947...",
"error": {
"default": "\u090f\u0915 \u0924\u094d\u0930\u0941\u091f\u0940 \u0906\u0932\u0940",
"serverConnection": "\u0938\u0930\u094d\u0935\u094d\u0939\u0930\u0936\u0940 \u0915\u0928\u0947\u0915\u094d\u091f \u0939\u094b\u090a \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940"
}
}
},
"auth": {
"login": {
"title": "\u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0932\u0949\u0917\u093f\u0928 \u0915\u0930\u093e",
"form": {
"email": {
"label": "\u0908\u092e\u0947\u0932 \u092a\u0924\u094d\u0924\u093e",
"required": "\u0908\u092e\u0947\u0932 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947",
"placeholder": "me@example.com"
},
"password": {
"label": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921",
"required": "\u092a\u093e\u0938\u0935\u0930\u094d\u0921 \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947"
},
"actions": {
"signin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e"
},
"alternativeText": {
"or": "\u0915\u093f\u0902\u0935\u093e"
}
},
"errors": {
"default": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0942 \u0936\u0915\u0924 \u0928\u093e\u0939\u0940",
"signin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"oauthSignin": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"redirectUriMismatch": "\u0930\u0940\u0921\u093e\u092f\u0930\u0947\u0915\u094d\u091f URI \u0913\u0925 \u0905\u0945\u092a \u0915\u0949\u0928\u094d\u092b\u093f\u0917\u0930\u0947\u0936\u0928\u0936\u0940 \u091c\u0941\u0933\u0924 \u0928\u093e\u0939\u0940",
"oauthCallback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"oauthCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"emailCreateAccount": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"callback": "\u0935\u0947\u0917\u0933\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947 \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u0923\u094d\u092f\u093e\u091a\u093e \u092a\u094d\u0930\u092f\u0924\u094d\u0928 \u0915\u0930\u093e",
"oauthAccountNotLinked": "\u0924\u0941\u092e\u091a\u0940 \u0913\u0933\u0916 \u092a\u091f\u0935\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940, \u092e\u0942\u0933 \u0935\u093e\u092a\u0930\u0932\u0947\u0932\u094d\u092f\u093e \u0916\u093e\u0924\u094d\u092f\u093e\u0928\u0947\u091a \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e",
"emailSignin": "\u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0942 \u0936\u0915\u0932\u0947 \u0928\u093e\u0939\u0940",
"emailVerify": "\u0915\u0943\u092a\u092f\u093e \u0924\u0941\u092e\u091a\u093e \u0908\u092e\u0947\u0932 \u0924\u092a\u093e\u0938\u093e, \u0928\u0935\u0940\u0928 \u0908\u092e\u0947\u0932 \u092a\u093e\u0920\u0935\u0932\u093e \u0917\u0947\u0932\u093e \u0906\u0939\u0947",
"credentialsSignin": "\u0938\u093e\u0907\u0928 \u0907\u0928 \u0905\u092f\u0936\u0938\u094d\u0935\u0940. \u0924\u0941\u092e\u094d\u0939\u0940 \u0926\u093f\u0932\u0947\u0932\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u092f\u094b\u0917\u094d\u092f \u0906\u0939\u0947 \u0915\u093e \u0924\u0947 \u0924\u092a\u093e\u0938\u093e",
"sessionRequired": "\u092f\u093e \u092a\u0943\u0937\u094d\u0920\u093e\u0935\u0930 \u092a\u094d\u0930\u0935\u0947\u0936 \u0915\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0915\u0943\u092a\u092f\u093e \u0938\u093e\u0907\u0928 \u0907\u0928 \u0915\u0930\u093e"
}
},
"provider": {
"continue": "{{provider}} \u0938\u0939 \u092a\u0941\u0922\u0947 \u091c\u093e"
}
},
"chat": {
"input": {
"placeholder": "\u0924\u0941\u092e\u091a\u093e \u0938\u0902\u0926\u0947\u0936 \u092f\u0947\u0925\u0947 \u091f\u093e\u0907\u092a \u0915\u0930\u093e...",
"actions": {
"send": "\u0938\u0902\u0926\u0947\u0936 \u092a\u093e\u0920\u0935\u093e",
"stop": "\u0915\u093e\u0930\u094d\u092f \u0925\u093e\u0902\u092c\u0935\u093e",
"attachFiles": "\u092b\u093e\u0907\u0932\u094d\u0938 \u091c\u094b\u0921\u093e"
}
},
"speech": {
"start": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0938\u0941\u0930\u0942 \u0915\u0930\u093e",
"stop": "\u0930\u0947\u0915\u0949\u0930\u094d\u0921\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u093e",
"connecting": "\u0915\u0928\u0947\u0915\u094d\u091f \u0915\u0930\u0924 \u0906\u0939\u0947"
},
"favorites": {
"use": "\u0906\u0935\u0921\u0924\u093e \u0938\u0902\u0926\u0947\u0936 \u0935\u093e\u092a\u0930\u093e",
"headline": "\u0906\u0935\u0921\u0924\u0947 \u0938\u0902\u0926\u0947\u0936",
"remove": "\u0906\u0935\u0921\u0924\u093e \u0938\u0902\u0926\u0947\u0936 \u0915\u093e\u0922\u093e",
"empty": {
"title": "\u0905\u0926\u094d\u092f\u093e\u092a \u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f \u091c\u0924\u0928 \u0915\u0947\u0932\u0947\u0932\u0947 \u0928\u093e\u0939\u0940\u0924",
"description": "\u090f\u0915 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f \u092a\u093e\u0920\u0935\u0942\u0928 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u0935\u0930 \u0938\u094d\u091f\u093e\u0930 \u0915\u0930\u0942\u0928 \u0938\u0941\u0930\u0941\u0935\u093e\u0924 \u0915\u0930\u093e \u0915\u093f\u0902\u0935\u093e \u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u092e\u0927\u0942\u0928 \u092a\u094d\u0930\u0949\u092e\u094d\u092a\u094d\u091f\u0935\u0930 \u0938\u094d\u091f\u093e\u0930 \u0915\u0930\u093e"
}
},
"commands": {
"button": "\u0938\u093e\u0927\u0928\u0947",
"changeTool": "\u0938\u093e\u0927\u0928 \u092c\u0926\u0932\u093e",
"availableTools": "\u0909\u092a\u0932\u092c\u094d\u0927 \u0938\u093e\u0927\u0928\u0947"
},
"fileUpload": {
"dragDrop": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092f\u0947\u0925\u0947 \u0921\u094d\u0930\u0945\u0917 \u0906\u0923\u093f \u0921\u094d\u0930\u0949\u092a \u0915\u0930\u093e",
"browse": "\u092b\u093e\u0907\u0932\u094d\u0938 \u092c\u094d\u0930\u093e\u0909\u091d \u0915\u0930\u093e",
"sizeLimit": "\u092e\u0930\u094d\u092f\u093e\u0926\u093e:",
"errors": {
"failed": "\u0905\u092a\u0932\u094b\u0921 \u0905\u092f\u0936\u0938\u094d\u0935\u0940",
"cancelled": "\u092f\u093e\u0902\u091a\u0947 \u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0947\u0932\u0947"
},
"actions": {
"cancelUpload": "\u0905\u092a\u0932\u094b\u0921 \u0930\u0926\u094d\u0926 \u0915\u0930\u093e",
"removeAttachment": "\u0905\u091f\u0945\u091a\u092e\u0947\u0902\u091f \u0915\u093e\u0922\u093e"
}
},
"messages": {
"status": {
"using": "\u0935\u093e\u092a\u0930\u0924 \u0906\u0939\u0947",
"used": "\u0935\u093e\u092a\u0930\u0932\u0947"
},
"actions": {
"copy": {
"button": "\u0915\u094d\u0932\u093f\u092a\u092c\u094b\u0930\u094d\u0921\u0935\u0930 \u0915\u0949\u092a\u0940 \u0915\u0930\u093e",
"success": "\u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u0947!"
}
},
"feedback": {
"positive": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924",
"negative": "\u0909\u092a\u092f\u0941\u0915\u094d\u0924 \u0928\u093e\u0939\u0940",
"edit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u0902\u092a\u093e\u0926\u093f\u0924 \u0915\u0930\u093e",
"dialog": {
"title": "\u091f\u093f\u092a\u094d\u092a\u0923\u0940 \u091c\u094b\u0921\u093e",
"submit": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0938\u092c\u092e\u093f\u091f \u0915\u0930\u093e",
"yourFeedback": "\u0924\u0941\u092e\u091a\u0940 \u092a\u094d\u0930\u0924\u093f\u0915\u094d\u0930\u093f\u092f\u093e..."
},
"status": {
"updating": "\u0905\u092a\u0921\u0947\u091f \u0915\u0930\u0924 \u0906\u0939\u0947",
"updated": "\u092b\u0940\u0921\u092c\u0945\u0915 \u0905\u092a\u0921\u0947\u091f \u0915\u0947\u0932\u0947"
}
}
},
"history": {
"title": "\u0936\u0947\u0935\u091f\u091a\u0947 \u0907\u0928\u092a\u0941\u091f",
"empty": "\u0930\u093f\u0915\u093e\u092e\u0947 \u0906\u0939\u0947...",
"show": "\u0907\u0924\u093f\u0939\u093e\u0938 \u0926\u093e\u0916\u0935\u093e"
},
"settings": {
"title": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u092a\u0945\u0928\u0932",
"customize": "\u092f\u093e \u0935\u0947\u0933\u0940 \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u091a\u0945\u091f \u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c \u0915\u0938\u094d\u091f\u092e\u093e\u0907\u091d \u0915\u0930\u093e"
},
"watermark": "LLM \u091a\u0941\u0915\u093e \u0915\u0930\u0942 \u0936\u0915\u0924\u093e\u0924. \u092e\u0939\u0924\u094d\u0924\u094d\u0935\u093e\u091a\u0940 \u092e\u093e\u0939\u093f\u0924\u0940 \u0924\u092a\u093e\u0938\u0923\u094d\u092f\u093e\u091a\u093e \u0935\u093f\u091a\u093e\u0930 \u0915\u0930\u093e."
},
"threadHistory": {
"sidebar": {
"title": "\u092e\u093e\u0917\u0940\u0932 \u091a\u0945\u091f\u094d\u0938",
"filters": {
"search": "\u0936\u094b\u0927\u093e",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0906\u091c",
"yesterday": "\u0915\u093e\u0932",
"previous7days": "\u092e\u093e\u0917\u0940\u0932 7 \u0926\u093f\u0935\u0938",
"previous30days": "\u092e\u093e\u0917\u0940\u0932 30 \u0926\u093f\u0935\u0938"
},
"empty": "\u0915\u094b\u0923\u0924\u0947\u0939\u0940 \u0925\u094d\u0930\u0947\u0921 \u0938\u093e\u092a\u0921\u0932\u0947 \u0928\u093e\u0939\u0940\u0924",
"actions": {
"close": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u092c\u0902\u0926 \u0915\u0930\u093e",
"open": "\u0938\u093e\u0907\u0921\u092c\u093e\u0930 \u0909\u0918\u0921\u093e"
}
},
"thread": {
"untitled": "\u0936\u0940\u0930\u094d\u0937\u0915\u0935\u093f\u0930\u0939\u093f\u0924 \u0938\u0902\u092d\u093e\u0937\u0923",
"menu": {
"rename": "\u0928\u093e\u0935 \u092c\u0926\u0932\u093e",
"share": "\u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
"delete": "\u0939\u091f\u0935\u093e"
},
"actions": {
"share": {
"title": "\u091a\u0945\u091f\u091a\u093e \u0926\u0941\u0935\u093e \u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
"button": "\u0936\u0947\u0905\u0930 \u0915\u0930\u093e",
"status": {
"copied": "\u0926\u0941\u0935\u093e \u0915\u0949\u092a\u0940 \u0915\u0947\u0932\u093e",
"created": "\u0936\u0947\u0905\u0930 \u0926\u0941\u0935\u093e \u0924\u092f\u093e\u0930 \u091d\u093e\u0932\u093e!",
"unshared": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0936\u0947\u0905\u0930\u093f\u0902\u0917 \u0905\u0915\u094d\u0937\u092e \u0915\u0947\u0932\u0947"
},
"error": {
"create": "\u0936\u0947\u0905\u0930 \u0926\u0941\u0935\u093e \u0924\u092f\u093e\u0930 \u0915\u0930\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936",
"unshare": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0936\u0947\u0905\u0930\u093f\u0902\u0917 \u0925\u093e\u0902\u092c\u0935\u0923\u094d\u092f\u093e\u0924 \u0905\u092a\u092f\u0936"
}
},
"delete": {
"title": "\u0939\u091f\u0935\u093f\u0923\u094d\u092f\u093e\u091a\u0940 \u092a\u0941\u0937\u094d\u091f\u0940 \u0915\u0930\u093e",
"description": "\u0939\u0947 \u0925\u094d\u0930\u0947\u0921 \u0906\u0923\u093f \u0924\u094d\u092f\u093e\u091a\u0947 \u0938\u0902\u0926\u0947\u0936 \u0935 \u0918\u091f\u0915 \u0939\u091f\u0935\u0947\u0932. \u0939\u0940 \u0915\u094d\u0930\u093f\u092f\u093e \u092a\u0942\u0930\u094d\u0935\u0935\u0924 \u0915\u0947\u0932\u0940 \u091c\u093e\u090a \u0936\u0915\u0924 \u0928\u093e\u0939\u0940",
"success": "\u091a\u0945\u091f \u0939\u091f\u0935\u0932\u093e",
"inProgress": "\u091a\u0945\u091f \u0939\u091f\u0935\u0924 \u0906\u0939\u0947"
},
"rename": {
"title": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u093e",
"description": "\u092f\u093e \u0925\u094d\u0930\u0947\u0921\u0938\u093e\u0920\u0940 \u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e",
"form": {
"name": {
"label": "\u0928\u093e\u0935",
"placeholder": "\u0928\u0935\u0940\u0928 \u0928\u093e\u0935 \u092a\u094d\u0930\u0935\u093f\u0937\u094d\u091f \u0915\u0930\u093e"
}
},
"success": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0932\u0947!",
"inProgress": "\u0925\u094d\u0930\u0947\u0921\u091a\u0947 \u0928\u093e\u0935 \u092c\u0926\u0932\u0924 \u0906\u0939\u0947"
}
}
}
},
"navigation": {
"header": {
"chat": "\u091a\u0945\u091f",
"readme": "\u0935\u093e\u091a\u093e",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f",
"dialog": {
"title": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f \u0924\u092f\u093e\u0930 \u0915\u0930\u093e",
"description": "\u0939\u0947 \u0924\u0941\u092e\u091a\u093e \u0938\u0927\u094d\u092f\u093e\u091a\u093e \u091a\u0945\u091f \u0907\u0924\u093f\u0939\u093e\u0938 \u0938\u093e\u092b \u0915\u0930\u0947\u0932. \u0924\u0941\u092e\u094d\u0939\u093e\u0932\u093e \u0916\u093e\u0924\u094d\u0930\u0940 \u0906\u0939\u0947 \u0915\u0940 \u0924\u0941\u092e\u094d\u0939\u0940 \u092a\u0941\u0922\u0947 \u091c\u093e\u090a \u0907\u091a\u094d\u091b\u093f\u0924\u093e?",
"tooltip": "\u0928\u0935\u0940\u0928 \u091a\u0945\u091f"
}
},
"user": {
"menu": {
"settings": "\u0938\u0947\u091f\u093f\u0902\u0917\u094d\u091c",
"settingsKey": "S",
"apiKeys": "API \u0915\u0940\u091c",
"logout": "\u0932\u0949\u0917\u0906\u0909\u091f"
}
}
},
"apiKeys": {
"title": "\u0906\u0935\u0936\u094d\u092f\u0915 API \u0915\u0940\u091c",
"description": "\u0939\u0947 \u0905\u0945\u092a \u0935\u093e\u092a\u0930\u0923\u094d\u092f\u093e\u0938\u093e\u0920\u0940 \u0916\u093e\u0932\u0940\u0932 API \u0915\u0940\u091c \u0906\u0935\u0936\u094d\u092f\u0915 \u0906\u0939\u0947\u0924. \u0915\u0940\u091c \u0924\u0941\u092e\u091a\u094d\u092f\u093e \u0921\u093f\u0935\u094d\u0939\u093e\u0907\u0938\u091a\u094d\u092f\u093e \u0932\u094b\u0915\u0932 \u0938\u094d\u091f\u094b\u0930\u0947\u091c\u092e\u0927\u094d\u092f\u0947 \u0938\u093e\u0920\u0935\u0932\u094d\u092f\u093e \u091c\u093e\u0924\u093e\u0924.",
"success": {
"saved": "\u092f\u0936\u0938\u094d\u0935\u0940\u0930\u093f\u0924\u094d\u092f\u093e \u091c\u0924\u0928 \u0915\u0947\u0932\u0947"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u091a\u0941\u0928\u0947\u0902..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0924\u093e\u0930\u0940\u0916 \u0928\u093f\u0935\u0921\u093e",
"range": "\u0924\u093e\u0930\u0940\u0916 \u0936\u094d\u0930\u0947\u0923\u0940 \u0928\u093f\u0935\u0921\u093e"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "Annuleren",
"confirm": "Bevestigen",
"continue": "Doorgaan",
"goBack": "Terug",
"reset": "Herstellen",
"submit": "Versturen"
},
"status": {
"loading": "Laden...",
"error": {
"default": "Er is een fout opgetreden",
"serverConnection": "Kon geen verbinding maken met de server"
}
}
},
"auth": {
"login": {
"title": "Inloggen om toegang te krijgen tot de app",
"form": {
"email": {
"label": "E-mailadres",
"required": "e-mail is een verplicht veld",
"placeholder": "me@example.com"
},
"password": {
"label": "Wachtwoord",
"required": "wachtwoord is een verplicht veld"
},
"actions": {
"signin": "Inloggen"
},
"alternativeText": {
"or": "OF"
}
},
"errors": {
"default": "Kan niet inloggen",
"signin": "Probeer in te loggen met een ander account",
"oauthSignin": "Probeer in te loggen met een ander account",
"redirectUriMismatch": "De redirect URI komt niet overeen met de oauth app configuratie",
"oauthCallback": "Probeer in te loggen met een ander account",
"oauthCreateAccount": "Probeer in te loggen met een ander account",
"emailCreateAccount": "Probeer in te loggen met een ander account",
"callback": "Probeer in te loggen met een ander account",
"oauthAccountNotLinked": "Om je identiteit te bevestigen, log in met hetzelfde account dat je oorspronkelijk hebt gebruikt",
"emailSignin": "De e-mail kon niet worden verzonden",
"emailVerify": "Verifieer je e-mail, er is een nieuwe e-mail verzonden",
"credentialsSignin": "Inloggen mislukt. Controleer of de ingevoerde gegevens correct zijn",
"sessionRequired": "Log in om toegang te krijgen tot deze pagina"
}
},
"provider": {
"continue": "Doorgaan met {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Typ hier je bericht...",
"actions": {
"send": "Bericht versturen",
"stop": "Taak stoppen",
"attachFiles": "Bestanden bijvoegen"
}
},
"speech": {
"start": "Start opname",
"stop": "Stop opname",
"connecting": "Verbinden"
},
"fileUpload": {
"dragDrop": "Sleep bestanden hierheen",
"browse": "Bestanden zoeken",
"sizeLimit": "Limiet:",
"errors": {
"failed": "Uploaden mislukt",
"cancelled": "Upload geannuleerd van"
},
"actions": {
"cancelUpload": "Annuleer upload",
"removeAttachment": "Verwijder bijlage"
}
},
"favorites": {
"use": "Gebruik een favoriet bericht",
"headline": "Favoriete berichten",
"remove": "Verwijder favoriet",
"empty": {
"title": "Nog geen opgeslagen prompts",
"description": "Begin door een prompt te versturen en voeg deze toe aan favorieten of voeg een prompt uit eerdere chats toe"
}
},
"commands": {
"button": "Hulpmiddelen",
"changeTool": "Wijzig hulpmiddel",
"availableTools": "Beschikbare hulpmiddelen"
},
"messages": {
"status": {
"using": "In gebruik",
"used": "Gebruikt"
},
"actions": {
"copy": {
"button": "Kopi\u00ebren naar klembord",
"success": "Gekopieerd!"
}
},
"feedback": {
"positive": "Nuttig",
"negative": "Niet nuttig",
"edit": "Feedback bewerken",
"dialog": {
"title": "Voeg een opmerking toe",
"submit": "Feedback versturen",
"yourFeedback": "Je feedback..."
},
"status": {
"updating": "Bijwerken",
"updated": "Feedback bijgewerkt"
}
}
},
"history": {
"title": "Laatste invoer",
"empty": "Zo leeg...",
"show": "Toon geschiedenis"
},
"settings": {
"title": "Instellingenpaneel",
"customize": "Pas hier je chatinstellingen aan"
},
"watermark": "LLM's kunnen fouten maken. Overweeg het controleren van belangrijke informatie."
},
"threadHistory": {
"sidebar": {
"title": "Eerdere chats",
"filters": {
"search": "Zoeken",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "Vandaag",
"yesterday": "Gisteren",
"previous7days": "Afgelopen 7 dagen",
"previous30days": "Afgelopen 30 dagen"
},
"empty": "Geen gesprekken gevonden",
"actions": {
"close": "Zijbalk sluiten",
"open": "Zijbalk openen"
}
},
"thread": {
"untitled": "Naamloos gesprek",
"menu": {
"rename": "Hernoemen",
"share": "Delen",
"delete": "Verwijderen"
},
"actions": {
"share": {
"title": "Deel link naar chat",
"button": "Delen",
"status": {
"copied": "Link gekopieerd",
"created": "Deellink gemaakt!",
"unshared": "Delen uitgeschakeld voor dit gesprek"
},
"error": {
"create": "Aanmaken van deellink mislukt",
"unshare": "Delen van gesprek stoppen mislukt"
}
},
"delete": {
"title": "Verwijdering bevestigen",
"description": "Dit zal het gesprek en bijbehorende berichten en elementen verwijderen. Deze actie kan niet ongedaan worden gemaakt",
"success": "Chat verwijderd",
"inProgress": "Chat verwijderen"
},
"rename": {
"title": "Gesprek hernoemen",
"description": "Voer een nieuwe naam in voor dit gesprek",
"form": {
"name": {
"label": "Naam",
"placeholder": "Voer nieuwe naam in"
}
},
"success": "Gesprek hernoemd!",
"inProgress": "Gesprek hernoemen"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "Leesmij",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "Nieuwe chat",
"dialog": {
"title": "Nieuwe chat aanmaken",
"description": "Dit zal je huidige chatgeschiedenis wissen. Weet je zeker dat je door wilt gaan?",
"tooltip": "Nieuwe chat"
}
},
"user": {
"menu": {
"settings": "Instellingen",
"settingsKey": "I",
"apiKeys": "API-sleutels",
"logout": "Uitloggen"
}
}
},
"apiKeys": {
"title": "Vereiste API-sleutels",
"description": "Om deze app te gebruiken zijn de volgende API-sleutels vereist. De sleutels worden opgeslagen in de lokale opslag van je apparaat.",
"success": {
"saved": "Succesvol opgeslagen"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "Selecteer..."
},
"DatePickerInput": {
"placeholder": {
"single": "Kies een datum",
"range": "Kies een datumbereik"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "Cancelar",
"confirm": "Confirmar",
"continue": "Continuar",
"goBack": "Voltar",
"reset": "Repor",
"submit": "Enviar"
},
"status": {
"loading": "A carregar...",
"error": {
"default": "Ocorreu um erro",
"serverConnection": "N\u00e3o foi poss\u00edvel estabelecer liga\u00e7\u00e3o ao servidor"
}
}
},
"auth": {
"login": {
"title": "Inicie sess\u00e3o para aceder \u00e0 aplica\u00e7\u00e3o",
"form": {
"email": {
"label": "E-mail",
"required": "o e-mail \u00e9 obrigat\u00f3rio",
"placeholder": "me@example.com"
},
"password": {
"label": "Palavra-passe",
"required": "a palavra-passe \u00e9 obrigat\u00f3ria"
},
"actions": {
"signin": "Iniciar sess\u00e3o"
},
"alternativeText": {
"or": "Ou"
}
},
"errors": {
"default": "N\u00e3o foi poss\u00edvel iniciar sess\u00e3o",
"signin": "Tente iniciar sess\u00e3o com outra conta",
"oauthSignin": "Tente iniciar sess\u00e3o com outra conta",
"redirectUriMismatch": "O URI de redirecionamento n\u00e3o corresponde \u00e0 configura\u00e7\u00e3o da aplica\u00e7\u00e3o OAuth",
"oauthCallback": "Tente iniciar sess\u00e3o com outra conta",
"oauthCreateAccount": "Tente iniciar sess\u00e3o com outra conta",
"emailCreateAccount": "Tente iniciar sess\u00e3o com outra conta",
"callback": "Tente iniciar sess\u00e3o com outra conta",
"oauthAccountNotLinked": "Para confirmar a sua identidade, inicie sess\u00e3o com a mesma conta utilizada anteriormente",
"emailSignin": "N\u00e3o foi poss\u00edvel enviar o e-mail",
"emailVerify": "Por favor, verifique o seu e-mail. Foi enviada uma nova mensagem",
"credentialsSignin": "Erro ao iniciar sess\u00e3o. Verifique se os dados fornecidos est\u00e3o corretos",
"sessionRequired": "Por favor, inicie sess\u00e3o para aceder a esta p\u00e1gina"
}
},
"provider": {
"continue": "Continuar com {{provider}}"
}
},
"chat": {
"input": {
"placeholder": "Escreva a sua mensagem aqui...",
"actions": {
"send": "Enviar mensagem",
"stop": "Parar tarefa",
"attachFiles": "Anexar ficheiros"
}
},
"favorites": {
"use": "Utilizar mensagem favorita",
"headline": "Mensagens favoritas",
"remove": "Remover favorito",
"empty": {
"title": "Ainda n\u00e3o h\u00e1 prompts guardados",
"description": "Comece por enviar um prompt e marc\u00e1-lo com estrela, ou marque com estrela um prompt de conversas anteriores"
}
},
"commands": {
"button": "Ferramentas",
"changeTool": "Alterar ferramenta",
"availableTools": "Ferramentas dispon\u00edveis"
},
"speech": {
"start": "Iniciar grava\u00e7\u00e3o",
"stop": "Parar grava\u00e7\u00e3o",
"connecting": "A ligar"
},
"fileUpload": {
"dragDrop": "Arraste e largue ficheiros aqui",
"browse": "Procurar ficheiros",
"sizeLimit": "Limite:",
"errors": {
"failed": "Erro ao carregar",
"cancelled": "Carregamento cancelado de"
},
"actions": {
"cancelUpload": "Cancelar carregamento",
"removeAttachment": "Remover anexo"
}
},
"messages": {
"status": {
"using": "A utilizar",
"used": "Utilizado"
},
"actions": {
"copy": {
"button": "Copiar para a \u00e1rea de transfer\u00eancia",
"success": "Copiado!"
}
},
"feedback": {
"positive": "\u00datil",
"negative": "N\u00e3o \u00fatil",
"edit": "Editar coment\u00e1rio",
"dialog": {
"title": "Adicionar um coment\u00e1rio",
"submit": "Enviar coment\u00e1rio",
"yourFeedback": "O seu coment\u00e1rio..."
},
"status": {
"updating": "A atualizar",
"updated": "Coment\u00e1rio atualizado"
}
}
},
"history": {
"title": "\u00daltimas entradas",
"empty": "Est\u00e1 vazio...",
"show": "Mostrar hist\u00f3rico"
},
"settings": {
"title": "Painel de configura\u00e7\u00f5es",
"customize": "Personalize aqui as configura\u00e7\u00f5es do seu chat"
},
"watermark": "Os modelos de linguagem podem cometer erros. Verifique sempre informa\u00e7\u00f5es importantes."
},
"threadHistory": {
"sidebar": {
"title": "Conversas anteriores",
"filters": {
"search": "Pesquisar",
"placeholder": "Pesquisar conversas..."
},
"timeframes": {
"today": "Hoje",
"yesterday": "Ontem",
"previous7days": "\u00daltimos 7 dias",
"previous30days": "\u00daltimos 30 dias"
},
"empty": "Nenhuma conversa encontrada",
"actions": {
"close": "Fechar barra lateral",
"open": "Abrir barra lateral"
}
},
"thread": {
"untitled": "Conversa sem t\u00edtulo",
"menu": {
"rename": "Renomear",
"share": "Partilhar",
"delete": "Eliminar"
},
"actions": {
"share": {
"title": "Partilhar liga\u00e7\u00e3o do chat",
"button": "Partilhar",
"status": {
"copied": "Liga\u00e7\u00e3o copiada",
"created": "Liga\u00e7\u00e3o de partilha criada!",
"unshared": "Partilha desativada para esta conversa"
},
"error": {
"create": "Erro ao criar liga\u00e7\u00e3o de partilha",
"unshare": "Erro ao desativar a partilha"
}
},
"delete": {
"title": "Confirmar elimina\u00e7\u00e3o",
"description": "Ir\u00e1 eliminar a conversa e todos os seus conte\u00fados. Esta a\u00e7\u00e3o n\u00e3o pode ser anulada.",
"success": "Chat eliminado",
"inProgress": "A eliminar chat"
},
"rename": {
"title": "Renomear conversa",
"description": "Insira um novo nome para esta conversa",
"form": {
"name": {
"label": "Nome",
"placeholder": "Insira o novo nome"
}
},
"success": "Conversa renomeada!",
"inProgress": "A renomear conversa"
}
}
}
},
"navigation": {
"header": {
"chat": "Chat",
"readme": "Leia-me",
"theme": {
"light": "Tema claro",
"dark": "Tema escuro",
"system": "Seguir sistema"
}
},
"newChat": {
"button": "Novo chat",
"dialog": {
"title": "Criar novo chat",
"description": "Isto ir\u00e1 apagar o hist\u00f3rico de chat atual. Tem a certeza de que pretende continuar?",
"tooltip": "Novo chat"
}
},
"user": {
"menu": {
"settings": "Configura\u00e7\u00f5es",
"settingsKey": "S",
"apiKeys": "Chaves API",
"logout": "Terminar sess\u00e3o"
}
}
},
"apiKeys": {
"title": "Chaves API necess\u00e1rias",
"description": "Para utilizar esta aplica\u00e7\u00e3o, s\u00e3o necess\u00e1rias as seguintes chaves API. As chaves s\u00e3o guardadas localmente no seu dispositivo.",
"success": {
"saved": "Guardado com sucesso"
}
},
"alerts": {
"info": "Informa\u00e7\u00e3o",
"note": "Nota",
"tip": "Dica",
"important": "Importante",
"warning": "Aviso",
"caution": "Cuidado",
"debug": "Depura\u00e7\u00e3o",
"example": "Exemplo",
"success": "Sucesso",
"help": "Ajuda",
"idea": "Ideia",
"pending": "Pendente",
"security": "Seguran\u00e7a",
"beta": "Beta",
"best-practice": "Boa pr\u00e1tica"
},
"components": {
"MultiSelectInput": {
"placeholder": "Selecionar..."
},
"DatePickerInput": {
"placeholder": {
"single": "Escolher uma data",
"range": "Escolher um intervalo de datas"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd",
"confirm": "\u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
"continue": "\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95",
"goBack": "\u0ba4\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bbf\u0b9a\u0bcd \u0b9a\u0bc6\u0bb2\u0bcd",
"reset": "\u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bae\u0bc8",
"submit": "\u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf"
},
"status": {
"loading": "\u0b8f\u0bb1\u0bcd\u0bb1\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1...",
"error": {
"default": "\u0baa\u0bbf\u0bb4\u0bc8 \u0b8f\u0bb1\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
"serverConnection": "\u0b9a\u0bc7\u0bb5\u0bc8\u0baf\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0b9f\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8"
}
}
},
"auth": {
"login": {
"title": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd",
"form": {
"email": {
"label": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0bae\u0bc1\u0b95\u0bb5\u0bb0\u0bbf",
"required": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd",
"required": "\u0b95\u0b9f\u0bb5\u0bc1\u0b9a\u0bcd\u0b9a\u0bca\u0bb2\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 \u0baa\u0bc1\u0bb2\u0bae\u0bcd"
},
"actions": {
"signin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0b95"
},
"alternativeText": {
"or": "\u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1"
}
},
"errors": {
"default": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
"signin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"oauthSignin": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"redirectUriMismatch": "\u0ba4\u0bbf\u0b9a\u0bc8\u0ba4\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bb2\u0bcd URI \u0b93\u0b86\u0ba4\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1 \u0b95\u0b9f\u0bcd\u0b9f\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b9f\u0ba9\u0bcd \u0baa\u0bca\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
"oauthCallback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"oauthCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"emailCreateAccount": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"callback": "\u0bb5\u0bc7\u0bb1\u0bc1 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf \u0bae\u0bc1\u0baf\u0bb1\u0bcd\u0b9a\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"oauthAccountNotLinked": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b85\u0b9f\u0bc8\u0baf\u0bbe\u0bb3\u0ba4\u0bcd\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0bae\u0bc1\u0ba4\u0bb2\u0bbf\u0bb2\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0baf \u0b85\u0ba4\u0bc7 \u0b95\u0ba3\u0b95\u0bcd\u0b95\u0bc1\u0b9f\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd",
"emailSignin": "\u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
"emailVerify": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bc8 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd, \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0bae\u0bbf\u0ba9\u0bcd\u0ba9\u0b9e\u0bcd\u0b9a\u0bb2\u0bcd \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1",
"credentialsSignin": "\u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0bb5\u0bc1 \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1. \u0ba8\u0bc0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0bb5\u0bb4\u0b99\u0bcd\u0b95\u0bbf\u0baf \u0bb5\u0bbf\u0bb5\u0bb0\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bb0\u0bbf\u0baf\u0bbe\u0ba9\u0bb5\u0bc8 \u0b8e\u0ba9 \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"sessionRequired": "\u0b87\u0ba8\u0bcd\u0ba4\u0baa\u0bcd \u0baa\u0b95\u0bcd\u0b95\u0ba4\u0bcd\u0ba4\u0bc8 \u0b85\u0ba3\u0bc1\u0b95 \u0b89\u0bb3\u0bcd\u0ba8\u0bc1\u0bb4\u0bc8\u0baf\u0bb5\u0bc1\u0bae\u0bcd"
}
},
"provider": {
"continue": "{{provider}} \u0bae\u0bc2\u0bb2\u0bae\u0bcd \u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd"
}
},
"chat": {
"input": {
"placeholder": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0b9f\u0bcd\u0b9f\u0b9a\u0bcd\u0b9a\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd...",
"actions": {
"send": "\u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0bc1",
"stop": "\u0baa\u0ba3\u0bbf\u0baf\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
"attachFiles": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0ba3\u0bc8"
}
},
"favorites": {
"use": "\u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bae\u0bbe\u0ba9 \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0baf\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bb5\u0bc1\u0bae\u0bcd",
"headline": "\u0bb5\u0bbf\u0bb0\u0bc1\u0baa\u0bcd\u0baa\u0bae\u0bbe\u0ba9 \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0b95\u0bb3\u0bcd",
"remove": "\u0baa\u0bbf\u0b9f\u0bbf\u0ba4\u0bcd\u0ba4\u0ba4\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1",
"empty": {
"title": "\u0b87\u0ba9\u0bcd\u0ba9\u0bc1\u0bae\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f \u0baa\u0bcd\u0bb0\u0bbe\u0bae\u0bcd\u0baa\u0bcd\u0b9f\u0bcd\u0b95\u0bb3\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8",
"description": "\u0b92\u0bb0\u0bc1 \u0baa\u0bcd\u0bb0\u0bbe\u0bae\u0bcd\u0baa\u0bcd\u0b9f\u0bcd \u0b85\u0ba9\u0bc1\u0baa\u0bcd\u0baa\u0bbf \u0b85\u0ba4\u0bc8 \u0bb8\u0bcd\u0b9f\u0bbe\u0bb0\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0bb5\u0ba4\u0ba9\u0bcd \u0bae\u0bc2\u0bb2\u0bae\u0bcd \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd \u0b85\u0bb2\u0bcd\u0bb2\u0ba4\u0bc1 \u0bae\u0bc1\u0ba8\u0bcd\u0ba4\u0bc8\u0baf \u0b85\u0bb0\u0b9f\u0bcd\u0b9f\u0bc8\u0b95\u0bb3\u0bbf\u0bb2\u0bcd \u0b87\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0bc1 \u0b92\u0bb0\u0bc1 \u0baa\u0bcd\u0bb0\u0bbe\u0bae\u0bcd\u0baa\u0bcd\u0b9f\u0bcd\u0b9f\u0bc8 \u0bb8\u0bcd\u0b9f\u0bbe\u0bb0\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb5\u0bc1\u0bae\u0bcd"
}
},
"commands": {
"button": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0b95\u0bb3\u0bcd",
"changeTool": "\u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0baf\u0bc8 \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bb5\u0bc1\u0bae\u0bcd",
"availableTools": "\u0b95\u0bbf\u0b9f\u0bc8\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd \u0b95\u0bb0\u0bc1\u0bb5\u0bbf\u0b95\u0bb3\u0bcd"
},
"speech": {
"start": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc1 \u0ba4\u0bca\u0b9f\u0b99\u0bcd\u0b95\u0bc1",
"stop": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
"connecting": "\u0b87\u0ba3\u0bc8\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
},
"fileUpload": {
"dragDrop": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0b87\u0bb4\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0bb5\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd",
"browse": "\u0b95\u0bcb\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b89\u0bb2\u0bbe\u0bb5\u0bc1",
"sizeLimit": "\u0bb5\u0bb0\u0bae\u0bcd\u0baa\u0bc1:",
"errors": {
"failed": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0ba4\u0bcb\u0bb2\u0bcd\u0bb5\u0bbf\u0baf\u0b9f\u0bc8\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1",
"cancelled": "\u0baa\u0ba4\u0bbf\u0bb5\u0bc7\u0bb1\u0bcd\u0bb1\u0bae\u0bcd \u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
},
"actions": {
"cancelUpload": "\u0bb0\u0ba4\u0bcd\u0ba4\u0bc1 \u0b9a\u0bc6\u0baf\u0bcd",
"removeAttachment": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b85\u0b95\u0bb1\u0bcd\u0bb1\u0bc1"
}
},
"messages": {
"status": {
"using": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1",
"used": "\u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
},
"actions": {
"copy": {
"button": "\u0b95\u0bbf\u0bb3\u0bbf\u0baa\u0bcd\u0baa\u0bcb\u0bb0\u0bcd\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1",
"success": "\u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!"
}
},
"feedback": {
"positive": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb0\u0bc1\u0ba8\u0bcd\u0ba4\u0ba4\u0bc1",
"negative": "\u0baa\u0baf\u0ba9\u0bc1\u0bb3\u0bcd\u0bb3\u0ba4\u0bbe\u0b95 \u0b87\u0bb2\u0bcd\u0bb2\u0bc8",
"edit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0ba4\u0bbf\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
"dialog": {
"title": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8\u0b9a\u0bcd \u0b9a\u0bc7\u0bb0\u0bcd",
"submit": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc8 \u0b9a\u0bae\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0bbf",
"yourFeedback": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1..."
},
"status": {
"updating": "\u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0bbf\u0bb1\u0ba4\u0bc1",
"updated": "\u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1 \u0baa\u0bc1\u0ba4\u0bc1\u0baa\u0bcd\u0baa\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
}
}
},
"history": {
"title": "\u0b95\u0b9f\u0bc8\u0b9a\u0bbf \u0b89\u0bb3\u0bcd\u0bb3\u0bc0\u0b9f\u0bc1\u0b95\u0bb3\u0bcd",
"empty": "\u0b95\u0bbe\u0bb2\u0bbf\u0baf\u0bbe\u0b95 \u0b89\u0bb3\u0bcd\u0bb3\u0ba4\u0bc1...",
"show": "\u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8\u0b95\u0bcd \u0b95\u0bbe\u0b9f\u0bcd\u0b9f\u0bc1"
},
"settings": {
"title": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd \u0baa\u0bb2\u0b95\u0bae\u0bcd",
"customize": "\u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0b87\u0b99\u0bcd\u0b95\u0bc7 \u0ba4\u0ba9\u0bbf\u0baa\u0bcd\u0baa\u0baf\u0ba9\u0bbe\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd"
},
"watermark": "LLM \u0b95\u0bb3\u0bcd \u0ba4\u0bb5\u0bb1\u0bc1\u0b95\u0bb3\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0baf\u0bb2\u0bbe\u0bae\u0bcd. \u0bae\u0bc1\u0b95\u0bcd\u0b95\u0bbf\u0baf\u0bae\u0bbe\u0ba9 \u0ba4\u0b95\u0bb5\u0bb2\u0bcd\u0b95\u0bb3\u0bc8\u0b9a\u0bcd \u0b9a\u0bb0\u0bbf\u0baa\u0bbe\u0bb0\u0bcd\u0baa\u0bcd\u0baa\u0ba4\u0bc8\u0b95\u0bcd \u0b95\u0bb0\u0bc1\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b95\u0bca\u0bb3\u0bcd\u0bb3\u0bc1\u0b99\u0bcd\u0b95\u0bb3\u0bcd."
},
"threadHistory": {
"sidebar": {
"title": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd",
"filters": {
"search": "\u0ba4\u0bc7\u0b9f\u0bc1",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0b87\u0ba9\u0bcd\u0bb1\u0bc1",
"yesterday": "\u0ba8\u0bc7\u0bb1\u0bcd\u0bb1\u0bc1",
"previous7days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 7 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd",
"previous30days": "\u0b95\u0b9f\u0ba8\u0bcd\u0ba4 30 \u0ba8\u0bbe\u0b9f\u0bcd\u0b95\u0bb3\u0bcd"
},
"empty": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd\u0b95\u0bb3\u0bcd \u0b8e\u0ba4\u0bc1\u0bb5\u0bc1\u0bae\u0bcd \u0b87\u0bb2\u0bcd\u0bb2\u0bc8",
"actions": {
"close": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0bae\u0bc2\u0b9f\u0bc1",
"open": "\u0baa\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0bbf\u0baf\u0bc8 \u0ba4\u0bbf\u0bb1"
}
},
"thread": {
"untitled": "\u0ba4\u0bb2\u0bc8\u0baa\u0bcd\u0baa\u0bbf\u0b9f\u0bbe\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
"menu": {
"rename": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd \u0bae\u0bbe\u0bb1\u0bcd\u0bb1\u0bc1",
"share": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd",
"delete": "\u0b85\u0bb4\u0bbf"
},
"actions": {
"share": {
"title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0baa\u0b95\u0bbf\u0bb0\u0bb5\u0bc1\u0bae\u0bcd",
"button": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd",
"status": {
"copied": "\u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0ba8\u0b95\u0bb2\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
"created": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc1 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!",
"unshared": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0bae\u0bc1\u0b9f\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
},
"error": {
"create": "\u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc1 \u0b87\u0ba3\u0bc8\u0baa\u0bcd\u0baa\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8",
"unshare": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0baa\u0b95\u0bbf\u0bb0\u0bcd\u0bb5\u0bc8 \u0ba8\u0bbf\u0bb1\u0bc1\u0ba4\u0bcd\u0ba4 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bb5\u0bbf\u0bb2\u0bcd\u0bb2\u0bc8"
}
},
"delete": {
"title": "\u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bb5\u0ba4\u0bc8 \u0b89\u0bb1\u0bc1\u0ba4\u0bbf\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4\u0bc1",
"description": "\u0b87\u0ba4\u0bc1 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bcd\u0bb1\u0bc1\u0bae\u0bcd \u0b85\u0ba4\u0ba9\u0bcd \u0b9a\u0bc6\u0baf\u0bcd\u0ba4\u0bbf\u0b95\u0bb3\u0bcd, \u0b89\u0bb1\u0bc1\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0b87\u0ba8\u0bcd\u0ba4 \u0b9a\u0bc6\u0baf\u0bb2\u0bc8 \u0bae\u0bc0\u0b9f\u0bcd\u0b9f\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95 \u0bae\u0bc1\u0b9f\u0bbf\u0baf\u0bbe\u0ba4\u0bc1",
"success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1",
"inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0ba8\u0bc0\u0b95\u0bcd\u0b95\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
},
"rename": {
"title": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1",
"description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc1\u0b95\u0bcd\u0b95\u0bc1 \u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd",
"form": {
"name": {
"label": "\u0baa\u0bc6\u0baf\u0bb0\u0bcd",
"placeholder": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0baa\u0bc6\u0baf\u0bb0\u0bc8 \u0b89\u0bb3\u0bcd\u0bb3\u0bbf\u0b9f\u0bb5\u0bc1\u0bae\u0bcd"
}
},
"success": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1!",
"inProgress": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0bae\u0bb1\u0bc1\u0baa\u0bc6\u0baf\u0bb0\u0bbf\u0b9f\u0bc1\u0b95\u0bbf\u0bb1\u0ba4\u0bc1"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
"readme": "\u0baa\u0b9f\u0bbf\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd",
"dialog": {
"title": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bc8 \u0b89\u0bb0\u0bc1\u0bb5\u0bbe\u0b95\u0bcd\u0b95\u0bc1",
"description": "\u0b87\u0ba4\u0bc1 \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0ba4\u0bb1\u0bcd\u0baa\u0bcb\u0ba4\u0bc8\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd \u0bb5\u0bb0\u0bb2\u0bbe\u0bb1\u0bcd\u0bb1\u0bc8 \u0b85\u0bb4\u0bbf\u0b95\u0bcd\u0b95\u0bc1\u0bae\u0bcd. \u0ba4\u0bca\u0b9f\u0bb0 \u0bb5\u0bbf\u0bb0\u0bc1\u0bae\u0bcd\u0baa\u0bc1\u0b95\u0bbf\u0bb1\u0bc0\u0bb0\u0bcd\u0b95\u0bb3\u0bbe?",
"tooltip": "\u0baa\u0bc1\u0ba4\u0bbf\u0baf \u0b89\u0bb0\u0bc8\u0baf\u0bbe\u0b9f\u0bb2\u0bcd"
}
},
"user": {
"menu": {
"settings": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd",
"settingsKey": "S",
"apiKeys": "API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd",
"logout": "\u0bb5\u0bc6\u0bb3\u0bbf\u0baf\u0bc7\u0bb1\u0bc1"
}
}
},
"apiKeys": {
"title": "\u0ba4\u0bc7\u0bb5\u0bc8\u0baf\u0bbe\u0ba9 API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd",
"description": "\u0b87\u0ba8\u0bcd\u0ba4 \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0bbe\u0b9f\u0bcd\u0b9f\u0bc8\u0baa\u0bcd \u0baa\u0baf\u0ba9\u0bcd\u0baa\u0b9f\u0bc1\u0ba4\u0bcd\u0ba4, \u0baa\u0bbf\u0ba9\u0bcd\u0bb5\u0bb0\u0bc1\u0bae\u0bcd API \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0ba4\u0bc7\u0bb5\u0bc8. \u0bb5\u0bbf\u0b9a\u0bc8\u0b95\u0bb3\u0bcd \u0b89\u0b99\u0bcd\u0b95\u0bb3\u0bcd \u0b9a\u0bbe\u0ba4\u0ba9\u0ba4\u0bcd\u0ba4\u0bbf\u0ba9\u0bcd \u0b89\u0bb3\u0bcd\u0bb3\u0bc2\u0bb0\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0baa\u0bcd\u0baa\u0b95\u0ba4\u0bcd\u0ba4\u0bbf\u0bb2\u0bcd \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bc1\u0bae\u0bcd.",
"success": {
"saved": "\u0bb5\u0bc6\u0bb1\u0bcd\u0bb1\u0bbf\u0b95\u0bb0\u0bae\u0bbe\u0b95 \u0b9a\u0bc7\u0bae\u0bbf\u0b95\u0bcd\u0b95\u0baa\u0bcd\u0baa\u0b9f\u0bcd\u0b9f\u0ba4\u0bc1"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0ba4\u0bc7\u0bb0\u0bcd\u0ba8\u0bcd\u0ba4\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0ba4\u0bc7\u0ba4\u0bbf\u0baf\u0bc8\u0ba4\u0bcd \u0ba4\u0bc7\u0bb0\u0bcd\u0ba8\u0bcd\u0ba4\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd",
"range": "\u0ba4\u0bc7\u0ba4\u0bbf \u0bb5\u0bb0\u0bae\u0bcd\u0baa\u0bc8\u0ba4\u0bcd \u0ba4\u0bc7\u0bb0\u0bcd\u0ba8\u0bcd\u0ba4\u0bc6\u0b9f\u0bc1\u0b95\u0bcd\u0b95\u0bb5\u0bc1\u0bae\u0bcd"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"confirm": "\u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"continue": "\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"goBack": "\u0c35\u0c46\u0c28\u0c15\u0c4d\u0c15\u0c3f \u0c35\u0c46\u0c33\u0c4d\u0c33\u0c02\u0c21\u0c3f",
"reset": "\u0c30\u0c40\u0c38\u0c46\u0c1f\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"submit": "\u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
},
"status": {
"loading": "\u0c32\u0c4b\u0c21\u0c4d \u0c05\u0c35\u0c41\u0c24\u0c4b\u0c02\u0c26\u0c3f...",
"error": {
"default": "\u0c32\u0c4b\u0c2a\u0c02 \u0c38\u0c02\u0c2d\u0c35\u0c3f\u0c02\u0c1a\u0c3f\u0c02\u0c26\u0c3f",
"serverConnection": "\u0c38\u0c30\u0c4d\u0c35\u0c30\u0c4d\u200c\u0c28\u0c3f \u0c1a\u0c47\u0c30\u0c41\u0c15\u0c4b\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41"
}
}
},
"auth": {
"login": {
"title": "\u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c32\u0c3e\u0c17\u0c3f\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"form": {
"email": {
"label": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c1a\u0c3f\u0c30\u0c41\u0c28\u0c3e\u0c2e\u0c3e",
"required": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f",
"placeholder": "me@example.com"
},
"password": {
"label": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d",
"required": "\u0c2a\u0c3e\u0c38\u0c4d\u200c\u0c35\u0c30\u0c4d\u0c21\u0c4d \u0c24\u0c2a\u0c4d\u0c2a\u0c28\u0c3f\u0c38\u0c30\u0c3f"
},
"actions": {
"signin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
},
"alternativeText": {
"or": "\u0c32\u0c47\u0c26\u0c3e"
}
},
"errors": {
"default": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c15\u0c2a\u0c4b\u0c2f\u0c3e\u0c2e\u0c41",
"signin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"oauthSignin": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"redirectUriMismatch": "\u0c30\u0c40\u0c21\u0c48\u0c30\u0c46\u0c15\u0c4d\u0c1f\u0c4d URI oauth \u0c2f\u0c3e\u0c2a\u0c4d \u0c15\u0c3e\u0c28\u0c4d\u0c2b\u0c3f\u0c17\u0c30\u0c47\u0c37\u0c28\u0c4d\u200c\u0c24\u0c4b \u0c38\u0c30\u0c3f\u0c2a\u0c4b\u0c32\u0c21\u0c02 \u0c32\u0c47\u0c26\u0c41",
"oauthCallback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"oauthCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"emailCreateAccount": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"callback": "\u0c35\u0c47\u0c30\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c2a\u0c4d\u0c30\u0c2f\u0c24\u0c4d\u0c28\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"oauthAccountNotLinked": "\u0c2e\u0c40 \u0c17\u0c41\u0c30\u0c4d\u0c24\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c2e\u0c40\u0c30\u0c41 \u0c2e\u0c4a\u0c26\u0c1f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c05\u0c26\u0c47 \u0c16\u0c3e\u0c24\u0c3e\u0c24\u0c4b \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"emailSignin": "\u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c21\u0c02 \u0c38\u0c3e\u0c27\u0c4d\u0c2f\u0c02 \u0c15\u0c3e\u0c32\u0c47\u0c26\u0c41",
"emailVerify": "\u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c2e\u0c40 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d\u200c\u0c28\u0c3f \u0c27\u0c43\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f, \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c07\u0c2e\u0c46\u0c2f\u0c3f\u0c32\u0c4d \u0c2a\u0c02\u0c2a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
"credentialsSignin": "\u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c05\u0c02\u0c26\u0c3f\u0c02\u0c1a\u0c3f\u0c28 \u0c35\u0c3f\u0c35\u0c30\u0c3e\u0c32\u0c41 \u0c38\u0c30\u0c48\u0c28\u0c35\u0c47\u0c28\u0c3e \u0c05\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"sessionRequired": "\u0c08 \u0c2a\u0c47\u0c1c\u0c40\u0c28\u0c3f \u0c2f\u0c3e\u0c15\u0c4d\u0c38\u0c46\u0c38\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c26\u0c2f\u0c1a\u0c47\u0c38\u0c3f \u0c38\u0c48\u0c28\u0c4d \u0c07\u0c28\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
}
},
"provider": {
"continue": "{{provider}}\u0c24\u0c4b \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
}
},
"chat": {
"input": {
"placeholder": "\u0c2e\u0c40 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c1f\u0c48\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f...",
"actions": {
"send": "\u0c38\u0c02\u0c26\u0c47\u0c36\u0c02 \u0c2a\u0c02\u0c2a\u0c02\u0c21\u0c3f",
"stop": "\u0c2a\u0c28\u0c3f \u0c06\u0c2a\u0c02\u0c21\u0c3f",
"attachFiles": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
}
},
"speech": {
"start": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"stop": "\u0c30\u0c3f\u0c15\u0c3e\u0c30\u0c4d\u0c21\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c02\u0c21\u0c3f",
"connecting": "\u0c05\u0c28\u0c41\u0c38\u0c02\u0c27\u0c3e\u0c28\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
},
"favorites": {
"use": "\u0c07\u0c37\u0c4d\u0c1f\u0c2e\u0c48\u0c28 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"headline": "\u0c07\u0c37\u0c4d\u0c1f\u0c2e\u0c48\u0c28 \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c41",
"remove": "\u0c07\u0c37\u0c4d\u0c1f\u0c2e\u0c48\u0c28\u0c26\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"empty": {
"title": "\u0c07\u0c02\u0c15\u0c3e \u0c2a\u0c4d\u0c30\u0c3e\u0c02\u0c2a\u0c4d\u0c1f\u0c4d\u200c\u0c32\u0c41 \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c26\u0c41",
"description": "\u0c12\u0c15 \u0c2a\u0c4d\u0c30\u0c3e\u0c02\u0c2a\u0c4d\u0c1f\u0c4d \u0c2a\u0c02\u0c2a\u0c3f \u0c26\u0c3e\u0c28\u0c3f\u0c15\u0c3f \u0c38\u0c4d\u0c1f\u0c3e\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c21\u0c02 \u0c26\u0c4d\u0c35\u0c3e\u0c30\u0c3e \u0c2a\u0c4d\u0c30\u0c3e\u0c30\u0c02\u0c2d\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f \u0c32\u0c47\u0c26\u0c3e \u0c2e\u0c41\u0c28\u0c41\u0c2a\u0c1f\u0c3f \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32 \u0c28\u0c41\u0c02\u0c21\u0c3f \u0c2a\u0c4d\u0c30\u0c3e\u0c02\u0c2a\u0c4d\u0c1f\u0c4d\u200c\u0c15\u0c41 \u0c38\u0c4d\u0c1f\u0c3e\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
}
},
"commands": {
"button": "\u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c32\u0c41",
"changeTool": "\u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
"availableTools": "\u0c32\u0c2d\u0c4d\u0c2f\u0c2e\u0c48\u0c28 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c3e\u0c32\u0c41"
},
"fileUpload": {
"dragDrop": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d\u200c\u0c28\u0c3f \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c21\u0c4d\u0c30\u0c3e\u0c17\u0c4d \u0c1a\u0c47\u0c38\u0c3f \u0c21\u0c4d\u0c30\u0c3e\u0c2a\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"browse": "\u0c2b\u0c48\u0c32\u0c4d\u0c38\u0c4d \u0c2c\u0c4d\u0c30\u0c4c\u0c1c\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"sizeLimit": "\u0c2a\u0c30\u0c3f\u0c2e\u0c3f\u0c24\u0c3f:",
"errors": {
"failed": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f",
"cancelled": "\u0c05\u0c2a\u0c4d\u200c\u0c32\u0c4b\u0c21\u0c4d \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
},
"actions": {
"cancelUpload": "\u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"removeAttachment": "\u0c05\u0c28\u0c41\u0c2c\u0c02\u0c27\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
}
},
"messages": {
"status": {
"using": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
"used": "\u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
},
"actions": {
"copy": {
"button": "\u0c15\u0c4d\u0c32\u0c3f\u0c2a\u0c4d\u200c\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d\u200c\u0c15\u0c3f \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"success": "\u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!"
}
},
"feedback": {
"positive": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02",
"negative": "\u0c38\u0c39\u0c3e\u0c2f\u0c15\u0c30\u0c02 \u0c15\u0c3e\u0c26\u0c41",
"edit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c35\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"dialog": {
"title": "\u0c35\u0c4d\u0c2f\u0c3e\u0c16\u0c4d\u0c2f \u0c1c\u0c4b\u0c21\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"submit": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c38\u0c2e\u0c30\u0c4d\u0c2a\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"yourFeedback": "\u0c2e\u0c40 \u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02..."
},
"status": {
"updating": "\u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f",
"updated": "\u0c05\u0c2d\u0c3f\u0c2a\u0c4d\u0c30\u0c3e\u0c2f\u0c02 \u0c28\u0c35\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
}
}
},
"history": {
"title": "\u0c1a\u0c3f\u0c35\u0c30\u0c3f \u0c07\u0c28\u0c4d\u200c\u0c2a\u0c41\u0c1f\u0c4d\u200c\u0c32\u0c41",
"empty": "\u0c16\u0c3e\u0c33\u0c40\u0c17\u0c3e \u0c09\u0c02\u0c26\u0c3f...",
"show": "\u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c1a\u0c42\u0c2a\u0c3f\u0c02\u0c1a\u0c41"
},
"settings": {
"title": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32 \u0c2a\u0c4d\u0c2f\u0c3e\u0c28\u0c46\u0c32\u0c4d",
"customize": "\u0c2e\u0c40 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c28\u0c41 \u0c07\u0c15\u0c4d\u0c15\u0c21 \u0c05\u0c28\u0c41\u0c15\u0c42\u0c32\u0c40\u0c15\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
},
"watermark": "LLM\u0c32\u0c41 \u0c24\u0c2a\u0c4d\u0c2a\u0c41\u0c32\u0c41 \u0c1a\u0c47\u0c2f\u0c35\u0c1a\u0c4d\u0c1a\u0c41. \u0c2e\u0c41\u0c16\u0c4d\u0c2f\u0c2e\u0c48\u0c28 \u0c38\u0c2e\u0c3e\u0c1a\u0c3e\u0c30\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c24\u0c28\u0c3f\u0c16\u0c40 \u0c1a\u0c47\u0c2f\u0c21\u0c3e\u0c28\u0c4d\u0c28\u0c3f \u0c2a\u0c30\u0c3f\u0c17\u0c23\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f."
},
"threadHistory": {
"sidebar": {
"title": "\u0c17\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c32\u0c41",
"filters": {
"search": "\u0c35\u0c46\u0c24\u0c15\u0c02\u0c21\u0c3f",
"placeholder": "Search conversations..."
},
"timeframes": {
"today": "\u0c08\u0c30\u0c4b\u0c1c\u0c41",
"yesterday": "\u0c28\u0c3f\u0c28\u0c4d\u0c28",
"previous7days": "\u0c17\u0c24 7 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41",
"previous30days": "\u0c17\u0c24 30 \u0c30\u0c4b\u0c1c\u0c41\u0c32\u0c41"
},
"empty": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c32\u0c41 \u0c15\u0c28\u0c41\u0c17\u0c4a\u0c28\u0c2c\u0c21\u0c32\u0c47\u0c26\u0c41",
"actions": {
"close": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c2e\u0c42\u0c38\u0c3f\u0c35\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"open": "\u0c38\u0c48\u0c21\u0c4d\u200c\u0c2c\u0c3e\u0c30\u0c4d \u0c24\u0c46\u0c30\u0c35\u0c02\u0c21\u0c3f"
}
},
"thread": {
"untitled": "\u0c2a\u0c47\u0c30\u0c41 \u0c32\u0c47\u0c28\u0c3f \u0c38\u0c02\u0c2d\u0c3e\u0c37\u0c23",
"menu": {
"rename": "\u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
"share": "\u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"delete": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f"
},
"actions": {
"share": {
"title": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d\u200c\u0c28\u0c41 \u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"button": "\u0c37\u0c47\u0c30\u0c4d \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"status": {
"copied": "\u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c15\u0c3e\u0c2a\u0c40 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
"created": "\u0c37\u0c47\u0c30\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!",
"unshared": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c15\u0c41 \u0c37\u0c47\u0c30\u0c3f\u0c02\u0c17\u0c4d \u0c06\u0c2a\u0c3f\u0c35\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
},
"error": {
"create": "\u0c37\u0c47\u0c30\u0c4d \u0c32\u0c3f\u0c02\u0c15\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c21\u0c02 \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f",
"unshare": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c37\u0c47\u0c30\u0c3f\u0c02\u0c17\u0c4d \u0c28\u0c3f\u0c32\u0c3f\u0c2a\u0c3f\u0c35\u0c47\u0c2f\u0c21\u0c02 \u0c35\u0c3f\u0c2b\u0c32\u0c2e\u0c48\u0c02\u0c26\u0c3f"
}
},
"delete": {
"title": "\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c2a\u0c41\u0c28\u0c41 \u0c28\u0c3f\u0c30\u0c4d\u0c27\u0c3e\u0c30\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"description": "\u0c07\u0c26\u0c3f \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d\u200c\u0c24\u0c4b \u0c2a\u0c3e\u0c1f\u0c41 \u0c26\u0c3e\u0c28\u0c3f \u0c38\u0c02\u0c26\u0c47\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c2e\u0c30\u0c3f\u0c2f\u0c41 \u0c05\u0c02\u0c36\u0c3e\u0c32\u0c28\u0c41 \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c08 \u0c1a\u0c30\u0c4d\u0c2f\u0c28\u0c41 \u0c30\u0c26\u0c4d\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c32\u0c47\u0c30\u0c41",
"success": "\u0c1a\u0c3e\u0c1f\u0c4d \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f",
"inProgress": "\u0c1a\u0c3e\u0c1f\u0c4d\u200c\u0c28\u0c3f \u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
},
"rename": {
"title": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c02\u0c21\u0c3f",
"description": "\u0c08 \u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c15\u0c4b\u0c38\u0c02 \u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f",
"form": {
"name": {
"label": "\u0c2a\u0c47\u0c30\u0c41",
"placeholder": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c2a\u0c47\u0c30\u0c41\u0c28\u0c41 \u0c28\u0c2e\u0c4b\u0c26\u0c41 \u0c1a\u0c47\u0c2f\u0c02\u0c21\u0c3f"
}
},
"success": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f!",
"inProgress": "\u0c25\u0c4d\u0c30\u0c46\u0c21\u0c4d \u0c2a\u0c47\u0c30\u0c41 \u0c2e\u0c3e\u0c30\u0c41\u0c38\u0c4d\u0c24\u0c4b\u0c02\u0c26\u0c3f"
}
}
}
},
"navigation": {
"header": {
"chat": "\u0c1a\u0c3e\u0c1f\u0c4d",
"readme": "\u0c1a\u0c26\u0c35\u0c02\u0c21\u0c3f",
"theme": {
"light": "Light Theme",
"dark": "Dark Theme",
"system": "Follow System"
}
},
"newChat": {
"button": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d",
"dialog": {
"title": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c38\u0c43\u0c37\u0c4d\u0c1f\u0c3f\u0c02\u0c1a\u0c02\u0c21\u0c3f",
"description": "\u0c07\u0c26\u0c3f \u0c2e\u0c40 \u0c2a\u0c4d\u0c30\u0c38\u0c4d\u0c24\u0c41\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d \u0c1a\u0c30\u0c3f\u0c24\u0c4d\u0c30\u0c28\u0c41 \u0c24\u0c41\u0c21\u0c3f\u0c1a\u0c3f\u0c35\u0c47\u0c38\u0c4d\u0c24\u0c41\u0c02\u0c26\u0c3f. \u0c2e\u0c40\u0c30\u0c41 \u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c3e\u0c32\u0c28\u0c41\u0c15\u0c41\u0c02\u0c1f\u0c41\u0c28\u0c4d\u0c28\u0c3e\u0c30\u0c3e?",
"tooltip": "\u0c15\u0c4a\u0c24\u0c4d\u0c24 \u0c1a\u0c3e\u0c1f\u0c4d"
}
},
"user": {
"menu": {
"settings": "\u0c38\u0c46\u0c1f\u0c4d\u0c1f\u0c3f\u0c02\u0c17\u0c4d\u200c\u0c32\u0c41",
"settingsKey": "S",
"apiKeys": "API \u0c15\u0c40\u0c32\u0c41",
"logout": "\u0c32\u0c3e\u0c17\u0c4d \u0c05\u0c35\u0c41\u0c1f\u0c4d"
}
}
},
"apiKeys": {
"title": "\u0c05\u0c35\u0c38\u0c30\u0c2e\u0c48\u0c28 API \u0c15\u0c40\u0c32\u0c41",
"description": "\u0c08 \u0c2f\u0c3e\u0c2a\u0c4d\u200c\u0c28\u0c3f \u0c09\u0c2a\u0c2f\u0c4b\u0c17\u0c3f\u0c02\u0c1a\u0c21\u0c3e\u0c28\u0c3f\u0c15\u0c3f, \u0c15\u0c3f\u0c02\u0c26\u0c3f API \u0c15\u0c40\u0c32\u0c41 \u0c05\u0c35\u0c38\u0c30\u0c02. \u0c15\u0c40\u0c32\u0c41 \u0c2e\u0c40 \u0c2a\u0c30\u0c3f\u0c15\u0c30\u0c02 \u0c2f\u0c4a\u0c15\u0c4d\u0c15 \u0c38\u0c4d\u0c25\u0c3e\u0c28\u0c3f\u0c15 \u0c28\u0c3f\u0c32\u0c4d\u0c35\u0c32\u0c4b \u0c28\u0c3f\u0c32\u0c4d\u0c35 \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c24\u0c3e\u0c2f\u0c3f.",
"success": {
"saved": "\u0c35\u0c3f\u0c1c\u0c2f\u0c35\u0c02\u0c24\u0c02\u0c17\u0c3e \u0c38\u0c47\u0c35\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c02\u0c26\u0c3f"
}
},
"alerts": {
"info": "Info",
"note": "Note",
"tip": "Tip",
"important": "Important",
"warning": "Warning",
"caution": "Caution",
"debug": "Debug",
"example": "Example",
"success": "Success",
"help": "Help",
"idea": "Idea",
"pending": "Pending",
"security": "Security",
"beta": "Beta",
"best-practice": "Best Practice"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u0c0e\u0c02\u0c1a\u0c41\u0c15\u0c4b\u0c02\u0c21\u0c3f..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u0c24\u0c47\u0c26\u0c40\u0c28\u0c3f \u0c0e\u0c02\u0c1a\u0c41\u0c15\u0c4b\u0c02\u0c21\u0c3f",
"range": "\u0c24\u0c47\u0c26\u0c40 \u0c2a\u0c30\u0c3f\u0c27\u0c3f\u0c28\u0c3f \u0c0e\u0c02\u0c1a\u0c41\u0c15\u0c4b\u0c02\u0c21\u0c3f"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u53d6\u6d88",
"confirm": "\u786e\u8ba4",
"continue": "\u7ee7\u7eed",
"goBack": "\u8fd4\u56de",
"reset": "\u91cd\u7f6e",
"submit": "\u63d0\u4ea4"
},
"status": {
"loading": "\u52a0\u8f7d\u4e2d...",
"error": {
"default": "\u53d1\u751f\u9519\u8bef",
"serverConnection": "\u65e0\u6cd5\u8fde\u63a5\u5230\u670d\u52a1\u5668"
}
}
},
"auth": {
"login": {
"title": "\u767b\u5f55\u4ee5\u8bbf\u95ee\u5e94\u7528",
"form": {
"email": {
"label": "\u7535\u5b50\u90ae\u7bb1",
"required": "\u90ae\u7bb1\u662f\u5fc5\u586b\u9879",
"placeholder": "me@example.com"
},
"password": {
"label": "\u5bc6\u7801",
"required": "\u5bc6\u7801\u662f\u5fc5\u586b\u9879"
},
"actions": {
"signin": "\u767b\u5f55"
},
"alternativeText": {
"or": "\u6216"
}
},
"errors": {
"default": "\u65e0\u6cd5\u767b\u5f55",
"signin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"oauthSignin": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"redirectUriMismatch": "\u91cd\u5b9a\u5411URI\u4e0eOAuth\u5e94\u7528\u914d\u7f6e\u4e0d\u5339\u914d",
"oauthCallback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"oauthCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"emailCreateAccount": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"callback": "\u8bf7\u5c1d\u8bd5\u4f7f\u7528\u5176\u4ed6\u8d26\u53f7\u767b\u5f55",
"oauthAccountNotLinked": "\u4e3a\u786e\u8ba4\u60a8\u7684\u8eab\u4efd\uff0c\u8bf7\u4f7f\u7528\u539f\u59cb\u8d26\u53f7\u767b\u5f55",
"emailSignin": "\u90ae\u4ef6\u53d1\u9001\u5931\u8d25",
"emailVerify": "\u8bf7\u9a8c\u8bc1\u60a8\u7684\u90ae\u7bb1\uff0c\u65b0\u7684\u9a8c\u8bc1\u90ae\u4ef6\u5df2\u53d1\u9001",
"credentialsSignin": "\u767b\u5f55\u5931\u8d25\u3002\u8bf7\u68c0\u67e5\u60a8\u63d0\u4f9b\u7684\u4fe1\u606f\u662f\u5426\u6b63\u786e",
"sessionRequired": "\u8bf7\u767b\u5f55\u4ee5\u8bbf\u95ee\u6b64\u9875\u9762"
}
},
"provider": {
"continue": "\u7ee7\u7eed\u4f7f\u7528{{provider}}"
}
},
"chat": {
"input": {
"placeholder": "\u5728\u6b64\u8f93\u5165\u60a8\u7684\u6d88\u606f...",
"actions": {
"send": "\u53d1\u9001\u6d88\u606f",
"stop": "\u505c\u6b62\u4efb\u52a1",
"attachFiles": "\u9644\u52a0\u6587\u4ef6"
}
},
"speech": {
"start": "\u5f00\u59cb\u5f55\u97f3",
"stop": "\u505c\u6b62\u5f55\u97f3",
"connecting": "\u8fde\u63a5\u4e2d"
},
"fileUpload": {
"dragDrop": "\u5c06\u6587\u4ef6\u62d6\u653e\u5230\u8fd9\u91cc",
"browse": "\u6d4f\u89c8\u6587\u4ef6",
"sizeLimit": "\u9650\u5236\uff1a",
"errors": {
"failed": "\u4e0a\u4f20\u5931\u8d25",
"cancelled": "\u5df2\u53d6\u6d88\u4e0a\u4f20"
},
"actions": {
"cancelUpload": "\u53d6\u6d88\u4e0a\u4f20",
"removeAttachment": "\u79fb\u9664\u9644\u4ef6"
}
},
"favorites": {
"use": "\u4f7f\u7528\u6536\u85cf\u7684\u6d88\u606f",
"headline": "\u6536\u85cf\u7684\u6d88\u606f",
"remove": "\u79fb\u9664\u6536\u85cf",
"empty": {
"title": "\u5c1a\u672a\u4fdd\u5b58\u7684\u63d0\u793a",
"description": "\u4ece\u53d1\u9001\u63d0\u793a\u5e76\u52a0\u661f\u6807\u5f00\u59cb\uff0c\u6216\u4ece\u4e4b\u524d\u7684\u804a\u5929\u4e2d\u52a0\u661f\u6807\u63d0\u793a"
}
},
"commands": {
"button": "\u5de5\u5177",
"changeTool": "\u66f4\u6362\u5de5\u5177",
"availableTools": "\u53ef\u7528\u5de5\u5177"
},
"messages": {
"status": {
"using": "\u4f7f\u7528\u4e2d",
"used": "\u5df2\u4f7f\u7528"
},
"actions": {
"copy": {
"button": "\u590d\u5236\u5230\u526a\u8d34\u677f",
"success": "\u5df2\u590d\u5236\uff01"
}
},
"feedback": {
"positive": "\u6709\u5e2e\u52a9",
"negative": "\u6ca1\u6709\u5e2e\u52a9",
"edit": "\u7f16\u8f91\u53cd\u9988",
"dialog": {
"title": "\u6dfb\u52a0\u8bc4\u8bba",
"submit": "\u63d0\u4ea4\u53cd\u9988",
"yourFeedback": "\u60a8\u7684\u53cd\u9988..."
},
"status": {
"updating": "\u66f4\u65b0\u4e2d",
"updated": "\u53cd\u9988\u5df2\u66f4\u65b0"
}
}
},
"history": {
"title": "\u6700\u8fd1\u8f93\u5165",
"empty": "\u7a7a\u7a7a\u5982\u4e5f...",
"show": "\u663e\u793a\u5386\u53f2"
},
"settings": {
"title": "\u8bbe\u7f6e\u9762\u677f",
"customize": "\u5728\u6b64\u81ea\u5b9a\u4e49\u60a8\u7684\u804a\u5929\u8bbe\u7f6e"
},
"watermark": "\u5927\u8bed\u8a00\u6a21\u578b\u53ef\u80fd\u4f1a\u72af\u9519\u3002\u8bf7\u6838\u5b9e\u91cd\u8981\u4fe1\u606f\u3002"
},
"threadHistory": {
"sidebar": {
"title": "\u5386\u53f2\u5bf9\u8bdd",
"filters": {
"search": "\u641c\u7d22",
"placeholder": "\u641c\u7d22\u4f1a\u8bdd..."
},
"timeframes": {
"today": "\u4eca\u5929",
"yesterday": "\u6628\u5929",
"previous7days": "\u8fc7\u53bb7\u5929",
"previous30days": "\u8fc7\u53bb30\u5929"
},
"empty": "\u672a\u627e\u5230\u5bf9\u8bdd",
"actions": {
"close": "\u5173\u95ed\u4fa7\u8fb9\u680f",
"open": "\u6253\u5f00\u4fa7\u8fb9\u680f"
}
},
"thread": {
"untitled": "\u672a\u547d\u540d\u5bf9\u8bdd",
"menu": {
"rename": "\u91cd\u547d\u540d",
"share": "\u5206\u4eab",
"delete": "\u5220\u9664"
},
"actions": {
"share": {
"title": "\u5206\u4eab\u804a\u5929\u94fe\u63a5",
"button": "\u5206\u4eab",
"status": {
"copied": "\u94fe\u63a5\u5df2\u590d\u5236",
"created": "\u5206\u4eab\u94fe\u63a5\u5df2\u521b\u5efa\uff01",
"unshared": "\u5df2\u7981\u7528\u6b64\u5bf9\u8bdd\u7684\u5206\u4eab"
},
"error": {
"create": "\u521b\u5efa\u5206\u4eab\u94fe\u63a5\u5931\u8d25",
"unshare": "\u53d6\u6d88\u5bf9\u8bdd\u5206\u4eab\u5931\u8d25"
}
},
"delete": {
"title": "\u786e\u8ba4\u5220\u9664",
"description": "\u8fd9\u5c06\u5220\u9664\u8be5\u5bf9\u8bdd\u53ca\u5176\u6240\u6709\u6d88\u606f\u548c\u5143\u7d20\u3002\u6b64\u64cd\u4f5c\u65e0\u6cd5\u64a4\u9500",
"success": "\u5bf9\u8bdd\u5df2\u5220\u9664",
"inProgress": "\u6b63\u5728\u5220\u9664\u5bf9\u8bdd"
},
"rename": {
"title": "\u91cd\u547d\u540d\u5bf9\u8bdd",
"description": "\u4e3a\u6b64\u5bf9\u8bdd\u8f93\u5165\u65b0\u540d\u79f0",
"form": {
"name": {
"label": "\u540d\u79f0",
"placeholder": "\u8f93\u5165\u65b0\u540d\u79f0"
}
},
"success": "\u5bf9\u8bdd\u5df2\u91cd\u547d\u540d\uff01",
"inProgress": "\u6b63\u5728\u91cd\u547d\u540d\u5bf9\u8bdd"
}
}
}
},
"navigation": {
"header": {
"chat": "\u804a\u5929",
"readme": "\u8bf4\u660e",
"theme": {
"light": "\u6d45\u8272\u4e3b\u9898",
"dark": "\u6df1\u8272\u4e3b\u9898",
"system": "\u8ddf\u968f\u7cfb\u7edf"
}
},
"newChat": {
"button": "\u65b0\u5efa\u5bf9\u8bdd",
"dialog": {
"title": "\u521b\u5efa\u65b0\u5bf9\u8bdd",
"description": "\u8fd9\u5c06\u6e05\u9664\u60a8\u5f53\u524d\u7684\u804a\u5929\u8bb0\u5f55\u3002\u786e\u5b9a\u8981\u7ee7\u7eed\u5417\uff1f",
"tooltip": "\u65b0\u5efa\u5bf9\u8bdd"
}
},
"user": {
"menu": {
"settings": "\u8bbe\u7f6e",
"settingsKey": "S",
"apiKeys": "API\u5bc6\u94a5",
"logout": "\u9000\u51fa\u767b\u5f55"
}
}
},
"apiKeys": {
"title": "\u6240\u9700API\u5bc6\u94a5",
"description": "\u4f7f\u7528\u6b64\u5e94\u7528\u9700\u8981\u4ee5\u4e0bAPI\u5bc6\u94a5\u3002\u8fd9\u4e9b\u5bc6\u94a5\u5b58\u50a8\u5728\u60a8\u8bbe\u5907\u7684\u672c\u5730\u5b58\u50a8\u4e2d\u3002",
"success": {
"saved": "\u4fdd\u5b58\u6210\u529f"
}
},
"alerts": {
"info": "\u4fe1\u606f",
"note": "\u6ce8\u91ca",
"tip": "\u63d0\u793a",
"important": "\u91cd\u8981",
"warning": "\u8b66\u544a",
"caution": "\u6ce8\u610f",
"debug": "\u8c03\u8bd5",
"example": "\u793a\u4f8b",
"success": "\u6210\u529f",
"help": "\u5e2e\u52a9",
"idea": "\u60f3\u6cd5",
"pending": "\u5f85\u5904\u7406",
"security": "\u5b89\u5168",
"beta": "\u6d4b\u8bd5",
"best-practice": "\u6700\u4f73\u5b9e\u8df5"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u9009\u62e9..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u9009\u62e9\u65e5\u671f",
"range": "\u9009\u62e9\u65e5\u671f\u8303\u56f4"
}
}
}
}

View File

@ -0,0 +1,260 @@
{
"common": {
"actions": {
"cancel": "\u53d6\u6d88",
"confirm": "\u78ba\u8a8d",
"continue": "\u7e7c\u7e8c",
"goBack": "\u8fd4\u56de",
"reset": "\u91cd\u8a2d",
"submit": "\u9001\u51fa"
},
"status": {
"loading": "\u8f09\u5165\u4e2d...",
"error": {
"default": "\u767c\u751f\u932f\u8aa4",
"serverConnection": "\u7121\u6cd5\u9023\u7dda\u5230\u4f3a\u670d\u5668"
}
}
},
"auth": {
"login": {
"title": "\u767b\u5165\u4ee5\u5b58\u53d6\u61c9\u7528\u7a0b\u5f0f",
"form": {
"email": {
"label": "\u96fb\u5b50\u4fe1\u7bb1",
"required": "\u4fe1\u7bb1\u662f\u5fc5\u586b\u9805\u76ee",
"placeholder": "me@example.com"
},
"password": {
"label": "\u5bc6\u78bc",
"required": "\u5bc6\u78bc\u662f\u5fc5\u586b\u9805\u76ee"
},
"actions": {
"signin": "\u767b\u5165"
},
"alternativeText": {
"or": "\u6216"
}
},
"errors": {
"default": "\u7121\u6cd5\u767b\u5165",
"signin": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"oauthSignin": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"redirectUriMismatch": "\u91cd\u65b0\u5c0e\u5411URI\u8207OAuth App\u8a2d\u5b9a\u4e0d\u76f8\u7b26",
"oauthCallback": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"oauthCreateAccount": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"emailCreateAccount": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"callback": "\u8acb\u5617\u8a66\u4f7f\u7528\u5176\u5b83\u5e33\u865f\u767b\u5165",
"oauthAccountNotLinked": "\u70ba\u78ba\u8a8d\u60a8\u7684\u8eab\u4efd\uff0c\u8acb\u4ee5\u539f\u672c\u4f7f\u7528\u7684\u5e33\u865f\u767b\u5165",
"emailSignin": "\u96fb\u5b50\u90f5\u4ef6\u767c\u9001\u5931\u6557",
"emailVerify": "\u8acb\u9a57\u8b49\u60a8\u7684\u96fb\u5b50\u4fe1\u7bb1\uff0c\u65b0\u7684\u9a57\u8b49\u90f5\u4ef6\u5df2\u767c\u9001",
"credentialsSignin": "\u767b\u5165\u5931\u6557\u3002\u8acb\u6aa2\u67e5\u60a8\u63d0\u4f9b\u7684\u8cc7\u8a0a\u662f\u5426\u6b63\u78ba",
"sessionRequired": "\u8acb\u767b\u5165\u4ee5\u5b58\u53d6\u6b64\u9801\u9762"
}
},
"provider": {
"continue": "\u7e7c\u7e8c\u4f7f\u7528{{provider}}"
}
},
"chat": {
"input": {
"placeholder": "\u5728\u6b64\u8f38\u5165\u60a8\u7684\u8a0a\u606f...",
"actions": {
"send": "\u767c\u9001\u8a0a\u606f",
"stop": "\u505c\u6b62\u4efb\u52d9",
"attachFiles": "\u9644\u52a0\u6a94\u6848"
}
},
"speech": {
"start": "\u958b\u59cb\u9304\u97f3",
"stop": "\u505c\u6b62\u9304\u97f3",
"connecting": "\u9023\u7dda\u4e2d"
},
"fileUpload": {
"dragDrop": "\u62d6\u66f3\u6a94\u6848\u5230\u9019\u88e1",
"browse": "\u700f\u89bd\u6a94\u6848",
"sizeLimit": "\u9650\u5236\uff1a",
"errors": {
"failed": "\u4e0a\u50b3\u5931\u6557",
"cancelled": "\u5df2\u53d6\u6d88\u4e0a\u50b3"
},
"actions": {
"cancelUpload": "\u53d6\u6d88\u4e0a\u50b3",
"removeAttachment": "\u79fb\u9664\u9644\u4ef6"
}
},
"favorites": {
"use": "\u4f7f\u7528\u6536\u85cf\u7684\u8a0a\u606f",
"headline": "\u6536\u85cf\u7684\u8a0a\u606f",
"remove": "\u79fb\u9664\u6536\u85cf",
"empty": {
"title": "\u5c1a\u672a\u5132\u5b58\u7684\u63d0\u793a",
"description": "\u5f9e\u767c\u9001\u63d0\u793a\u4e26\u52a0\u661f\u865f\u958b\u59cb\uff0c\u6216\u5f9e\u4e4b\u524d\u7684\u804a\u5929\u4e2d\u52a0\u661f\u865f\u63d0\u793a"
}
},
"commands": {
"button": "\u5de5\u5177",
"changeTool": "\u66f4\u63db\u5de5\u5177",
"availableTools": "\u53ef\u7528\u5de5\u5177"
},
"messages": {
"status": {
"using": "\u6b63\u5728\u4f7f\u7528",
"used": "\u5df2\u4f7f\u7528"
},
"actions": {
"copy": {
"button": "\u8907\u88fd\u5230\u526a\u8cbc\u7c3f",
"success": "\u5df2\u8907\u88fd\uff01"
}
},
"feedback": {
"positive": "\u6709\u5e6b\u52a9",
"negative": "\u6c92\u6709\u5e6b\u52a9",
"edit": "\u7de8\u8f2f\u56de\u994b",
"dialog": {
"title": "\u65b0\u589e\u8a55\u8ad6",
"submit": "\u9001\u51fa\u56de\u994b",
"yourFeedback": "\u60a8\u7684\u56de\u994b..."
},
"status": {
"updating": "\u66f4\u65b0\u4e2d",
"updated": "\u56de\u994b\u5df2\u66f4\u65b0"
}
}
},
"history": {
"title": "\u6700\u8fd1\u8f38\u5165",
"empty": "\u7a7a\u7a7a\u5982\u4e5f...",
"show": "\u986f\u793a\u6b77\u53f2"
},
"settings": {
"title": "\u8a2d\u5b9a\u9762\u677f",
"customize": "\u5728\u6b64\u81ea\u5b9a\u7fa9\u60a8\u7684\u804a\u5929\u8a2d\u5b9a"
},
"watermark": "\u5927\u578b\u8a9e\u8a00\u6a21\u578b\u53ef\u80fd\u6703\u72af\u932f\u3002\u8acb\u6838\u5be6\u91cd\u8981\u8cc7\u8a0a\u3002"
},
"threadHistory": {
"sidebar": {
"title": "\u6b77\u53f2\u5c0d\u8a71",
"filters": {
"search": "\u641c\u5c0b",
"placeholder": "\u641c\u5c0b\u5c0d\u8a71..."
},
"timeframes": {
"today": "\u4eca\u5929",
"yesterday": "\u6628\u5929",
"previous7days": "\u904e\u53bb7\u5929",
"previous30days": "\u904e\u53bb30\u5929"
},
"empty": "\u672a\u627e\u5230\u5c0d\u8a71",
"actions": {
"close": "\u95dc\u9589\u5074\u908a\u6b04",
"open": "\u6253\u958b\u5074\u908a\u6b04"
}
},
"thread": {
"untitled": "\u672a\u547d\u540d\u5c0d\u8a71",
"menu": {
"rename": "\u91cd\u65b0\u547d\u540d",
"share": "\u5206\u4eab",
"delete": "\u522a\u9664"
},
"actions": {
"share": {
"title": "\u5206\u4eab\u804a\u5929\u9023\u7d50",
"button": "\u5206\u4eab",
"status": {
"copied": "\u9023\u7d50\u5df2\u8907\u88fd",
"created": "\u5206\u4eab\u9023\u7d50\u5df2\u5efa\u7acb\uff01",
"unshared": "\u5df2\u505c\u7528\u6b64\u5c0d\u8a71\u7684\u5206\u4eab"
},
"error": {
"create": "\u5efa\u7acb\u5206\u4eab\u9023\u7d50\u5931\u6557",
"unshare": "\u53d6\u6d88\u5c0d\u8a71\u5206\u4eab\u5931\u6557"
}
},
"delete": {
"title": "\u78ba\u8a8d\u522a\u9664",
"description": "\u9019\u5c07\u522a\u9664\u8a72\u5c0d\u8a71\u53ca\u5176\u6240\u6709\u8a0a\u606f\u548c\u5143\u4ef6\u3002\u6b64\u64cd\u4f5c\u7121\u6cd5\u5fa9\u539f\u3002",
"success": "\u5c0d\u8a71\u5df2\u522a\u9664",
"inProgress": "\u6b63\u5728\u522a\u9664\u5c0d\u8a71"
},
"rename": {
"title": "\u91cd\u65b0\u547d\u540d\u5c0d\u8a71",
"description": "\u70ba\u6b64\u5c0d\u8a71\u8f38\u5165\u65b0\u540d\u7a31",
"form": {
"name": {
"label": "\u540d\u7a31",
"placeholder": "\u8f38\u5165\u65b0\u540d\u7a31"
}
},
"success": "\u5c0d\u8a71\u5df2\u91cd\u65b0\u547d\u540d\uff01",
"inProgress": "\u6b63\u5728\u91cd\u65b0\u547d\u540d\u5c0d\u8a71"
}
}
}
},
"navigation": {
"header": {
"chat": "\u804a\u5929",
"readme": "\u8aaa\u660e",
"theme": {
"light": "\u6dfa\u8272\u4e3b\u984c",
"dark": "\u6df1\u8272\u4e3b\u984c",
"system": "\u8ddf\u96a8\u7cfb\u7d71"
}
},
"newChat": {
"button": "\u65b0\u5efa\u5c0d\u8a71",
"dialog": {
"title": "\u5275\u5efa\u65b0\u5c0d\u8a71",
"description": "\u9019\u5c07\u6e05\u9664\u60a8\u7576\u524d\u7684\u804a\u5929\u8a18\u9304\u3002\u78ba\u5b9a\u8981\u7e7c\u7e8c\u55ce\uff1f",
"tooltip": "\u65b0\u5efa\u5c0d\u8a71"
}
},
"user": {
"menu": {
"settings": "\u8a2d\u5b9a",
"settingsKey": "S",
"apiKeys": "API\u91d1\u9470",
"logout": "\u767b\u51fa"
}
}
},
"apiKeys": {
"title": "\u6240\u9700API\u91d1\u9470",
"description": "\u4f7f\u7528\u6b64\u61c9\u7528\u7a0b\u5f0f\u9700\u8981\u4ee5\u4e0bAPI\u91d1\u9470\u3002\u9019\u4e9b\u91d1\u9470\u5132\u5b58\u5728\u60a8\u8a2d\u5099\u7684\u672c\u5730\u5132\u5b58\u7a7a\u9593\u4e2d\u3002",
"success": {
"saved": "\u5132\u5b58\u6210\u529f"
}
},
"alerts": {
"info": "\u8cc7\u8a0a",
"note": "\u6ce8\u91cb",
"tip": "\u63d0\u793a",
"important": "\u91cd\u8981",
"warning": "\u8b66\u544a",
"caution": "\u6ce8\u610f",
"debug": "\u9664\u932f",
"example": "\u7bc4\u4f8b",
"success": "\u6210\u529f",
"help": "\u5e6b\u52a9",
"idea": "\u60f3\u6cd5",
"pending": "\u5f85\u8655\u7406",
"security": "\u5b89\u5168",
"beta": "\u6e2c\u8a66",
"best-practice": "\u6700\u4f73\u5be6\u8e10"
},
"components": {
"MultiSelectInput": {
"placeholder": "\u9078\u64c7..."
},
"DatePickerInput": {
"placeholder": {
"single": "\u9078\u64c7\u65e5\u671f",
"range": "\u9078\u64c7\u65e5\u671f\u7bc4\u570d"
}
}
}
}

View File

@ -1,14 +1,18 @@
FROM node:20-alpine # frontend/Dockerfile
FROM python:3.11.8-slim
WORKDIR /app WORKDIR /app
COPY package*.json ./ COPY pyproject.toml .
RUN npm ci RUN pip install --no-cache-dir -e ".[frontend]"
COPY . . COPY frontend/ ./frontend
COPY configs.py .
RUN npm run build WORKDIR /app/frontend
EXPOSE 3000 EXPOSE 8000
CMD ["npm", "start"] ENV PYTHONPATH=/app
CMD ["chainlit", "run", "app.py", "--host", "0.0.0.0", "--port", "8000"]

122
frontend/app.py Normal file
View File

@ -0,0 +1,122 @@
import os
from dotenv import load_dotenv
load_dotenv()
import aiohttp
import asyncio
import chainlit as cl
from chainlit.data.sql_alchemy import SQLAlchemyDataLayer
from chainlit.types import ThreadDict
from frontend.services import (
sync_session_model,
post_agent_request,
parse_sse_stream,
dispatch_events,
finalize_message,
)
from configs import (
ALL_MODELS,
ALL_STARTERS,
DEFAULT_MODEL,
AUTH_USER,
AUTH_PASS,
CHAINLIT_DATABASE_URL,
HTTP_TIMEOUT_TOTAL,
HTTP_TIMEOUT_CONNECT,
)
_CLIENT_TIMEOUT = aiohttp.ClientTimeout(
total=HTTP_TIMEOUT_TOTAL,
connect=HTTP_TIMEOUT_CONNECT,
)
@cl.password_auth_callback
def auth_callback(username: str, password: str) -> cl.User | None:
"""Checks the user's login and password."""
if username == AUTH_USER and password == AUTH_PASS:
return cl.User(
identifier=username,
metadata={"role": "admin", "provider": "credentials"}
)
else:
return None
@cl.set_starters
async def set_starters() -> list[cl.Starter]:
"""Define starter prompts displayed on the welcome screen."""
return [
cl.Starter(
label=starter["label"],
message=starter["prompt"],
icon=f"/public/icons/{starter['icon']}",
)
for starter in ALL_STARTERS
]
@cl.set_chat_profiles
async def chat_profile() -> list[cl.ChatProfile]:
"""Define available AI model profiles for the chat."""
return [
cl.ChatProfile(
name=model["id"],
markdown_description=model["desc"],
icon=f"/public/icons/{model['icon']}",
)
for model in ALL_MODELS
]
@cl.on_chat_start
async def init_session() -> None:
"""Initialize chat session with selected model."""
model = cl.user_session.get("chat_profile") or DEFAULT_MODEL
cl.user_session.set("model", model)
cl.user_session.set("history", [])
@cl.data_layer
def get_data_layer() -> SQLAlchemyDataLayer:
"""Returns SQLAlchemy data layer for storing chat history"""
return SQLAlchemyDataLayer(
conninfo=CHAINLIT_DATABASE_URL
)
@cl.on_chat_resume
async def chat_resume(thread: ThreadDict) -> None:
"""Converts thread steps into role-based history list."""
history = []
for step in thread["steps"]:
if step["type"] == "user_message":
history.append({"role": "user", "content": step["output"]})
elif step["type"] == "assistant_message":
history.append({"role": "assistant", "content": step["output"]})
model = cl.user_session.get("chat_profile") or DEFAULT_MODEL
cl.user_session.set("model", model)
cl.user_session.set("history", history)
@cl.on_message
async def on_message(message: cl.Message) -> None:
"""Input AI agent response, connect with FastAPI."""
model, history = sync_session_model()
history.append({"role": "user", "content": message.content})
msg = cl.Message(content="")
cancelled = False
active_steps = {}
async with cl.Step(name="thinking 💭", type="run") as steps:
try:
async with aiohttp.ClientSession(timeout=_CLIENT_TIMEOUT) as session:
response = await post_agent_request(session, message.content, model, history)
async for parsed in parse_sse_stream(response):
await dispatch_events(parsed, msg, steps, active_steps)
except asyncio.CancelledError:
cancelled = True
steps.output = "Cancelled"
except Exception as e:
steps.output = "Error"
history = await finalize_message(msg, cancelled, history)
cl.user_session.set("history", history)

View File

@ -1,26 +0,0 @@
"use client";
import { AssistantRuntimeProvider } from "@assistant-ui/react";
import {
useChatRuntime,
AssistantChatTransport,
} from "@assistant-ui/react-ai-sdk";
import { lastAssistantMessageIsCompleteWithToolCalls } from "ai";
import { Thread } from "@/components/assistant-ui/thread";
export const Assistant = () => {
const runtime = useChatRuntime({
sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,
transport: new AssistantChatTransport({
api: "/api/chat",
}),
});
return (
<AssistantRuntimeProvider runtime={runtime}>
<div className="h-dvh">
<Thread />
</div>
</AssistantRuntimeProvider>
);
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

View File

@ -1,88 +0,0 @@
@import "tailwindcss";
@import "tw-animate-css";
@custom-variant dark (&:is(.dark *));
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--animate-shimmer: shimmer-sweep var(--shimmer-duration, 1000ms) linear
infinite both;
@keyframes shimmer-sweep {
from {
background-position: 150% 0;
}
to {
background-position: -100% 0;
}
}
}
:root {
--radius: 0.625rem;
--background: oklch(0.12 0.04 240);
--foreground: oklch(0.95 0.01 240);
--card: oklch(0.17 0.05 240);
--card-foreground: oklch(0.95 0.01 240);
--popover: oklch(0.17 0.05 240);
--popover-foreground: oklch(0.95 0.01 240);
--primary: oklch(0.6 0.18 240);
--primary-foreground: oklch(0.98 0 0);
--secondary: oklch(0.2 0.05 240);
--secondary-foreground: oklch(0.95 0.01 240);
--muted: oklch(0.2 0.05 240);
--muted-foreground: oklch(0.65 0.05 240);
--accent: oklch(0.22 0.06 240);
--accent-foreground: oklch(0.95 0.01 240);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(1 0 0 / 8%);
--input: oklch(1 0 0 / 12%);
--ring: oklch(0.5 0.15 240);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
:root {
color-scheme: light;
}
:root.dark {
color-scheme: dark;
}
body {
@apply bg-background text-foreground;
}
}

View File

@ -1,34 +0,0 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import { TooltipProvider } from "@/components/ui/tooltip";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Legal AI Assistant",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en" className="root">
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
<TooltipProvider>{children}</TooltipProvider>
</body>
</html>
);
}

View File

@ -1,5 +0,0 @@
import { Assistant } from "./assistant";
export default function Home() {
return <Assistant />;
}

29
frontend/chainlit.md Normal file
View File

@ -0,0 +1,29 @@
# Legal AI Assistant 🏛️⚖️
An AI-powered assistant for querying public data from the **Slovak Ministry of Justice API** (obcan.justice.sk). Ask about courts, judges, decisions, contracts, and legal proceedings — all in Slovak.
---
## What it does
- Searches courts, judges, decisions, contracts, civil and administrative proceedings
- Calls the Justice API via MCP tools and presents results clearly
- Maintains conversation history across sessions
- Streams responses token by token in real time
---
## Frontend (Chainlit)
Built with **Chainlit 2.11**, the interface provides:
- **Chat profiles** — switch between AI models (GPT, Gemini, DeepSeek, Qwen, LLaMA) directly from the UI
- **Starter prompts** — quick-access example questions on the welcome screen
- **Step tracking** — tool calls and reasoning steps are shown as collapsible steps inside each response
- **Auth** — password-protected login
- **Persistent history** — conversations are stored in PostgreSQL and resumable across sessions
- **Custom theme** — dark mode with a custom CSS and branded logo
---
> ⚠️ This assistant retrieves and presents public data only. It does not provide legal advice.

View File

@ -1,21 +0,0 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": true,
"tsx": true,
"tailwind": {
"config": "",
"css": "app/globals.css",
"baseColor": "zinc",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

View File

@ -1,62 +0,0 @@
"use client";
import { type FC } from "react";
import { ComposerPrimitive, AuiIf } from "@assistant-ui/react";
import { ArrowUpIcon, SquareIcon } from "lucide-react";
import { Button } from "@/components/ui/button";
import { TooltipIconButton } from "./tooltip-icon-button";
const ComposerAction: FC = () => {
return (
<div className="relative flex items-center justify-end">
<AuiIf condition={(s) => !s.thread.isRunning}>
<ComposerPrimitive.Send asChild>
<TooltipIconButton
tooltip="Odoslať"
side="bottom"
type="button"
variant="default"
size="icon"
className="size-8 rounded-full bg-blue-600 hover:bg-blue-700 border-0"
aria-label="Send message"
>
<ArrowUpIcon className="size-4" />
</TooltipIconButton>
</ComposerPrimitive.Send>
</AuiIf>
<AuiIf condition={(s) => s.thread.isRunning}>
<ComposerPrimitive.Cancel asChild>
<Button
type="button"
variant="default"
size="icon"
className="size-8 rounded-full bg-blue-600 hover:bg-blue-700 border-0"
aria-label="Stop generating"
>
<SquareIcon className="size-3 fill-current" />
</Button>
</ComposerPrimitive.Cancel>
</AuiIf>
</div>
);
};
export const ThreadComposer: FC = () => {
return (
<ComposerPrimitive.Root className="relative flex w-full flex-col">
<div
data-slot="composer-shell"
className="flex w-full flex-col gap-2 rounded-2xl border border-blue-500/20 bg-card p-3 transition-shadow focus-within:border-blue-500/50 focus-within:ring-2 focus-within:ring-blue-500/10"
>
<ComposerPrimitive.Input
placeholder="Napíšte správu..."
className="max-h-32 min-h-10 w-full resize-none bg-transparent px-2 py-1 text-sm outline-none placeholder:text-muted-foreground/60"
rows={1}
autoFocus
aria-label="Message input"
/>
<ComposerAction />
</div>
</ComposerPrimitive.Root>
);
};

View File

@ -1,21 +0,0 @@
"use client";
import { type FC } from "react";
import { SquarePenIcon, ChevronDownIcon, ScaleIcon } from "lucide-react";
export const ThreadHeader: FC = () => {
return (
<div className="flex items-center gap-2 px-4 py-3 border-b border-border/40">
<button className="p-1.5 rounded-md hover:bg-accent transition-colors">
<SquarePenIcon className="size-5 text-muted-foreground" />
</button>
<div className="flex items-center gap-1.5 px-3 py-1.5 rounded-lg hover:bg-accent cursor-pointer transition-colors">
<span className="text-sm font-medium text-foreground">
Legal AI Assistant
</span>
<ChevronDownIcon className="size-4 text-muted-foreground" />
</div>
</div>
);
};

View File

@ -1,243 +0,0 @@
"use client";
import "@assistant-ui/react-markdown/styles/dot.css";
import {
type CodeHeaderProps,
MarkdownTextPrimitive,
unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,
useIsMarkdownCodeBlock,
} from "@assistant-ui/react-markdown";
import remarkGfm from "remark-gfm";
import { type FC, memo, useState } from "react";
import { CheckIcon, CopyIcon } from "lucide-react";
import { TooltipIconButton } from "@/components/assistant-ui/tooltip-icon-button";
import { cn } from "@/lib/utils";
const MarkdownTextImpl = () => {
return (
<MarkdownTextPrimitive
remarkPlugins={[remarkGfm]}
className="aui-md"
components={defaultComponents}
/>
);
};
export const MarkdownText = memo(MarkdownTextImpl);
const CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {
const { isCopied, copyToClipboard } = useCopyToClipboard();
const onCopy = () => {
if (!code || isCopied) return;
copyToClipboard(code);
};
return (
<div className="aui-code-header-root mt-2.5 flex items-center justify-between rounded-t-lg border border-border/50 border-b-0 bg-muted/50 px-3 py-1.5 text-xs">
<span className="aui-code-header-language font-medium text-muted-foreground lowercase">
{language}
</span>
<TooltipIconButton tooltip="Copy" onClick={onCopy}>
{!isCopied && <CopyIcon />}
{isCopied && <CheckIcon />}
</TooltipIconButton>
</div>
);
};
const useCopyToClipboard = ({
copiedDuration = 3000,
}: {
copiedDuration?: number;
} = {}) => {
const [isCopied, setIsCopied] = useState<boolean>(false);
const copyToClipboard = (value: string) => {
if (!value) return;
navigator.clipboard.writeText(value).then(() => {
setIsCopied(true);
setTimeout(() => setIsCopied(false), copiedDuration);
});
};
return { isCopied, copyToClipboard };
};
const defaultComponents = memoizeMarkdownComponents({
h1: ({ className, ...props }) => (
<h1
className={cn(
"aui-md-h1 mb-2 scroll-m-20 font-semibold text-base first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
h2: ({ className, ...props }) => (
<h2
className={cn(
"aui-md-h2 mt-3 mb-1.5 scroll-m-20 font-semibold text-sm first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
h3: ({ className, ...props }) => (
<h3
className={cn(
"aui-md-h3 mt-2.5 mb-1 scroll-m-20 font-semibold text-sm first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
h4: ({ className, ...props }) => (
<h4
className={cn(
"aui-md-h4 mt-2 mb-1 scroll-m-20 font-medium text-sm first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
h5: ({ className, ...props }) => (
<h5
className={cn(
"aui-md-h5 mt-2 mb-1 font-medium text-sm first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
h6: ({ className, ...props }) => (
<h6
className={cn(
"aui-md-h6 mt-2 mb-1 font-medium text-sm first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
p: ({ className, ...props }) => (
<p
className={cn(
"aui-md-p my-2.5 leading-normal first:mt-0 last:mb-0",
className,
)}
{...props}
/>
),
a: ({ className, ...props }) => (
<a
className={cn(
"aui-md-a text-primary underline underline-offset-2 hover:text-primary/80",
className,
)}
{...props}
/>
),
blockquote: ({ className, ...props }) => (
<blockquote
className={cn(
"aui-md-blockquote my-2.5 border-muted-foreground/30 border-l-2 pl-3 text-muted-foreground italic",
className,
)}
{...props}
/>
),
ul: ({ className, ...props }) => (
<ul
className={cn(
"aui-md-ul my-2 ml-4 list-disc marker:text-muted-foreground [&>li]:mt-1",
className,
)}
{...props}
/>
),
ol: ({ className, ...props }) => (
<ol
className={cn(
"aui-md-ol my-2 ml-4 list-decimal marker:text-muted-foreground [&>li]:mt-1",
className,
)}
{...props}
/>
),
hr: ({ className, ...props }) => (
<hr
className={cn("aui-md-hr my-2 border-muted-foreground/20", className)}
{...props}
/>
),
table: ({ className, ...props }) => (
<table
className={cn(
"aui-md-table my-2 w-full border-separate border-spacing-0 overflow-y-auto",
className,
)}
{...props}
/>
),
th: ({ className, ...props }) => (
<th
className={cn(
"aui-md-th bg-muted px-2 py-1 text-left font-medium first:rounded-tl-lg last:rounded-tr-lg [[align=center]]:text-center [[align=right]]:text-right",
className,
)}
{...props}
/>
),
td: ({ className, ...props }) => (
<td
className={cn(
"aui-md-td border-muted-foreground/20 border-b border-l px-2 py-1 text-left last:border-r [[align=center]]:text-center [[align=right]]:text-right",
className,
)}
{...props}
/>
),
tr: ({ className, ...props }) => (
<tr
className={cn(
"aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg",
className,
)}
{...props}
/>
),
li: ({ className, ...props }) => (
<li className={cn("aui-md-li leading-normal", className)} {...props} />
),
sup: ({ className, ...props }) => (
<sup
className={cn("aui-md-sup [&>a]:text-xs [&>a]:no-underline", className)}
{...props}
/>
),
pre: ({ className, ...props }) => (
<pre
className={cn(
"aui-md-pre overflow-x-auto rounded-t-none rounded-b-lg border border-border/50 border-t-0 bg-muted/30 p-3 text-xs leading-relaxed",
className,
)}
{...props}
/>
),
code: function Code({ className, ...props }) {
const isCodeBlock = useIsMarkdownCodeBlock();
return (
<code
className={cn(
!isCodeBlock &&
"aui-md-inline-code rounded-md border border-border/50 bg-muted/50 px-1.5 py-0.5 font-mono text-[0.85em]",
className,
)}
{...props}
/>
);
},
CodeHeader,
});

View File

@ -1,160 +0,0 @@
"use client";
import { type FC } from "react";
import {
ActionBarMorePrimitive,
ActionBarPrimitive,
AuiIf,
BranchPickerPrimitive,
ErrorPrimitive,
MessagePrimitive,
useAuiState,
} from "@assistant-ui/react";
import {
CheckIcon,
ChevronLeftIcon,
ChevronRightIcon,
CopyIcon,
DownloadIcon,
MoreHorizontalIcon,
RefreshCwIcon,
ScaleIcon,
} from "lucide-react";
import { cn } from "@/lib/utils";
import { MarkdownText } from "./markdown-text";
import { ToolFallback } from "./tool-fallback";
import { TooltipIconButton } from "./tooltip-icon-button";
const MessageError: FC = () => {
return (
<MessagePrimitive.Error>
<ErrorPrimitive.Root className="mt-2 rounded-md border border-destructive bg-destructive/10 p-3 text-destructive text-sm">
<ErrorPrimitive.Message className="line-clamp-2" />
</ErrorPrimitive.Root>
</MessagePrimitive.Error>
);
};
const AssistantActionBar: FC = () => {
return (
<ActionBarPrimitive.Root
hideWhenRunning
autohide="not-last"
autohideFloat="single-branch"
className="col-start-3 row-start-2 -ml-1 flex gap-1 text-muted-foreground"
>
<ActionBarPrimitive.Copy asChild>
<TooltipIconButton tooltip="Kopírovať">
<AuiIf condition={(s) => s.message.isCopied}>
<CheckIcon />
</AuiIf>
<AuiIf condition={(s) => !s.message.isCopied}>
<CopyIcon />
</AuiIf>
</TooltipIconButton>
</ActionBarPrimitive.Copy>
<ActionBarPrimitive.Reload asChild>
<TooltipIconButton tooltip="Obnoviť">
<RefreshCwIcon />
</TooltipIconButton>
</ActionBarPrimitive.Reload>
<ActionBarMorePrimitive.Root>
<ActionBarMorePrimitive.Trigger asChild>
<TooltipIconButton tooltip="Viac" className="data-[state=open]:bg-accent">
<MoreHorizontalIcon />
</TooltipIconButton>
</ActionBarMorePrimitive.Trigger>
<ActionBarMorePrimitive.Content
side="bottom"
align="start"
className="z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md"
>
<ActionBarPrimitive.ExportMarkdown asChild>
<ActionBarMorePrimitive.Item className="flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent">
<DownloadIcon className="size-4" />
Export ako Markdown
</ActionBarMorePrimitive.Item>
</ActionBarPrimitive.ExportMarkdown>
</ActionBarMorePrimitive.Content>
</ActionBarMorePrimitive.Root>
</ActionBarPrimitive.Root>
);
};
export const BranchPicker: FC<BranchPickerPrimitive.Root.Props> = ({
className,
...rest
}) => {
return (
<BranchPickerPrimitive.Root
hideWhenSingleBranch
className={cn(
"mr-2 -ml-2 inline-flex items-center text-muted-foreground text-xs",
className,
)}
{...rest}
>
<BranchPickerPrimitive.Previous asChild>
<TooltipIconButton tooltip="Predchádzajúci">
<ChevronLeftIcon />
</TooltipIconButton>
</BranchPickerPrimitive.Previous>
<span className="font-medium">
<BranchPickerPrimitive.Number /> / <BranchPickerPrimitive.Count />
</span>
<BranchPickerPrimitive.Next asChild>
<TooltipIconButton tooltip="Ďalší">
<ChevronRightIcon />
</TooltipIconButton>
</BranchPickerPrimitive.Next>
</BranchPickerPrimitive.Root>
);
};
export const AssistantMessage: FC = () => {
return (
<MessagePrimitive.Root
className="fade-in slide-in-from-bottom-1 relative mx-auto w-full max-w-(--thread-max-width) animate-in py-3 duration-150"
data-role="assistant"
>
<div className="flex gap-3 px-2">
<div className="size-7 rounded-full bg-blue-600/20 border border-blue-500/30 flex items-center justify-center shrink-0 mt-0.5">
<ScaleIcon className="size-3.5 text-blue-400" />
</div>
<div className="flex-1 min-w-0">
<div className="text-foreground leading-relaxed">
<MessagePrimitive.Parts>
{({ part }) => {
if (part.type === "text") return <MarkdownText />;
if (part.type === "tool-call")
return part.toolUI ?? <ToolFallback {...part} />;
return null;
}}
</MessagePrimitive.Parts>
<MessageError />
</div>
<div className="mt-1 flex">
<BranchPicker />
<AssistantActionBar />
</div>
</div>
</div>
</MessagePrimitive.Root>
);
};
export const UserMessage: FC = () => {
return (
<MessagePrimitive.Root
className="fade-in slide-in-from-bottom-1 mx-auto grid w-full max-w-(--thread-max-width) animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] content-start gap-y-2 px-2 py-3 duration-150 [&:where(>*)]:col-start-2"
data-role="user"
>
<div className="relative col-start-2 min-w-0">
<div className="wrap-break-word rounded-2xl bg-blue-600/20 border border-blue-500/20 px-4 py-2.5 text-foreground empty:hidden">
<MessagePrimitive.Parts />
</div>
</div>
<BranchPicker className="col-span-full col-start-1 row-start-3 -mr-1 justify-end" />
</MessagePrimitive.Root>
);
};

View File

@ -1,64 +0,0 @@
"use client";
import { type FC } from "react";
import { AuiIf, ThreadPrimitive, useAuiState } from "@assistant-ui/react";
import { ArrowDownIcon } from "lucide-react";
import { ThreadHeader } from "./header";
import { ThreadWelcome } from "./welcome";
import { AssistantMessage, UserMessage } from "./messages";
import { ThreadComposer } from "./composer";
import { TooltipIconButton } from "./tooltip-icon-button";
const ThreadMessage: FC = () => {
const role = useAuiState((s) => s.message.role);
if (role === "user") return <UserMessage />;
return <AssistantMessage />;
};
const ThreadScrollToBottom: FC = () => {
return (
<ThreadPrimitive.ScrollToBottom asChild>
<TooltipIconButton
tooltip="Scroll to bottom"
variant="outline"
className="absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:border-border dark:bg-background dark:hover:bg-accent"
>
<ArrowDownIcon />
</TooltipIconButton>
</ThreadPrimitive.ScrollToBottom>
);
};
export const Thread: FC = () => {
return (
<ThreadPrimitive.Root
className="aui-root aui-thread-root @container flex h-full flex-col bg-background"
style={{
["--thread-max-width" as string]: "48rem",
["--composer-radius" as string]: "16px",
["--composer-padding" as string]: "12px",
}}
>
<ThreadHeader />
<ThreadPrimitive.Viewport
turnAnchor="top"
className="relative flex flex-1 flex-col overflow-x-auto overflow-y-scroll scroll-smooth px-4 pt-4"
>
<AuiIf condition={(s) => s.thread.isEmpty}>
<ThreadWelcome />
</AuiIf>
<ThreadPrimitive.Messages>
{() => <ThreadMessage />}
</ThreadPrimitive.Messages>
<ThreadPrimitive.ViewportFooter className="sticky bottom-0 mx-auto mt-auto flex w-full max-w-(--thread-max-width) flex-col gap-4 overflow-visible rounded-t-2xl bg-background pb-4 md:pb-6 pt-2">
<ThreadScrollToBottom />
<ThreadComposer />
</ThreadPrimitive.ViewportFooter>
</ThreadPrimitive.Viewport>
</ThreadPrimitive.Root>
);
};

View File

@ -1,324 +0,0 @@
"use client";
import { memo, useCallback, useRef, useState } from "react";
import {
AlertCircleIcon,
CheckIcon,
ChevronDownIcon,
LoaderIcon,
XCircleIcon,
} from "lucide-react";
import {
useScrollLock,
type ToolCallMessagePartStatus,
type ToolCallMessagePartComponent,
} from "@assistant-ui/react";
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible";
import { cn } from "@/lib/utils";
const ANIMATION_DURATION = 200;
export type ToolFallbackRootProps = Omit<
React.ComponentProps<typeof Collapsible>,
"open" | "onOpenChange"
> & {
open?: boolean;
onOpenChange?: (open: boolean) => void;
defaultOpen?: boolean;
};
function ToolFallbackRoot({
className,
open: controlledOpen,
onOpenChange: controlledOnOpenChange,
defaultOpen = false,
children,
...props
}: ToolFallbackRootProps) {
const collapsibleRef = useRef<HTMLDivElement>(null);
const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
const isControlled = controlledOpen !== undefined;
const isOpen = isControlled ? controlledOpen : uncontrolledOpen;
const handleOpenChange = useCallback(
(open: boolean) => {
if (!open) {
lockScroll();
}
if (!isControlled) {
setUncontrolledOpen(open);
}
controlledOnOpenChange?.(open);
},
[lockScroll, isControlled, controlledOnOpenChange],
);
return (
<Collapsible
ref={collapsibleRef}
data-slot="tool-fallback-root"
open={isOpen}
onOpenChange={handleOpenChange}
className={cn(
"aui-tool-fallback-root group/tool-fallback-root w-full rounded-lg border py-3",
className,
)}
style={
{
"--animation-duration": `${ANIMATION_DURATION}ms`,
} as React.CSSProperties
}
{...props}
>
{children}
</Collapsible>
);
}
type ToolStatus = ToolCallMessagePartStatus["type"];
const statusIconMap: Record<ToolStatus, React.ElementType> = {
running: LoaderIcon,
complete: CheckIcon,
incomplete: XCircleIcon,
"requires-action": AlertCircleIcon,
};
function ToolFallbackTrigger({
toolName,
status,
className,
...props
}: React.ComponentProps<typeof CollapsibleTrigger> & {
toolName: string;
status?: ToolCallMessagePartStatus;
}) {
const statusType = status?.type ?? "complete";
const isRunning = statusType === "running";
const isCancelled =
status?.type === "incomplete" && status.reason === "cancelled";
const Icon = statusIconMap[statusType];
const label = isCancelled ? "Cancelled tool" : "Used tool";
return (
<CollapsibleTrigger
data-slot="tool-fallback-trigger"
className={cn(
"aui-tool-fallback-trigger group/trigger flex w-full items-center gap-2 px-4 text-sm transition-colors",
className,
)}
{...props}
>
<Icon
data-slot="tool-fallback-trigger-icon"
className={cn(
"aui-tool-fallback-trigger-icon size-4 shrink-0",
isCancelled && "text-muted-foreground",
isRunning && "animate-spin",
)}
/>
<span
data-slot="tool-fallback-trigger-label"
className={cn(
"aui-tool-fallback-trigger-label-wrapper relative inline-block grow text-left leading-none",
isCancelled && "text-muted-foreground line-through",
)}
>
<span>
{label}: <b>{toolName}</b>
</span>
{isRunning && (
<span
aria-hidden
data-slot="tool-fallback-trigger-shimmer"
className="aui-tool-fallback-trigger-shimmer shimmer pointer-events-none absolute inset-0 motion-reduce:animate-none"
>
{label}: <b>{toolName}</b>
</span>
)}
</span>
<ChevronDownIcon
data-slot="tool-fallback-trigger-chevron"
className={cn(
"aui-tool-fallback-trigger-chevron size-4 shrink-0",
"transition-transform duration-(--animation-duration) ease-out",
"group-data-[state=closed]/trigger:-rotate-90",
"group-data-[state=open]/trigger:rotate-0",
)}
/>
</CollapsibleTrigger>
);
}
function ToolFallbackContent({
className,
children,
...props
}: React.ComponentProps<typeof CollapsibleContent>) {
return (
<CollapsibleContent
data-slot="tool-fallback-content"
className={cn(
"aui-tool-fallback-content relative overflow-hidden text-sm outline-none",
"group/collapsible-content ease-out",
"data-[state=closed]:animate-collapsible-up",
"data-[state=open]:animate-collapsible-down",
"data-[state=closed]:fill-mode-forwards",
"data-[state=closed]:pointer-events-none",
"data-[state=open]:duration-(--animation-duration)",
"data-[state=closed]:duration-(--animation-duration)",
className,
)}
{...props}
>
<div className="mt-3 flex flex-col gap-2 border-t pt-2">{children}</div>
</CollapsibleContent>
);
}
function ToolFallbackArgs({
argsText,
className,
...props
}: React.ComponentProps<"div"> & {
argsText?: string;
}) {
if (!argsText) return null;
return (
<div
data-slot="tool-fallback-args"
className={cn("aui-tool-fallback-args px-4", className)}
{...props}
>
<pre className="aui-tool-fallback-args-value whitespace-pre-wrap">
{argsText}
</pre>
</div>
);
}
function ToolFallbackResult({
result,
className,
...props
}: React.ComponentProps<"div"> & {
result?: unknown;
}) {
if (result === undefined) return null;
return (
<div
data-slot="tool-fallback-result"
className={cn(
"aui-tool-fallback-result border-t border-dashed px-4 pt-2",
className,
)}
{...props}
>
<p className="aui-tool-fallback-result-header font-semibold">Result:</p>
<pre className="aui-tool-fallback-result-content whitespace-pre-wrap">
{typeof result === "string" ? result : JSON.stringify(result, null, 2)}
</pre>
</div>
);
}
function ToolFallbackError({
status,
className,
...props
}: React.ComponentProps<"div"> & {
status?: ToolCallMessagePartStatus;
}) {
if (status?.type !== "incomplete") return null;
const error = status.error;
const errorText = error
? typeof error === "string"
? error
: JSON.stringify(error)
: null;
if (!errorText) return null;
const isCancelled = status.reason === "cancelled";
const headerText = isCancelled ? "Cancelled reason:" : "Error:";
return (
<div
data-slot="tool-fallback-error"
className={cn("aui-tool-fallback-error px-4", className)}
{...props}
>
<p className="aui-tool-fallback-error-header font-semibold text-muted-foreground">
{headerText}
</p>
<p className="aui-tool-fallback-error-reason text-muted-foreground">
{errorText}
</p>
</div>
);
}
const ToolFallbackImpl: ToolCallMessagePartComponent = ({
toolName,
argsText,
result,
status,
}) => {
const isCancelled =
status?.type === "incomplete" && status.reason === "cancelled";
return (
<ToolFallbackRoot
className={cn(isCancelled && "border-muted-foreground/30 bg-muted/30")}
>
<ToolFallbackTrigger toolName={toolName} status={status} />
<ToolFallbackContent>
<ToolFallbackError status={status} />
<ToolFallbackArgs
argsText={argsText}
className={cn(isCancelled && "opacity-60")}
/>
{!isCancelled && <ToolFallbackResult result={result} />}
</ToolFallbackContent>
</ToolFallbackRoot>
);
};
const ToolFallback = memo(
ToolFallbackImpl,
) as unknown as ToolCallMessagePartComponent & {
Root: typeof ToolFallbackRoot;
Trigger: typeof ToolFallbackTrigger;
Content: typeof ToolFallbackContent;
Args: typeof ToolFallbackArgs;
Result: typeof ToolFallbackResult;
Error: typeof ToolFallbackError;
};
ToolFallback.displayName = "ToolFallback";
ToolFallback.Root = ToolFallbackRoot;
ToolFallback.Trigger = ToolFallbackTrigger;
ToolFallback.Content = ToolFallbackContent;
ToolFallback.Args = ToolFallbackArgs;
ToolFallback.Result = ToolFallbackResult;
ToolFallback.Error = ToolFallbackError;
export {
ToolFallback,
ToolFallbackRoot,
ToolFallbackTrigger,
ToolFallbackContent,
ToolFallbackArgs,
ToolFallbackResult,
ToolFallbackError,
};

View File

@ -1,42 +0,0 @@
"use client";
import { ComponentPropsWithRef, forwardRef } from "react";
import { Slottable } from "@radix-ui/react-slot";
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
export type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {
tooltip: string;
side?: "top" | "bottom" | "left" | "right";
};
export const TooltipIconButton = forwardRef<
HTMLButtonElement,
TooltipIconButtonProps
>(({ children, tooltip, side = "bottom", className, ...rest }, ref) => {
return (
<Tooltip>
<TooltipTrigger asChild>
<Button
variant="ghost"
size="icon"
{...rest}
className={cn("aui-button-icon size-6 p-1", className)}
ref={ref}
>
<Slottable>{children}</Slottable>
<span className="aui-sr-only sr-only">{tooltip}</span>
</Button>
</TooltipTrigger>
<TooltipContent side={side}>{tooltip}</TooltipContent>
</Tooltip>
);
});
TooltipIconButton.displayName = "TooltipIconButton";

View File

@ -1,84 +0,0 @@
"use client";
import { type FC } from "react";
const STARTERS = [
{
icon: "/icons/magnifying-glass.svg",
description: "What legal data can the agent find?",
},
{
icon: "/icons/ban.svg",
description: "What are the agent's limitations?",
},
{
icon: "/icons/hexagon.svg",
description: "What are the details of your AI model?",
},
{
icon: "/icons/database.svg",
description: "What are your data sources?",
},
];
const ThreadSuggestions: FC = () => {
const handleClick = (prompt: string) => {
const input = document.querySelector(
'textarea[aria-label="Message input"]'
) as HTMLTextAreaElement;
if (input) {
const nativeInputValueSetter = Object.getOwnPropertyDescriptor(
window.HTMLTextAreaElement.prototype,
"value"
)?.set;
nativeInputValueSetter?.call(input, prompt);
input.dispatchEvent(new Event("input", { bubbles: true }));
input.focus();
}
};
return (
<div className="grid w-full grid-cols-2 @lg:grid-cols-4 gap-2 pb-4 px-2">
{STARTERS.map((s) => (
<button
key={s.description}
onClick={() => handleClick(s.description)}
className="flex flex-row items-center gap-1 rounded-xl border border-blue-500/20 bg-card px-4 py-3 text-left text-sm transition-colors hover:bg-blue-600/10 hover:border-blue-500/40 cursor-pointer"
>
<div className="size-5 flex-shrink-0">
<img
src={s.icon}
alt=""
className="size-full object-contain group-hover:scale-110 transition-transform"
/>
</div>
<span className="text-muted-foreground group-hover:text-foreground transition-colors leading-tight">
{s.description}
</span>
</button>
))}
</div>
);
};
export const ThreadWelcome: FC = () => {
return (
<div className="mx-auto my-auto flex w-full max-w-(--thread-max-width) grow flex-col items-center justify-end gap-6">
<div className="flex flex-col items-center gap-4">
<div className=" rounded-full overflow-hidden ring-2 ring-blue-500/30 shadow-lg shadow-blue-500/20">
<img
src="/logo.png"
alt="Legal AI"
className="w-50 h-50 object-cover"
/>
</div>
<div className="flex flex-col items-center gap-1 text-center">
<h1 className="fade-in slide-in-from-bottom-1 animate-in fill-mode-both font-semibold text-2xl duration-200">
Legal AI Assistant
</h1>
</div>
</div>
<ThreadSuggestions />
</div>
);
};

View File

@ -1,64 +0,0 @@
import * as React from "react";
import { cva, type VariantProps } from "class-variance-authority";
import { Slot } from "radix-ui";
import { cn } from "@/lib/utils";
const buttonVariants = cva(
"inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium text-sm outline-none transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive:
"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
secondary:
"bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
icon: "size-9",
"icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
"icon-sm": "size-8",
"icon-lg": "size-10",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
function Button({
className,
variant = "default",
size = "default",
asChild = false,
...props
}: React.ComponentProps<"button"> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean;
}) {
const Comp = asChild ? Slot.Root : "button";
return (
<Comp
data-slot="button"
data-variant={variant}
data-size={size}
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
);
}
export { Button, buttonVariants };

View File

@ -1,33 +0,0 @@
"use client";
import { Collapsible as CollapsiblePrimitive } from "radix-ui";
function Collapsible({
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) {
return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />;
}
function CollapsibleTrigger({
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>) {
return (
<CollapsiblePrimitive.CollapsibleTrigger
data-slot="collapsible-trigger"
{...props}
/>
);
}
function CollapsibleContent({
...props
}: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>) {
return (
<CollapsiblePrimitive.CollapsibleContent
data-slot="collapsible-content"
{...props}
/>
);
}
export { Collapsible, CollapsibleTrigger, CollapsibleContent };

View File

@ -1,57 +0,0 @@
"use client";
import * as React from "react";
import { Tooltip as TooltipPrimitive } from "radix-ui";
import { cn } from "@/lib/utils";
function TooltipProvider({
delayDuration = 0,
...props
}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
return (
<TooltipPrimitive.Provider
data-slot="tooltip-provider"
delayDuration={delayDuration}
{...props}
/>
);
}
function Tooltip({
...props
}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
return <TooltipPrimitive.Root data-slot="tooltip" {...props} />;
}
function TooltipTrigger({
...props
}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
}
function TooltipContent({
className,
sideOffset = 0,
children,
...props
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
return (
<TooltipPrimitive.Portal>
<TooltipPrimitive.Content
data-slot="tooltip-content"
sideOffset={sideOffset}
className={cn(
"fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) animate-in text-balance rounded-md bg-foreground px-3 py-1.5 text-background text-xs data-[state=closed]:animate-out",
className,
)}
{...props}
>
{children}
<TooltipPrimitive.Arrow className="z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground" />
</TooltipPrimitive.Content>
</TooltipPrimitive.Portal>
);
}
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };

View File

@ -1,6 +0,0 @@
import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}

View File

@ -1,7 +0,0 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
devIndicators: false,
};
export default nextConfig;

File diff suppressed because it is too large Load Diff

View File

@ -1,48 +0,0 @@
{
"name": "frontend",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"format": "biome format .",
"format:fix": "biome format --write .",
"lint": "biome check .",
"lint:fix": "biome check --write ."
},
"dependencies": {
"@ai-sdk/openai": "^3.0.52",
"@assistant-ui/react": "^0.12.25",
"@assistant-ui/react-ai-sdk": "latest",
"@assistant-ui/react-data-stream": "^0.12.11",
"@assistant-ui/react-markdown": "latest",
"@radix-ui/react-avatar": "^1.1.11",
"@radix-ui/react-collapsible": "^1.1.12",
"@radix-ui/react-dialog": "^1.1.15",
"@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-tooltip": "^1.2.8",
"ai": "^6.0.159",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^1.8.0",
"next": "^16.2.3",
"radix-ui": "^1.4.3",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"remark-gfm": "^4.0.1",
"tailwind-merge": "^3.5.0",
"tw-animate-css": "^1.4.0",
"tw-shimmer": "^0.4.10",
"zustand": "^5.0.12"
},
"devDependencies": {
"@biomejs/biome": "^2.4.11",
"@tailwindcss/postcss": "^4.2.2",
"@types/node": "^25.6.0",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
"tailwindcss": "^4.2.2",
"typescript": "^6.0.2"
}
}

View File

@ -1,5 +0,0 @@
const config = {
plugins: ["@tailwindcss/postcss"],
};
export default config;

175
frontend/public/custom.css Normal file
View File

@ -0,0 +1,175 @@
/*
/public/custom.css
1. changed welcome screen (text, logo, composer, starters, button, textarea)
2. changed navbar (theme, readme, profiles desc)
*/
/* WELCOME SCREEN */
#welcome-screen div[role="article"] {
font-size: 0;
line-height: 0;
height: 0;
position: relative;
margin-top: 15px;
}
#welcome-screen div[role="article"]::after {
content: "Legal AI Assistant";
font-weight: bold;
font-size: 24px;
color: white;
display: block;
text-align: center;
}
#welcome-screen img.h-16.w-16.rounded-full {
display: none;
}
#welcome-screen .flex-col.gap-2.mb-2.items-center::before {
content: "";
display: block;
width: 256px;
height: 256px;
background-image: url("/public/logo_dark.png");
background-size: contain;
background-repeat: no-repeat;
background-position: center;
margin: 0 auto;
filter: drop-shadow(0 0 2px #3D9FE0) drop-shadow(0 0 4px #3D9FE0);
}
#message-composer {
align-items: flex-end;
padding: 12px;
border-radius: 14px;
margin: 0 auto;
order: 2;
}
/* CHAT SUBMIT (BUTTON) */
#message-composer #chat-submit svg {
display: none;
}
#message-composer #chat-submit {
background-image: url("/public/icons/input-icon.svg");
background-size: 20px;
background-repeat: no-repeat;
background-position: center;
border-radius: 10px;
align-self: flex-end;
}
#message-composer #stop-button {
border-radius: 10px;
}
/* HEADERS */
#header #theme-toggle {
display: none;
}
#header #readme-button span{
display: none;
}
#header #readme-button::after{
content: "About \1F6C8";
font-size: 18px;
}
#chat-profile-description {
display: none;
}
/* STARTERS */
#welcome-screen #starters {
order: 1 !important;
display: grid;
grid-template-columns: repeat(4, 1fr);
}
#welcome-screen #starters button {
height: auto !important;
white-space: normal !important;
display: flex;
flex-direction: column;
align-items: flex-start;
text-align: left;
border-radius: 0.75rem;
}
#welcome-screen #starters button img {
margin-bottom: 6px;
}
#welcome-screen #starters p {
white-space: normal;
overflow: visible;
text-overflow: unset;
}
/*MATERMARKS*/
.watermark div{
display: none;
}
/* AI AVATAR*/
img[alt="Avatar for Legal AI Assistant"] {
content: url("/public/logo_dark.png");
}
/* USER MESSAGES */
div[data-step-type="user_message"] .rounded-3xl {
border-radius: 14px;
}
/*COPY TOOLTIP*/
div[data-state="delayed-open"].bg-popover,
div[data-state="instant-open"].bg-popover,
div[data-state="closed"].bg-popover {
display: none !important;
}
/* THINKING MESSAGE */
.ai-message.animate-pulse {
display: none;
}
div[data-step-type="run"] img {
display: none;
}
.animate-pulse.bg-muted {
display: none;
}
/* MESSANGE CONTENT */
/* Hide like/dislike buttons */
button[data-state="closed"].positive-feedback-off,
button[data-state="closed"].negative-feedback-off {
display: none;
}
/* AUTH RIGHT SECTION */
div.relative.hidden.bg-muted.lg\:block.overflow-hidden {
background-color: hsl(0, 0%, 13%) !important;
}
div.relative.hidden.bg-muted.lg\:block.overflow-hidden img {
filter: none !important;
opacity: 1 !important;
}
img.absolute.inset-0.h-full.w-full.object-cover {
filter: none !important;
--tw-grayscale: grayscale(0%) !important;
--tw-brightness: brightness(1) !important;
}

BIN
frontend/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 180 KiB

View File

@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>DeepSeek</title><path d="M23.748 4.482c-.254-.124-.364.113-.512.234-.051.039-.094.09-.137.136-.372.397-.806.657-1.373.626-.829-.046-1.537.214-2.163.848-.133-.782-.575-1.248-1.247-1.548-.352-.156-.708-.311-.955-.65-.172-.241-.219-.51-.305-.774-.055-.16-.11-.323-.293-.35-.2-.031-.278.136-.356.276-.313.572-.434 1.202-.422 1.84.027 1.436.633 2.58 1.838 3.393.137.093.172.187.129.323-.082.28-.18.552-.266.833-.055.179-.137.217-.329.14a5.526 5.526 0 01-1.736-1.18c-.857-.828-1.631-1.742-2.597-2.458a11.365 11.365 0 00-.689-.471c-.985-.957.13-1.743.388-1.836.27-.098.093-.432-.779-.428-.872.004-1.67.295-2.687.684a3.055 3.055 0 01-.465.137 9.597 9.597 0 00-2.883-.102c-1.885.21-3.39 1.102-4.497 2.623C.082 8.606-.231 10.684.152 12.85c.403 2.284 1.569 4.175 3.36 5.653 1.858 1.533 3.997 2.284 6.438 2.14 1.482-.085 3.133-.284 4.994-1.86.47.234.962.327 1.78.397.63.059 1.236-.03 1.705-.128.735-.156.684-.837.419-.961-2.155-1.004-1.682-.595-2.113-.926 1.096-1.296 2.746-2.642 3.392-7.003.05-.347.007-.565 0-.845-.004-.17.035-.237.23-.256a4.173 4.173 0 001.545-.475c1.396-.763 1.96-2.015 2.093-3.517.02-.23-.004-.467-.247-.588zM11.581 18c-2.089-1.642-3.102-2.183-3.52-2.16-.392.024-.321.471-.235.763.09.288.207.486.371.739.114.167.192.416-.113.603-.673.416-1.842-.14-1.897-.167-1.361-.802-2.5-1.86-3.301-3.307-.774-1.393-1.224-2.887-1.298-4.482-.02-.386.093-.522.477-.592a4.696 4.696 0 011.529-.039c2.132.312 3.946 1.265 5.468 2.774.868.86 1.525 1.887 2.202 2.891.72 1.066 1.494 2.082 2.48 2.914.348.292.625.514.891.677-.802.09-2.14.11-3.054-.614zm1-6.44a.306.306 0 01.415-.287.302.302 0 01.2.288.306.306 0 01-.31.307.303.303 0 01-.304-.308zm3.11 1.596c-.2.081-.399.151-.59.16a1.245 1.245 0 01-.798-.254c-.274-.23-.47-.358-.552-.758a1.73 1.73 0 01.016-.588c.07-.327-.008-.537-.239-.727-.187-.156-.426-.199-.688-.199a.559.559 0 01-.254-.078c-.11-.054-.2-.19-.114-.358.028-.054.16-.186.192-.21.356-.202.767-.136 1.146.016.352.144.618.408 1.001.782.391.451.462.576.685.914.176.265.336.537.445.848.067.195-.019.354-.25.452z" fill="#4D6BFE"></path></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Gemini</title><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="#3186FF"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-0-_R_0_)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-1-_R_0_)"></path><path d="M20.616 10.835a14.147 14.147 0 01-4.45-3.001 14.111 14.111 0 01-3.678-6.452.503.503 0 00-.975 0 14.134 14.134 0 01-3.679 6.452 14.155 14.155 0 01-4.45 3.001c-.65.28-1.318.505-2.002.678a.502.502 0 000 .975c.684.172 1.35.397 2.002.677a14.147 14.147 0 014.45 3.001 14.112 14.112 0 013.679 6.453.502.502 0 00.975 0c.172-.685.397-1.351.677-2.003a14.145 14.145 0 013.001-4.45 14.113 14.113 0 016.453-3.678.503.503 0 000-.975 13.245 13.245 0 01-2.003-.678z" fill="url(#lobe-icons-gemini-2-_R_0_)"></path><defs><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-0-_R_0_" x1="7" x2="11" y1="15.5" y2="12"><stop stop-color="#08B962"></stop><stop offset="1" stop-color="#08B962" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-1-_R_0_" x1="8" x2="11.5" y1="5.5" y2="11"><stop stop-color="#F94543"></stop><stop offset="1" stop-color="#F94543" stop-opacity="0"></stop></linearGradient><linearGradient gradientUnits="userSpaceOnUse" id="lobe-icons-gemini-2-_R_0_" x1="3.5" x2="17.5" y1="13.5" y2="12"><stop stop-color="#FABC12"></stop><stop offset=".46" stop-color="#FABC12" stop-opacity="0"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>OpenAI</title><path d="M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="rgb(177, 151, 252)" d="M344 170.6C362.9 161.6 376 142.3 376 120C376 89.1 350.9 64 320 64C289.1 64 264 89.1 264 120C264 142.3 277.1 161.6 296 170.6L296 269.4C293.2 270.7 290.5 272.3 288 274.1L207.9 228.3C209.5 207.5 199.3 186.7 180 175.5C153.2 160 119 169.2 103.5 196C88 222.8 97.2 257 124 272.5C125.3 273.3 126.6 274 128 274.6L128 365.4C126.7 366 125.3 366.7 124 367.5C97.2 383 88 417.2 103.5 444C119 470.8 153.2 480 180 464.5C199.3 453.4 209.4 432.5 207.8 411.7L258.3 382.8C246.8 371.6 238.4 357.2 234.5 341.1L184 370.1C181.4 368.3 178.8 366.8 176 365.4L176 274.6C178.8 273.3 181.5 271.7 184 269.9L264.1 315.7C264 317.1 263.9 318.5 263.9 320C263.9 342.3 277 361.6 295.9 370.6L295.9 469.4C277 478.4 263.9 497.7 263.9 520C263.9 550.9 289 576 319.9 576C350.8 576 375.9 550.9 375.9 520C375.9 497.7 362.8 478.4 343.9 469.4L343.9 370.6C346.7 369.3 349.4 367.7 351.9 365.9L432 411.7C430.4 432.5 440.6 453.3 459.8 464.5C486.6 480 520.8 470.8 536.3 444C551.8 417.2 542.6 383 515.8 367.5C514.5 366.7 513.1 366 511.8 365.4L511.8 274.6C513.2 274 514.5 273.3 515.8 272.5C542.6 257 551.8 222.8 536.3 196C520.8 169.2 486.8 160 460 175.5C440.7 186.6 430.6 207.5 432.2 228.3L381.6 257.2C393.1 268.4 401.5 282.8 405.4 298.9L456 269.9C458.6 271.7 461.2 273.2 464 274.6L464 365.4C461.2 366.7 458.5 368.3 456 370L375.9 324.2C376 322.8 376.1 321.4 376.1 319.9C376.1 297.6 363 278.3 344.1 269.3L344.1 170.5z"/></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-send-horizontal-icon lucide-send-horizontal"><path d="M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904z"/><path d="M6 12h16"/></svg>

After

Width:  |  Height:  |  Size: 409 B

View File

@ -0,0 +1 @@
<svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Ollama</title><path d="M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z"></path></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -0,0 +1 @@
<svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Qwen</title><path d="M12.604 1.34c.393.69.784 1.382 1.174 2.075a.18.18 0 00.157.091h5.552c.174 0 .322.11.446.327l1.454 2.57c.19.337.24.478.024.837-.26.43-.513.864-.76 1.3l-.367.658c-.106.196-.223.28-.04.512l2.652 4.637c.172.301.111.494-.043.77-.437.785-.882 1.564-1.335 2.34-.159.272-.352.375-.68.37-.777-.016-1.552-.01-2.327.016a.099.099 0 00-.081.05 575.097 575.097 0 01-2.705 4.74c-.169.293-.38.363-.725.364-.997.003-2.002.004-3.017.002a.537.537 0 01-.465-.271l-1.335-2.323a.09.09 0 00-.083-.049H4.982c-.285.03-.553-.001-.805-.092l-1.603-2.77a.543.543 0 01-.002-.54l1.207-2.12a.198.198 0 000-.197 550.951 550.951 0 01-1.875-3.272l-.79-1.395c-.16-.31-.173-.496.095-.965.465-.813.927-1.625 1.387-2.436.132-.234.304-.334.584-.335a338.3 338.3 0 012.589-.001.124.124 0 00.107-.063l2.806-4.895a.488.488 0 01.422-.246c.524-.001 1.053 0 1.583-.006L11.704 1c.341-.003.724.032.9.34zm-3.432.403a.06.06 0 00-.052.03L6.254 6.788a.157.157 0 01-.135.078H3.253c-.056 0-.07.025-.041.074l5.81 10.156c.025.042.013.062-.034.063l-2.795.015a.218.218 0 00-.2.116l-1.32 2.31c-.044.078-.021.118.068.118l5.716.008c.046 0 .08.02.104.061l1.403 2.454c.046.081.092.082.139 0l5.006-8.76.783-1.382a.055.055 0 01.096 0l1.424 2.53a.122.122 0 00.107.062l2.763-.02a.04.04 0 00.035-.02.041.041 0 000-.04l-2.9-5.086a.108.108 0 010-.113l.293-.507 1.12-1.977c.024-.041.012-.062-.035-.062H9.2c-.059 0-.073-.026-.043-.077l1.434-2.505a.107.107 0 000-.114L9.225 1.774a.06.06 0 00-.053-.031zm6.29 8.02c.046 0 .058.02.034.06l-.832 1.465-2.613 4.585a.056.056 0 01-.05.029.058.058 0 01-.05-.029L8.498 9.841c-.02-.034-.01-.052.028-.054l.216-.012 6.722-.012z" fill="url(#lobe-icons-qwen-_R_0_)" fill-rule="nonzero"></path><defs><linearGradient id="lobe-icons-qwen-_R_0_" x1="0%" x2="100%" y1="0%" y2="0%"><stop offset="0%" stop-color="#6336E7" stop-opacity=".84"></stop><stop offset="100%" stop-color="#6F69F7" stop-opacity=".84"></stop></linearGradient></defs></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 640"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill="rgb(255, 212, 59)" d="M384 96L512 96C529.7 96 544 110.3 544 128C544 145.7 529.7 160 512 160L398.4 160C393.2 185.8 375.5 207.1 352 217.3L352 512L512 512C529.7 512 544 526.3 544 544C544 561.7 529.7 576 512 576L128 576C110.3 576 96 561.7 96 544C96 526.3 110.3 512 128 512L288 512L288 217.3C264.5 207 246.8 185.7 241.6 160L128 160C110.3 160 96 145.7 96 128C96 110.3 110.3 96 128 96L256 96C270.6 76.6 293.8 64 320 64C346.2 64 369.4 76.6 384 96zM439.6 384L584.4 384L512 259.8L439.6 384zM512 480C449.1 480 396.8 446 386 401.1C383.4 390.1 387 378.8 392.7 369L487.9 205.8C492.9 197.2 502.1 192 512 192C521.9 192 531.1 197.3 536.1 205.8L631.3 369C637 378.8 640.6 390.1 638 401.1C627.2 445.9 574.9 480 512 480zM126.8 259.8L54.4 384L199.3 384L126.8 259.8zM.9 401.1C-1.7 390.1 1.9 378.8 7.6 369L102.8 205.8C107.8 197.2 117 192 126.9 192C136.8 192 146 197.3 151 205.8L246.2 369C251.9 378.8 255.5 390.1 252.9 401.1C242.1 445.9 189.8 480 126.9 480C64 480 11.7 446 .9 401.1z"/></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

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