diff --git a/crates/ui-egui/src/i18n/ui.rs b/crates/ui-egui/src/i18n/ui.rs index d5031a13..537854bd 100644 --- a/crates/ui-egui/src/i18n/ui.rs +++ b/crates/ui-egui/src/i18n/ui.rs @@ -19,7 +19,7 @@ use std::fmt::Display; use std::sync::OnceLock; thread_local! { - /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk", "pt-br", "cs"); "en" until the first + /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk", "pt-br", "cs", "es"); "en" until the first /// frame sets it. static CURRENT: Cell<&'static str> = const { Cell::new("en") }; } @@ -46,6 +46,7 @@ fn catalog(language: &str) -> Option<&'static Index> { static UK: OnceLock = OnceLock::new(); static PT_BR: OnceLock = OnceLock::new(); static CS: OnceLock = OnceLock::new(); + static ES: OnceLock = OnceLock::new(); let (index, rows) = match language { "ja" => (&JA, JAPANESE), "zh-hans" => (&HANS, SIMPLIFIED_CHINESE), @@ -53,6 +54,7 @@ fn catalog(language: &str) -> Option<&'static Index> { "uk" => (&UK, UKRAINIAN), "pt-br" => (&PT_BR, PORTUGUESE), "cs" => (&CS, CZECH), + "es" => (&ES, SPANISH), _ => return None, }; Some(index.get_or_init(|| rows.iter().copied().collect())) @@ -3607,6 +3609,557 @@ const CZECH: &[(&str, &str)] = &[ ("Per Layer", "Na vrstvu"), ]; +/// Spanish: neutral, tú, sentence case; the same source strings as the Chinese catalogs, in the same +/// order. Terms follow the Spanish menu catalog (composición, material de archivo, cola de procesamiento, +/// ajuste preestablecido, método abreviado). Written from the English source. +const SPANISH: &[(&str, &str)] = &[ + ("Appearance Settings…", "Ajustes de apariencia…"), + ("Add to favorites", "Añadir a favoritos"), + ("Remove from favorites", "Quitar de favoritos"), + (" OK ", " Aceptar "), + (" Delete ", " Eliminar "), + (" Open Auto-Save ", " Abrir guardado automático "), + ("(missing)", "(ausente)"), + ("360 View Orientation", "Orientación de la vista 360°"), + ("3:2 Pulldown: {}", "Pulldown 3:2: {}"), + ( + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", + "Un compositor de código abierto y desarrollado en sala limpia para gráficos en movimiento y efectos visuales: nativo en macOS, Windows y Linux, y en el navegador. Forma parte de la familia de aplicaciones creativas ArtCraft.", + ), + ("About EffectCraft", "Acerca de EffectCraft"), + ("About...", "Acerca de..."), + ("Active", "Activo"), + ("Active Camera", "Cámara activa"), + ("Alpha", "Alfa"), + ("Adapt Feature On Every Frame", "Adaptar la característica en cada fotograma"), + ("Adaptive Sample Limit:", "Límite de muestras adaptativas:"), + ("Add Animator", "Añadir animador"), + ("Add Comment", "Añadir comentario"), + ("Add Formatting", "Añadir formato"), + ("Add Group", "Añadir grupo"), + ("Add Mirror", "Añadir espejo"), + ("Add Selected As", "Añadir seleccionados como"), + ("Add a comment", "Añadir un comentario"), + ("Add a shape, fill, stroke or path operation", "Añadir una forma, relleno, trazo u operación de trazado"), + ("Add to Composition", "Añadir a la composición"), + ("Add to Favorites", "Añadir a favoritos"), + ("Add:", "Añadir:"), + ("Adjust Exposure (stops)", "Ajustar exposición (pasos)"), + ( + "Adjust composition duration to the time span of the selected layers", + "Ajustar la duración de la composición al intervalo de tiempo de las capas seleccionadas", + ), + ("Advanced 3D", "3D avanzado"), + ("Align Layers to:", "Alinear capas con:"), + ("All six face cameras turn together; the scene is not changed.", "Las seis cámaras de las caras giran juntas; la escena no cambia."), + ("Anchor:", "Punto de anclaje:"), + ("Aperture", "Abertura"), + ("Appearance Mode", "Modo de apariencia"), + ("Appearance Mode: {}", "Modo de apariencia: {}"), + ("Apply Dimensions:", "Aplicar dimensiones:"), + ("Apply Motion To:", "Aplicar movimiento a:"), + ("Arrange", "Organizar"), + ("Assign", "Asignar"), + ("Auto", "Automático"), + ("Auto-saves", "Guardados automáticos"), + ("Back", "Atrás"), + ("Background Color:", "Color de fondo:"), + ("Blend Mode:", "Modo de fusión:"), + ("Blending Mode", "Modo de fusión"), + ("Blur", "Desenfoque"), + ("Blur Level", "Nivel de desenfoque"), + ("Boundary", "Límite"), + ("Browser Storage", "Almacenamiento del navegador"), + ("Browse…", "Examinar…"), + ("Brush Dynamics", "Dinámica del pincel"), + ("Caching frames…", "Almacenando fotogramas en caché…"), + ("Cancel", "Cancelar"), + ("Casts Shadows", "Proyecta sombras"), + ("Change Renderer…", "Cambiar motor de procesamiento…"), + ( + "Changing a shortcut creates a custom preset; the default stays as it is.", + "Cambiar un método abreviado crea un ajuste preestablecido personalizado; el predeterminado no cambia.", + ), + ("Channel", "Canal"), + ("Channel:", "Canal:"), + ("Chapter:", "Capítulo:"), + ("Choose...", "Elegir..."), + ("Classic 3D", "3D clásico"), + ("Clear", "Borrar"), + ("Clear list", "Borrar lista"), + ("Click a key to see its commands.", "Haz clic en una tecla para ver sus comandos."), + ( + "Click above the bar to add an opacity stop, below it to add a color stop.", + "Haz clic encima de la barra para añadir una parada de opacidad; debajo, para añadir una parada de color.", + ), + ("Click adds a point (½ height = no change)", "Al hacer clic se añade un punto (½ altura = sin cambios)"), + ("Click adds a point; drag one off to remove", "Al hacer clic se añade un punto; arrastra uno fuera para quitarlo"), + ("Click to make this viewer active", "Haz clic para activar este visor"), + ("Click to reveal the expression in the timeline", "Haz clic para mostrar la expresión en la cronología"), + ("Click to show the active composition here", "Haz clic para mostrar la composición activa aquí"), + ("Click, then click in the Composition panel", "Haz clic y, a continuación, haz clic en el panel Composición"), + ("Clone Options", "Opciones de clonación"), + ("Clone Source Overlay:", "Superposición del origen del clon:"), + ("Close", "Cerrar"), + ("Close Panel", "Cerrar panel"), + ("Close tutorial", "Cerrar tutorial"), + ("Color", "Color"), + ("Color Depth: {}", "Profundidad de color: {}"), + ("Color:", "Color:"), + ("Colour map", "Mapa de color"), + ("Columns", "Columnas"), + ("Comment:", "Comentario:"), + ("Community", "Comunidad"), + ("Composition", "Composición"), + ("Composition Mini-Flowchart", "Minidiagrama de flujo de la composición"), + ("Composition Name:", "Nombre de la composición:"), + ("Composition Settings ▸ 3D Renderer", "Configuración de la composición ▸ Motor de procesamiento 3D"), + ("Composition Settings…", "Configuración de la composición…"), + ("Composition marker bin: drag a marker to the time ruler", "Contenedor de marcadores de composición: arrastra un marcador a la regla de tiempo"), + ("Cone Angle", "Ángulo del cono"), + ("Cone Feather", "Calado del cono"), + ("Constrain Proportions", "Restringir proporciones"), + ("Continuous (Lock Outgoing to Incoming)", "Continuo (igualar la velocidad de salida a la de entrada)"), + ("Cue Point", "Punto de referencia"), + ("Current Render", "Procesamiento actual"), + ("Dark", "Oscuro"), + ("Dark Theme", "Tema oscuro"), + ("Darker", "Más oscuro"), + ("Default Output:", "Salida predeterminada:"), + ("Default: {}", "Predeterminado: {}"), + ("Defaults", "Predeterminados"), + ("Delete", "Eliminar"), + ("Delete Selected Points", "Eliminar puntos seleccionados"), + ("Delete selected project items", "Eliminar elementos del proyecto seleccionados"), + ("Delete this template", "Eliminar esta plantilla"), + ("Depth of Field", "Profundidad de campo"), + ("Discord", "Discord"), + ("Distribute Layers:", "Distribuir capas:"), + ("Don't Recover", "No recuperar"), + ("Don't Save", "No guardar"), + ("Double-click a layer to open it in the Layer panel", "Haz doble clic en una capa para abrirla en el panel Capa"), + ("Double-click footage in the Project panel to open it here", "Haz doble clic en el material de archivo del panel Proyecto para abrirlo aquí"), + ("Double-click to edit the comment", "Haz doble clic para editar el comentario"), + ("Download", "Descargar"), + ( + "Drag properties here from the timeline,\nor use Animation > Add Property to Essential Graphics.", + "Arrastra propiedades aquí desde la cronología,\no usa Animación > Añadir propiedad a Gráficos esenciales.", + ), + ("Drag to change", "Arrastra para cambiar"), + ("Drag to create a guide", "Arrastra para crear una guía"), + ("Drag to slip the source", "Arrastra para deslizar el origen"), + ("Drop Frame", "Drop frame"), + ("Duplicate", "Duplicar"), + ("Duration:", "Duración:"), + ("Edit Gradient…", "Editar degradado…"), + ("Edit Target: {}", "Destino de la edición: {}"), + ("Edit in the Timeline", "Editar en la cronología"), + ("EffectCraft didn't quit normally last time.", "EffectCraft no se cerró normalmente la última vez."), + ("Effects & Presets options", "Opciones de Efectos y ajustes preestablecidos"), + ("Effects: {}", "Efectos: {}"), + ("Empty folder", "Carpeta vacía"), + ("Enable Depth of Field", "Habilitar profundidad de campo"), + ("Enable Expression", "Habilitar expresión"), + ("Enhance", "Mejorar"), + ("Essential Properties — {}", "Propiedades esenciales — {}"), + ("Event", "Evento"), + ("Export Template…", "Exportar plantilla…"), + ("Export...", "Exportar..."), + ("Expression Language Menu", "Menú de lenguaje de expresiones"), + ("Expression pick whip: drag onto a property", "Selector de expresión: arrastra hasta una propiedad"), + ("Expression:", "Expresión:"), + ("Eyedropper: click, then click in the Composition panel", "Cuentagotas: haz clic y, a continuación, haz clic en el panel Composición"), + ("Falloff", "Atenuación"), + ("Falloff Distance", "Distancia de atenuación"), + ("Favorites", "Favoritos"), + ("Field Render: {}", "Procesamiento de campos: {}"), + ("Figures", "Cifras"), + ("Fill Target", "Destino del relleno"), + ("Finished", "Finalizado"), + ("Flowchart: {}", "Diagrama de flujo: {}"), + ("Focus Distance", "Distancia de enfoque"), + ("Follow Feature Rotation and Scale", "Seguir la rotación y la escala de la característica"), + ("Footage: {}", "Material de archivo: {}"), + ("Format: {}", "Formato: {}"), + ("Frame Aspect Ratio: {}", "Relación de aspecto del fotograma: {}"), + ("Frame Blending: {}", "Fusión de fotogramas: {}"), + ("Frame Rate:", "Velocidad de fotogramas:"), + ("Frame Render Time {}ms", "Tiempo de procesamiento del fotograma {}ms"), + ("Frame Target:", "Marco de destino:"), + ("Freeze", "Congelar"), + ("Grab bag", "Varios"), + ("Gradient Editor", "Editor de degradados"), + ("Grid", "Cuadrícula"), + ("Guide Layers: {}", "Capas de guía: {}"), + ("Guides", "Guías"), + ("Height:", "Altura:"), + ("Hide This", "Ocultar esto"), + ("Histogram", "Histograma"), + ("Hold In Place", "Mantener en el lugar"), + ("Home", "Inicio"), + ("If Confidence is Below", "Si la confianza es inferior a"), + ("Import", "Importar"), + ("Import and Add to Composition", "Importar y añadir a la composición"), + ("Import...", "Importar..."), + ("Imported media", "Medios importados"), + ("Influence:", "Influencia:"), + ("Install from File…", "Instalar desde archivo…"), + ("Intensity", "Intensidad"), + ("Inverted", "Invertida"), + ("Join the ArtCraft community on Discord", "Únete a la comunidad de ArtCraft en Discord"), + ("Key: {}", "Tecla: {}"), + ("LEARN", "APRENDER"), + ("Label", "Etiqueta"), + ("Label Colors and Names:", "Colores y nombres de etiquetas:"), + ("Label:", "Etiqueta:"), + ("Latest auto-save: {}", "Último guardado automático: {}"), + ("Layer", "Capa"), + ("Layer controls", "Controles de capa"), + ("Layer {}", "Capa {}"), + ("Layer:", "Capa:"), + ("Layer: {}", "Capa: {}"), + ("Learn", "Aprender"), + ("Leave all attributes in \"{}\"", "Dejar todos los atributos en \"{}\""), + ("Licence: {}", "Licencia: {}"), + ("Ligatures", "Ligaduras"), + ("Light", "Claro"), + ("Light Theme", "Tema claro"), + ("Light Type", "Tipo de luz"), + ("Lighter", "Más claro"), + ("Link Selected Property", "Vincular propiedad seleccionada"), + ("Location:", "Ubicación:"), + ("Lock Aspect Ratio to {}", "Bloquear relación de aspecto en {}"), + ("Lock to Zoom", "Bloquear al zoom"), + ("Locked: {} — {}", "Bloqueado: {} — {}"), + ("Log:", "Registro:"), + ("Loop (Trace Path)", "Bucle (trazar trazado)"), + ("MIT OR Apache-2.0 • Fonts: Inter, JetBrains Mono (OFL)", "MIT OR Apache-2.0 • Fuentes: Inter, JetBrains Mono (OFL)"), + ("Magnification ratio popup", "Menú de proporción de ampliación"), + ("Make Comp Size", "Ajustar al tamaño de la composición"), + ("Masks", "Máscaras"), + ("Maximize Panel", "Maximizar panel"), + ("Media Replacement", "Sustitución de medios"), + ("Mesh:", "Malla:"), + ("Diameter:", "Diámetro:"), + ("Method Used: {} Average Error: {} pixels", "Método usado: {} Error promedio: {} píxeles"), + ("Models folder: {}", "Carpeta de modelos: {}"), + ("Modifiers:", "Modificadores:"), + ("More", "Más"), + ("More ArtCraft apps", "Más aplicaciones de ArtCraft"), + ("More tutorials", "Más tutoriales"), + ("Motion Blur", "Desenfoque de movimiento"), + ("Motion Blur: {}", "Desenfoque de movimiento: {}"), + ("Motion Sketch: drag to record", "Boceto de movimiento: arrastra para grabar"), + ("Move Down", "Mover hacia abajo"), + ("Move Up", "Mover hacia arriba"), + ("Move to Project Root", "Mover a la raíz del proyecto"), + ("Name", "Nombre"), + ("Name:", "Nombre:"), + ("Navigation", "Navegación"), + ("New", "Nuevo"), + ("New Comp from Selection", "Nueva composición a partir de la selección"), + ("New Duration:", "Nueva duración:"), + ("New composition name:", "Nombre de la nueva composición:"), + ("New from Render Queue item:", "Nuevo a partir del elemento de la cola de procesamiento:"), + ("New from Template", "Nuevo a partir de plantilla"), + ("Next", "Siguiente"), + ("Nice work. Pick another tutorial on the Home screen's Learn tab.", "Buen trabajo. Elige otro tutorial en la pestaña Aprender de la pantalla de inicio."), + ( + "No VR environments yet. Create one with Composition ▸ VR ▸ Create VR Environment…", + "Aún no hay entornos de RV. Crea uno con Composición ▸ RV ▸ Crear entorno de RV…", + ), + ("No audio layer selected", "No hay ninguna capa de audio seleccionada"), + ("No background jobs running", "No hay tareas en segundo plano en ejecución"), + ("No composition markers", "No hay marcadores de composición"), + ("No contributor data was built into this copy.", "No se incluyeron datos de colaboradores en esta copia."), + ( + "No device list from this host; the system default output is used.", + "Este host no proporcionó una lista de dispositivos; se usa la salida predeterminada del sistema.", + ), + ("No layer selected", "No hay ninguna capa seleccionada"), + ("No matching effects or presets", "No hay efectos ni ajustes preestablecidos que coincidan"), + ("No matching fonts", "No hay fuentes coincidentes"), + ("Variable fonts only", "Solo fuentes variables"), + ("No model credits were built into this copy.", "No se incluyeron créditos de modelos en esta copia."), + ("No nested compositions", "No hay composiciones anidadas"), + ("No shortcut", "Sin método abreviado"), + ("No unlocked layer selected", "No hay ninguna capa desbloqueada seleccionada"), + ("No video", "Sin vídeo"), + ("None", "Ninguno"), + ("Not applied: tick it in the list to add it.", "No aplicado: márcalo en la lista para añadirlo."), + ("Not assigned", "Sin asignar"), + ("Note: Shadows are only cast from layers with Cast Shadows enabled.", "Nota: Las sombras solo se proyectan desde capas con Proyectar sombras activado."), + ("Notify", "Notificar"), + ("OK", "Aceptar"), + ("Offset:", "Desplazamiento:"), + ("On ({}) stop:", "Al parar ({}):"), + ("One-Node Camera", "Cámara de un nodo"), + ("Opacity:", "Opacidad:"), + ("Open Composition", "Abrir composición"), + ("Open Last Saved Project", "Abrir el último proyecto guardado"), + ("Open New Composition", "Abrir nueva composición"), + ("Open Output", "Abrir salida"), + ("Open a composition to build Essential Graphics", "Abre una composición para crear Gráficos esenciales"), + ("Open a composition to see its scopes", "Abre una composición para ver sus ámbitos"), + ("Open a composition to track motion.", "Abre una composición para seguir movimiento."), + ("Opus Tuning: {}", "Ajuste de Opus: {}"), + ("Original Duration:", "Duración original:"), + ("Output Cycle: {}", "Ciclo de salida: {}"), + ("Output To:", "Salida a:"), + ("Overlay", "Superposición"), + ("Parameter Name:", "Nombre del parámetro:"), + ("Parent pick whip: drag onto a layer", "Selector de capa padre: arrastra hasta una capa"), + ("Pixel Aspect Ratio:", "Relación de aspecto de píxel:"), + ("Playing on Video Preview", "Reproduciendo en la previsualización de vídeo"), + ("Post-Render Action: {}", "Acción posterior al procesamiento: {}"), + ("Preserve frame rate when nested or in render queue", "Conservar la velocidad de fotogramas cuando se anida o está en la cola de procesamiento"), + ("Preserve resolution when nested", "Conservar la resolución al anidar"), + ("Preset", "Ajuste preestablecido"), + ("Preset:", "Ajuste preestablecido:"), + ("Presets", "Ajustes preestablecidos"), + ("Previous", "Anterior"), + ("Primary:", "Principal:"), + ("Process Before Match", "Procesar antes de buscar coincidencias"), + ("Profile: {}", "Perfil: {}"), + ( + "Project color depth: click to cycle 8/16/32 bpc, Alt-click for Project Settings", + "Profundidad de color del proyecto: haz clic para alternar entre 8/16/32 bpc; Alt+clic para la configuración del proyecto", + ), + ("Project: {}", "Proyecto: {}"), + ("Projects", "Proyectos"), + ("Property pick whip: drag onto a property", "Selector de propiedad: arrastra hasta una propiedad"), + ("Protected Region", "Región protegida"), + ("Proxy Use: {}", "Uso de proxy: {}"), + ("Push All to Comp", "Enviar todo a la composición"), + ("RGB", "RGB"), + ("Radius", "Radio"), + ("Rate Control: {}", "Control de tasa: {}"), + ("Recent", "Recientes"), + ("Recording", "Grabando"), + ("Remove", "Quitar"), + ("Rename", "Cambiar nombre"), + ("Render: {} ms • UI {} fps{}", "Procesamiento: {} ms • IU {} fps{}"), + ("Renderer:", "Motor de procesamiento:"), + ("Request Persistent Storage", "Solicitar almacenamiento persistente"), + ("Reset", "Restablecer"), + ("Reset Labels", "Restablecer etiquetas"), + ("Reset Preset", "Restablecer ajuste preestablecido"), + ("Reset to Default", "Restablecer valores predeterminados"), + ("Reset to Saved Layout", "Restablecer al diseño guardado"), + ("Resolution/Down Sample Factor Popup", "Menú emergente de resolución/factor de reducción de muestreo"), + ("Restore Panel Size", "Restaurar tamaño del panel"), + ("Reverse the order", "Invertir el orden"), + ("Revert All", "Revertir todo"), + ("Roman Hanging Punctuation", "Puntuación colgante latina"), + ("Roving:", "Itinerante:"), + ("Ruler zero point (drag to move, double-click to reset)", "Punto cero de la regla (arrastra para mover, haz doble clic para restablecer)"), + ("Rulers", "Reglas"), + ("Run", "Ejecutar"), + ("Sample Format: {}", "Formato de muestra: {}"), + ("Samples Per Frame:", "Muestras por fotograma:"), + ("Save from #{}", "Guardar desde #{}"), + ("Saved {}", "Guardado {}"), + ("Script… (⌘/Ctrl+Enter runs)", "Script… (⌘/Ctrl+Enter ejecuta)"), + ("Search commands or shortcuts", "Buscar comandos o métodos abreviados"), + ("Select", "Seleccionar"), + ("Select a command to change its shortcut.", "Selecciona un comando para cambiar su método abreviado."), + ("Select a layer to see its effects", "Selecciona una capa para ver sus efectos"), + ("Select a layer to see its properties", "Selecciona una capa para ver sus propiedades"), + ("({}) Selected Objects", "({}) objetos seleccionados"), + ( + "Select a layer with a mask or shape path (or the path property), or Puppet pins.", + "Selecciona una capa con una máscara o un trazado de forma (o la propiedad de trazado), o pines de marioneta.", + ), + ("Select a text layer", "Selecciona una capa de texto"), + ("Select an item in the Project panel", "Selecciona un elemento en el panel Proyecto"), + ("Select animated properties to show them in the Graph Editor", "Selecciona propiedades animadas para mostrarlas en el editor de gráficos"), + ( + "Select the leader pin, then Shift-click the pins that should trail it (hair, cloth, tails)", + "Selecciona el pin guía y luego haz Mayús+clic en los pines que deben seguirlo (pelo, tela, colas)", + ), + ("Set Ground Plane and Origin", "Definir plano de suelo y origen"), + ("Set Paint Colors to Black and White (D)", "Definir colores de pintura como negro y blanco (D)"), + ("Settings", "Ajustes"), + ("Settings Name:", "Nombre de los ajustes:"), + ("Shadow Darkness", "Oscuridad de la sombra"), + ("Shadow Diffusion", "Difusión de la sombra"), + ("Shadows", "Sombras"), + ("Shape…", "Forma…"), + ("Show", "Mostrar"), + ("Show Layer Name", "Mostrar nombre de la capa"), + ("Show Source Name", "Mostrar nombre del origen"), + ("Show me", "Mostrar cómo hacerlo"), + ("Show:", "Mostrar:"), + ("Shutter Angle:", "Ángulo del obturador:"), + ("Shutter Phase:", "Fase del obturador:"), + ("Size", "Tamaño"), + ("Skip", "Omitir"), + ("Snapping", "Ajuste"), + ("Snapping options", "Opciones de ajuste"), + ("Snapshot", "Instantánea"), + ("Solo Supported Properties", "Mostrar solo las propiedades compatibles"), + ("Solo Switches: {}", "Conmutadores de solo: {}"), + ("Sort", "Ordenar"), + ("Spacing:", "Espaciado:"), + ("Spatial Interpolation:", "Interpolación espacial:"), + ("Speed:", "Velocidad:"), + ("Start Timecode:", "Código de tiempo inicial:"), + ("Start: {} Duration: {}", "Inicio: {} Duración: {}"), + ("Step {} of {}: {}", "Paso {} de {}: {}"), + ("Stop", "Detener"), + ("Stop {} at {}°", "Parada {} en {}°"), + ("Stored in: {}", "Guardado en: {}"), + ("Stretch", "Estirar"), + ("Stretch Factor:", "Factor de estiramiento:"), + ("Stylistic Sets", "Conjuntos estilísticos"), + ("Subpixel Positioning", "Posicionamiento de subpíxeles"), + ("Swap Paint Colors (X)", "Intercambiar colores de pintura (X)"), + ("Sync with System", "Sincronizar con el sistema"), + ("System Default", "Predeterminado del sistema"), + ("Table", "Tabla"), + ("Template name", "Nombre de la plantilla"), + ("Template: {}\n{}", "Plantilla: {}\n{}"), + ("Temporal Interpolation:", "Interpolación temporal:"), + ("The Media Browser is not available here (use File ▸ Import)", "El Navegador de medios no está disponible aquí (usa Archivo ▸ Importar)"), + ("The OpenEXR layer shown in red, green, blue and alpha", "La capa de OpenEXR mostrada en rojo, verde, azul y alfa"), + ("The render queue is empty.", "La cola de procesamiento está vacía."), + ( + "These adjacent keyframes cannot interpolate because their stop counts differ.", + "Estos fotogramas clave adyacentes no pueden interpolarse porque sus números de paradas son distintos.", + ), + ("This ScriptUI panel has closed", "Este panel de ScriptUI se ha cerrado"), + ("This change will create a new solid for this layer.", "Este cambio creará un nuevo sólido para esta capa."), + ("Time", "Tiempo"), + ("Time Stretch…", "Estirar el tiempo…"), + ("Time:", "Tiempo:"), + ("Time: {}", "Tiempo: {}"), + ("Title/Action Safe", "Área segura de título/acción"), + ("Title/action safe", "Área segura de título/acción"), + ("Toggle Switches / Modes", "Alternar conmutadores / modos"), + ("Track Name:", "Nombre del seguimiento:"), + ( + "Trained models are available in the desktop app; the browser uses the classic engine.", + "Los modelos entrenados están disponibles en la aplicación de escritorio; el navegador usa el motor clásico.", + ), + ("Transform", "Transformar"), + ("Transparency grid", "Cuadrícula de transparencia"), + ("Tutorial complete", "Tutorial completado"), + ("Two-Node Camera", "Cámara de dos nodos"), + ("Type", "Tipo"), + ("Type a command or effect…", "Escribe un comando o efecto…"), + ("URL:", "URL:"), + ("Undock Panel", "Desacoplar panel"), + ("Move Panel to New Window", "Mover panel a una ventana nueva"), + ("Move Panel to Main Window", "Mover panel a la ventana principal"), + ("Unfreeze", "Descongelar"), + ("Unlink {}", "Desvincular {}"), + ( + "Use this option to place the currently selected layers together into a new intermediate composition.", + "Usa esta opción para colocar las capas seleccionadas juntas en una nueva composición intermedia.", + ), + ("VR Environments", "Entornos de RV"), + ("Value:", "Valor:"), + ("Variable Font Axes", "Ejes de fuente variable"), + ("Video Codec: {}", "Códec de vídeo: {}"), + ("View:", "Vista:"), + ("Welcome to EffectCraft", "Te damos la bienvenida a EffectCraft"), + ("Width:", "Ancho:"), + ("You can undo this.", "Puedes deshacer esto."), + ("Your changes will be lost if you don't save them.", "Tus cambios se perderán si no los guardas."), + ("Zoom", "Zoom"), + ("built-in", "integrado"), + ("frames per second", "fotogramas por segundo"), + ("template name", "nombre de plantilla"), + ("{} contributors · {} commits", "{} colaboradores · {} commits"), + ("{} x {}, {}MB per 8bpc frame", "{} x {}, {}MB por fotograma de 8 bpc"), + ("{} — coming soon", "{} — próximamente"), + ("{} — double-click to open, {}-click to reveal", "{} — doble clic para abrir, clic con {} para mostrar"), + ("⌘/Ctrl-drag a pin to record its motion", "⌘/Ctrl + arrastra un pin para grabar su movimiento"), + ("▣ {}", "▣ {}"), + ("⚠ {} is used by:", "⚠ {} se usa en:"), + ("3D Reference Axes", "Ejes de referencia 3D"), + ("Affect all layers that use this solid", "Afectar a todas las capas que usan este sólido"), + ("Choose grid and guide options", "Elegir opciones de cuadrícula y guías"), + ("Colorize", "Colorear"), + ("Custom", "Personalizado"), + ("Custom...", "Personalizada..."), + ("Fit", "Ajustar"), + ("Fit up to 100%", "Ajustar hasta el 100%"), + ("Full", "Completa"), + ("Half", "Mitad"), + ("Only this layer uses this solid.", "Solo esta capa usa este sólido."), + ("Proportional Grid", "Cuadrícula proporcional"), + ("Quarter", "Cuarto"), + ("Region of Interest", "Región de interés"), + ("Reset Exposure", "Restablecer exposición"), + ("Show Channel and Color Management Settings", "Mostrar ajustes de canal y gestión del color"), + ("Show Snapshot (hold)", "Mostrar instantánea (mantener)"), + ("Take Snapshot", "Tomar instantánea"), + ("Third", "Tercio"), + ("Toggle Mask and Shape Path Visibility", "Alternar visibilidad de máscara y trazado de forma"), + ("Toggle Transparency Grid", "Alternar cuadrícula de transparencia"), + ("16 bits per channel", "16 bits por canal"), + ("32 bits per channel (float)", "32 bits por canal (flotante)"), + ("8 bits per channel", "8 bits por canal"), + ("Adaptive Resolution", "Resolución adaptable"), + ("Adobe-style built-in", "Integrado al estilo Adobe"), + ("Blue", "Azul"), + ("Current Settings", "Ajustes actuales"), + ("Disable Per-character 3D", "Deshabilitar 3D por carácter"), + ("Draft", "Borrador"), + ("Enable Per-character 3D", "Habilitar 3D por carácter"), + ("Fast Draft", "Borrador rápido"), + ("Fast Previews (Draft 3D, Faster Effects)", "Previsualizaciones rápidas (borrador 3D, efectos más rápidos)"), + ("Green", "Verde"), + ("Import Image Sequence", "Importar secuencia de imágenes"), + ("Import PDF / Illustrator File", "Importar archivo PDF / Illustrator"), + ("Import Photoshop File", "Importar archivo de Photoshop"), + ("Interpret Unlabeled Alpha As", "Interpretar alfa sin etiquetar como"), + ("Join the ArtCraft Discord", "Únete al Discord de ArtCraft"), + ("Mercury GPU Acceleration ({})", "Aceleración por GPU Mercury ({})"), + ("Mercury Software Only", "Solo software Mercury"), + ("OCIO (built-in ACES config)", "OCIO (configuración ACES integrada)"), + ("Off (Final Quality)", "Desactivado (calidad final)"), + ("OpenGL (compatibility)", "OpenGL (compatibilidad)"), + ("Opus Bitrate: {} kbps", "Tasa de bits de Opus: {} kbps"), + ("RGB Straight", "RGB sin premultiplicar"), + ("Red", "Rojo"), + ("Tone map", "Mapeo de tonos"), + ("Use In-Window Menu Bar on macOS", "Usar la barra de menús en la ventana en macOS"), + ("Wireframe", "Estructura alámbrica"), + ("sRGB IEC61966-2.1 (default)", "sRGB IEC61966-2.1 (predeterminado)"), + ("New Project", "Nuevo proyecto"), + ("Open Project…", "Abrir proyecto…"), + ("Templates", "Plantillas"), + ("EffectCraft home page", "Página de inicio de EffectCraft"), + ("EffectCraft on GitHub", "EffectCraft en GitHub"), + ("Motion graphics and visual effects · version {}", "Gráficos en movimiento y efectos visuales · versión {}"), + ("New Composition", "Nueva composición"), + ("Open Demo Project", "Abrir proyecto de demostración"), + ("Import Footage…", "Importar material de archivo…"), + ("Filter recent files", "Filtrar archivos recientes"), + ("NAME", "NOMBRE"), + ("OPENED", "ABIERTO"), + ("SIZE", "TAMAÑO"), + ("KIND", "TIPO"), + ("Your recent files will show here", "Tus archivos recientes aparecerán aquí"), + ("Create a new project, or open the demo project to look around.", "Crea un proyecto nuevo o abre el proyecto de demostración para explorar."), + ("No recent files match the filter", "Ningún archivo reciente coincide con el filtro"), + ("Try another name or folder.", "Prueba con otro nombre o carpeta."), + ("Just now", "Ahora mismo"), + ("Yesterday", "Ayer"), + ("{} minute ago", "Hace {} minuto"), + ("{} minutes ago", "Hace {} minutos"), + ("{} hour ago", "Hace {} hora"), + ("{} hours ago", "Hace {} horas"), + ("{} day ago", "Hace {} día"), + ("{} days ago", "Hace {} días"), + ("EffectCraft project", "Proyecto de EffectCraft"), + ("After Effects project", "Proyecto de After Effects"), + ("Lottie animation", "Animación de Lottie"), + ("Project", "Proyecto"), +]; + #[cfg(test)] mod tests { use super::*; @@ -3708,6 +4261,7 @@ mod tests { .chain(UKRAINIAN.iter().copied()) .chain(PORTUGUESE.iter().copied()) .chain(CZECH.iter().copied()) + .chain(SPANISH.iter().copied()) .collect() } @@ -3738,7 +4292,7 @@ mod tests { let hant: Vec<&str> = TRADITIONAL_CHINESE.iter().map(|(en, _)| *en).collect(); assert_eq!(hans, hant, "the two Chinese catalogs list different source strings"); // Japanese, Ukrainian and Czech may lag the Chinese catalogs: a missing row falls back to English. - for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN), ("Brazilian Portuguese", PORTUGUESE), ("Czech", CZECH)] { + for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN), ("Brazilian Portuguese", PORTUGUESE), ("Czech", CZECH), ("Spanish", SPANISH)] { let extra: Vec<&str> = cat.iter().map(|(en, _)| *en).filter(|en| !hans.contains(en)).collect(); assert!(extra.is_empty(), "the {name} catalog lists source strings the Chinese ones don't: {extra:?}"); } @@ -3796,6 +4350,22 @@ mod tests { assert_eq!(tr("Cancel"), "Cancel"); } + /// Spanish panels translate, fill values in order and keep project content; every Chinese source + /// string has a Spanish row. + #[test] + fn spanish_panels_translate_and_keep_project_content() { + let es: Vec<&str> = SPANISH.iter().map(|(en, _)| *en).collect(); + let hans: Vec<&str> = SIMPLIFIED_CHINESE.iter().map(|(en, _)| *en).collect(); + assert_eq!(es, hans, "the Spanish catalog lists different source strings than the Chinese ones"); + set_current("es"); + assert_eq!(tr("Composition Name:"), "Nombre de la composición:"); + assert_eq!(tr("Cancel"), "Cancelar"); + assert_eq!(tr("my layer.mp4"), "my layer.mp4"); + assert_eq!(tr_args("Step {} of {}: {}", &[&1, &3, &"Colour"]), "Paso 1 de 3: Colour"); + set_current("en"); + assert_eq!(tr("Cancel"), "Cancel"); + } + /// Values fill the placeholders in order, and a missing value is dropped instead of panicking. #[test] fn tr_args_fills_values_in_order() {