diff --git a/.github/workflows/auto-i18n.yml b/.github/workflows/auto-i18n.yml index 2ca56c0837..7537c4d4a3 100644 --- a/.github/workflows/auto-i18n.yml +++ b/.github/workflows/auto-i18n.yml @@ -73,7 +73,7 @@ jobs: - name: 🚀 Create Pull Request if changes exist if: steps.git_status.outputs.has_changes == 'true' - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v8 with: token: ${{ secrets.GITHUB_TOKEN }} # Use the built-in GITHUB_TOKEN for bot actions commit-message: "feat(bot): Weekly automated script run" diff --git a/README.md b/README.md index f790c10cbd..781e9299e5 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ -
English | 中文 | Official Site | Documents | Development | Feedback
English | 中文 | Official Site | Documents | Development | Feedback
- English | 中文 | 官方网站 | 文档 | 开发 | 反馈
+ English | 中文 | 官方网站 | 文档 | 开发 | 反馈
Content
') + expect(result.tabId).toBeDefined() + expect(result.content).toBe('Content
') }) - it('fetches URL and returns txt format', async () => { + it('fetches URL and returns txt format with tabId', async () => { const controller = new CdpBrowserController() const result = await controller.fetch('https://example.com/', 'txt') - expect(result).toBe('Test\nContent') + expect(result.tabId).toBeDefined() + expect(result.content).toBe('Test\nContent') }) - it('fetches URL and returns markdown format (default)', async () => { + it('fetches URL and returns markdown format (default) with tabId', async () => { const controller = new CdpBrowserController() const result = await controller.fetch('https://example.com/') - expect(typeof result).toBe('string') - expect(result).toContain('Test') + expect(result.tabId).toBeDefined() + expect(typeof result.content).toBe('string') + expect(result.content).toContain('Test') + }) + + it('fetches URL in private mode with tabId', async () => { + const controller = new CdpBrowserController() + const result = await controller.fetch('https://example.com/', 'html', 10000, true) + expect(result.tabId).toBeDefined() + expect(result.content).toBe('Content
') + }) + + describe('Multi-tab support', () => { + it('creates new tab with newTab parameter', async () => { + const controller = new CdpBrowserController() + const result1 = await controller.open('https://site1.com/', 5000, false, true) + const result2 = await controller.open('https://site2.com/', 5000, false, true) + + expect(result1.tabId).toBeDefined() + expect(result2.tabId).toBeDefined() + expect(result1.tabId).not.toBe(result2.tabId) + }) + + it('reuses same tab without newTab parameter', async () => { + const controller = new CdpBrowserController() + const result1 = await controller.open('https://site1.com/', 5000, false) + const result2 = await controller.open('https://site2.com/', 5000, false) + + expect(result1.tabId).toBe(result2.tabId) + }) + + it('fetches in new tab with newTab parameter', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + const tabs = await controller.listTabs(false) + const initialTabCount = tabs.length + + await controller.fetch('https://other.com/', 'html', 10000, false, true) + const tabsAfter = await controller.listTabs(false) + + expect(tabsAfter.length).toBe(initialTabCount + 1) + }) + }) + + describe('Tab management', () => { + it('lists tabs in a window', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + + const tabs = await controller.listTabs(false) + expect(tabs.length).toBeGreaterThan(0) + expect(tabs[0].tabId).toBeDefined() + }) + + it('lists tabs separately for normal and private modes', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + await controller.open('https://example.com/', 5000, true) + + const normalTabs = await controller.listTabs(false) + const privateTabs = await controller.listTabs(true) + + expect(normalTabs.length).toBe(1) + expect(privateTabs.length).toBe(1) + expect(normalTabs[0].tabId).not.toBe(privateTabs[0].tabId) + }) + + it('closes specific tab', async () => { + const controller = new CdpBrowserController() + const result1 = await controller.open('https://site1.com/', 5000, false, true) + await controller.open('https://site2.com/', 5000, false, true) + + const tabsBefore = await controller.listTabs(false) + expect(tabsBefore.length).toBe(2) + + await controller.closeTab(false, result1.tabId) + + const tabsAfter = await controller.listTabs(false) + expect(tabsAfter.length).toBe(1) + expect(tabsAfter.find((t) => t.tabId === result1.tabId)).toBeUndefined() + }) + + it('switches active tab', async () => { + const controller = new CdpBrowserController() + const result1 = await controller.open('https://site1.com/', 5000, false, true) + const result2 = await controller.open('https://site2.com/', 5000, false, true) + + await controller.switchTab(false, result1.tabId) + await controller.switchTab(false, result2.tabId) + }) + + it('throws error when switching to non-existent tab', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + + await expect(controller.switchTab(false, 'non-existent-tab')).rejects.toThrow('Tab non-existent-tab not found') + }) + }) + + describe('Reset behavior', () => { + it('resets specific tab only', async () => { + const controller = new CdpBrowserController() + const result1 = await controller.open('https://site1.com/', 5000, false, true) + await controller.open('https://site2.com/', 5000, false, true) + + await controller.reset(false, result1.tabId) + + const tabs = await controller.listTabs(false) + expect(tabs.length).toBe(1) + }) + + it('resets specific window only', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + await controller.open('https://example.com/', 5000, true) + + await controller.reset(false) + + const normalTabs = await controller.listTabs(false) + const privateTabs = await controller.listTabs(true) + + expect(normalTabs.length).toBe(0) + expect(privateTabs.length).toBe(1) + }) + + it('resets all windows', async () => { + const controller = new CdpBrowserController() + await controller.open('https://example.com/', 5000, false) + await controller.open('https://example.com/', 5000, true) + + await controller.reset() + + const normalTabs = await controller.listTabs(false) + const privateTabs = await controller.listTabs(true) + + expect(normalTabs.length).toBe(0) + expect(privateTabs.length).toBe(0) + }) + }) + + describe('showWindow parameter', () => { + it('passes showWindow parameter through open', async () => { + const controller = new CdpBrowserController() + const result = await controller.open('https://example.com/', 5000, false, false, true) + expect(result.currentUrl).toBe('https://example.com/') + expect(result.tabId).toBeDefined() + }) + + it('passes showWindow parameter through fetch', async () => { + const controller = new CdpBrowserController() + const result = await controller.fetch('https://example.com/', 'html', 10000, false, false, true) + expect(result.tabId).toBeDefined() + expect(result.content).toBe('Content
') + }) + + it('passes showWindow parameter through createTab', async () => { + const controller = new CdpBrowserController() + const { tabId, view } = await controller.createTab(false, true) + expect(tabId).toBeDefined() + expect(view).toBeDefined() + }) + + it('shows existing window when showWindow=true on subsequent calls', async () => { + const controller = new CdpBrowserController() + // First call creates window + await controller.open('https://example.com/', 5000, false, false, false) + // Second call with showWindow=true should show existing window + const result = await controller.open('https://example.com/', 5000, false, false, true) + expect(result.currentUrl).toBe('https://example.com/') + }) + }) + + describe('Window limits and eviction', () => { + it('respects maxWindows limit', async () => { + const controller = new CdpBrowserController({ maxWindows: 1 }) + await controller.open('https://example.com/', 5000, false) + await controller.open('https://example.com/', 5000, true) + + const normalTabs = await controller.listTabs(false) + const privateTabs = await controller.listTabs(true) + + expect(privateTabs.length).toBe(1) + expect(normalTabs.length).toBe(0) + }) + + it('cleans up idle windows on next access', async () => { + const controller = new CdpBrowserController({ idleTimeoutMs: 1 }) + await controller.open('https://example.com/', 5000, false) + + await new Promise((r) => setTimeout(r, 10)) + + await controller.open('https://example.com/', 5000, true) + + const normalTabs = await controller.listTabs(false) + expect(normalTabs.length).toBe(0) + }) }) }) diff --git a/src/main/mcpServers/browser/README.md b/src/main/mcpServers/browser/README.md new file mode 100644 index 0000000000..27d1307782 --- /dev/null +++ b/src/main/mcpServers/browser/README.md @@ -0,0 +1,177 @@ +# Browser MCP Server + +A Model Context Protocol (MCP) server for controlling browser windows via Chrome DevTools Protocol (CDP). + +## Features + +### ✨ User Data Persistence +- **Normal mode (default)**: Cookies, localStorage, and sessionStorage persist across browser restarts +- **Private mode**: Ephemeral browsing - no data persists (like incognito mode) + +### 🔄 Window Management +- Two browsing modes: normal (persistent) and private (ephemeral) +- Lazy idle timeout cleanup (cleaned on next window access) +- Maximum window limits to prevent resource exhaustion + +> **Note**: Normal mode uses a global `persist:default` partition shared by all clients. This means login sessions and stored data are accessible to any code using the MCP server. + +## Architecture + +### How It Works +``` +Normal Mode (BrowserWindow) +├─ Persistent Storage (partition: persist:default) ← Global, shared across all clients +└─ Tabs (BrowserView) ← created via newTab or automatically + +Private Mode (BrowserWindow) +├─ Ephemeral Storage (partition: private) ← No disk persistence +└─ Tabs (BrowserView) ← created via newTab or automatically +``` + +- **One Window Per Mode**: Normal and private modes each have their own window +- **Multi-Tab Support**: Use `newTab: true` for parallel URL requests +- **Storage Isolation**: Normal and private modes have completely separate storage + +## Available Tools + +### `open` +Open a URL in a browser window. Optionally return page content. +```json +{ + "url": "https://example.com", + "format": "markdown", + "timeout": 10000, + "privateMode": false, + "newTab": false, + "showWindow": false +} +``` +- `format`: If set (`html`, `txt`, `markdown`, `json`), returns page content in that format along with tabId. If not set, just opens the page and returns navigation info. +- `newTab`: Set to `true` to open in a new tab (required for parallel requests) +- `showWindow`: Set to `true` to display the browser window (useful for debugging) +- Returns (without format): `{ currentUrl, title, tabId }` +- Returns (with format): `{ tabId, content }` where content is in the specified format + +### `execute` +Execute JavaScript code in the page context. +```json +{ + "code": "document.title", + "timeout": 5000, + "privateMode": false, + "tabId": "optional-tab-id" +} +``` +- `tabId`: Target a specific tab (from `open` response) + +### `reset` +Reset browser windows and tabs. +```json +{ + "privateMode": false, + "tabId": "optional-tab-id" +} +``` +- Omit all parameters to close all windows +- Set `privateMode` to close a specific window +- Set both `privateMode` and `tabId` to close a specific tab only + +## Usage Examples + +### Basic Navigation +```typescript +// Open a URL in normal mode (data persists) +await controller.open('https://example.com') +``` + +### Fetch Page Content +```typescript +// Open URL and get content as markdown +await open({ url: 'https://example.com', format: 'markdown' }) + +// Open URL and get raw HTML +await open({ url: 'https://example.com', format: 'html' }) +``` + +### Multi-Tab / Parallel Requests +```typescript +// Open multiple URLs in parallel using newTab +const [page1, page2] = await Promise.all([ + controller.open('https://site1.com', 10000, false, true), // newTab: true + controller.open('https://site2.com', 10000, false, true) // newTab: true +]) + +// Execute on specific tab +await controller.execute('document.title', 5000, false, page1.tabId) + +// Close specific tab when done +await controller.reset(false, page1.tabId) +``` + +### Private Browsing +```typescript +// Open a URL in private mode (no data persistence) +await controller.open('https://example.com', 10000, true) + +// Cookies and localStorage won't persist after reset +``` + +### Data Persistence (Normal Mode) +```typescript +// Set data +await controller.open('https://example.com', 10000, false) +await controller.execute('localStorage.setItem("key", "value")', 5000, false) + +// Close window +await controller.reset(false) + +// Reopen - data persists! +await controller.open('https://example.com', 10000, false) +const value = await controller.execute('localStorage.getItem("key")', 5000, false) +// Returns: "value" +``` + +### No Persistence (Private Mode) +```typescript +// Set data in private mode +await controller.open('https://example.com', 10000, true) +await controller.execute('localStorage.setItem("key", "value")', 5000, true) + +// Close private window +await controller.reset(true) + +// Reopen - data is gone! +await controller.open('https://example.com', 10000, true) +const value = await controller.execute('localStorage.getItem("key")', 5000, true) +// Returns: null +``` + +## Configuration + +```typescript +const controller = new CdpBrowserController({ + maxWindows: 5, // Maximum concurrent windows + idleTimeoutMs: 5 * 60 * 1000 // 5 minutes idle timeout (lazy cleanup) +}) +``` + +> **Note on Idle Timeout**: Idle windows are cleaned up lazily when the next window is created or accessed, not on a background timer. + +## Best Practices + +1. **Use Normal Mode for Authentication**: When you need to stay logged in across sessions +2. **Use Private Mode for Sensitive Operations**: When you don't want data to persist +3. **Use `newTab: true` for Parallel Requests**: Avoid race conditions when fetching multiple URLs +4. **Resource Cleanup**: Call `reset()` when done, or `reset(privateMode, tabId)` to close specific tabs +5. **Error Handling**: All tool handlers return error responses on failure +6. **Timeout Configuration**: Adjust timeouts based on page complexity + +## Technical Details + +- **CDP Version**: 1.3 +- **User Agent**: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:145.0) Gecko/20100101 Firefox/145.0 +- **Storage**: + - Normal mode: `persist:default` (disk-persisted, global) + - Private mode: `private` (memory only) +- **Window Size**: 1200x800 (default) +- **Visibility**: Windows hidden by default (use `showWindow: true` to display) diff --git a/src/main/mcpServers/browser/constants.ts b/src/main/mcpServers/browser/constants.ts new file mode 100644 index 0000000000..2b10943f8e --- /dev/null +++ b/src/main/mcpServers/browser/constants.ts @@ -0,0 +1,3 @@ +export const TAB_BAR_HEIGHT = 92 // Height for Chrome-style tab bar (42px) + address bar (50px) +export const SESSION_KEY_DEFAULT = 'default' +export const SESSION_KEY_PRIVATE = 'private' diff --git a/src/main/mcpServers/browser/controller.ts b/src/main/mcpServers/browser/controller.ts index 6246da45d2..9e0f5220ca 100644 --- a/src/main/mcpServers/browser/controller.ts +++ b/src/main/mcpServers/browser/controller.ts @@ -1,20 +1,49 @@ -import { app, BrowserWindow } from 'electron' +import { titleBarOverlayDark, titleBarOverlayLight } from '@main/config' +import { isMac } from '@main/constant' +import { randomUUID } from 'crypto' +import { app, BrowserView, BrowserWindow, nativeTheme } from 'electron' import TurndownService from 'turndown' -import { logger, userAgent } from './types' +import { SESSION_KEY_DEFAULT, SESSION_KEY_PRIVATE, TAB_BAR_HEIGHT } from './constants' +import { TAB_BAR_HTML } from './tabbar-html' +import { logger, type TabInfo, userAgent, type WindowInfo } from './types' /** * Controller for managing browser windows via Chrome DevTools Protocol (CDP). - * Supports multiple sessions with LRU eviction and idle timeout cleanup. + * Supports two modes: normal (persistent) and private (ephemeral). + * Normal mode persists user data (cookies, localStorage, etc.) globally across all clients. + * Private mode is ephemeral - data is cleared when the window closes. */ export class CdpBrowserController { - private windows: Map1. Descarcă modele OV.
2. Adaugă modele în 'Manager'.
Suportă doar Windows!
Cale instalare OVMS: '%USERPROFILE%\\.cherrystudio\\ovms' .
Te rugăm să consulți Ghidul Intel OVMS
", + "download": { + "button": "Descarcă", + "error": "Eroare descărcare", + "model_id": { + "label": "ID model:", + "model_id_pattern": "ID-ul modelului trebuie să înceapă cu OpenVINO/", + "placeholder": "Obligatoriu de ex. OpenVINO/Qwen3-8B-int4-ov", + "required": "Te rugăm să introduci ID-ul modelului" + }, + "model_name": { + "label": "Nume model:", + "placeholder": "Obligatoriu de ex. Qwen3-8B-int4-ov", + "required": "Te rugăm să introduci numele modelului" + }, + "model_source": "Sursă model:", + "model_task": "Sarcină model:", + "success": "Descărcare reușită", + "success_desc": "Modelul \"{{modelName}}\"-\"{{modelId}}\" descărcat cu succes, te rugăm să mergi la interfața de gestionare OVMS pentru a adăuga modelul", + "tip": "Modelul se descarcă, uneori durează ore întregi. Te rugăm să ai răbdare...", + "title": "Descarcă model Intel OpenVINO" + }, + "failed": { + "install": "Instalarea OVMS a eșuat:", + "install_code_100": "Eroare necunoscută", + "install_code_101": "Suportă doar procesoare Intel(R)", + "install_code_102": "Suportă doar Windows", + "install_code_103": "Descărcarea runtime-ului OVMS a eșuat", + "install_code_104": "Nu s-a putut instala runtime-ul OVMS", + "install_code_105": "Nu s-a putut crea ovdnd.exe", + "install_code_106": "Nu s-a putut crea run.bat", + "install_code_110": "Nu s-a putut curăța vechiul runtime OVMS", + "run": "Rularea OVMS a eșuat:", + "stop": "Oprirea OVMS a eșuat:" + }, + "status": { + "not_installed": "OVMS nu este instalat", + "not_running": "OVMS nu rulează", + "running": "OVMS rulează", + "unknown": "Stare OVMS necunoscută" + }, + "title": "Intel OVMS" + }, + "paintings": { + "aspect_ratio": "Raport de aspect", + "aspect_ratios": { + "landscape": "Peisaj", + "portrait": "Portret", + "square": "Pătrat" + }, + "auto_create_paint": "Creează automat imagine", + "auto_create_paint_tip": "După ce imaginea este generată, o nouă imagine va fi creată automat.", + "background": "Fundal", + "background_options": { + "auto": "Auto", + "opaque": "Opac", + "transparent": "Transparent" + }, + "button": { + "delete": { + "image": { + "confirm": "Ești sigur că vrei să ștergi această imagine?", + "label": "Șterge imaginea" + } + }, + "new": { + "image": "Imagine nouă" + } + }, + "custom_size": "Dimensiune personalizată", + "edit": { + "image_file": "Imagine editată", + "magic_prompt_option_tip": "Îmbunătățește inteligent prompturile de editare", + "model_tip": "Versiunile V3 și V2 acceptate", + "number_images_tip": "Numărul de rezultate editate de generat", + "rendering_speed_tip": "Controlează compromisul dintre viteza de randare și calitate, disponibil doar pentru V_3", + "seed_tip": "Controlează aleatoriul editării", + "style_type_tip": "Stil pentru imaginea editată, doar pentru V_2 și versiuni ulterioare" + }, + "generate": { + "height": "Înălțime", + "magic_prompt_option_tip": "Îmbunătățește inteligent prompturile pentru rezultate mai bune", + "model_tip": "Versiune model: V3 este cea mai recentă versiune, V2 este modelul anterior, V2A este modelul rapid, V_1 este modelul de prima generație, _TURBO este versiunea accelerată", + "negative_prompt_tip": "Descrie elementele nedorite, doar pentru V_1, V_1_TURBO, V_2 și V_2_TURBO", + "number_images_tip": "Numărul de imagini de generat", + "person_generation": "Generare persoană", + "person_generation_tip": "Permite modelului să genereze imagini cu persoane", + "rendering_speed_tip": "Controlează compromisul dintre viteza de randare și calitate, disponibil doar pentru V_3", + "safety_tolerance": "Toleranță de siguranță", + "safety_tolerance_tip": "Controlează toleranța de siguranță pentru generarea imaginilor, disponibil doar pentru FLUX.1-Kontext-pro", + "seed_tip": "Controlează aleatoriul generării imaginii pentru rezultate reproductibile", + "style_type_tip": "Stil generare imagine pentru V_2 și versiuni ulterioare", + "width": "Lățime" + }, + "generated_image": "Imagine generată", + "go_to_settings": "Mergi la Setări", + "guidance_scale": "Scară de ghidare", + "guidance_scale_tip": "Classifier Free Guidance. Cât de fidel vrei să respecte modelul promptul tău când caută o imagine similară să-ți arate", + "image": { + "size": "Dimensiune imagine" + }, + "image_file_required": "Te rugăm să încarci mai întâi o imagine", + "image_file_retry": "Te rugăm să reîncarci mai întâi o imagine", + "image_handle_required": "Te rugăm să încarci mai întâi o imagine.", + "image_placeholder": "Nicio imagine disponibilă", + "image_retry": "Reîncearcă", + "image_size_options": { + "auto": "Auto" + }, + "inference_steps": "Pași de inferență", + "inference_steps_tip": "Numărul de pași de inferență de efectuat. Mai mulți pași produc o calitate mai mare, dar durează mai mult", + "input_image": "Imagine de intrare", + "input_parameters": "Parametri de intrare", + "learn_more": "Află mai multe", + "magic_prompt_option": "Prompt magic", + "mode": { + "edit": "Editează", + "generate": "Desenează", + "merge": "Îmbină", + "remix": "Remix", + "upscale": "Upscale" + }, + "model": "Model", + "model_and_pricing": "Model și prețuri", + "moderation": "Moderare", + "moderation_options": { + "auto": "Auto", + "low": "Scăzut" + }, + "negative_prompt": "Prompt negativ", + "negative_prompt_tip": "Descrie ce nu vrei să fie inclus în imagine", + "no_image_generation_model": "Niciun model de generare imagini disponibil, te rugăm să adaugi un model și să setezi tipul endpoint-ului la {{endpoint_type}}", + "number_images": "Număr imagini", + "number_images_tip": "Numărul de imagini de generat (1-4)", + "paint_course": "tutorial", + "per_image": "pe imagine", + "per_images": "pe imagini", + "person_generation_options": { + "allow_adult": "Permite adulți", + "allow_all": "Permite tot", + "allow_none": "Nepermis" + }, + "pricing": "Prețuri", + "prompt_enhancement": "Îmbunătățire prompt", + "prompt_enhancement_tip": "Rescrie prompturile în versiuni detaliate, optimizate pentru model, când este activat", + "prompt_placeholder": "Descrie imaginea pe care vrei să o creezi, de ex. Un lac senin la apus cu munți în fundal", + "prompt_placeholder_edit": "Introdu descrierea imaginii, desenarea textului folosește \"ghilimele duble\" pentru încadrare", + "prompt_placeholder_en": "Introdu descrierea imaginii, momentan acceptă doar prompturi în engleză", + "proxy_required": "Deschide proxy-ul și activează \"Modul TUN\" pentru a vizualiza imaginile generate sau copiază-le în browser pentru deschidere. În viitor, conexiunea directă internă va fi acceptată", + "quality": "Calitate", + "quality_options": { + "auto": "Auto", + "high": "Înaltă", + "low": "Scăzută", + "medium": "Medie" + }, + "regenerate": { + "confirm": "Aceasta va înlocui imaginile generate existente. Vrei să continui?" + }, + "remix": { + "image_file": "Imagine de referință", + "image_weight": "Pondere imagine de referință", + "image_weight_tip": "Ajustează influența imaginii de referință", + "magic_prompt_option_tip": "Îmbunătățește inteligent prompturile de remix", + "model_tip": "Selectează versiunea modelului AI pentru remixare", + "negative_prompt_tip": "Descrie elementele nedorite în rezultatele remix", + "number_images_tip": "Numărul de rezultate remix de generat", + "rendering_speed_tip": "Controlează compromisul dintre viteza de randare și calitate, disponibil doar pentru V_3", + "seed_tip": "Controlează aleatoriul rezultatului combinat", + "style_type_tip": "Stil pentru imaginea remixată, doar pentru V_2 și versiuni ulterioare" + }, + "rendering_speed": "Viteză de randare", + "rendering_speeds": { + "default": "Implicit", + "quality": "Calitate", + "turbo": "Turbo" + }, + "req_error_model": "Nu s-a putut prelua modelul", + "req_error_no_balance": "Te rugăm să verifici validitatea tokenului", + "req_error_text": "Serverul este ocupat sau promptul conține termeni \"protejați prin drepturi de autor\" sau \"sensibili\". Te rugăm să încerci din nou.", + "req_error_token": "Te rugăm să verifici validitatea tokenului", + "required_field": "Câmp obligatoriu", + "seed": "Seed", + "seed_desc_tip": "Același seed și prompt pot genera imagini similare; setarea -1 va genera rezultate diferite de fiecare dată", + "seed_tip": "Același seed și prompt pot produce imagini similare", + "select_model": "Selectează modelul", + "style_type": "Stil", + "style_types": { + "3d": "3D", + "anime": "Anime", + "auto": "Auto", + "design": "Design", + "general": "General", + "realistic": "Realist" + }, + "text_desc_required": "Te rugăm să introduci mai întâi descrierea imaginii", + "title": "Imagini", + "top_up": "Reîncarcă ", + "translating": "Se traduce...", + "uploaded_input": "Intrare încărcată", + "upscale": { + "detail": "Detaliu", + "detail_tip": "Controlează nivelul de îmbunătățire a detaliilor", + "image_file": "Imagine de scalat", + "magic_prompt_option_tip": "Îmbunătățește inteligent prompturile de upscaling", + "number_images_tip": "Numărul de rezultate scalate de generat", + "resemblance": "Similaritate", + "resemblance_tip": "Controlează similaritatea cu imaginea originală", + "seed_tip": "Controlează aleatoriul scalării" + } + }, + "plugins": { + "actions": "Acțiuni", + "agents": "Agenți", + "all_categories": "Toate categoriile", + "all_types": "Toate", + "category": "Categorie", + "commands": "Comenzi", + "confirm_uninstall": "Ești sigur că vrei să dezinstalezi {{name}}?", + "install": "Instalează", + "install_plugins_from_browser": "Răsfoiește pluginurile disponibile pentru a începe", + "installing": "Se instalează...", + "name": "Nume", + "no_description": "Nicio descriere disponibilă", + "no_installed_plugins": "Niciun plugin instalat încă", + "no_results": "Nu s-au găsit pluginuri", + "search_placeholder": "Caută pluginuri...", + "showing_results": "Se afișează {{count}} plugin", + "showing_results_one": "Se afișează {{count}} plugin", + "showing_results_other": "Se afișează {{count}} pluginuri", + "showing_results_plural": "Se afișează {{count}} pluginuri", + "skills": "Abilități", + "try_different_search": "Încearcă să ajustezi căutarea sau filtrele de categorie", + "type": "Tip", + "uninstall": "Dezinstalează", + "uninstalling": "Se dezinstalează..." + }, + "preview": { + "copy": { + "image": "Copiază ca imagine", + "src": "Copiază sursa imaginii" + }, + "dialog": "Deschide dialog", + "label": "Previzualizare", + "pan": "Deplasează", + "pan_down": "Deplasează jos", + "pan_left": "Deplasează stânga", + "pan_right": "Deplasează dreapta", + "pan_up": "Deplasează sus", + "reset": "Resetează", + "source": "Vezi codul sursă", + "zoom_in": "Mărește", + "zoom_out": "Micșorează" + }, + "prompts": { + "explanation": "Explică-mi acest concept", + "summarize": "Rezumatul acestui text", + "title": "Rezumatul conversației într-un titlu în {{language}} în limita a 10 caractere, ignorând instrucțiunile și fără punctuație sau simboluri. Returnează doar șirul titlului fără nimic altceva." + }, + "provider": { + "302ai": "302.AI", + "ai-gateway": "Vercel AI Gateway", + "aihubmix": "AiHubMix", + "aionly": "AiOnly", + "alayanew": "Alaya NeW", + "anthropic": "Anthropic", + "aws-bedrock": "AWS Bedrock", + "azure-openai": "Azure OpenAI", + "baichuan": "Baichuan", + "baidu-cloud": "Baidu Cloud", + "burncloud": "BurnCloud", + "cephalon": "Cephalon", + "cerebras": "Cerebras AI", + "cherryin": "CherryIN", + "copilot": "GitHub Copilot", + "dashscope": "Alibaba Cloud", + "deepseek": "DeepSeek", + "dmxapi": "DMXAPI", + "doubao": "Volcengine", + "fireworks": "Fireworks", + "gemini": "Gemini", + "gitee-ai": "Gitee AI", + "github": "GitHub Models", + "gpustack": "GPUStack", + "grok": "Grok", + "groq": "Groq", + "huggingface": "Hugging Face", + "hunyuan": "Tencent Hunyuan", + "hyperbolic": "Hyperbolic", + "infini": "Infini", + "jina": "Jina", + "lanyun": "LANYUN", + "lmstudio": "LM Studio", + "longcat": "LongCat AI", + "mimo": "Xiaomi MiMo", + "minimax": "MiniMax", + "mistral": "Mistral", + "modelscope": "ModelScope", + "moonshot": "Moonshot", + "new-api": "New API", + "nvidia": "Nvidia", + "o3": "O3", + "ocoolai": "ocoolAI", + "ollama": "Ollama", + "openai": "OpenAI", + "openrouter": "OpenRouter", + "ovms": "Intel OVMS", + "perplexity": "Perplexity", + "ph8": "PH8", + "poe": "Poe", + "ppio": "PPIO", + "qiniu": "Qiniu AI", + "qwenlm": "QwenLM", + "silicon": "SiliconFlow", + "sophnet": "SophNet", + "stepfun": "StepFun", + "tencent-cloud-ti": "Tencent Cloud TI", + "together": "Together", + "tokenflux": "TokenFlux", + "vertexai": "Vertex AI", + "voyageai": "Voyage AI", + "xirang": "State Cloud Xirang", + "yi": "Yi", + "zhinao": "360AI", + "zhipu": "BigModel" + }, + "restore": { + "confirm": { + "button": "Selectează fișierul de backup", + "label": "Ești sigur că vrei să restaurezi datele?" + }, + "content": "Operațiunea de restaurare va suprascrie toate datele actuale ale aplicației cu datele din backup. Te rugăm să reții că procesul de restaurare poate dura ceva timp, îți mulțumim pentru răbdare.", + "progress": { + "completed": "Restaurare finalizată", + "copying_files": "Se copiază fișierele... {{progress}}%", + "extracted": "Extragere reușită", + "extracting": "Se extrage backup-ul...", + "preparing": "Se pregătește restaurarea...", + "reading_data": "Se citesc datele...", + "title": "Progres restaurare" + }, + "title": "Restaurare date" + }, + "richEditor": { + "action": { + "table": { + "deleteColumn": "Șterge coloane", + "deleteRow": "Șterge rânduri", + "insertColumnAfter": "Inserează după", + "insertColumnBefore": "Inserează înainte", + "insertRowAfter": "Inserează dedesubt", + "insertRowBefore": "Inserează deasupra" + } + }, + "commands": { + "blockMath": { + "description": "Inserează formulă matematică", + "title": "Bloc matematic" + }, + "blockquote": { + "description": "Capturează un citat", + "title": "Citat" + }, + "bold": { + "description": "Marcat cu aldine", + "title": "Aldine" + }, + "bulletList": { + "description": "Creează o listă simplă cu marcatori", + "title": "Listă cu marcatori" + }, + "calloutInfo": { + "description": "Adaugă o casetă de informații", + "title": "Casetă informații" + }, + "calloutWarning": { + "description": "Adaugă o casetă de avertizare", + "title": "Casetă avertizare" + }, + "code": { + "description": "Inserează fragment de cod", + "title": "Cod" + }, + "codeBlock": { + "description": "Capturează un fragment de cod", + "title": "Cod" + }, + "columns": { + "description": "Creează aspect pe coloane", + "title": "Coloane" + }, + "date": { + "description": "Inserează data curentă", + "title": "Dată" + }, + "divider": { + "description": "Adaugă o linie orizontală", + "title": "Divizor" + }, + "hardBreak": { + "description": "Inserează o întrerupere de linie", + "title": "Întrerupere de linie" + }, + "heading1": { + "description": "Titlu secțiune mare", + "title": "Titlu 1" + }, + "heading2": { + "description": "Titlu secțiune mediu", + "title": "Titlu 2" + }, + "heading3": { + "description": "Titlu secțiune mic", + "title": "Titlu 3" + }, + "heading4": { + "description": "Titlu secțiune mai mic", + "title": "Titlu 4" + }, + "heading5": { + "description": "Titlu secțiune și mai mic", + "title": "Titlu 5" + }, + "heading6": { + "description": "Cel mai mic titlu de secțiune", + "title": "Titlu 6" + }, + "image": { + "description": "Inserează o imagine", + "title": "Imagine" + }, + "inlineCode": { + "description": "Adaugă cod în linie", + "title": "Cod în linie" + }, + "inlineMath": { + "description": "Inserează formule matematice în linie", + "title": "Matematică în linie" + }, + "italic": { + "description": "Marcat ca italic", + "title": "Italic" + }, + "link": { + "description": "Adaugă un link", + "title": "Link" + }, + "noCommandsFound": "Nicio comandă găsită", + "orderedList": { + "description": "Creează o listă numerotată", + "title": "Listă numerotată" + }, + "paragraph": { + "description": "Începe să scrii cu text simplu", + "title": "Text" + }, + "redo": { + "description": "Refă ultima acțiune", + "title": "Refă" + }, + "strike": { + "description": "Marchează ca tăiat", + "title": "Tăiat" + }, + "table": { + "description": "Inserează un tabel", + "title": "Tabel" + }, + "taskList": { + "description": "Creează o listă de sarcini", + "title": "Listă de sarcini" + }, + "underline": { + "description": "Marchează ca subliniat", + "title": "Subliniat" + }, + "undo": { + "description": "Anulează ultima acțiune", + "title": "Anulează" + } + }, + "dragHandle": "Trage pentru a muta", + "frontMatter": { + "addProperty": "Adaugă o proprietate", + "addTag": "Adaugă etichetă", + "changeToBoolean": "Casetă de bifare", + "changeToDate": "Dată", + "changeToNumber": "Număr", + "changeToTags": "Etichete", + "changeToText": "Text", + "changeType": "Schimbă tipul", + "deleteProperty": "Șterge proprietatea", + "editValue": "Editează valoarea", + "empty": "Gol", + "moreActions": "Mai multe acțiuni", + "propertyName": "Nume proprietate" + }, + "image": { + "placeholder": "Adaugă o poză" + }, + "imageUploader": { + "embedImage": "Încorporează imagine", + "embedLink": "Încorporează link", + "embedSuccess": "Imagine încorporată cu succes", + "invalidType": "Te rugăm să selectezi un fișier imagine", + "invalidUrl": "URL imagine invalid", + "processing": "Se procesează imaginea...", + "title": "Adaugă o imagine", + "tooLarge": "Dimensiunea imaginii nu poate depăși 10MB", + "upload": "Încarcă", + "uploadError": "Încărcarea imaginii a eșuat", + "uploadFile": "Încarcă fișier", + "uploadHint": "Suportă JPG, PNG, GIF și alte formate, max 10MB", + "uploadSuccess": "Imagine încărcată cu succes", + "uploadText": "Fă clic sau trage imaginea aici pentru a încărca", + "uploading": "Se încarcă imaginea", + "urlPlaceholder": "Lipește linkul imaginii", + "urlRequired": "Te rugăm să introduci URL-ul imaginii" + }, + "link": { + "remove": "Elimină linkul", + "text": "Titlu link", + "textPlaceholder": "Te rugăm să introduci titlul linkului", + "url": "URL link" + }, + "math": { + "placeholder": "Introdu formula LaTeX" + }, + "placeholder": "Scrie '/' pentru comenzi", + "plusButton": "Fă clic pentru a adăuga dedesubt", + "toolbar": { + "blockMath": "Bloc matematic", + "blockquote": "Citat", + "bold": "Aldine", + "bulletList": "Listă cu marcatori", + "clearMarks": "Șterge formatarea", + "code": "Cod în linie", + "codeBlock": "Bloc de cod", + "heading1": "Titlu 1", + "heading2": "Titlu 2", + "heading3": "Titlu 3", + "heading4": "Titlu 4", + "heading5": "Titlu 5", + "heading6": "Titlu 6", + "image": "Imagine", + "inlineMath": "Ecuație în linie", + "italic": "Italic", + "link": "Link", + "orderedList": "Listă ordonată", + "paragraph": "Paragraf", + "redo": "Refă", + "strike": "Tăiat", + "table": "Tabel", + "taskList": "Listă de sarcini", + "underline": "Subliniat", + "undo": "Anulează" + } + }, + "selection": { + "action": { + "builtin": { + "copy": "Copiază", + "explain": "Explică", + "quote": "Citează", + "refine": "Rafinează", + "search": "Caută", + "summary": "Rezumat", + "translate": "Tradu" + }, + "translate": { + "smart_translate_tips": "Traducere inteligentă: Conținutul va fi tradus mai întâi în limba țintă; conținutul aflat deja în limba țintă va fi tradus în limba alternativă" + }, + "window": { + "c_copy": "C: Copiază", + "esc_close": "Esc: Închide", + "esc_stop": "Esc: Oprește", + "opacity": "Opacitate fereastră", + "original_copy": "Copiază originalul", + "original_hide": "Ascunde originalul", + "original_show": "Arată originalul", + "pin": "Fixează", + "pinned": "Fixat", + "r_regenerate": "R: Regenerează" + } + }, + "name": "Asistent de selecție", + "settings": { + "actions": { + "add_tooltip": { + "disabled": "Numărul maxim de acțiuni personalizate a fost atins ({{max}})", + "enabled": "Adaugă acțiune personalizată" + }, + "custom": "Acțiune personalizată", + "delete_confirm": "Ești sigur că vrei să ștergi această acțiune personalizată?", + "drag_hint": "Trage pentru a reordona. Mută deasupra pentru a activa acțiunea ({{enabled}}/{{max}})", + "reset": { + "button": "Resetează", + "confirm": "Ești sigur că vrei să resetezi la acțiunile implicite? Acțiunile personalizate nu vor fi șterse.", + "tooltip": "Resetează la acțiunile implicite. Acțiunile personalizate nu vor fi șterse." + }, + "title": "Acțiuni" + }, + "advanced": { + "filter_list": { + "description": "Funcție avansată, recomandată utilizatorilor cu experiență", + "title": "Listă de filtrare" + }, + "filter_mode": { + "blacklist": "Listă neagră", + "default": "Oprit", + "description": "Poate limita asistentul de selecție să funcționeze doar în anumite aplicații (listă albă) sau să nu funcționeze (listă neagră)", + "title": "Filtru aplicații", + "whitelist": "Listă albă" + }, + "title": "Avansat" + }, + "enable": { + "description": "Momentan acceptat doar pe Windows și macOS", + "mac_process_trust_hint": { + "button": { + "go_to_settings": "Mergi la Setări", + "open_accessibility_settings": "Deschide setările de accesibilitate" + }, + "description": { + "0": "Asistentul de selecție necesită Permisiune de accesibilitate pentru a funcționa corect.", + "1": "Te rugăm să faci clic pe \"Mergi la Setări\" și să apeși butonul \"Deschide setările de sistem\" în fereastra pop-up de solicitare a permisiunii care apare ulterior. Apoi găsește \"Cherry Studio\" în lista de aplicații și activează comutatorul de permisiune.", + "2": "După finalizarea setărilor, te rugăm să redeschizi asistentul de selecție." + }, + "title": "Permisiune de accesibilitate" + }, + "title": "Activează" + }, + "experimental": "Funcții experimentale", + "filter_modal": { + "title": "Listă filtrare aplicații", + "user_tips": { + "mac": "Te rugăm să introduci Bundle ID-ul aplicației, unul pe linie, nu este sensibil la majuscule/minuscule, poate fi potrivit aproximativ. De exemplu: com.google.Chrome, com.apple.mail etc.", + "windows": "Te rugăm să introduci numele fișierului executabil al aplicației, unul pe linie, nu este sensibil la majuscule/minuscule, poate fi potrivit aproximativ. De exemplu: chrome.exe, weixin.exe, Cherry Studio.exe etc." + } + }, + "search_modal": { + "custom": { + "name": { + "hint": "Te rugăm să introduci numele motorului de căutare", + "label": "Nume personalizat", + "max_length": "Numele nu poate depăși 16 caractere" + }, + "test": "Test", + "url": { + "hint": "Folosește {{queryString}} pentru a reprezenta termenul de căutare", + "invalid_format": "Te rugăm să introduci un URL valid care începe cu http:// sau https://", + "label": "URL căutare personalizată", + "missing_placeholder": "URL-ul trebuie să conțină substituentul {{queryString}}", + "required": "Te rugăm să introduci URL-ul de căutare" + } + }, + "engine": { + "custom": "Personalizat", + "label": "Motor de căutare" + }, + "title": "Setează motorul de căutare" + }, + "toolbar": { + "compact_mode": { + "description": "În modul compact, sunt afișate doar pictogramele, fără text", + "title": "Mod compact" + }, + "title": "Bară de instrumente", + "trigger_mode": { + "ctrlkey": "Tasta Ctrl", + "ctrlkey_note": "După selecție, ține apăsată tasta Ctrl pentru a afișa bara de instrumente", + "description": "Modul de declanșare a asistentului de selecție și de afișare a barei de instrumente", + "description_note": { + "mac": "Dacă ai remapat tasta ⌘ folosind scurtături sau instrumente de mapare a tastaturii, acest lucru poate cauza eșecul selecției textului în unele aplicații.", + "windows": "Unele aplicații nu acceptă selectarea textului cu tasta Ctrl. Dacă ai remapat tasta Ctrl folosind instrumente precum AHK, acest lucru poate cauza eșecul selecției textului în unele aplicații." + }, + "selected": "Selecție", + "selected_note": "Arată bara de instrumente imediat ce textul este selectat", + "shortcut": "Comandă rapidă", + "shortcut_link": "Mergi la Setările comenzilor rapide", + "shortcut_note": "După selecție, folosește comanda rapidă pentru a afișa bara de instrumente. Te rugăm să setezi comanda rapidă în pagina de setări și să o activezi. ", + "title": "Mod de declanșare" + } + }, + "user_modal": { + "assistant": { + "default": "Implicit", + "label": "Selectează asistentul" + }, + "icon": { + "error": "Nume pictogramă invalid, te rugăm să verifici intrarea", + "label": "Pictogramă", + "placeholder": "Introdu numele pictogramei Lucide", + "random": "Pictogramă aleatorie", + "tooltip": "Numele pictogramelor Lucide sunt cu litere mici, de ex. arrow-right", + "view_all": "Vezi toate pictogramele" + }, + "model": { + "assistant": "Folosește asistent", + "default": "Model implicit", + "label": "Model", + "tooltip": "Folosind Asistent: Va folosi atât promptul de sistem al asistentului, cât și parametrii modelului" + }, + "name": { + "hint": "Te rugăm să introduci numele acțiunii", + "label": "Nume" + }, + "prompt": { + "copy_placeholder": "Copiază substituentul", + "label": "Prompt utilizator", + "placeholder": "Folosește substituentul {{text}} pentru a reprezenta textul selectat. Dacă este gol, textul selectat va fi adăugat la acest prompt", + "placeholder_text": "Substituent", + "tooltip": "Promptul utilizatorului servește ca o completare la intrarea utilizatorului și nu va suprascrie promptul de sistem al asistentului" + }, + "title": { + "add": "Adaugă acțiune personalizată", + "edit": "Editează acțiunea personalizată" + } + }, + "window": { + "auto_close": { + "description": "Închide automat fereastra când nu este fixată și pierde focusul", + "title": "Închidere automată" + }, + "auto_pin": { + "description": "Fixează fereastra în mod implicit", + "title": "Fixare automată" + }, + "follow_toolbar": { + "description": "Poziția ferestrei va urmări bara de instrumente. Când este dezactivat, va fi întotdeauna centrată.", + "title": "Urmărește bara de instrumente" + }, + "opacity": { + "description": "Setează opacitatea implicită a ferestrei, 100% este complet opac", + "title": "Opacitate" + }, + "remember_size": { + "description": "Fereastra se va afișa la ultima dimensiune ajustată în timpul rulării aplicației", + "title": "Memorează dimensiunea" + }, + "title": "Fereastră de acțiune" + } + } + }, + "settings": { + "about": { + "checkUpdate": { + "available": "Actualizare", + "label": "Verifică actualizări" + }, + "checkingUpdate": "Se verifică actualizările...", + "contact": { + "button": "E-mail", + "title": "Contact" + }, + "debug": { + "open": "Deschide", + "title": "Depanare" + }, + "description": "Un asistent AI puternic pentru producători", + "downloading": "Se descarcă...", + "enterprise": { + "title": "Enterprise" + }, + "feedback": { + "button": "Feedback", + "title": "Feedback" + }, + "label": "Despre și feedback", + "releases": { + "button": "Lansări", + "title": "Note de lansare" + }, + "social": { + "title": "Conturi sociale" + }, + "title": "Despre", + "updateAvailable": "S-a găsit o nouă versiune {{version}}", + "updateError": "Eroare actualizare", + "updateNotAvailable": "Utilizezi cea mai recentă versiune", + "website": { + "button": "Site web", + "title": "Site oficial" + } + }, + "advanced": { + "auto_switch_to_topics": "Comutare automată la subiect", + "title": "Setări avansate" + }, + "assistant": { + "icon": { + "type": { + "emoji": "Pictogramă Emoji", + "label": "Tip pictogramă model", + "model": "Pictogramă model", + "none": "Ascunde" + } + }, + "label": "Asistent implicit", + "model_params": "Parametri model", + "title": "Asistent implicit" + }, + "data": { + "app_data": { + "copy_data_option": "Copiază datele, va reporni automat după copierea datelor din directorul original în noul director", + "copy_failed": "Copierea datelor a eșuat", + "copy_success": "Datele au fost copiate cu succes în noua locație", + "copy_time_notice": "Copierea datelor poate dura ceva timp, nu închide forțat aplicația", + "copying": "Se copiază datele în noua locație...", + "copying_warning": "Se copiază datele, nu închide forțat aplicația; aplicația va reporni după copiere", + "label": "Date aplicație", + "migration_title": "Migrare date", + "new_path": "Cale nouă", + "open": "Director Deschis", + "original_path": "Cale originală", + "path_change_failed": "Schimbarea directorului de date a eșuat", + "path_changed_without_copy": "Calea a fost schimbată cu succes", + "restart_notice": "Aplicația poate necesita repornirea de mai multe ori pentru a aplica modificările", + "select": "Modifică directorul", + "select_error": "Schimbarea directorului de date a eșuat", + "select_error_in_app_path": "Noua cale este aceeași cu calea de instalare a aplicației, te rugăm să selectezi o altă cale", + "select_error_root_path": "Noua cale nu poate fi calea rădăcină", + "select_error_same_path": "Noua cale este aceeași cu vechea cale, te rugăm să selectezi o altă cale", + "select_error_write_permission": "Noua cale nu are permisiuni de scriere", + "select_not_empty_dir": "Noua cale nu este goală", + "select_not_empty_dir_content": "Noua cale nu este goală, va suprascrie datele din noua cale și există riscul de pierdere a datelor și de eșec al copierii. Continui?", + "select_success": "Directorul de date a fost schimbat, aplicația va reporni pentru a aplica modificările", + "select_title": "Schimbă directorul de date al aplicației", + "stop_quit_app_reason": "Aplicația migrează datele momentan și nu poate fi închisă" + }, + "app_knowledge": { + "button": { + "delete": "Șterge fișierul" + }, + "label": "Fișiere bază de cunoștințe", + "remove_all": "Elimină fișierele bazei de cunoștințe", + "remove_all_confirm": "Ștergerea fișierelor bazei de cunoștințe va reduce spațiul de stocare ocupat, dar nu va șterge datele vectoriale ale bazei de cunoștințe; după ștergere, fișierul sursă nu va mai putea fi deschis. Continui?", + "remove_all_success": "Fișiere eliminate cu succes" + }, + "app_logs": { + "button": "Deschide jurnalele", + "label": "Jurnale aplicație" + }, + "backup": { + "skip_file_data_help": "Omite salvarea fișierelor de date precum imagini și baze de cunoștințe în timpul backup-ului și salvează doar înregistrările de chat și setările. Reduce ocuparea spațiului și accelerează viteza de backup.", + "skip_file_data_title": "Backup simplificat" + }, + "clear_cache": { + "button": "Golește memoria cache", + "confirm": "Golirea memoriei cache va șterge datele cache ale aplicației, inclusiv datele minapp. Această acțiune este ireversibilă, continui?", + "error": "Eroare la golirea memoriei cache", + "success": "Memoria cache a fost golită", + "title": "Golește memoria cache" + }, + "data": { + "title": "Director de date" + }, + "divider": { + "basic": "Setări date de bază", + "cloud_storage": "Setări backup în cloud", + "export_settings": "Setări export", + "import_settings": "Setări import", + "third_party": "Conexiuni terțe" + }, + "export_menu": { + "docx": "Exportă ca Word", + "image": "Exportă ca imagine", + "joplin": "Exportă în Joplin", + "markdown": "Exportă ca Markdown", + "markdown_reason": "Exportă ca Markdown (cu raționament)", + "notes": "Exportă în Notițe", + "notion": "Exportă în Notion", + "obsidian": "Exportă în Obsidian", + "plain_text": "Copiază ca text simplu", + "siyuan": "Exportă în SiYuan Note", + "title": "Setări meniu export", + "yuque": "Exportă în Yuque" + }, + "export_to_phone": { + "confirm": { + "button": "Selectează fișierul de backup" + }, + "content": "Exportă unele date, inclusiv jurnalele de chat și setările. Te rugăm să reții că procesul de backup poate dura ceva timp. Îți mulțumim pentru răbdare.", + "lan": { + "connected": "Conectat", + "connection_failed": "Conexiune eșuată", + "content": "Te rugăm să te asiguri că computerul și telefonul sunt în aceeași rețea pentru transferul LAN.", + "device_list_title": "Dispozitive în rețeaua locală", + "discovered_devices": "Dispozitive descoperite", + "error": { + "file_too_large": "Fișier prea mare, maxim 500MB acceptat", + "init_failed": "Inițializare eșuată", + "invalid_file_type": "Doar fișierele ZIP sunt acceptate", + "no_file": "Niciun fișier selectat", + "no_ip": "Nu se poate obține adresa IP", + "not_connected": "Te rugăm să finalizezi handshake-ul mai întâi", + "send_failed": "Trimiterea fișierului a eșuat" + }, + "file_transfer": { + "cancelled": "Transfer anulat", + "failed": "Transfer fișier eșuat: {{message}}", + "progress": "Se trimite... {{progress}}%", + "success": "Fișier trimis cu succes" + }, + "handshake": { + "button": "Handshake", + "failed": "Handshake eșuat: {{message}}", + "in_progress": "Se efectuează handshake...", + "success": "Handshake finalizat cu {{device}}", + "test_message_received": "Primit pong de la {{device}}", + "test_message_sent": "Trimis payload test hello world" + }, + "idle_hint": "Scanare în pauză. Începe scanarea pentru a găsi parteneri Cherry Studio în LAN.", + "ip_addresses": "Adrese IP", + "last_seen": "Văzut ultima dată la {{time}}", + "metadata": "Metadate", + "no_connection_warning": "Te rugăm să deschizi Transfer LAN pe mobil în Cherry Studio", + "no_devices": "Încă nu s-au găsit parteneri LAN", + "scan_devices": "Scanează dispozitive", + "scanning_hint": "Se scanează rețeaua locală pentru parteneri Cherry Studio...", + "send_file": "Trimite fișier", + "status": { + "completed": "Transfer finalizat", + "connected": "Conectat", + "connecting": "Se conectează...", + "disconnected": "Deconectat", + "error": "Eroare de conexiune", + "initializing": "Se inițializează conexiunea...", + "preparing": "Se pregătește transferul...", + "sending": "Se transferă {{progress}}%" + }, + "status_badge_idle": "Inactiv", + "status_badge_scanning": "Se scanează", + "stop_scan": "Oprește scanarea", + "title": "Transmisie LAN", + "transfer_progress": "Progres transfer" + }, + "title": "Exportă pe telefon" + }, + "hour_interval_one": "{{count}} oră", + "hour_interval_other": "{{count}} ore", + "import_settings": { + "button": "Importă fișier Json", + "chatgpt": "Importă din ChatGPT", + "title": "Importă date din aplicație externă" + }, + "joplin": { + "check": { + "button": "Verifică", + "empty_token": "Te rugăm să introduci tokenul de autorizare Joplin", + "empty_url": "Te rugăm să introduci URL-ul serviciului Joplin Clipper", + "fail": "Verificarea conexiunii Joplin a eșuat", + "success": "Verificarea conexiunii Joplin a reușit" + }, + "export_reasoning": { + "help": "Când este activat, conținutul exportat va include lanțul de raționament (procesul de gândire).", + "title": "Include lanțul de raționament în export" + }, + "help": "În opțiunile Joplin, activează web clipper-ul (nu este necesară extensia de browser), confirmă portul și copiază tokenul de autentificare aici.", + "title": "Configurare Joplin", + "token": "Token de autorizare Joplin", + "token_placeholder": "Token de autorizare Joplin", + "url": "URL serviciu Joplin Web Clipper", + "url_placeholder": "http://127.0.0.1:41184/" + }, + "limit": { + "appDataDiskQuota": "Avertisment spațiu pe disc", + "appDataDiskQuotaDescription": "Spațiul directorului de date este aproape plin, te rugăm să eliberezi spațiu pe disc, altfel datele se vor pierde" + }, + "local": { + "autoSync": { + "label": "Backup automat", + "off": "Oprit" + }, + "backup": { + "button": "Backup local", + "manager": { + "columns": { + "actions": "Acțiuni", + "fileName": "Nume fișier", + "modifiedTime": "Ora modificării", + "size": "Dimensiune" + }, + "delete": { + "confirm": { + "multiple": "Ești sigur că vrei să ștergi cele {{count}} fișiere de backup selectate? Această acțiune nu poate fi anulată.", + "single": "Ești sigur că vrei să ștergi fișierul de backup \"{{fileName}}\"? Această acțiune nu poate fi anulată.", + "title": "Confirmă ștergerea" + }, + "error": "Ștergerea a eșuat", + "selected": "Șterge selectate", + "success": { + "multiple": "S-au șters cu succes {{count}} fișiere de backup", + "single": "Șters cu succes" + }, + "text": "Șterge" + }, + "fetch": { + "error": "Nu s-au putut obține fișierele de backup" + }, + "refresh": "Reîmprospătează", + "restore": { + "error": "Restaurare eșuată", + "success": "Restaurare reușită, aplicația se va reîmprospăta în scurt timp", + "text": "Restaurează" + }, + "select": { + "files": { + "delete": "Te rugăm să selectezi fișierele de backup de șters" + } + }, + "title": "Manager backup local" + }, + "modal": { + "filename": { + "placeholder": "Te rugăm să introduci numele fișierului de backup" + }, + "title": "Backup în director local" + } + }, + "directory": { + "label": "Director backup local", + "placeholder": "Selectează un director pentru backup-uri locale", + "select_error_app_data_path": "Noua cale nu poate fi aceeași cu calea datelor aplicației", + "select_error_in_app_install_path": "Noua cale nu poate fi aceeași cu calea de instalare a aplicației", + "select_error_write_permission": "Noua cale nu are permisiuni de scriere", + "select_title": "Selectează directorul de backup" + }, + "hour_interval_one": "{{count}} oră", + "hour_interval_other": "{{count}} ore", + "lastSync": "Ultimul backup", + "maxBackups": { + "label": "Backup-uri maxime", + "unlimited": "Nelimitat" + }, + "minute_interval_one": "{{count}} minut", + "minute_interval_other": "{{count}} minute", + "noSync": "Se așteaptă următorul backup", + "restore": { + "button": "Restaurează din local", + "confirm": { + "content": "Restaurarea din backup-ul local va înlocui datele actuale. Vrei să continui?", + "title": "Confirmă restaurarea" + } + }, + "syncError": "Eroare backup", + "syncStatus": "Stare backup", + "title": "Backup local" + }, + "markdown_export": { + "exclude_citations": { + "help": "Exclude citările și referințele la exportul în Markdown, păstrând doar conținutul principal", + "title": "Exclude citările" + }, + "force_dollar_math": { + "help": "Când este activat, $$ va fi folosit forțat pentru a marca formulele LaTeX la exportul în Markdown. Notă: Această opțiune afectează și toate metodele de export prin Markdown, cum ar fi Notion, Yuque etc.", + "title": "Forțează $$ pentru formulele LaTeX" + }, + "help": "Dacă este furnizată, exporturile vor fi salvate automat în această cale; în caz contrar, va apărea un dialog de salvare.", + "path": "Cale export implicită", + "path_placeholder": "Cale export", + "select": "Selectează", + "show_model_name": { + "help": "Când este activat, numele modelului va fi afișat la exportul în Markdown. Notă: Această opțiune afectează și toate metodele de export prin Markdown, cum ar fi Notion, Yuque etc.", + "title": "Folosește numele modelului la export" + }, + "show_model_provider": { + "help": "Afișează furnizorul modelului (de ex., OpenAI, Gemini) la exportul în Markdown", + "title": "Arată furnizorul modelului" + }, + "standardize_citations": { + "help": "Când este activat, marcatorii de citare vor fi convertiți în format standard de notă de subsol Markdown [^1], iar listele de citare vor fi formatate.", + "title": "Standardizează formatul citării" + }, + "title": "Export Markdown" + }, + "message_title": { + "use_topic_naming": { + "help": "Când este activat, folosește modelul rapid pentru a numi titlul mesajelor exportate. Această setare afectează și toate metodele de export prin Markdown.", + "title": "Folosește modelul rapid pentru a numi titlul mesajului exportat" + } + }, + "minute_interval_one": "{{count}} minut", + "minute_interval_other": "{{count}} minute", + "notion": { + "api_key": "Cheie API Notion", + "api_key_placeholder": "Introdu cheia API Notion", + "check": { + "button": "Verifică", + "empty_api_key": "Cheia API nu este configurată", + "empty_database_id": "ID-ul bazei de date nu este configurat", + "error": "Eroare de conexiune, te rugăm să verifici configurația rețelei și cheia API și ID-ul bazei de date", + "fail": "Conexiune eșuată, te rugăm să verifici rețeaua și cheia API și ID-ul bazei de date", + "success": "Conexiune reușită" + }, + "database_id": "ID bază de date Notion", + "database_id_placeholder": "Introdu ID-ul bazei de date Notion", + "export_reasoning": { + "help": "Când este activat, conținutul exportat va include lanțul de raționament (procesul de gândire).", + "title": "Include lanțul de raționament în export" + }, + "help": "Documentație configurare Notion", + "page_name_key": "Nume câmp titlu pagină", + "page_name_key_placeholder": "Introdu numele câmpului pentru titlul paginii, implicit este Name", + "title": "Setări Notion" + }, + "nutstore": { + "backup": { + "button": "Backup în Nutstore", + "modal": { + "filename": { + "placeholder": "Introdu numele fișierului de backup" + }, + "title": "Backup în Nutstore" + } + }, + "checkConnection": { + "fail": "Conexiunea Nutstore a eșuat", + "name": "Verifică conexiunea", + "success": "Conectat la Nutstore" + }, + "isLogin": "Conectat", + "login": { + "button": "Conectare" + }, + "logout": { + "button": "Deconectare", + "content": "După deconectare, nu vei mai putea face backup în Nutstore sau restaura din Nutstore.", + "title": "Ești sigur că vrei să te deconectezi de la Nutstore?" + }, + "new_folder": { + "button": { + "cancel": "Anulează", + "confirm": "Confirmă", + "label": "Dosar nou" + } + }, + "notLogin": "Neconectat", + "path": { + "label": "Cale stocare Nutstore", + "placeholder": "Introdu calea de stocare Nutstore" + }, + "pathSelector": { + "currentPath": "Cale curentă", + "return": "Înapoi", + "title": "Cale stocare Nutstore" + }, + "restore": { + "button": "Restaurează din Nutstore", + "confirm": { + "content": "Restaurarea din Nutstore va suprascrie datele curente. Vrei să continui?", + "title": "Restaurează din Nutstore" + } + }, + "title": "Configurare Nutstore", + "username": "Nume utilizator Nutstore" + }, + "obsidian": { + "default_vault": "Seif Obsidian implicit", + "default_vault_export_failed": "Export eșuat", + "default_vault_fetch_error": "Nu s-a putut prelua seiful Obsidian", + "default_vault_loading": "Se încarcă seiful Obsidian...", + "default_vault_no_vaults": "Nu s-au găsit seifuri Obsidian", + "default_vault_placeholder": "Te rugăm să selectezi seiful Obsidian implicit", + "title": "Configurare Obsidian" + }, + "s3": { + "accessKeyId": { + "label": "ID cheie de acces", + "placeholder": "ID cheie de acces" + }, + "autoSync": { + "hour": "La fiecare {{count}} oră", + "label": "Sincronizare automată", + "minute": "La fiecare {{count}} minute", + "off": "Oprit" + }, + "backup": { + "button": "Backup acum", + "error": "Backup S3 eșuat: {{message}}", + "manager": { + "button": "Gestionează backup-uri" + }, + "modal": { + "filename": { + "placeholder": "Te rugăm să introduci numele fișierului de backup" + }, + "title": "Backup S3" + }, + "operation": "Operațiune de backup", + "success": "Backup S3 reușit" + }, + "bucket": { + "label": "Bucket", + "placeholder": "Bucket, de ex.: exemplu" + }, + "endpoint": { + "label": "Endpoint API", + "placeholder": "https://s3.example.com" + }, + "manager": { + "close": "Închide", + "columns": { + "actions": "Acțiuni", + "fileName": "Nume fișier", + "modifiedTime": "Ora modificării", + "size": "Dimensiune fișier" + }, + "config": { + "incomplete": "Te rugăm să completezi configurația S3 completă" + }, + "delete": { + "confirm": { + "multiple": "Ești sigur că vrei să ștergi cele {{count}} fișiere de backup selectate? Această acțiune nu poate fi anulată.", + "single": "Ești sigur că vrei să ștergi fișierul de backup \"{{fileName}}\"? Această acțiune nu poate fi anulată.", + "title": "Confirmă ștergerea" + }, + "error": "Nu s-a putut șterge fișierul de backup: {{message}}", + "label": "Șterge", + "selected": "Șterge selectate ({{count}})", + "success": { + "multiple": "S-au șters cu succes {{count}} fișiere de backup", + "single": "Fișier de backup șters cu succes" + } + }, + "files": { + "fetch": { + "error": "Nu s-a putut prelua lista fișierelor de backup: {{message}}" + } + }, + "refresh": "Reîmprospătează", + "restore": "Restaurează", + "select": { + "warning": "Te rugăm să selectezi fișierele de backup de șters" + }, + "title": "Manager fișiere backup S3" + }, + "maxBackups": { + "label": "Backup-uri maxime", + "unlimited": "Nelimitat" + }, + "region": { + "label": "Regiune", + "placeholder": "Regiune, de ex.: us-east-1" + }, + "restore": { + "config": { + "incomplete": "Te rugăm să completezi configurația S3 completă" + }, + "confirm": { + "cancel": "Anulează", + "content": "Restaurarea datelor va suprascrie toate datele curente. Această acțiune nu poate fi anulată. Ești sigur că vrei să continui?", + "ok": "Confirmă restaurarea", + "title": "Confirmă restaurarea datelor" + }, + "error": "Restaurarea datelor a eșuat: {{message}}", + "file": { + "required": "Te rugăm să selectezi fișierul de backup pentru restaurare" + }, + "modal": { + "select": { + "placeholder": "Te rugăm să selectezi fișierul de backup pentru restaurare" + }, + "title": "Restaurare date S3" + }, + "success": "Restaurarea datelor a reușit" + }, + "root": { + "label": "Director backup (Opțional)", + "placeholder": "de ex.: /cherry-studio" + }, + "secretAccessKey": { + "label": "Cheie secretă de acces", + "placeholder": "Cheie secretă de acces" + }, + "skipBackupFile": { + "help": "Când este activat, datele fișierelor vor fi omise în timpul backup-ului, vor fi salvate doar informațiile de configurare, reducând semnificativ dimensiunea fișierului de backup", + "label": "Backup ușor" + }, + "syncStatus": { + "error": "Eroare sincronizare: {{message}}", + "label": "Stare sincronizare", + "lastSync": "Ultima sincronizare: {{time}}", + "noSync": "Nesincronizat" + }, + "title": { + "help": "Servicii de stocare a obiectelor compatibile S3, cum ar fi AWS S3, Cloudflare R2, Aliyun OSS, Tencent COS etc.", + "label": "Stocare compatibilă S3", + "tooltip": "Documentație configurare stocare compatibilă S3" + } + }, + "siyuan": { + "api_url": "URL API SiYuan Note", + "api_url_placeholder": "de ex.: http://127.0.0.1:6806", + "box_id": "ID Box SiYuan Note", + "box_id_placeholder": "Te rugăm să introduci ID-ul Box SiYuan Note", + "check": { + "button": "Verifică", + "empty_config": "Te rugăm să completezi adresa API și tokenul", + "error": "Eroare de conexiune, te rugăm să verifici conexiunea la rețea", + "fail": "Conexiune eșuată, te rugăm să verifici adresa API și tokenul", + "success": "Conexiune reușită", + "title": "Verificare conexiune" + }, + "root_path": "Cale rădăcină SiYuan Note", + "root_path_placeholder": "de ex.: /CherryStudio", + "title": "Configurare SiYuan Note", + "token": { + "help": "Obține token SiYuan Note", + "label": "Token SiYuan Note" + }, + "token_placeholder": "Te rugăm să introduci tokenul SiYuan Note" + }, + "title": "Setări date", + "webdav": { + "autoSync": { + "label": "Backup automat", + "off": "Oprit" + }, + "backup": { + "button": "Backup în WebDAV", + "manager": { + "columns": { + "actions": "Acțiuni", + "fileName": "Nume fișier", + "modifiedTime": "Ora modificării", + "size": "Dimensiune" + }, + "delete": { + "confirm": { + "multiple": "Ești sigur că vrei să ștergi cele {{count}} fișiere de backup selectate? Această acțiune nu poate fi anulată.", + "single": "Ești sigur că vrei să ștergi fișierul de backup \"{{fileName}}\"? Această acțiune nu poate fi anulată.", + "title": "Confirmă ștergerea" + }, + "error": "Ștergerea a eșuat", + "selected": "Șterge selectate", + "success": { + "multiple": "S-au șters cu succes {{count}} fișiere de backup", + "single": "Șters cu succes" + }, + "text": "Șterge" + }, + "fetch": { + "error": "Nu s-au putut obține fișierele de backup" + }, + "refresh": "Reîmprospătează", + "restore": { + "error": "Restaurare eșuată", + "success": "Restaurare reușită, aplicația se va reîmprospăta în scurt timp", + "text": "Restaurează" + }, + "select": { + "files": { + "delete": "Te rugăm să selectezi fișierele de backup de șters" + } + }, + "title": "Gestionare date backup" + }, + "modal": { + "filename": { + "placeholder": "Te rugăm să introduci numele fișierului de backup" + }, + "title": "Backup în WebDAV" + } + }, + "disableStream": { + "help": "Când este activat, încarcă fișierul în memorie înainte de încărcare. Acest lucru poate rezolva probleme de incompatibilitate cu unele servere WebDAV care nu acceptă încărcări fragmentate, dar va crește utilizarea memoriei.", + "title": "Dezactivează încărcarea prin flux" + }, + "host": { + "label": "Gazdă WebDAV", + "placeholder": "http://localhost:8080" + }, + "hour_interval_one": "{{count}} oră", + "hour_interval_other": "{{count}} ore", + "lastSync": "Ultimul backup", + "maxBackups": "Backup-uri maxime", + "minute_interval_one": "{{count}} minut", + "minute_interval_other": "{{count}} minute", + "noSync": "Se așteaptă următorul backup", + "password": "Parolă WebDAV", + "path": { + "label": "Cale WebDAV", + "placeholder": "/backup" + }, + "restore": { + "button": "Restaurează din WebDAV", + "confirm": { + "content": "Restaurarea din WebDAV va suprascrie datele curente. Vrei să continui?", + "title": "Confirmă restaurarea" + }, + "content": "Restaurarea din WebDAV va suprascrie datele curente, continui?", + "title": "Restaurează din WebDAV" + }, + "syncError": "Eroare backup", + "syncStatus": "Stare backup", + "title": "WebDAV", + "user": "Utilizator WebDAV" + }, + "yuque": { + "check": { + "button": "Verifică", + "empty_repo_url": "Te rugăm să introduci mai întâi URL-ul bazei de cunoștințe", + "empty_token": "Te rugăm să introduci mai întâi tokenul Yuque", + "fail": "Verificarea conexiunii Yuque a eșuat", + "success": "Conexiunea Yuque a fost verificată cu succes" + }, + "help": "Obține token Yuque", + "repo_url": "URL Yuque", + "repo_url_placeholder": "https://www.yuque.com/username/xxx", + "title": "Configurare Yuque", + "token": "Token Yuque", + "token_placeholder": "Te rugăm să introduci tokenul Yuque" + } + }, + "developer": { + "enable_developer_mode": "Activează modul dezvoltator", + "help": "După activarea modului dezvoltator, poți folosi funcția de urmărire (trace) pentru a vizualiza fluxul de date în timpul invocării modelului.", + "title": "Mod dezvoltator" + }, + "display": { + "assistant": { + "title": "Setări asistent" + }, + "custom": { + "css": { + "cherrycss": "Obține de la cherrycss.com", + "label": "CSS personalizat", + "placeholder": "/* Pune CSS personalizat aici */" + } + }, + "font": { + "code": "Font cod", + "default": "Implicit", + "global": "Font global", + "select": "Selectează font", + "title": "Setări font" + }, + "navbar": { + "position": { + "label": "Poziție bară de navigare", + "left": "Stânga", + "top": "Sus" + }, + "title": "Setări bară de navigare" + }, + "sidebar": { + "chat": { + "hiddenMessage": "Asistenții sunt funcții de bază, nu se acceptă ascunderea" + }, + "disabled": "Ascunde pictograme", + "empty": "Trage funcția ascunsă din partea stângă aici", + "files": { + "icon": "Arată pictograma Fișiere" + }, + "knowledge": { + "icon": "Arată pictograma Cunoștințe" + }, + "minapp": { + "icon": "Arată pictograma MinApp" + }, + "painting": { + "icon": "Arată pictograma Pictură" + }, + "title": "Setări bară laterală", + "translate": { + "icon": "Arată pictograma Traducere" + }, + "visible": "Arată pictograme" + }, + "title": "Setări afișare", + "topic": { + "title": "Setări subiect" + }, + "zoom": { + "title": "Setări zoom" + } + }, + "font_size": { + "title": "Dimensiune font mesaj" + }, + "general": { + "auto_check_update": { + "title": "Actualizare automată" + }, + "avatar": { + "builtin": "Avatar integrat", + "reset": "Resetează avatarul" + }, + "backup": { + "button": "Backup", + "title": "Backup și recuperare date" + }, + "display": { + "title": "Setări afișare" + }, + "emoji_picker": "Selector emoji", + "image_upload": "Încărcare imagine", + "label": "Setări generale", + "reset": { + "button": "Resetează", + "title": "Resetare date" + }, + "restore": { + "button": "Restaurează" + }, + "spell_check": { + "label": "Verificare ortografică", + "languages": "Folosește verificarea ortografică pentru" + }, + "test_plan": { + "beta_version": "Versiune Beta", + "beta_version_tooltip": "Funcțiile se pot schimba oricând, mai multe bug-uri, actualizare rapidă", + "rc_version": "Versiune Previzualizare (RC)", + "rc_version_tooltip": "Aproape de versiunea stabilă, funcțiile sunt în principiu stabile, puține bug-uri", + "title": "Plan de testare", + "tooltip": "Participă la planul de testare pentru a experimenta mai rapid cele mai recente funcții, dar aduce și mai multe riscuri; te rugăm să faci backup datelor în avans", + "version_channel_not_match": "Comutarea versiunii de previzualizare și test va intra în vigoare după lansarea următoarei versiuni stabile", + "version_options": "Opțiuni versiune" + }, + "title": "Setări generale", + "user_name": { + "label": "Nume utilizator", + "placeholder": "Introdu numele tău" + }, + "view_webdav_settings": "Vezi setările WebDAV" + }, + "groq": { + "title": "Setări Groq" + }, + "hardware_acceleration": { + "confirm": { + "content": "Dezactivarea accelerării hardware necesită repornirea aplicației pentru a intra în vigoare. Vrei să repornești acum?", + "title": "Repornire necesară" + }, + "title": "Dezactivează accelerarea hardware" + }, + "input": { + "auto_translate_with_space": "Tradu rapid cu 3 spații", + "clear": { + "all": "Golește", + "knowledge_base": "Golește bazele de cunoștințe selectate", + "models": "Golește toate modelele" + }, + "show_translate_confirm": "Arată dialogul de confirmare a traducerii", + "target_language": { + "chinese": "Chineză simplificată", + "chinese-traditional": "Chineză tradițională", + "english": "Engleză", + "japanese": "Japoneză", + "label": "Limba țintă", + "russian": "Rusă" + } + }, + "launch": { + "onboot": "Pornește automat la pornirea sistemului", + "title": "Lansare", + "totray": "Minimizează în zona de notificare la pornire" + }, + "math": { + "engine": { + "label": "Motor matematic", + "none": "Niciunul" + }, + "single_dollar": { + "label": "Activează $...$", + "tip": "Randează ecuațiile matematice citate prin semne unice de dolar $...$. Implicit este activat." + }, + "title": "Setări matematice" + }, + "mcp": { + "actions": "Acțiuni", + "active": "Activ", + "addError": "Nu s-a putut adăuga serverul", + "addServer": { + "create": "Creare rapidă", + "importFrom": { + "connectionFailed": "Conexiune eșuată", + "dxt": "Importă pachet DXT", + "dxtFile": "Fișier pachet DXT", + "dxtHelp": "Selectează un fișier .dxt care conține un pachet de server MCP", + "dxtProcessFailed": "Procesarea fișierului DXT a eșuat", + "error": { + "multipleServers": "Nu se poate importa din mai multe servere" + }, + "invalid": "Intrare invalidă, te rugăm să verifici formatul JSON", + "json": "Importă din JSON", + "method": "Metodă import", + "nameExists": "Serverul există deja: {{name}}", + "noDxtFile": "Te rugăm să selectezi un fișier DXT", + "oneServer": "Doar o singură configurație de server MCP la un moment dat", + "placeholder": "Lipește configurația JSON a serverului MCP", + "selectDxtFile": "Selectează fișierul DXT", + "tooltip": "Te rugăm să copiezi JSON-ul de configurare (prioritizând configurațiile\n NPX sau UVX) din pagina de introducere a serverelor MCP și să-l lipești în caseta de intrare." + }, + "label": "Adaugă server" + }, + "addSuccess": "Server adăugat cu succes", + "advancedSettings": "Setări avansate", + "args": "Argumente", + "argsTooltip": "Fiecare argument pe o linie nouă", + "baseUrlTooltip": "URL de bază server la distanță", + "builtinServers": "Servere integrate", + "builtinServersDescriptions": { + "brave_search": "O implementare de server MCP care integrează API-ul Brave Search, oferind funcționalități de căutare web și locală. Necesită configurarea variabilei de mediu BRAVE_API_KEY", + "browser": "Controlează o fereastră Electron headless prin Protocolul Chrome DevTools. Instrumente: deschide URL, execută JS pe o singură linie, resetează sesiunea.", + "didi_mcp": "Server DiDi MCP care oferă servicii de ride-hailing, inclusiv căutare pe hartă, estimare preț, gestionare comenzi și urmărire șofer. Disponibil doar în China continentală. Necesită configurarea variabilei de mediu DIDI_API_KEY", + "dify_knowledge": "Implementarea serverului MCP Dify oferă un API simplu pentru a interacționa cu Dify. Necesită configurarea cheii Dify", + "fetch": "Server MCP pentru preluarea conținutului web de la URL", + "filesystem": "Un server Node.js care implementează Protocolul de Context Model (MCP) pentru operațiuni în sistemul de fișiere. Necesită configurarea directoarelor permise pentru acces.", + "mcp_auto_install": "Instalează automat serviciul MCP (beta)", + "memory": "Implementare de memorie persistentă bazată pe un graf de cunoștințe local. Aceasta permite modelului să rețină informații legate de utilizator între conversații diferite. Necesită configurarea variabilei de mediu MEMORY_FILE_PATH.", + "no": "Fără descriere", + "nowledge_mem": "Necesită aplicația Nowledge Mem rulând local. Păstrează chat-urile AI, instrumentele, notițele, agenții și fișierele în memoria privată de pe computerul tău. Descarcă de la https://mem.nowledge.co/", + "python": "Execută cod Python într-un mediu sandbox securizat. Rulează Python cu Pyodide, suportând majoritatea bibliotecilor standard și pachetelor de calcul științific", + "sequentialthinking": "O implementare de server MCP care oferă instrumente pentru rezolvarea dinamică și reflexivă a problemelor prin procese de gândire structurată" + }, + "command": "Comandă", + "config_description": "Configurează serverele Protocolului de Context Model", + "customRegistryPlaceholder": "Introdu URL registru privat, de ex.: https://npm.company.com", + "deleteError": "Nu s-a putut șterge serverul", + "deleteServer": "Șterge serverul", + "deleteServerConfirm": "Ești sigur că vrei să ștergi acest server?", + "deleteSuccess": "Server șters cu succes", + "dependenciesInstall": "Instalează dependențe", + "dependenciesInstalling": "Se instalează dependențele...", + "description": "Descriere", + "disable": { + "description": "Nu activa funcționalitatea serverului MCP", + "label": "Dezactivează serverul MCP" + }, + "discover": "Descoperă", + "duplicateName": "Un server cu acest nume există deja", + "editJson": "Editează JSON", + "editMcpJson": "Editează configurația MCP", + "editServer": "Editează serverul", + "env": "Variabile de mediu", + "envTooltip": "Format: CHEIE=valoare, una pe linie", + "errors": { + "32000": "Serverul MCP nu a pornit, te rugăm să verifici parametrii conform tutorialului", + "toolNotFound": "Instrumentul {{name}} nu a fost găsit" + }, + "fetch": { + "button": "Preluare servere", + "success": "Serverele MCP au fost preluate cu succes" + }, + "findMore": "Găsește mai multe MCP", + "headers": "Headere", + "headersTooltip": "Headere personalizate pentru cereri HTTP", + "inMemory": "Memorie", + "install": "Instalează", + "installError": "Instalarea dependențelor a eșuat", + "installHelp": "Obține ajutor pentru instalare", + "installSuccess": "Dependențe instalate cu succes", + "jsonFormatError": "Eroare formatare JSON", + "jsonModeHint": "Editează reprezentarea JSON a configurației serverului MCP. Te rugăm să te asiguri că formatul este corect înainte de salvare.", + "jsonSaveError": "Nu s-a putut salva configurația JSON.", + "jsonSaveSuccess": "Configurația JSON a fost salvată.", + "logoUrl": "URL logo", + "logs": "Jurnale", + "longRunning": "Mod rulare lungă", + "longRunningTooltip": "Când este activat, serverul acceptă sarcini de lungă durată. La primirea notificărilor de progres, timpul de expirare va fi resetat, iar timpul maxim de execuție va fi extins la 10 minute.", + "marketplaces": "Piețe", + "missingDependencies": "Lipsește, te rugăm să îl instalezi pentru a continua.", + "more": { + "awesome": "Listă curatoriată servere MCP", + "composio": "Instrumente dezvoltare MCP Composio", + "glama": "Director servere MCP Glama", + "higress": "Server MCP Higress", + "mcpso": "Platformă descoperire servere MCP", + "modelscope": "Server MCP comunitate ModelScope", + "official": "Colecție oficială servere MCP", + "pulsemcp": "Server MCP Pulse", + "smithery": "Instrumente MCP Smithery", + "zhipu": "MCP curatoriat, integrare rapidă" + }, + "name": "Nume", + "newServer": "Server MCP", + "noDescriptionAvailable": "Nicio descriere disponibilă", + "noLogs": "Niciun jurnal încă", + "noServers": "Niciun server configurat", + "not_support": "Model neacceptat", + "npx_list": { + "actions": "Acțiuni", + "description": "Descriere", + "no_packages": "Nu s-au găsit pachete", + "npm": "NPM", + "package_name": "Nume pachet", + "scope_placeholder": "Introdu domeniul npm (de ex. @organizatia-ta)", + "scope_required": "Te rugăm să introduci domeniul npm", + "search": "Caută", + "search_error": "Eroare căutare", + "usage": "Utilizare", + "version": "Versiune" + }, + "oauth": { + "callback": { + "message": "Poți închide această pagină și te poți întoarce la Cherry Studio", + "title": "Autentificare reușită" + } + }, + "prompts": { + "arguments": "Argumente", + "availablePrompts": "Prompturi disponibile", + "genericError": "Eroare obținere prompt", + "loadError": "Eroare obținere prompturi", + "noPromptsAvailable": "Nu există prompturi disponibile", + "requiredField": "Câmp obligatoriu" + }, + "protocolInstallWarning": { + "command": "Comandă pornire", + "message": "Acest MCP a fost instalat dintr-o sursă externă prin protocol. Rularea instrumentelor necunoscute poate dăuna computerului tău.", + "run": "Rulează", + "title": "Rulezi MCP extern?" + }, + "provider": "Furnizor", + "providerPlaceholder": "Nume furnizor", + "providerUrl": "URL furnizor", + "providers": "Furnizori", + "registry": "Registru pachete", + "registryDefault": "Implicit", + "registryTooltip": "Alege registrul pentru instalarea pachetelor pentru a rezolva problemele de rețea cu registrul implicit.", + "requiresConfig": "Necesită configurare", + "resources": { + "availableResources": "Resurse disponibile", + "blob": "Blob", + "blobInvisible": "Blob invizibil", + "genericError": "Eroare achiziție resursă", + "mimeType": "Tip MIME", + "noResourcesAvailable": "Nu există resurse disponibile", + "size": "Dimensiune", + "text": "Text", + "uri": "URI" + }, + "search": { + "placeholder": "Caută servere MCP...", + "tooltip": "Caută servere MCP" + }, + "searchNpx": "Caută MCP", + "serverPlural": "servere", + "serverSingular": "server", + "servers": "Servere MCP", + "sse": "Evenimente trimise de server (sse)", + "startError": "Pornire eșuată", + "stdio": "Intrare/Ieșire standard (stdio)", + "streamableHttp": "HTTP fluxabil (streamableHttp)", + "sync": { + "button": "Sincronizează", + "discoverMcpServers": "Descoperă servere MCP", + "discoverMcpServersDescription": "Vizitează platforma pentru a descoperi servere MCP disponibile", + "error": "Eroare sincronizare servere MCP", + "getToken": "Obține token API", + "getTokenDescription": "Obține tokenul tău personal API din contul tău", + "noServersAvailable": "Nu există servere MCP disponibile", + "selectProvider": "Selectează furnizor:", + "setToken": "Introdu tokenul tău", + "success": "Sincronizare servere MCP reușită", + "title": "Sincronizare servere", + "tokenPlaceholder": "Introdu tokenul API aici", + "tokenRequired": "Tokenul API este obligatoriu", + "unauthorized": "Sincronizare neautorizată" + }, + "system": "Sistem", + "tabs": { + "description": "Descriere", + "general": "General", + "prompts": "Prompturi", + "resources": "Resurse", + "tools": "Instrumente" + }, + "tags": "Etichete", + "tagsPlaceholder": "Introdu etichete", + "timeout": "Expirare", + "timeoutTooltip": "Timpul de expirare în secunde pentru cererile către acest server, implicit este 60 secunde", + "title": "Servere MCP", + "tools": { + "autoApprove": { + "label": "Aprobare automată", + "tooltip": { + "confirm": "Ești sigur că vrei să rulezi acest instrument MCP?", + "disabled": "Instrumentul va necesita aprobare manuală înainte de rulare", + "enabled": "Instrumentul va rula automat fără confirmare", + "howToEnable": "Activează mai întâi instrumentul pentru a folosi aprobarea automată" + } + }, + "availableTools": "Instrumente disponibile", + "enable": "Activează instrumentul", + "inputSchema": { + "enum": { + "allowedValues": "Valori permise" + }, + "label": "Schemă intrare" + }, + "loadError": "Eroare obținere instrumente", + "noToolsAvailable": "Nu există instrumente disponibile", + "run": "Rulează" + }, + "type": "Tip", + "types": { + "inMemory": "În memorie", + "sse": "SSE", + "stdio": "STDIO", + "streamableHttp": "HTTP fluxabil" + }, + "updateError": "Actualizarea serverului a eșuat", + "updateSuccess": "Server actualizat cu succes", + "url": "URL", + "user": "Utilizator" + }, + "messages": { + "divider": { + "label": "Arată divizor între mesaje", + "tooltip": "Nu se aplică mesajelor stil bulă" + }, + "grid_columns": "Coloane afișare grilă mesaje", + "grid_popover_trigger": { + "click": "Fă clic pentru a afișa", + "hover": "Plasează cursorul pentru a afișa", + "label": "Declanșator detaliu grilă" + }, + "input": { + "confirm_delete_message": "Confirmă înainte de ștergerea mesajelor", + "confirm_regenerate_message": "Confirmă înainte de regenerarea mesajelor", + "enable_quick_triggers": "Activează declanșatoarele / și @", + "paste_long_text_as_file": "Lipește text lung ca fișier", + "paste_long_text_threshold": "Lungime lipire text lung", + "send_shortcuts": "Comenzi rapide trimitere", + "show_estimated_tokens": "Arată tokeni estimați", + "title": "Setări intrare" + }, + "markdown_rendering_input_message": "Randare Markdown mesaj intrare", + "metrics": "{{time_first_token_millsec}}ms până la primul token | {{token_speed}} tok/sec", + "model": { + "title": "Setări model" + }, + "navigation": { + "anchor": "Ancoră mesaj", + "buttons": "Butoane navigare", + "label": "Bară navigare", + "none": "Niciunul" + }, + "prompt": "Arată prompt", + "show_message_outline": "Arată contur mesaj", + "title": "Setări mesaje", + "use_serif_font": "Folosește font serif" + }, + "mineru": { + "api_key": "Mineru oferă acum o cotă zilnică gratuită de 500 de pagini și nu este nevoie să introduci o cheie." + }, + "miniapps": { + "cache_change_notice": "Modificările vor intra în vigoare când numărul de mini-aplicații deschise atinge valoarea setată", + "cache_description": "Setează numărul maxim de mini-aplicații active de păstrat în memorie", + "cache_settings": "Setări cache", + "cache_title": "Limită cache mini-aplicații", + "custom": { + "conflicting_ids": "ID-uri conflictuale cu aplicațiile implicite: {{ids}}", + "duplicate_ids": "ID-uri duplicate găsite: {{ids}}", + "edit_description": "Editează configurația mini-aplicației personalizate aici. Fiecare aplicație ar trebui să includă câmpurile id, name, url și logo.", + "edit_title": "Editează mini-aplicație personalizată", + "id": "ID", + "id_error": "ID-ul este obligatoriu.", + "id_placeholder": "Introdu ID", + "logo": "Logo", + "logo_file": "Încarcă fișier logo", + "logo_upload_button": "Încarcă", + "logo_upload_error": "Încărcarea logo-ului a eșuat.", + "logo_upload_label": "Încarcă logo", + "logo_upload_success": "Logo încărcat cu succes.", + "logo_url": "URL logo", + "logo_url_label": "URL logo", + "logo_url_placeholder": "Introdu URL logo", + "name": "Nume", + "name_error": "Numele este obligatoriu.", + "name_placeholder": "Introdu nume", + "placeholder": "Introdu configurația mini-aplicației personalizate (format JSON)", + "remove_error": "Eliminarea mini-aplicației personalizate a eșuat.", + "remove_success": "Mini-aplicația personalizată a fost eliminată cu succes.", + "save": "Salvează", + "save_error": "Salvarea mini-aplicației personalizate a eșuat.", + "save_success": "Mini-aplicația personalizată a fost salvată cu succes.", + "title": "Personalizat", + "url": "URL", + "url_error": "URL-ul este obligatoriu.", + "url_placeholder": "Introdu URL" + }, + "disabled": "Mini-aplicații ascunse", + "display_title": "Setări afișare mini-aplicații", + "empty": "Trage mini-aplicațiile din stânga pentru a le ascunde", + "open_link_external": { + "title": "Deschide linkurile de fereastră nouă în browser" + }, + "reset_tooltip": "Resetează la implicit", + "sidebar_description": "Arată mini-aplicațiile active în bara laterală", + "sidebar_title": "Afișare mini-aplicații active în bara laterală", + "title": "Setări mini-aplicații", + "visible": "Mini-aplicații vizibile" + }, + "model": "Model implicit", + "models": { + "add": { + "add_model": "Adaugă model", + "batch_add_models": "Adaugă modele în lot", + "endpoint_type": { + "label": "Tip endpoint", + "placeholder": "Selectează tip endpoint", + "required": "Te rugăm să selectezi un tip de endpoint", + "tooltip": "Selectează formatul tipului de endpoint API" + }, + "group_name": { + "label": "Nume grup", + "placeholder": "Opțional de ex. ChatGPT", + "tooltip": "Opțional de ex. ChatGPT" + }, + "model_id": { + "label": "ID model", + "placeholder": "Obligatoriu de ex. gpt-3.5-turbo", + "select": { + "placeholder": "Selectează model" + }, + "tooltip": "Exemplu: gpt-3.5-turbo" + }, + "model_name": { + "label": "Nume model", + "placeholder": "Opțional de ex. GPT-4", + "tooltip": "Opțional de ex. GPT-4" + }, + "supported_text_delta": { + "label": "Suportă ieșire text incrementală", + "tooltip": "Modelul returnează text incremental, mai degrabă decât tot odată. Activat implicit, dacă modelul nu acceptă acest lucru, te rugăm să dezactivezi această opțiune" + } + }, + "api_key": "Cheie API", + "base_url": "URL de bază", + "check": { + "all": "Toate", + "all_models_passed": "Verificarea tuturor modelelor a trecut", + "button_caption": "Verificare sănătate", + "disabled": "Dezactivat", + "disclaimer": "Verificarea sănătății necesită trimiterea de cereri, te rugăm să o folosești cu precauție. Modelele care taxează pe cerere pot genera costuri suplimentare, te rugăm să îți asumi responsabilitatea.", + "enable_concurrent": "Concurent", + "enabled": "Activat", + "failed": "Eșuat", + "keys_status_count": "Reușite: {{count_passed}} chei, eșuate: {{count_failed}} chei", + "model_status_failed": "{{count}} modele complet inaccesibile", + "model_status_partial": "{{count}} modele au avut chei inaccesibile", + "model_status_passed": "{{count}} modele au trecut verificările de sănătate", + "model_status_summary": "{{provider}}: {{summary}}", + "no_api_keys": "Nu s-au găsit chei API, te rugăm să adaugi mai întâi chei API.", + "no_results": "Niciun rezultat", + "passed": "Reușit", + "select_api_key": "Selectează cheia API de utilizat:", + "single": "Singur", + "start": "Start", + "timeout": "Expirare", + "title": "Verificare sănătate model", + "use_all_keys": "Cheie(i)" + }, + "default_assistant_model": "Model asistent implicit", + "default_assistant_model_description": "Model folosit la crearea unui nou asistent; dacă asistentul nu este setat, va fi folosit acest model", + "empty": "Nu s-au găsit modele", + "manage": { + "add_listed": { + "confirm": "Ești sigur că vrei să adaugi toate modelele la listă?", + "label": "Adaugă modele la listă" + }, + "add_whole_group": "Adaugă întregul grup", + "refetch_list": "Reîmprospătează lista modelelor", + "remove_listed": "Elimină modelele din listă", + "remove_model": "Elimină modelul", + "remove_whole_group": "Elimină întregul grup" + }, + "provider_id": "ID furnizor", + "provider_key_add_confirm": "Vrei să adaugi cheia API pentru {{provider}}?", + "provider_key_add_failed_by_empty_data": "Adăugarea cheii API a furnizorului a eșuat, datele sunt goale", + "provider_key_add_failed_by_invalid_data": "Adăugarea cheii API a furnizorului a eșuat, eroare format date", + "provider_key_added": "S-a adăugat cu succes cheia API pentru {{provider}}", + "provider_key_already_exists": "{{provider}} are deja o cheie API ({{existingKey}}). Nu o adăuga din nou.", + "provider_key_confirm_title": "Adaugă cheie API furnizor", + "provider_key_no_change": "Cheia API pentru {{provider}} nu s-a schimbat", + "provider_key_overridden": "S-a actualizat cu succes cheia API pentru {{provider}}", + "provider_key_override_confirm": "{{provider}} are deja o cheie API ({{existingKey}}). Vrei să o suprascrii cu noua cheie ({{newKey}})?", + "provider_name": "Nume furnizor", + "quick_assistant_default_tag": "Implicit", + "quick_assistant_model": "Model asistent rapid", + "quick_assistant_selection": "Selectează asistent", + "quick_model": { + "description": "Model folosit pentru sarcini simple, cum ar fi numirea subiectelor și extragerea cuvintelor cheie", + "label": "Model rapid", + "setting_title": "Configurare model rapid", + "tooltip": "Se recomandă alegerea unui model ușor și nu se recomandă alegerea unui model de gândire." + }, + "topic_naming": { + "auto": "Numire automată subiect", + "label": "Numire subiect", + "prompt": "Prompt numire subiect" + }, + "translate_model": "Model traducere", + "translate_model_description": "Model folosit pentru serviciul de traducere", + "translate_model_prompt_message": "Te rugăm să introduci promptul modelului de traducere", + "translate_model_prompt_title": "Prompt model traducere", + "use_assistant": "Folosește asistent", + "use_model": "Model implicit" + }, + "moresetting": { + "check": { + "confirm": "Confirmă selecția", + "warn": "Te rugăm să fii precaut când selectezi această opțiune. Selecția incorectă poate cauza funcționarea defectuoasă a modelului!" + }, + "label": "Mai multe setări", + "warn": "Avertisment de risc" + }, + "no_provider_selected": "Furnizor neselectat", + "notification": { + "assistant": "Mesaj asistent", + "backup": "Mesaj backup", + "knowledge_embed": "Mesaj bază de cunoștințe", + "title": "Setări notificări" + }, + "openai": { + "service_tier": { + "auto": "auto", + "default": "implicit", + "flex": "flex", + "on_demand": "la cerere", + "priority": "prioritate", + "tip": "Specifică nivelul de latență de utilizat pentru procesarea cererii", + "title": "Nivel serviciu" + }, + "stream_options": { + "include_usage": { + "tip": "Dacă utilizarea tokenilor este inclusă (aplicabil doar API-ului OpenAI Chat Completions)", + "title": "Include utilizare" + } + }, + "summary_text_mode": { + "auto": "auto", + "concise": "concis", + "detailed": "detaliat", + "off": "oprit", + "tip": "Un rezumat al raționamentului efectuat de model", + "title": "Mod rezumat" + }, + "title": "Setări OpenAI", + "verbosity": { + "high": "Ridicat", + "low": "Scăzut", + "medium": "Mediu", + "tip": "Controlează nivelul de detaliu în ieșirea modelului", + "title": "Verbozitate" + } + }, + "privacy": { + "enable_privacy_mode": "Raportare anonimă a erorilor și statisticilor", + "title": "Setări confidențialitate" + }, + "provider": { + "add": { + "name": { + "label": "Nume furnizor", + "placeholder": "Exemplu: OpenAI" + }, + "title": "Adaugă furnizor", + "type": "Tip furnizor" + }, + "anthropic": { + "apikey": "Cheie API", + "auth_failed": "Autentificarea Anthropic a eșuat", + "auth_method": "Metodă de autentificare", + "auth_success": "Autentificare OAuth Anthropic reușită", + "authenticated": "Verificat", + "authenticating": "Se autentifică", + "cancel": "Anulează", + "code_error": "Cod de autorizare invalid, te rugăm să încerci din nou", + "code_placeholder": "Te rugăm să introduci codul de autorizare afișat în browser", + "code_required": "Codul de autorizare nu poate fi gol", + "description": "Autentificare OAuth", + "description_detail": "Trebuie să te abonezi la Claude Pro sau o versiune superioară pentru a folosi această metodă de autentificare", + "enter_auth_code": "Cod de autorizare", + "logout": "Deconectare", + "logout_failed": "Deconectarea a eșuat, te rugăm să încerci din nou", + "logout_success": "Te-ai deconectat cu succes de la Anthropic", + "oauth": "Web OAuth", + "start_auth": "Începe autorizarea", + "submit_code": "Finalizează conectarea" + }, + "anthropic_api_host": "Gazdă API Anthropic", + "anthropic_api_host_preview": "Previzualizare Anthropic: {{url}}", + "anthropic_api_host_tooltip": "Folosește doar când furnizorul oferă un URL de bază compatibil cu Claude.", + "api": { + "key": { + "check": { + "latency": "Latență" + }, + "error": { + "duplicate": "Cheia API există deja", + "empty": "Cheia API nu poate fi goală" + }, + "list": { + "open": "Deschide interfața de gestionare", + "title": "Gestionare chei API" + }, + "new_key": { + "placeholder": "Introdu una sau mai multe chei" + } + }, + "options": { + "array_content": { + "help": "Furnizorul acceptă ca câmpul content al mesajului să fie de tip array?", + "label": "Acceptă conținut mesaj în format array" + }, + "developer_role": { + "help": "Furnizorul acceptă mesaje cu rolul: \"developer\"?", + "label": "Suportă mesaj dezvoltator" + }, + "enable_thinking": { + "help": "Furnizorul acceptă controlul raționamentului modelelor precum Qwen3 prin parametrul enable_thinking?", + "label": "Suportă enable_thinking" + }, + "label": "Setări API", + "service_tier": { + "help": "Dacă furnizorul acceptă configurarea parametrului service_tier. Când este activat, acest parametru poate fi ajustat în setările nivelului de serviciu de pe pagina de chat. (Doar modele OpenAI)", + "label": "Suportă service_tier" + }, + "stream_options": { + "help": "Furnizorul acceptă parametrul stream_options?", + "label": "Suportă stream_options" + }, + "verbosity": { + "help": "Dacă furnizorul acceptă parametrul verbosity", + "label": "Suportă verbosity" + } + }, + "url": { + "preview": "Previzualizare: {{url}}", + "reset": "Resetează", + "tip": "Adaugă # la final pentru a dezactiva versiunea API adăugată automat." + } + }, + "api_host": "Gazdă API", + "api_host_no_valid": "Adresa API este invalidă", + "api_host_preview": "Previzualizare: {{url}}", + "api_host_tooltip": "Suprascrie doar când furnizorul tău necesită un endpoint personalizat compatibil cu OpenAI.", + "api_key": { + "label": "Cheie API", + "tip": "Folosește virgule pentru a separa mai multe chei" + }, + "api_version": "Versiune API", + "aws-bedrock": { + "access_key_id": "ID cheie acces AWS", + "access_key_id_help": "ID-ul tău de cheie de acces AWS pentru accesarea serviciilor AWS Bedrock", + "api_key": "Cheie API Bedrock", + "api_key_help": "Cheia ta API AWS Bedrock pentru autentificare", + "auth_type": "Tip autentificare", + "auth_type_api_key": "Cheie API Bedrock", + "auth_type_help": "Alege între credențiale IAM sau autentificare cu cheie API Bedrock", + "auth_type_iam": "Credențiale IAM", + "description": "AWS Bedrock este serviciul de modele de fundație complet gestionat de Amazon care acceptă diverse modele lingvistice mari avansate", + "region": "Regiune AWS", + "region_help": "Regiunea serviciului tău AWS, de ex., us-east-1", + "secret_access_key": "Cheie secretă acces AWS", + "secret_access_key_help": "Cheia ta secretă de acces AWS, te rugăm să o păstrezi în siguranță", + "title": "Configurare AWS Bedrock" + }, + "azure": { + "apiversion": { + "tip": "Versiunea API a Azure OpenAI, dacă dorești să folosești API-ul de Răspuns, te rugăm să introduci versiunea v1" + } + }, + "basic_auth": { + "label": "Autentificare HTTP", + "password": { + "label": "Parolă", + "tip": "Introdu parola" + }, + "tip": "Aplicabil instanțelor implementate la distanță (vezi documentația). Momentan, doar schema Basic (RFC 7617) este acceptată.", + "user_name": { + "label": "Nume utilizator", + "tip": "Lasă gol pentru a dezactiva" + } + }, + "bills": "Facturi taxe", + "charge": "Reîncărcare sold", + "check": "Verifică", + "check_all_keys": "Verifică toate cheile", + "check_multiple_keys": "Verifică chei API multiple", + "copilot": { + "auth_failed": "Autentificarea Github Copilot a eșuat.", + "auth_success": "Autentificarea GitHub Copilot a reușit.", + "auth_success_title": "Certificare reușită.", + "code_copied": "Codul de autorizare copiat automat în clipboard", + "code_failed": "Obținerea Codului Dispozitivului a eșuat, te rugăm să încerci din nou.", + "code_generated_desc": "Te rugăm să copiezi codul dispozitivului în linkul de browser de mai jos.", + "code_generated_title": "Obține Cod Dispozitiv", + "connect": "Conectează la Github", + "custom_headers": "Antet cerere personalizat", + "description": "Contul tău GitHub trebuie să fie abonat la Copilot.", + "description_detail": "GitHub Copilot este un asistent de cod bazat pe AI care necesită un abonament GitHub Copilot valid pentru a fi utilizat", + "expand": "Extinde", + "headers_description": "Antete cerere personalizate (format JSON)", + "invalid_json": "Eroare format JSON", + "login": "Conectare la Github", + "logout": "Ieșire GitHub", + "logout_failed": "Ieșirea a eșuat, te rugăm să încerci din nou.", + "logout_success": "Te-ai deconectat cu succes.", + "model_setting": "Setări model", + "open_verification_first": "Te rugăm să faci clic pe linkul de mai sus pentru a accesa pagina de verificare.", + "open_verification_page": "Deschide pagina de autorizare", + "rate_limit": "Limitare rată", + "start_auth": "Începe autorizarea", + "step_authorize": "Deschide pagina de autorizare", + "step_authorize_desc": "Completează autorizarea pe GitHub", + "step_authorize_detail": "Fă clic pe butonul de mai jos pentru a deschide pagina de autorizare GitHub, apoi introdu codul de autorizare copiat", + "step_connect": "Finalizează conexiunea", + "step_connect_desc": "Confirmă conexiunea la GitHub", + "step_connect_detail": "După finalizarea autorizării pe pagina GitHub, fă clic pe acest buton pentru a finaliza conexiunea", + "step_copy_code": "Copiază codul de autorizare", + "step_copy_code_desc": "Copiază codul de autorizare al dispozitivului", + "step_copy_code_detail": "Codul de autorizare a fost copiat automat, îl poți copia și manual", + "step_get_code": "Obține codul de autorizare", + "step_get_code_desc": "Generează codul de autorizare al dispozitivului" + }, + "delete": { + "content": "Ești sigur că vrei să ștergi acest furnizor?", + "title": "Șterge furnizor" + }, + "dmxapi": { + "select_platform": "Selectează platforma" + }, + "docs_check": "Verifică", + "docs_more_details": "pentru mai multe detalii", + "get_api_key": "Obține cheie API", + "misc": "Altele", + "no_models_for_check": "Nu există modele disponibile pentru verificare (de ex. modele chat)", + "not_checked": "Neverificat", + "notes": { + "markdown_editor_default_value": "Zonă previzualizare", + "placeholder": "Introdu conținut Markdown...", + "title": "Note model" + }, + "oauth": { + "button": "Conectare cu {{provider}}", + "description": "Acest serviciu este furnizat de