feat: add support for additional languages in localization

- Expanded the localization support by adding new languages: Chinese (zh), Russian (ru), Dutch (nl), and Spanish (es).
- Updated the localization files and the AppLocalizations class to include the new languages, ensuring a broader reach for international users.
- Enhanced the isSupported method to recognize the newly added languages, improving the app's adaptability to diverse user preferences.
This commit is contained in:
cogwheel0
2025-10-10 21:38:19 +05:30
parent dea53593ba
commit c26ba02a88
6 changed files with 1298 additions and 2 deletions

317
lib/l10n/app_es.arb Normal file
View File

@@ -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."
}

View File

@@ -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) =>
<String>['de', 'en', 'fr', 'it'].contains(locale.languageCode);
bool isSupported(Locale locale) => <String>[
'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(

317
lib/l10n/app_nl.arb Normal file
View File

@@ -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."
}

317
lib/l10n/app_ru.arb Normal file
View File

@@ -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": "Меньше накладных расходов, но может не работать за строгими прокси/брандмауэрами."
}

317
lib/l10n/app_zh.arb Normal file
View File

@@ -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": "开销较低,但可能在严格的代理/防火墙后失败。"
}