diff --git a/l10n.yaml b/l10n.yaml index 3de0410..68e56ce 100644 --- a/l10n.yaml +++ b/l10n.yaml @@ -8,3 +8,7 @@ preferred-supported-locales: - de - fr - it + - zh + - ru + - nl + - es diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb new file mode 100644 index 0000000..630747a --- /dev/null +++ b/lib/l10n/app_es.arb @@ -0,0 +1,317 @@ +{ + "@@locale": "es", + "appTitle": "Conduit", + "initializationFailed": "Error de inicialización", + "retry": "Reintentar", + "back": "Atrás", + "you": "Tú", + "loadingProfile": "Cargando perfil...", + "unableToLoadProfile": "No se puede cargar el perfil", + "pleaseCheckConnection": "Por favor, verifica tu conexión e inténtalo de nuevo", + "connectionIssueTitle": "No se puede conectar al servidor", + "@connectionIssueTitle": { + "description": "Título que se muestra cuando el servidor configurado no está disponible" + }, + "connectionIssueSubtitle": "Reconecta para continuar o cierra sesión para elegir otro servidor.", + "@connectionIssueSubtitle": { + "description": "Subtítulo que explica las acciones disponibles cuando no se puede acceder al servidor" + }, + "stillOfflineMessage": "Todavía no podemos conectarnos al servidor. Verifica tu conexión e inténtalo de nuevo.", + "@stillOfflineMessage": { + "description": "Mensaje de estado después de un reintento cuando no se ha restaurado la conexión" + }, + "account": "Cuenta", + "supportConduit": "Apoyar Conduit", + "supportConduitSubtitle": "Mantén Conduit independiente financiando el desarrollo continuo.", + "githubSponsorsTitle": "GitHub Sponsors", + "githubSponsorsSubtitle": "Conviértete en un patrocinador recurrente para financiar elementos del roadmap.", + "buyMeACoffeeTitle": "Buy Me a Coffee", + "buyMeACoffeeSubtitle": "Haz una donación única para agradecer.", + "signOut": "Cerrar sesión", + "endYourSession": "Finalizar tu sesión", + "defaultModel": "Modelo predeterminado", + "autoSelect": "Selección automática", + "loadingModels": "Cargando modelos...", + "failedToLoadModels": "No se pudieron cargar los modelos", + "availableModels": "Modelos disponibles", + "noResults": "Sin resultados", + "searchModels": "Buscar modelos...", + "errorMessage": "Algo salió mal. Por favor, inténtalo de nuevo.", + "loginButton": "Iniciar sesión", + "menuItem": "Configuración", + "dynamicContentWithPlaceholder": "¡Bienvenido, {name}!", + "itemsCount": "{count, plural, =0{Sin elementos} one{1 elemento} other{{count} elementos}}", + "closeButtonSemantic": "Cerrar", + "loadingContent": "Cargando contenido", + "noItems": "Sin elementos", + "noItemsToDisplay": "No hay elementos para mostrar", + "loadMore": "Cargar más", + "workspace": "Espacio de trabajo", + "recentFiles": "Archivos recientes", + "knowledgeBase": "Base de conocimientos", + "noFilesYet": "Aún no hay archivos", + "uploadDocsPrompt": "Sube documentos para referenciarlos en tus conversaciones con Conduit", + "uploadFirstFile": "Sube tu primer archivo", + "attachments": "Adjuntos", + "knowledgeBaseEmpty": "La base de conocimientos está vacía", + "createCollectionsPrompt": "Crea colecciones de documentos relacionados para referencia fácil", + "chooseSourcePhoto": "Elige tu fuente", + "takePhoto": "Tomar una foto", + "chooseFromGallery": "Elegir de tus fotos", + "document": "Documento", + "documentHint": "Archivo PDF, Word o de texto", + "uploadFileTitle": "Subir archivo", + "fileUploadComingSoon": "¡La carga de archivos para {type} estará disponible pronto!", + "kbCreationComingSoon": "¡La creación de base de conocimientos estará disponible pronto!", + "backToServerSetup": "Volver a configuración del servidor", + "connectedToServer": "Conectado al servidor", + "signIn": "Iniciar sesión", + "enterCredentials": "Ingresa tus credenciales para acceder a tus conversaciones de IA", + "credentials": "Credenciales", + "apiKey": "Clave API", + "usernameOrEmail": "Usuario o correo electrónico", + "password": "Contraseña", + "signInWithApiKey": "Iniciar sesión con clave API", + "connectToServer": "Conectar al servidor", + "enterServerAddress": "Ingresa la dirección de tu servidor Open-WebUI para comenzar", + "serverUrl": "URL del servidor", + "serverUrlHint": "https://tu-servidor.com", + "enterServerUrlSemantic": "Ingresa la URL o dirección IP de tu servidor", + "headerName": "Nombre de encabezado", + "headerValue": "Valor de encabezado", + "headerValueHint": "api-key-123 o Bearer token", + "addHeader": "Añadir encabezado", + "maximumHeadersReached": "Número máximo de encabezados alcanzado", + "removeHeader": "Eliminar encabezado", + "connecting": "Conectando...", + "connectToServerButton": "Conectar al servidor", + "demoModeActive": "Modo demo activo", + "skipServerSetupTryDemo": "Omitir configuración del servidor y probar la demo", + "enterDemo": "Entrar a demo", + "demoBadge": "Demo", + "serverNotOpenWebUI": "Esto no parece ser un servidor Open-WebUI.", + "serverUrlEmpty": "La URL del servidor no puede estar vacía", + "invalidUrlFormat": "Formato de URL inválido. Por favor, verifica tu entrada.", + "onlyHttpHttps": "Solo se admiten los protocolos HTTP y HTTPS.", + "serverAddressRequired": "Se requiere dirección del servidor (ej. 192.168.1.10 o example.com).", + "portRange": "El puerto debe estar entre 1 y 65535.", + "invalidIpFormat": "Formato de dirección IP inválido. Usa un formato como 192.168.1.10.", + "couldNotConnectGeneric": "No se pudo conectar. Verifica la dirección e inténtalo de nuevo.", + "weCouldntReachServer": "No pudimos conectarnos al servidor. Verifica tu conexión y que el servidor esté funcionando.", + "connectionTimedOut": "Se agotó el tiempo de conexión. El servidor puede estar ocupado o bloqueado por un firewall.", + "useHttpOrHttpsOnly": "Usa solo http:// o https://.", + "loginFailed": "Error al iniciar sesión", + "invalidCredentials": "Usuario o contraseña inválidos. Por favor, inténtalo de nuevo.", + "serverRedirectingHttps": "El servidor está redirigiendo solicitudes. Verifica la configuración HTTPS de tu servidor.", + "unableToConnectServer": "No se puede conectar al servidor. Por favor, verifica tu conexión.", + "requestTimedOut": "Se agotó el tiempo de espera de la solicitud. Por favor, inténtalo de nuevo.", + "genericSignInFailed": "No pudimos iniciar tu sesión. Verifica tus credenciales y configuración del servidor.", + "skip": "Omitir", + "next": "Siguiente", + "done": "Listo", + "onboardStartTitle": "Hola, {username}", + "onboardStartSubtitle": "Elige un modelo para comenzar. Toca Nueva conversación cuando quieras.", + "onboardStartBullet1": "Toca el nombre del modelo en la barra superior para cambiar modelos", + "onboardStartBullet2": "Usa Nueva conversación para restablecer el contexto", + "onboardAttachTitle": "Añadir contexto", + "onboardAttachSubtitle": "Fundamenta las respuestas con contenido del espacio de trabajo o fotos.", + "onboardAttachBullet1": "Espacio de trabajo: PDFs, documentos, conjuntos de datos", + "onboardAttachBullet2": "Fotos: cámara o galería", + "onboardSpeakTitle": "Habla naturalmente", + "onboardSpeakSubtitle": "Toca el micrófono para dictar con retroalimentación de forma de onda en vivo.", + "onboardSpeakBullet1": "Detente en cualquier momento; el texto parcial se conserva", + "onboardSpeakBullet2": "Genial para notas rápidas o prompts largos", + "onboardQuickTitle": "Acciones rápidas", + "onboardQuickSubtitle": "Abre el menú para cambiar entre Conversaciones, Espacio de trabajo y Perfil.", + "onboardQuickBullet1": "Toca el menú para acceder a Conversaciones, Espacio de trabajo, Perfil", + "onboardQuickBullet2": "Inicia Nueva conversación o gestiona modelos desde la barra superior", + "addAttachment": "Añadir adjunto", + "attachmentLabel": "Adjunto", + "tools": "Herramientas", + "voiceInput": "Entrada de voz", + "voice": "Voz", + "voiceStatusListening": "Escuchando...", + "voiceStatusRecording": "Grabando...", + "voiceHoldToTalk": "Mantén presionado para hablar", + "voiceAutoSend": "Envío automático", + "voiceTranscript": "Transcripción", + "voicePromptSpeakNow": "Habla ahora...", + "voicePromptTapStart": "Toca Iniciar para comenzar", + "voiceActionStop": "Detener", + "voiceActionStart": "Iniciar", + "messageInputLabel": "Entrada de mensaje", + "messageInputHint": "Escribe tu mensaje", + "messageHintText": "Mensaje...", + "stopGenerating": "Detener generación", + "codeCopiedToClipboard": "Código copiado al portapapeles.", + "send": "Enviar", + "sendMessage": "Enviar mensaje", + "file": "Archivo", + "photo": "Foto", + "camera": "Cámara", + "apiUnavailable": "Servicio de API no disponible", + "unableToLoadImage": "No se puede cargar la imagen", + "notAnImageFile": "No es un archivo de imagen: {fileName}", + "failedToLoadImage": "No se pudo cargar la imagen: {error}", + "invalidDataUrl": "Formato de URL de datos inválido", + "failedToDecodeImage": "No se pudo decodificar la imagen", + "invalidImageFormat": "Formato de imagen inválido", + "emptyImageData": "Datos de imagen vacíos", + "featureRequiresInternet": "Esta función requiere conexión a Internet", + "messagesWillSendWhenOnline": "Los mensajes se enviarán cuando vuelvas a estar en línea", + "confirm": "Confirmar", + "cancel": "Cancelar", + "ok": "OK", + "inputField": "Campo de entrada", + "captureDocumentOrImage": "Capturar un documento o imagen", + "checkConnection": "Verificar conexión", + "openSettings": "Abrir configuración", + "chooseDifferentFile": "Elegir otro archivo", + "goBack": "Volver", + "technicalDetails": "Detalles técnicos", + "save": "Guardar", + "chooseModel": "Elegir modelo", + "reviewerMode": "MODO REVISOR", + "selectLanguage": "Seleccionar idioma", + "newFolder": "Nueva carpeta", + "folderName": "Nombre de carpeta", + "newChat": "Nueva conversación", + "more": "Más", + "clear": "Limpiar", + "searchHint": "Buscar...", + "searchConversations": "Buscar conversaciones...", + "create": "Crear", + "folderCreated": "Carpeta creada", + "failedToCreateFolder": "No se pudo crear la carpeta", + "movedChatToFolder": "Se movió \"{title}\" a \"{folder}\"", + "@movedChatToFolder": { + "placeholders": { + "title": {"type": "String"}, + "folder": {"type": "String"} + } + }, + "failedToMoveChat": "No se pudo mover la conversación", + "failedToLoadChats": "No se pudieron cargar las conversaciones", + "failedToUpdatePin": "No se pudo actualizar el anclaje", + "failedToDeleteChat": "No se pudo eliminar la conversación", + "manage": "Gestionar", + "rename": "Renombrar", + "delete": "Eliminar", + "renameChat": "Renombrar conversación", + "enterChatName": "Ingresa nombre de conversación", + "failedToRenameChat": "No se pudo renombrar la conversación", + "failedToUpdateArchive": "No se pudo actualizar el archivo", + "unarchive": "Desarchivar", + "archive": "Archivar", + "pin": "Anclar", + "unpin": "Desanclar", + "recent": "Reciente", + "system": "Sistema", + "english": "English", + "deutsch": "Deutsch", + "francais": "Français", + "italiano": "Italiano", + "deleteMessagesTitle": "Eliminar mensajes", + "deleteMessagesMessage": "¿Eliminar {count} mensajes?", + "@deleteMessagesMessage": { + "placeholders": { + "count": {"type": "int"} + } + }, + "routeNotFound": "Ruta no encontrada: {routeName}", + "@routeNotFound": { + "placeholders": { + "routeName": {"type": "String"} + } + }, + "deleteChatTitle": "Eliminar conversación", + "deleteChatMessage": "Esta conversación se eliminará permanentemente.", + "deleteFolderTitle": "Eliminar carpeta", + "deleteFolderMessage": "Esta carpeta y sus referencias de asignación se eliminarán.", + "failedToDeleteFolder": "No se pudo eliminar la carpeta", + "aboutApp": "Acerca de la aplicación", + "aboutAppSubtitle": "Información y enlaces de Conduit", + "web": "Web", + "imageGen": "Generación de imágenes", + "pinned": "Anclado", + "folders": "Carpetas", + "archived": "Archivado", + "appLanguage": "Idioma de la aplicación", + "darkMode": "Modo oscuro", + "webSearch": "Búsqueda web", + "webSearchDescription": "Busca en la web y cita fuentes en las respuestas.", + "imageGeneration": "Generación de imágenes", + "imageGenerationDescription": "Crea imágenes a partir de tus prompts.", + "copy": "Copiar", + "ttsListen": "Escuchar", + "ttsStop": "Detener", + "edit": "Editar", + "regenerate": "Regenerar", + "noConversationsYet": "Aún no hay conversaciones", + "usernameOrEmailHint": "Ingresa tu usuario o correo electrónico", + "passwordHint": "Ingresa tu contraseña", + "enterApiKey": "Ingresa tu clave API", + "signingIn": "Iniciando sesión...", + "advancedSettings": "Configuración avanzada", + "customHeaders": "Encabezados personalizados", + "customHeadersDescription": "Añade encabezados HTTP personalizados para autenticación, claves API o requisitos especiales del servidor.", + "allowSelfSignedCertificates": "Confiar en certificados autofirmados", + "@allowSelfSignedCertificates": { + "description": "Etiqueta del interruptor que permite confiar en certificados TLS autofirmados para el servidor configurado." + }, + "allowSelfSignedCertificatesDescription": "Acepta el certificado TLS de este servidor incluso si es autofirmado. Actívalo solo para servidores en los que confíes.", + "@allowSelfSignedCertificatesDescription": { + "description": "Texto de ayuda que aclara los riesgos de habilitar el interruptor de certificados autofirmados." + }, + "headerNameEmpty": "El nombre del encabezado no puede estar vacío", + "headerNameTooLong": "Nombre de encabezado demasiado largo (máx. 64 caracteres)", + "headerNameInvalidChars": "Nombre de encabezado inválido. Usa solo letras, números y estos símbolos: !#$&-^_`|~", + "headerNameReserved": "No se puede sobrescribir el encabezado reservado \"{key}\"", + "@headerNameReserved": {"placeholders": {"key": {"type": "String"}}}, + "headerValueEmpty": "El valor del encabezado no puede estar vacío", + "headerValueTooLong": "Valor de encabezado demasiado largo (máx. 1024 caracteres)", + "headerValueInvalidChars": "El valor del encabezado contiene caracteres inválidos. Usa solo ASCII imprimible.", + "headerValueUnsafe": "El valor del encabezado parece contener contenido potencialmente inseguro", + "headerAlreadyExists": "El encabezado \"{key}\" ya existe. Elimínalo primero para actualizarlo.", + "@headerAlreadyExists": {"placeholders": {"key": {"type": "String"}}}, + "maxHeadersReachedDetail": "Máximo de 10 encabezados personalizados permitidos. Elimina algunos para añadir más.", + "editMessage": "Editar mensaje", + "noModelsAvailable": "No hay modelos disponibles", + "followingSystem": "Siguiendo el sistema: {theme}", + "@followingSystem": {"placeholders": {"theme": {"type": "String"}}}, + "themeDark": "Oscuro", + "themePalette": "Paleta de acentos", + "@themePalette": {"description": "Título para seleccionar la paleta de colores de la aplicación."}, + "themePaletteDescription": "Elige los colores de acento usados para botones, tarjetas y burbujas de chat.", + "@themePaletteDescription": {"description": "Texto de ayuda que explica la selección de paleta."}, + "themeLight": "Claro", + "currentlyUsingDarkTheme": "Usando actualmente el tema oscuro", + "currentlyUsingLightTheme": "Usando actualmente el tema claro", + "aboutConduit": "Acerca de Conduit", + "versionLabel": "Versión: {version} ({build})", + "@versionLabel": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}}, + "githubRepository": "Repositorio GitHub", + "unableToLoadAppInfo": "No se puede cargar información de la aplicación", + "thinking": "Pensando...", + "thoughts": "Pensamientos", + "thoughtForDuration": "Pensó durante {duration}", + "@thoughtForDuration": { + "description": "Muestra cuánto tiempo el asistente estuvo pensando antes de responder.", + "placeholders": {"duration": {"type": "String", "example": "3s"}} + }, + "appCustomization": "Personalización de la aplicación", + "appCustomizationSubtitle": "Personaliza cómo se muestran los nombres y la interfaz", + "quickActionsDescription": "Elige hasta dos accesos directos para anclar cerca del compositor", + "chatSettings": "Conversación", + "sendOnEnter": "Enviar con Enter", + "sendOnEnterDescription": "Enter envía (teclado virtual). Cmd/Ctrl+Enter también disponible", + "display": "Visualización", + "realtime": "Tiempo real", + "transportMode": "Modo de transporte", + "transportModeDescription": "Elige cómo se conecta la aplicación para actualizaciones en tiempo real.", + "mode": "Modo", + "transportModeAuto": "Automático (Polling + WebSocket)", + "transportModeWs": "Solo WebSocket", + "transportModeAutoInfo": "Más robusto en redes restrictivas. Se actualiza a WebSocket cuando es posible.", + "transportModeWsInfo": "Menor sobrecarga, pero puede fallar detrás de proxies/firewalls estrictos." +} diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 8e8d9eb..1ef847b 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -7,8 +7,12 @@ import 'package:intl/intl.dart' as intl; import 'app_localizations_de.dart'; import 'app_localizations_en.dart'; +import 'app_localizations_es.dart'; import 'app_localizations_fr.dart'; import 'app_localizations_it.dart'; +import 'app_localizations_nl.dart'; +import 'app_localizations_ru.dart'; +import 'app_localizations_zh.dart'; // ignore_for_file: type=lint @@ -100,6 +104,10 @@ abstract class AppLocalizations { Locale('de'), Locale('fr'), Locale('it'), + Locale('zh'), + Locale('ru'), + Locale('nl'), + Locale('es'), ]; /// Application name displayed in the app and OS UI. @@ -1751,8 +1759,16 @@ class _AppLocalizationsDelegate } @override - bool isSupported(Locale locale) => - ['de', 'en', 'fr', 'it'].contains(locale.languageCode); + bool isSupported(Locale locale) => [ + 'de', + 'en', + 'es', + 'fr', + 'it', + 'nl', + 'ru', + 'zh', + ].contains(locale.languageCode); @override bool shouldReload(_AppLocalizationsDelegate old) => false; @@ -1765,10 +1781,18 @@ AppLocalizations lookupAppLocalizations(Locale locale) { return AppLocalizationsDe(); case 'en': return AppLocalizationsEn(); + case 'es': + return AppLocalizationsEs(); case 'fr': return AppLocalizationsFr(); case 'it': return AppLocalizationsIt(); + case 'nl': + return AppLocalizationsNl(); + case 'ru': + return AppLocalizationsRu(); + case 'zh': + return AppLocalizationsZh(); } throw FlutterError( diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb new file mode 100644 index 0000000..0072eba --- /dev/null +++ b/lib/l10n/app_nl.arb @@ -0,0 +1,317 @@ +{ + "@@locale": "nl", + "appTitle": "Conduit", + "initializationFailed": "Initialisatie mislukt", + "retry": "Opnieuw proberen", + "back": "Terug", + "you": "Jij", + "loadingProfile": "Profiel laden...", + "unableToLoadProfile": "Kan profiel niet laden", + "pleaseCheckConnection": "Controleer je verbinding en probeer het opnieuw", + "connectionIssueTitle": "Kan je server niet bereiken", + "@connectionIssueTitle": { + "description": "Titel die wordt weergegeven wanneer de geconfigureerde server onbereikbaar is" + }, + "connectionIssueSubtitle": "Maak opnieuw verbinding om door te gaan of log uit om een andere server te kiezen.", + "@connectionIssueSubtitle": { + "description": "Ondertitel die beschikbare acties uitlegt wanneer de server niet bereikbaar is" + }, + "stillOfflineMessage": "We kunnen de server nog steeds niet bereiken. Controleer je verbinding en probeer het opnieuw.", + "@stillOfflineMessage": { + "description": "Statusbericht na een herhaalde poging wanneer de verbinding niet is hersteld" + }, + "account": "Account", + "supportConduit": "Ondersteun Conduit", + "supportConduitSubtitle": "Houd Conduit onafhankelijk door doorlopende ontwikkeling te financieren.", + "githubSponsorsTitle": "GitHub Sponsors", + "githubSponsorsSubtitle": "Word een terugkerende sponsor om roadmap-items te financieren.", + "buyMeACoffeeTitle": "Buy Me a Coffee", + "buyMeACoffeeSubtitle": "Doe een eenmalige donatie om bedankt te zeggen.", + "signOut": "Uitloggen", + "endYourSession": "Beëindig je sessie", + "defaultModel": "Standaardmodel", + "autoSelect": "Automatisch selecteren", + "loadingModels": "Modellen laden...", + "failedToLoadModels": "Kan modellen niet laden", + "availableModels": "Beschikbare modellen", + "noResults": "Geen resultaten", + "searchModels": "Modellen zoeken...", + "errorMessage": "Er is iets misgegaan. Probeer het opnieuw.", + "loginButton": "Inloggen", + "menuItem": "Instellingen", + "dynamicContentWithPlaceholder": "Welkom, {name}!", + "itemsCount": "{count, plural, =0{Geen items} one{1 item} other{{count} items}}", + "closeButtonSemantic": "Sluiten", + "loadingContent": "Inhoud laden", + "noItems": "Geen items", + "noItemsToDisplay": "Geen items om weer te geven", + "loadMore": "Meer laden", + "workspace": "Werkruimte", + "recentFiles": "Recente bestanden", + "knowledgeBase": "Kennisbank", + "noFilesYet": "Nog geen bestanden", + "uploadDocsPrompt": "Upload documenten om te gebruiken in je gesprekken met Conduit", + "uploadFirstFile": "Upload je eerste bestand", + "attachments": "Bijlagen", + "knowledgeBaseEmpty": "Kennisbank is leeg", + "createCollectionsPrompt": "Maak verzamelingen van gerelateerde documenten voor eenvoudige verwijzing", + "chooseSourcePhoto": "Kies je bron", + "takePhoto": "Foto maken", + "chooseFromGallery": "Kies uit je foto's", + "document": "Document", + "documentHint": "PDF, Word of tekstbestand", + "uploadFileTitle": "Bestand uploaden", + "fileUploadComingSoon": "Bestand uploaden voor {type} komt binnenkort!", + "kbCreationComingSoon": "Kennisbank aanmaken komt binnenkort!", + "backToServerSetup": "Terug naar serverinstelling", + "connectedToServer": "Verbonden met server", + "signIn": "Inloggen", + "enterCredentials": "Voer je inloggegevens in om toegang te krijgen tot je AI-gesprekken", + "credentials": "Inloggegevens", + "apiKey": "API-sleutel", + "usernameOrEmail": "Gebruikersnaam of e-mail", + "password": "Wachtwoord", + "signInWithApiKey": "Inloggen met API-sleutel", + "connectToServer": "Verbinden met server", + "enterServerAddress": "Voer je Open-WebUI serveradres in om te beginnen", + "serverUrl": "Server-URL", + "serverUrlHint": "https://jouw-server.com", + "enterServerUrlSemantic": "Voer je server-URL of IP-adres in", + "headerName": "Header-naam", + "headerValue": "Header-waarde", + "headerValueHint": "api-key-123 of Bearer token", + "addHeader": "Header toevoegen", + "maximumHeadersReached": "Maximum aantal headers bereikt", + "removeHeader": "Header verwijderen", + "connecting": "Verbinden...", + "connectToServerButton": "Verbinden met server", + "demoModeActive": "Demomodus actief", + "skipServerSetupTryDemo": "Serverinstelling overslaan en demo proberen", + "enterDemo": "Demo starten", + "demoBadge": "Demo", + "serverNotOpenWebUI": "Dit lijkt geen Open-WebUI server te zijn.", + "serverUrlEmpty": "Server-URL mag niet leeg zijn", + "invalidUrlFormat": "Ongeldig URL-formaat. Controleer je invoer.", + "onlyHttpHttps": "Alleen HTTP- en HTTPS-protocollen worden ondersteund.", + "serverAddressRequired": "Serveradres is vereist (bijv. 192.168.1.10 of example.com).", + "portRange": "Poort moet tussen 1 en 65535 zijn.", + "invalidIpFormat": "Ongeldig IP-adresformaat. Gebruik een formaat zoals 192.168.1.10.", + "couldNotConnectGeneric": "Kan geen verbinding maken. Controleer het adres en probeer het opnieuw.", + "weCouldntReachServer": "We konden de server niet bereiken. Controleer je verbinding en of de server actief is.", + "connectionTimedOut": "Verbinding time-out. De server is mogelijk druk of geblokkeerd door een firewall.", + "useHttpOrHttpsOnly": "Gebruik alleen http:// of https://.", + "loginFailed": "Inloggen mislukt", + "invalidCredentials": "Ongeldige gebruikersnaam of wachtwoord. Probeer het opnieuw.", + "serverRedirectingHttps": "De server leidt verzoeken om. Controleer de HTTPS-configuratie van je server.", + "unableToConnectServer": "Kan geen verbinding maken met server. Controleer je verbinding.", + "requestTimedOut": "Het verzoek is verlopen. Probeer het opnieuw.", + "genericSignInFailed": "We konden je niet inloggen. Controleer je inloggegevens en serverinstellingen.", + "skip": "Overslaan", + "next": "Volgende", + "done": "Klaar", + "onboardStartTitle": "Hallo, {username}", + "onboardStartSubtitle": "Kies een model om te beginnen. Tik op Nieuwe chat wanneer je maar wilt.", + "onboardStartBullet1": "Tik op de modelnaam in de bovenbalk om van model te wisselen", + "onboardStartBullet2": "Gebruik Nieuwe chat om de context te resetten", + "onboardAttachTitle": "Context toevoegen", + "onboardAttachSubtitle": "Onderbouw antwoorden met inhoud uit de werkruimte of foto's.", + "onboardAttachBullet1": "Werkruimte: PDF's, documenten, datasets", + "onboardAttachBullet2": "Foto's: camera of galerij", + "onboardSpeakTitle": "Spreek natuurlijk", + "onboardSpeakSubtitle": "Tik op de microfoon om te dicteren met live golfvormfeedback.", + "onboardSpeakBullet1": "Stop op elk moment; gedeeltelijke tekst wordt bewaard", + "onboardSpeakBullet2": "Geweldig voor snelle notities of lange prompts", + "onboardQuickTitle": "Snelle acties", + "onboardQuickSubtitle": "Open het menu om te schakelen tussen Chats, Werkruimte en Profiel.", + "onboardQuickBullet1": "Tik op het menu voor toegang tot Chats, Werkruimte, Profiel", + "onboardQuickBullet2": "Start Nieuwe chat of beheer modellen vanuit de bovenbalk", + "addAttachment": "Bijlage toevoegen", + "attachmentLabel": "Bijlage", + "tools": "Hulpmiddelen", + "voiceInput": "Spraakinvoer", + "voice": "Stem", + "voiceStatusListening": "Luisteren...", + "voiceStatusRecording": "Opnemen...", + "voiceHoldToTalk": "Houd ingedrukt om te praten", + "voiceAutoSend": "Automatisch verzenden", + "voiceTranscript": "Transcriptie", + "voicePromptSpeakNow": "Spreek nu...", + "voicePromptTapStart": "Tik op Start om te beginnen", + "voiceActionStop": "Stop", + "voiceActionStart": "Start", + "messageInputLabel": "Berichtinvoer", + "messageInputHint": "Typ je bericht", + "messageHintText": "Bericht...", + "stopGenerating": "Stop met genereren", + "codeCopiedToClipboard": "Code gekopieerd naar klembord.", + "send": "Verzenden", + "sendMessage": "Bericht verzenden", + "file": "Bestand", + "photo": "Foto", + "camera": "Camera", + "apiUnavailable": "API-service niet beschikbaar", + "unableToLoadImage": "Kan afbeelding niet laden", + "notAnImageFile": "Geen afbeeldingsbestand: {fileName}", + "failedToLoadImage": "Kan afbeelding niet laden: {error}", + "invalidDataUrl": "Ongeldig data-URL-formaat", + "failedToDecodeImage": "Kan afbeelding niet decoderen", + "invalidImageFormat": "Ongeldig afbeeldingsformaat", + "emptyImageData": "Lege afbeeldingsgegevens", + "featureRequiresInternet": "Deze functie vereist een internetverbinding", + "messagesWillSendWhenOnline": "Berichten worden verzonden wanneer je weer online bent", + "confirm": "Bevestigen", + "cancel": "Annuleren", + "ok": "OK", + "inputField": "Invoerveld", + "captureDocumentOrImage": "Document of afbeelding vastleggen", + "checkConnection": "Verbinding controleren", + "openSettings": "Instellingen openen", + "chooseDifferentFile": "Ander bestand kiezen", + "goBack": "Terug", + "technicalDetails": "Technische details", + "save": "Opslaan", + "chooseModel": "Model kiezen", + "reviewerMode": "BEOORDELAARSMODUS", + "selectLanguage": "Taal selecteren", + "newFolder": "Nieuwe map", + "folderName": "Mapnaam", + "newChat": "Nieuwe chat", + "more": "Meer", + "clear": "Wissen", + "searchHint": "Zoeken...", + "searchConversations": "Gesprekken zoeken...", + "create": "Aanmaken", + "folderCreated": "Map aangemaakt", + "failedToCreateFolder": "Kan map niet aanmaken", + "movedChatToFolder": "'{title}' verplaatst naar '{folder}'", + "@movedChatToFolder": { + "placeholders": { + "title": {"type": "String"}, + "folder": {"type": "String"} + } + }, + "failedToMoveChat": "Kan chat niet verplaatsen", + "failedToLoadChats": "Kan chats niet laden", + "failedToUpdatePin": "Kan vastpinning niet bijwerken", + "failedToDeleteChat": "Kan chat niet verwijderen", + "manage": "Beheren", + "rename": "Hernoemen", + "delete": "Verwijderen", + "renameChat": "Chat hernoemen", + "enterChatName": "Chatnaam invoeren", + "failedToRenameChat": "Kan chat niet hernoemen", + "failedToUpdateArchive": "Kan archief niet bijwerken", + "unarchive": "Uit archief halen", + "archive": "Archiveren", + "pin": "Vastpinnen", + "unpin": "Losmaken", + "recent": "Recent", + "system": "Systeem", + "english": "English", + "deutsch": "Deutsch", + "francais": "Français", + "italiano": "Italiano", + "deleteMessagesTitle": "Berichten verwijderen", + "deleteMessagesMessage": "{count} berichten verwijderen?", + "@deleteMessagesMessage": { + "placeholders": { + "count": {"type": "int"} + } + }, + "routeNotFound": "Route niet gevonden: {routeName}", + "@routeNotFound": { + "placeholders": { + "routeName": {"type": "String"} + } + }, + "deleteChatTitle": "Chat verwijderen", + "deleteChatMessage": "Deze chat wordt permanent verwijderd.", + "deleteFolderTitle": "Map verwijderen", + "deleteFolderMessage": "Deze map en zijn toewijzingen worden verwijderd.", + "failedToDeleteFolder": "Kan map niet verwijderen", + "aboutApp": "Over de app", + "aboutAppSubtitle": "Conduit-informatie en links", + "web": "Web", + "imageGen": "Afbeeldingsgeneratie", + "pinned": "Vastgepind", + "folders": "Mappen", + "archived": "Gearchiveerd", + "appLanguage": "App-taal", + "darkMode": "Donkere modus", + "webSearch": "Webzoekopdracht", + "webSearchDescription": "Doorzoek het web en citeer bronnen in antwoorden.", + "imageGeneration": "Afbeeldingsgeneratie", + "imageGenerationDescription": "Maak afbeeldingen van je prompts.", + "copy": "Kopiëren", + "ttsListen": "Luisteren", + "ttsStop": "Stoppen", + "edit": "Bewerken", + "regenerate": "Opnieuw genereren", + "noConversationsYet": "Nog geen gesprekken", + "usernameOrEmailHint": "Voer je gebruikersnaam of e-mail in", + "passwordHint": "Voer je wachtwoord in", + "enterApiKey": "Voer je API-sleutel in", + "signingIn": "Inloggen...", + "advancedSettings": "Geavanceerde instellingen", + "customHeaders": "Aangepaste headers", + "customHeadersDescription": "Voeg aangepaste HTTP-headers toe voor authenticatie, API-sleutels of speciale serververeisten.", + "allowSelfSignedCertificates": "Vertrouw zelfondertekende certificaten", + "@allowSelfSignedCertificates": { + "description": "Schakelaar waarmee zelfondertekende TLS-certificaten voor de geconfigureerde server vertrouwd kunnen worden." + }, + "allowSelfSignedCertificatesDescription": "Accepteer het TLS-certificaat van deze server, zelfs als het zelfondertekend is. Schakel dit alleen in voor servers die je vertrouwt.", + "@allowSelfSignedCertificatesDescription": { + "description": "Hulptekst die de risico's van het inschakelen van de schakelaar voor zelfondertekende certificaten verduidelijkt." + }, + "headerNameEmpty": "Header-naam mag niet leeg zijn", + "headerNameTooLong": "Header-naam te lang (max 64 tekens)", + "headerNameInvalidChars": "Ongeldige header-naam. Gebruik alleen letters, cijfers en deze symbolen: !#$&-^_`|~", + "headerNameReserved": "Kan gereserveerde header '{key}' niet overschrijven", + "@headerNameReserved": {"placeholders": {"key": {"type": "String"}}}, + "headerValueEmpty": "Header-waarde mag niet leeg zijn", + "headerValueTooLong": "Header-waarde te lang (max 1024 tekens)", + "headerValueInvalidChars": "Header-waarde bevat ongeldige tekens. Gebruik alleen afdrukbare ASCII.", + "headerValueUnsafe": "Header-waarde lijkt mogelijk onveilige inhoud te bevatten", + "headerAlreadyExists": "Header '{key}' bestaat al. Verwijder deze eerst om bij te werken.", + "@headerAlreadyExists": {"placeholders": {"key": {"type": "String"}}}, + "maxHeadersReachedDetail": "Maximaal 10 aangepaste headers toegestaan. Verwijder er enkele om meer toe te voegen.", + "editMessage": "Bericht bewerken", + "noModelsAvailable": "Geen modellen beschikbaar", + "followingSystem": "Volgt systeem: {theme}", + "@followingSystem": {"placeholders": {"theme": {"type": "String"}}}, + "themeDark": "Donker", + "themePalette": "Accentpalet", + "@themePalette": {"description": "Titel voor het selecteren van het app-kleurenpalet."}, + "themePaletteDescription": "Kies de accentkleuren voor knoppen, kaarten en chatballonnen.", + "@themePaletteDescription": {"description": "Hulptekst die de paletselectie uitlegt."}, + "themeLight": "Licht", + "currentlyUsingDarkTheme": "Momenteel donker thema in gebruik", + "currentlyUsingLightTheme": "Momenteel licht thema in gebruik", + "aboutConduit": "Over Conduit", + "versionLabel": "Versie: {version} ({build})", + "@versionLabel": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}}, + "githubRepository": "GitHub-repository", + "unableToLoadAppInfo": "Kan app-info niet laden", + "thinking": "Denken...", + "thoughts": "Gedachten", + "thoughtForDuration": "Dacht {duration}", + "@thoughtForDuration": { + "description": "Toont hoe lang de assistent dacht voordat hij antwoordde.", + "placeholders": {"duration": {"type": "String", "example": "3s"}} + }, + "appCustomization": "App-aanpassing", + "appCustomizationSubtitle": "Personaliseer hoe namen en UI worden weergegeven", + "quickActionsDescription": "Kies maximaal twee snelkoppelingen om vast te pinnen bij de composer", + "chatSettings": "Chat", + "sendOnEnter": "Verzenden met Enter", + "sendOnEnterDescription": "Enter verzendt (softtoetsenbord). Cmd/Ctrl+Enter ook beschikbaar", + "display": "Weergave", + "realtime": "Realtime", + "transportMode": "Transportmodus", + "transportModeDescription": "Kies hoe de app verbindt voor realtime updates.", + "mode": "Modus", + "transportModeAuto": "Automatisch (Polling + WebSocket)", + "transportModeWs": "Alleen WebSocket", + "transportModeAutoInfo": "Robuuster op beperkende netwerken. Upgrade naar WebSocket indien mogelijk.", + "transportModeWsInfo": "Lagere overhead, maar kan mislukken achter strikte proxies/firewalls." +} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb new file mode 100644 index 0000000..32fc391 --- /dev/null +++ b/lib/l10n/app_ru.arb @@ -0,0 +1,317 @@ +{ + "@@locale": "ru", + "appTitle": "Conduit", + "initializationFailed": "Ошибка инициализации", + "retry": "Повторить", + "back": "Назад", + "you": "Вы", + "loadingProfile": "Загрузка профиля...", + "unableToLoadProfile": "Не удалось загрузить профиль", + "pleaseCheckConnection": "Пожалуйста, проверьте соединение и повторите попытку", + "connectionIssueTitle": "Не удается подключиться к серверу", + "@connectionIssueTitle": { + "description": "Заголовок, отображаемый при недоступности настроенного сервера" + }, + "connectionIssueSubtitle": "Переподключитесь, чтобы продолжить, или выйдите, чтобы выбрать другой сервер.", + "@connectionIssueSubtitle": { + "description": "Подзаголовок с доступными действиями при недоступности сервера" + }, + "stillOfflineMessage": "Мы все еще не можем подключиться к серверу. Проверьте соединение и повторите попытку.", + "@stillOfflineMessage": { + "description": "Сообщение после повторной попытки, когда соединение не восстановлено" + }, + "account": "Аккаунт", + "supportConduit": "Поддержать Conduit", + "supportConduitSubtitle": "Сохраните независимость Conduit, финансируя разработку.", + "githubSponsorsTitle": "GitHub Sponsors", + "githubSponsorsSubtitle": "Станьте регулярным спонсором для финансирования дорожной карты.", + "buyMeACoffeeTitle": "Buy Me a Coffee", + "buyMeACoffeeSubtitle": "Сделайте разовое пожертвование в знак благодарности.", + "signOut": "Выйти", + "endYourSession": "Завершить сеанс", + "defaultModel": "Модель по умолчанию", + "autoSelect": "Автовыбор", + "loadingModels": "Загрузка моделей...", + "failedToLoadModels": "Не удалось загрузить модели", + "availableModels": "Доступные модели", + "noResults": "Нет результатов", + "searchModels": "Поиск моделей...", + "errorMessage": "Что-то пошло не так. Пожалуйста, попробуйте еще раз.", + "loginButton": "Войти", + "menuItem": "Настройки", + "dynamicContentWithPlaceholder": "Добро пожаловать, {name}!", + "itemsCount": "{count, plural, =0{Нет элементов} one{{count} элемент} few{{count} элемента} other{{count} элементов}}", + "closeButtonSemantic": "Закрыть", + "loadingContent": "Загрузка содержимого", + "noItems": "Нет элементов", + "noItemsToDisplay": "Нет элементов для отображения", + "loadMore": "Загрузить еще", + "workspace": "Рабочее пространство", + "recentFiles": "Недавние файлы", + "knowledgeBase": "База знаний", + "noFilesYet": "Пока нет файлов", + "uploadDocsPrompt": "Загрузите документы для использования в разговорах с Conduit", + "uploadFirstFile": "Загрузить первый файл", + "attachments": "Вложения", + "knowledgeBaseEmpty": "База знаний пуста", + "createCollectionsPrompt": "Создайте коллекции связанных документов для удобной ссылки", + "chooseSourcePhoto": "Выберите источник", + "takePhoto": "Сделать фото", + "chooseFromGallery": "Выбрать из галереи", + "document": "Документ", + "documentHint": "PDF, Word или текстовый файл", + "uploadFileTitle": "Загрузить файл", + "fileUploadComingSoon": "Загрузка файлов для {type} скоро появится!", + "kbCreationComingSoon": "Создание базы знаний скоро появится!", + "backToServerSetup": "Вернуться к настройке сервера", + "connectedToServer": "Подключено к серверу", + "signIn": "Войти", + "enterCredentials": "Введите свои учетные данные для доступа к вашим разговорам с ИИ", + "credentials": "Учетные данные", + "apiKey": "API-ключ", + "usernameOrEmail": "Имя пользователя или email", + "password": "Пароль", + "signInWithApiKey": "Войти с помощью API-ключа", + "connectToServer": "Подключиться к серверу", + "enterServerAddress": "Введите адрес вашего сервера Open-WebUI для начала", + "serverUrl": "URL сервера", + "serverUrlHint": "https://your-server.com", + "enterServerUrlSemantic": "Введите URL или IP-адрес вашего сервера", + "headerName": "Имя заголовка", + "headerValue": "Значение заголовка", + "headerValueHint": "api-key-123 или Bearer token", + "addHeader": "Добавить заголовок", + "maximumHeadersReached": "Достигнуто максимальное количество заголовков", + "removeHeader": "Удалить заголовок", + "connecting": "Подключение...", + "connectToServerButton": "Подключиться к серверу", + "demoModeActive": "Демо-режим активен", + "skipServerSetupTryDemo": "Пропустить настройку сервера и попробовать демо", + "enterDemo": "Войти в демо", + "demoBadge": "Демо", + "serverNotOpenWebUI": "Это не похоже на сервер Open-WebUI.", + "serverUrlEmpty": "URL сервера не может быть пустым", + "invalidUrlFormat": "Неверный формат URL. Пожалуйста, проверьте ввод.", + "onlyHttpHttps": "Поддерживаются только протоколы HTTP и HTTPS.", + "serverAddressRequired": "Требуется адрес сервера (например, 192.168.1.10 или example.com).", + "portRange": "Порт должен быть от 1 до 65535.", + "invalidIpFormat": "Неверный формат IP-адреса. Используйте формат как 192.168.1.10.", + "couldNotConnectGeneric": "Не удалось подключиться. Проверьте адрес и повторите попытку.", + "weCouldntReachServer": "Мы не смогли связаться с сервером. Проверьте подключение и работает ли сервер.", + "connectionTimedOut": "Время ожидания подключения истекло. Сервер может быть занят или заблокирован брандмауэром.", + "useHttpOrHttpsOnly": "Используйте только http:// или https://.", + "loginFailed": "Ошибка входа", + "invalidCredentials": "Неверное имя пользователя или пароль. Пожалуйста, попробуйте еще раз.", + "serverRedirectingHttps": "Сервер перенаправляет запросы. Проверьте настройки HTTPS вашего сервера.", + "unableToConnectServer": "Не удается подключиться к серверу. Пожалуйста, проверьте соединение.", + "requestTimedOut": "Время ожидания запроса истекло. Пожалуйста, попробуйте еще раз.", + "genericSignInFailed": "Не удалось войти. Проверьте учетные данные и настройки сервера.", + "skip": "Пропустить", + "next": "Далее", + "done": "Готово", + "onboardStartTitle": "Здравствуйте, {username}", + "onboardStartSubtitle": "Выберите модель для начала. Нажмите «Новый чат» в любое время.", + "onboardStartBullet1": "Нажмите на имя модели в верхней панели для переключения моделей", + "onboardStartBullet2": "Используйте «Новый чат» для сброса контекста", + "onboardAttachTitle": "Добавить контекст", + "onboardAttachSubtitle": "Обоснуйте ответы содержимым из рабочего пространства или фотографиями.", + "onboardAttachBullet1": "Рабочее пространство: PDF, документы, наборы данных", + "onboardAttachBullet2": "Фотографии: камера или галерея", + "onboardSpeakTitle": "Говорите естественно", + "onboardSpeakSubtitle": "Нажмите на микрофон для диктовки с визуализацией формы волны в реальном времени.", + "onboardSpeakBullet1": "Остановитесь в любое время; частичный текст сохранится", + "onboardSpeakBullet2": "Отлично подходит для быстрых заметок или длинных запросов", + "onboardQuickTitle": "Быстрые действия", + "onboardQuickSubtitle": "Откройте меню для переключения между чатами, рабочим пространством и профилем.", + "onboardQuickBullet1": "Нажмите на меню для доступа к чатам, рабочему пространству, профилю", + "onboardQuickBullet2": "Начните новый чат или управляйте моделями из верхней панели", + "addAttachment": "Добавить вложение", + "attachmentLabel": "Вложение", + "tools": "Инструменты", + "voiceInput": "Голосовой ввод", + "voice": "Голос", + "voiceStatusListening": "Слушаю...", + "voiceStatusRecording": "Запись...", + "voiceHoldToTalk": "Удерживайте для разговора", + "voiceAutoSend": "Автоотправка", + "voiceTranscript": "Транскрипция", + "voicePromptSpeakNow": "Говорите сейчас...", + "voicePromptTapStart": "Нажмите «Начать» для запуска", + "voiceActionStop": "Стоп", + "voiceActionStart": "Начать", + "messageInputLabel": "Ввод сообщения", + "messageInputHint": "Введите ваше сообщение", + "messageHintText": "Сообщение...", + "stopGenerating": "Остановить генерацию", + "codeCopiedToClipboard": "Код скопирован в буфер обмена.", + "send": "Отправить", + "sendMessage": "Отправить сообщение", + "file": "Файл", + "photo": "Фото", + "camera": "Камера", + "apiUnavailable": "Служба API недоступна", + "unableToLoadImage": "Не удалось загрузить изображение", + "notAnImageFile": "Не является файлом изображения: {fileName}", + "failedToLoadImage": "Не удалось загрузить изображение: {error}", + "invalidDataUrl": "Неверный формат data URL", + "failedToDecodeImage": "Не удалось декодировать изображение", + "invalidImageFormat": "Неверный формат изображения", + "emptyImageData": "Пустые данные изображения", + "featureRequiresInternet": "Эта функция требует подключения к интернету", + "messagesWillSendWhenOnline": "Сообщения будут отправлены, когда вы снова будете онлайн", + "confirm": "Подтвердить", + "cancel": "Отмена", + "ok": "OK", + "inputField": "Поле ввода", + "captureDocumentOrImage": "Сфотографировать документ или изображение", + "checkConnection": "Проверить соединение", + "openSettings": "Открыть настройки", + "chooseDifferentFile": "Выбрать другой файл", + "goBack": "Назад", + "technicalDetails": "Технические детали", + "save": "Сохранить", + "chooseModel": "Выбрать модель", + "reviewerMode": "РЕЖИМ РЕЦЕНЗЕНТА", + "selectLanguage": "Выбрать язык", + "newFolder": "Новая папка", + "folderName": "Имя папки", + "newChat": "Новый чат", + "more": "Еще", + "clear": "Очистить", + "searchHint": "Поиск...", + "searchConversations": "Поиск разговоров...", + "create": "Создать", + "folderCreated": "Папка создана", + "failedToCreateFolder": "Не удалось создать папку", + "movedChatToFolder": "Перемещено «{title}» в «{folder}»", + "@movedChatToFolder": { + "placeholders": { + "title": {"type": "String"}, + "folder": {"type": "String"} + } + }, + "failedToMoveChat": "Не удалось переместить чат", + "failedToLoadChats": "Не удалось загрузить чаты", + "failedToUpdatePin": "Не удалось обновить закрепление", + "failedToDeleteChat": "Не удалось удалить чат", + "manage": "Управление", + "rename": "Переименовать", + "delete": "Удалить", + "renameChat": "Переименовать чат", + "enterChatName": "Введите имя чата", + "failedToRenameChat": "Не удалось переименовать чат", + "failedToUpdateArchive": "Не удалось обновить архив", + "unarchive": "Разархивировать", + "archive": "Архивировать", + "pin": "Закрепить", + "unpin": "Открепить", + "recent": "Недавние", + "system": "Системный", + "english": "English", + "deutsch": "Deutsch", + "francais": "Français", + "italiano": "Italiano", + "deleteMessagesTitle": "Удалить сообщения", + "deleteMessagesMessage": "Удалить {count, plural, one{{count} сообщение} few{{count} сообщения} other{{count} сообщений}}?", + "@deleteMessagesMessage": { + "placeholders": { + "count": {"type": "int"} + } + }, + "routeNotFound": "Маршрут не найден: {routeName}", + "@routeNotFound": { + "placeholders": { + "routeName": {"type": "String"} + } + }, + "deleteChatTitle": "Удалить чат", + "deleteChatMessage": "Этот чат будет удален навсегда.", + "deleteFolderTitle": "Удалить папку", + "deleteFolderMessage": "Эта папка и ее ссылки будут удалены.", + "failedToDeleteFolder": "Не удалось удалить папку", + "aboutApp": "О приложении", + "aboutAppSubtitle": "Информация о Conduit и ссылки", + "web": "Веб", + "imageGen": "Генерация изображений", + "pinned": "Закреплено", + "folders": "Папки", + "archived": "Архивировано", + "appLanguage": "Язык приложения", + "darkMode": "Темный режим", + "webSearch": "Веб-поиск", + "webSearchDescription": "Поиск в интернете и цитирование источников в ответах.", + "imageGeneration": "Генерация изображений", + "imageGenerationDescription": "Создавайте изображения из ваших запросов.", + "copy": "Копировать", + "ttsListen": "Прослушать", + "ttsStop": "Остановить", + "edit": "Редактировать", + "regenerate": "Регенерировать", + "noConversationsYet": "Пока нет разговоров", + "usernameOrEmailHint": "Введите ваше имя пользователя или email", + "passwordHint": "Введите ваш пароль", + "enterApiKey": "Введите ваш API-ключ", + "signingIn": "Вход...", + "advancedSettings": "Расширенные настройки", + "customHeaders": "Пользовательские заголовки", + "customHeadersDescription": "Добавьте пользовательские HTTP-заголовки для аутентификации, API-ключей или особых требований сервера.", + "allowSelfSignedCertificates": "Доверять самоподписанным сертификатам", + "@allowSelfSignedCertificates": { + "description": "Переключатель, позволяющий доверять самоподписанным TLS-сертификатам для настроенного сервера." + }, + "allowSelfSignedCertificatesDescription": "Принимать TLS-сертификат этого сервера, даже если он самоподписанный. Включайте только для серверов, которым вы доверяете.", + "@allowSelfSignedCertificatesDescription": { + "description": "Вспомогательный текст, разъясняющий риски включения переключателя самоподписанных сертификатов." + }, + "headerNameEmpty": "Имя заголовка не может быть пустым", + "headerNameTooLong": "Имя заголовка слишком длинное (максимум 64 символа)", + "headerNameInvalidChars": "Недопустимое имя заголовка. Используйте только буквы, цифры и эти символы: !#$&-^_`|~", + "headerNameReserved": "Невозможно переопределить зарезервированный заголовок «{key}»", + "@headerNameReserved": {"placeholders": {"key": {"type": "String"}}}, + "headerValueEmpty": "Значение заголовка не может быть пустым", + "headerValueTooLong": "Значение заголовка слишком длинное (максимум 1024 символа)", + "headerValueInvalidChars": "Значение заголовка содержит недопустимые символы. Используйте только печатаемые ASCII.", + "headerValueUnsafe": "Значение заголовка содержит потенциально небезопасное содержимое", + "headerAlreadyExists": "Заголовок «{key}» уже существует. Сначала удалите его для обновления.", + "@headerAlreadyExists": {"placeholders": {"key": {"type": "String"}}}, + "maxHeadersReachedDetail": "Разрешено максимум 10 пользовательских заголовков. Удалите некоторые, чтобы добавить больше.", + "editMessage": "Редактировать сообщение", + "noModelsAvailable": "Нет доступных моделей", + "followingSystem": "Следует за системой: {theme}", + "@followingSystem": {"placeholders": {"theme": {"type": "String"}}}, + "themeDark": "Темная", + "themePalette": "Цветовая палитра", + "@themePalette": {"description": "Заголовок для выбора цветовой палитры приложения."}, + "themePaletteDescription": "Выберите акцентные цвета для кнопок, карточек и пузырьков чата.", + "@themePaletteDescription": {"description": "Вспомогательный текст, объясняющий выбор палитры."}, + "themeLight": "Светлая", + "currentlyUsingDarkTheme": "Используется темная тема", + "currentlyUsingLightTheme": "Используется светлая тема", + "aboutConduit": "О Conduit", + "versionLabel": "Версия: {version} ({build})", + "@versionLabel": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}}, + "githubRepository": "Репозиторий GitHub", + "unableToLoadAppInfo": "Не удалось загрузить информацию о приложении", + "thinking": "Думаю...", + "thoughts": "Мысли", + "thoughtForDuration": "Думал {duration}", + "@thoughtForDuration": { + "description": "Показывает, сколько времени ассистент думал перед ответом.", + "placeholders": {"duration": {"type": "String", "example": "3с"}} + }, + "appCustomization": "Настройка приложения", + "appCustomizationSubtitle": "Персонализируйте отображение имен и интерфейса", + "quickActionsDescription": "Выберите до двух ярлыков для закрепления рядом с полем ввода", + "chatSettings": "Чат", + "sendOnEnter": "Отправка по Enter", + "sendOnEnterDescription": "Enter отправляет (программная клавиатура). Также доступно Cmd/Ctrl+Enter", + "display": "Отображение", + "realtime": "Реальное время", + "transportMode": "Режим транспорта", + "transportModeDescription": "Выберите, как приложение подключается для обновлений в реальном времени.", + "mode": "Режим", + "transportModeAuto": "Авто (опрос + WebSocket)", + "transportModeWs": "Только WebSocket", + "transportModeAutoInfo": "Более надежен в ограничительных сетях. Переходит на WebSocket, когда это возможно.", + "transportModeWsInfo": "Меньше накладных расходов, но может не работать за строгими прокси/брандмауэрами." +} diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb new file mode 100644 index 0000000..1e3c6ca --- /dev/null +++ b/lib/l10n/app_zh.arb @@ -0,0 +1,317 @@ +{ + "@@locale": "zh", + "appTitle": "Conduit", + "initializationFailed": "初始化失败", + "retry": "重试", + "back": "返回", + "you": "你", + "loadingProfile": "加载个人资料中...", + "unableToLoadProfile": "无法加载个人资料", + "pleaseCheckConnection": "请检查您的连接并重试", + "connectionIssueTitle": "无法连接到您的服务器", + "@connectionIssueTitle": { + "description": "当配置的服务器无法访问时显示的标题" + }, + "connectionIssueSubtitle": "重新连接以继续或退出登录以选择其他服务器。", + "@connectionIssueSubtitle": { + "description": "当无法访问服务器时解释可用操作的副标题" + }, + "stillOfflineMessage": "我们仍然无法访问服务器。请仔细检查您的连接并重试。", + "@stillOfflineMessage": { + "description": "重试后连接未恢复时的状态消息" + }, + "account": "账户", + "supportConduit": "支持 Conduit", + "supportConduitSubtitle": "通过资助持续开发来保持 Conduit 的独立性。", + "githubSponsorsTitle": "GitHub 赞助", + "githubSponsorsSubtitle": "成为定期赞助者以资助路线图项目。", + "buyMeACoffeeTitle": "Buy Me a Coffee", + "buyMeACoffeeSubtitle": "一次性捐赠以表达感谢。", + "signOut": "退出登录", + "endYourSession": "结束您的会话", + "defaultModel": "默认模型", + "autoSelect": "自动选择", + "loadingModels": "加载模型中...", + "failedToLoadModels": "无法加载模型", + "availableModels": "可用模型", + "noResults": "无结果", + "searchModels": "搜索模型...", + "errorMessage": "出了点问题。请重试。", + "loginButton": "登录", + "menuItem": "设置", + "dynamicContentWithPlaceholder": "欢迎,{name}!", + "itemsCount": "{count, plural, =0{无项目} other{{count} 个项目}}", + "closeButtonSemantic": "关闭", + "loadingContent": "加载内容中", + "noItems": "无项目", + "noItemsToDisplay": "无可显示的项目", + "loadMore": "加载更多", + "workspace": "工作区", + "recentFiles": "最近文件", + "knowledgeBase": "知识库", + "noFilesYet": "尚无文件", + "uploadDocsPrompt": "上传文档以在您与 Conduit 的对话中引用", + "uploadFirstFile": "上传您的第一个文件", + "attachments": "附件", + "knowledgeBaseEmpty": "知识库为空", + "createCollectionsPrompt": "创建相关文档集合以便于引用", + "chooseSourcePhoto": "选择来源", + "takePhoto": "拍照", + "chooseFromGallery": "从相册中选择", + "document": "文档", + "documentHint": "PDF、Word 或文本文件", + "uploadFileTitle": "上传文件", + "fileUploadComingSoon": "{type} 的文件上传即将推出!", + "kbCreationComingSoon": "知识库创建即将推出!", + "backToServerSetup": "返回服务器设置", + "connectedToServer": "已连接到服务器", + "signIn": "登录", + "enterCredentials": "输入您的凭据以访问您的 AI 对话", + "credentials": "凭据", + "apiKey": "API 密钥", + "usernameOrEmail": "用户名或电子邮件", + "password": "密码", + "signInWithApiKey": "使用 API 密钥登录", + "connectToServer": "连接到服务器", + "enterServerAddress": "输入您的 Open-WebUI 服务器地址以开始", + "serverUrl": "服务器 URL", + "serverUrlHint": "https://your-server.com", + "enterServerUrlSemantic": "输入您的服务器 URL 或 IP 地址", + "headerName": "标头名称", + "headerValue": "标头值", + "headerValueHint": "api-key-123 或 Bearer token", + "addHeader": "添加标头", + "maximumHeadersReached": "已达到最大标头数", + "removeHeader": "删除标头", + "connecting": "连接中...", + "connectToServerButton": "连接到服务器", + "demoModeActive": "演示模式已激活", + "skipServerSetupTryDemo": "跳过服务器设置并尝试演示", + "enterDemo": "进入演示", + "demoBadge": "演示", + "serverNotOpenWebUI": "这似乎不是 Open-WebUI 服务器。", + "serverUrlEmpty": "服务器 URL 不能为空", + "invalidUrlFormat": "无效的 URL 格式。请检查您的输入。", + "onlyHttpHttps": "仅支持 HTTP 和 HTTPS 协议。", + "serverAddressRequired": "需要服务器地址(例如 192.168.1.10 或 example.com)。", + "portRange": "端口必须在 1 到 65535 之间。", + "invalidIpFormat": "无效的 IP 地址格式。使用如 192.168.1.10 的格式。", + "couldNotConnectGeneric": "无法连接。请仔细检查地址并重试。", + "weCouldntReachServer": "我们无法访问服务器。请检查您的连接和服务器是否正在运行。", + "connectionTimedOut": "连接超时。服务器可能很忙或被防火墙阻止。", + "useHttpOrHttpsOnly": "仅使用 http:// 或 https://。", + "loginFailed": "登录失败", + "invalidCredentials": "无效的用户名或密码。请重试。", + "serverRedirectingHttps": "服务器正在重定向请求。请检查您的服务器的 HTTPS 配置。", + "unableToConnectServer": "无法连接到服务器。请检查您的连接。", + "requestTimedOut": "请求超时。请重试。", + "genericSignInFailed": "我们无法让您登录。请检查您的凭据和服务器设置。", + "skip": "跳过", + "next": "下一步", + "done": "完成", + "onboardStartTitle": "你好,{username}", + "onboardStartSubtitle": "选择一个模型以开始。随时点击新对话。", + "onboardStartBullet1": "点击顶部栏中的模型名称以切换模型", + "onboardStartBullet2": "使用新对话重置上下文", + "onboardAttachTitle": "添加上下文", + "onboardAttachSubtitle": "使用工作区或照片中的内容来支持回复。", + "onboardAttachBullet1": "工作区:PDF、文档、数据集", + "onboardAttachBullet2": "照片:相机或相册", + "onboardSpeakTitle": "自然说话", + "onboardSpeakSubtitle": "点击麦克风以实时波形反馈听写。", + "onboardSpeakBullet1": "随时停止;部分文本会保留", + "onboardSpeakBullet2": "非常适合快速笔记或长提示", + "onboardQuickTitle": "快速操作", + "onboardQuickSubtitle": "打开菜单在对话、工作区和个人资料之间切换。", + "onboardQuickBullet1": "点击菜单访问对话、工作区、个人资料", + "onboardQuickBullet2": "从顶部栏开始新对话或管理模型", + "addAttachment": "添加附件", + "attachmentLabel": "附件", + "tools": "工具", + "voiceInput": "语音输入", + "voice": "语音", + "voiceStatusListening": "正在听...", + "voiceStatusRecording": "正在录制...", + "voiceHoldToTalk": "按住说话", + "voiceAutoSend": "自动发送", + "voiceTranscript": "转录", + "voicePromptSpeakNow": "现在说话...", + "voicePromptTapStart": "点击开始以开始", + "voiceActionStop": "停止", + "voiceActionStart": "开始", + "messageInputLabel": "消息输入", + "messageInputHint": "输入您的消息", + "messageHintText": "消息...", + "stopGenerating": "停止生成", + "codeCopiedToClipboard": "代码已复制到剪贴板。", + "send": "发送", + "sendMessage": "发送消息", + "file": "文件", + "photo": "照片", + "camera": "相机", + "apiUnavailable": "API 服务不可用", + "unableToLoadImage": "无法加载图像", + "notAnImageFile": "不是图像文件:{fileName}", + "failedToLoadImage": "无法加载图像:{error}", + "invalidDataUrl": "无效的数据 URL 格式", + "failedToDecodeImage": "无法解码图像", + "invalidImageFormat": "无效的图像格式", + "emptyImageData": "空图像数据", + "featureRequiresInternet": "此功能需要互联网连接", + "messagesWillSendWhenOnline": "当您重新上线时将发送消息", + "confirm": "确认", + "cancel": "取消", + "ok": "确定", + "inputField": "输入字段", + "captureDocumentOrImage": "捕获文档或图像", + "checkConnection": "检查连接", + "openSettings": "打开设置", + "chooseDifferentFile": "选择其他文件", + "goBack": "返回", + "technicalDetails": "技术详情", + "save": "保存", + "chooseModel": "选择模型", + "reviewerMode": "审核者模式", + "selectLanguage": "选择语言", + "newFolder": "新文件夹", + "folderName": "文件夹名称", + "newChat": "新对话", + "more": "更多", + "clear": "清除", + "searchHint": "搜索...", + "searchConversations": "搜索对话...", + "create": "创建", + "folderCreated": "文件夹已创建", + "failedToCreateFolder": "无法创建文件夹", + "movedChatToFolder": "已将「{title}」移至「{folder}」", + "@movedChatToFolder": { + "placeholders": { + "title": {"type": "String"}, + "folder": {"type": "String"} + } + }, + "failedToMoveChat": "无法移动对话", + "failedToLoadChats": "无法加载对话", + "failedToUpdatePin": "无法更新置顶", + "failedToDeleteChat": "无法删除对话", + "manage": "管理", + "rename": "重命名", + "delete": "删除", + "renameChat": "重命名对话", + "enterChatName": "输入对话名称", + "failedToRenameChat": "无法重命名对话", + "failedToUpdateArchive": "无法更新存档", + "unarchive": "取消存档", + "archive": "存档", + "pin": "置顶", + "unpin": "取消置顶", + "recent": "最近", + "system": "系统", + "english": "English", + "deutsch": "Deutsch", + "francais": "Français", + "italiano": "Italiano", + "deleteMessagesTitle": "删除消息", + "deleteMessagesMessage": "删除 {count} 条消息?", + "@deleteMessagesMessage": { + "placeholders": { + "count": {"type": "int"} + } + }, + "routeNotFound": "未找到路由:{routeName}", + "@routeNotFound": { + "placeholders": { + "routeName": {"type": "String"} + } + }, + "deleteChatTitle": "删除对话", + "deleteChatMessage": "此对话将被永久删除。", + "deleteFolderTitle": "删除文件夹", + "deleteFolderMessage": "此文件夹及其分配引用将被删除。", + "failedToDeleteFolder": "无法删除文件夹", + "aboutApp": "关于应用", + "aboutAppSubtitle": "Conduit 信息和链接", + "web": "网页", + "imageGen": "图像生成", + "pinned": "已置顶", + "folders": "文件夹", + "archived": "已存档", + "appLanguage": "应用语言", + "darkMode": "深色模式", + "webSearch": "网页搜索", + "webSearchDescription": "搜索网页并在回复中引用来源。", + "imageGeneration": "图像生成", + "imageGenerationDescription": "从您的提示创建图像。", + "copy": "复制", + "ttsListen": "收听", + "ttsStop": "停止", + "edit": "编辑", + "regenerate": "重新生成", + "noConversationsYet": "尚无对话", + "usernameOrEmailHint": "输入您的用户名或电子邮件", + "passwordHint": "输入您的密码", + "enterApiKey": "输入您的 API 密钥", + "signingIn": "正在登录...", + "advancedSettings": "高级设置", + "customHeaders": "自定义标头", + "customHeadersDescription": "为身份验证、API 密钥或特殊服务器要求添加自定义 HTTP 标头。", + "allowSelfSignedCertificates": "信任自签名证书", + "@allowSelfSignedCertificates": { + "description": "允许信任配置服务器的自签名 TLS 证书的切换标签。" + }, + "allowSelfSignedCertificatesDescription": "接受此服务器的 TLS 证书,即使它是自签名的。仅对您信任的服务器启用。", + "@allowSelfSignedCertificatesDescription": { + "description": "阐明启用自签名证书切换风险的帮助文本。" + }, + "headerNameEmpty": "标头名称不能为空", + "headerNameTooLong": "标头名称太长(最多 64 个字符)", + "headerNameInvalidChars": "无效的标头名称。仅使用字母、数字和这些符号:!#$&-^_`|~", + "headerNameReserved": "无法覆盖保留的标头「{key}」", + "@headerNameReserved": {"placeholders": {"key": {"type": "String"}}}, + "headerValueEmpty": "标头值不能为空", + "headerValueTooLong": "标头值太长(最多 1024 个字符)", + "headerValueInvalidChars": "标头值包含无效字符。仅使用可打印的 ASCII。", + "headerValueUnsafe": "标头值似乎包含潜在的不安全内容", + "headerAlreadyExists": "标头「{key}」已存在。首先删除它以更新。", + "@headerAlreadyExists": {"placeholders": {"key": {"type": "String"}}}, + "maxHeadersReachedDetail": "最多允许 10 个自定义标头。删除一些以添加更多。", + "editMessage": "编辑消息", + "noModelsAvailable": "无可用模型", + "followingSystem": "跟随系统:{theme}", + "@followingSystem": {"placeholders": {"theme": {"type": "String"}}}, + "themeDark": "深色", + "themePalette": "强调色调色板", + "@themePalette": {"description": "选择应用颜色调色板的标题。"}, + "themePaletteDescription": "选择用于按钮、卡片和对话气泡的强调色。", + "@themePaletteDescription": {"description": "解释调色板选择的帮助文本。"}, + "themeLight": "浅色", + "currentlyUsingDarkTheme": "当前使用深色主题", + "currentlyUsingLightTheme": "当前使用浅色主题", + "aboutConduit": "关于 Conduit", + "versionLabel": "版本:{version}({build})", + "@versionLabel": {"placeholders": {"version": {"type": "String"}, "build": {"type": "String"}}}, + "githubRepository": "GitHub 仓库", + "unableToLoadAppInfo": "无法加载应用信息", + "thinking": "思考中...", + "thoughts": "思路", + "thoughtForDuration": "思考了 {duration}", + "@thoughtForDuration": { + "description": "显示助手在回复前思考了多长时间。", + "placeholders": {"duration": {"type": "String", "example": "3s"}} + }, + "appCustomization": "应用自定义", + "appCustomizationSubtitle": "个性化名称和 UI 显示", + "quickActionsDescription": "选择最多两个快捷方式以固定在撰写器附近", + "chatSettings": "对话", + "sendOnEnter": "回车发送", + "sendOnEnterDescription": "回车发送(软键盘)。Cmd/Ctrl+Enter 也可用", + "display": "显示", + "realtime": "实时", + "transportMode": "传输模式", + "transportModeDescription": "选择应用如何连接以进行实时更新。", + "mode": "模式", + "transportModeAuto": "自动(轮询 + WebSocket)", + "transportModeWs": "仅 WebSocket", + "transportModeAutoInfo": "在限制性网络上更稳健。在可能的情况下升级到 WebSocket。", + "transportModeWsInfo": "开销较低,但可能在严格的代理/防火墙后失败。" +}