Internationalization: 7 languages with live switching
Custom signal-based runtime (no i18n dependency): shared src/shared/i18n dictionaries, ui I18nService.t() reactive by construction so language switches live, and a backend i18n.ts for native menus + thrown errors. Every user-facing string keyed across templates, toasts, dialogs, file kinds, columns, macOS menu/context menus, and errors. Language picker in Options (auto-detects OS locale, falls back to English); switching relabels the webview and native chrome instantly. English/Spanish/French/ German fully drafted; Chinese/Japanese/Basque drafted, flagged for native review. Docs updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
// Spanish translations. Missing keys fall back to English (see en.ts / index.ts).
|
||||
export const es = {
|
||||
common: {
|
||||
cancel: "Cancelar",
|
||||
save: "Guardar",
|
||||
close: "Cerrar",
|
||||
delete: "Eliminar",
|
||||
rename: "Renombrar",
|
||||
create: "Crear",
|
||||
apply: "Aplicar",
|
||||
choose: "Elegir…",
|
||||
connect: "Conectar",
|
||||
local: "Local",
|
||||
},
|
||||
app: {
|
||||
notConnectedTitle: "No conectado a la aplicación",
|
||||
notConnectedBody: "Esta página se ejecuta en un navegador normal. Abre la aplicación de escritorio para usarla.",
|
||||
managerOpen: "El gestor de conexiones está abierto.",
|
||||
showConnections: "Mostrar conexiones",
|
||||
},
|
||||
tabBar: {
|
||||
connections: "Conexiones",
|
||||
manageConnections: "Gestionar conexiones",
|
||||
newTab: "Nueva pestaña ({mod}T)",
|
||||
closeTab: "Cerrar pestaña ({mod}W)",
|
||||
options: "Opciones",
|
||||
},
|
||||
options: {
|
||||
title: "Opciones",
|
||||
language: "Idioma",
|
||||
system: "Sistema",
|
||||
theme: { label: "Tema", system: "Sistema", light: "Claro", dark: "Oscuro" },
|
||||
tone: { label: "Tono", dark: "Oscuro", darker: "Más oscuro" },
|
||||
accent: { label: "Acento" },
|
||||
accentNames: {
|
||||
graphite: "Grafito",
|
||||
blue: "Azul",
|
||||
indigo: "Índigo",
|
||||
purple: "Morado",
|
||||
rose: "Rosa",
|
||||
orange: "Naranja",
|
||||
green: "Verde",
|
||||
teal: "Turquesa",
|
||||
},
|
||||
fileIcons: { label: "Iconos", plain: "Simple", multi: "Color" },
|
||||
interface: { label: "Interfaz", compact: "Compacta", default: "Normal", large: "Grande" },
|
||||
speedUnit: { label: "Unidad de velocidad" },
|
||||
transfers: { label: "Transferencias", single: "Una", multi: "Varias" },
|
||||
atOnce: "A la vez",
|
||||
editor: { label: "Editor", builtin: "Integrado", custom: "Personalizado" },
|
||||
systemDefault: "Predeterminado del sistema",
|
||||
resetDefault: "Restablecer al predeterminado",
|
||||
finishedTransfers: { label: "Transferencias completadas", autoClear: "Auto-limpiar", keep: "Mantener" },
|
||||
},
|
||||
kinds: {
|
||||
folder: "Carpeta",
|
||||
symlink: "Enlace simbólico",
|
||||
file: "Archivo",
|
||||
image: "Imagen",
|
||||
audio: "Audio",
|
||||
video: "Vídeo",
|
||||
archive: "Archivo comprimido",
|
||||
code: "Código",
|
||||
document: "Documento",
|
||||
},
|
||||
columns: {
|
||||
name: "Nombre",
|
||||
size: "Tamaño",
|
||||
mtime: "Modificado",
|
||||
kind: "Tipo",
|
||||
rights: "Permisos",
|
||||
owner: "Propietario",
|
||||
group: "Grupo",
|
||||
},
|
||||
panel: {
|
||||
choosePanel: "Elige qué muestra este panel",
|
||||
copy: "Copiar",
|
||||
copyToRight: "Copiar al panel derecho (F5)",
|
||||
copyToLeft: "Copiar al panel izquierdo (F5)",
|
||||
edit: "Editar",
|
||||
editFile: "Editar archivo (F4)",
|
||||
rename: "Renombrar (F2)",
|
||||
newFolder: "Nueva carpeta (F7)",
|
||||
newFile: "Nuevo archivo",
|
||||
permissions: "Permisos",
|
||||
delete: "Eliminar",
|
||||
deleteHint: "Eliminar (F8 / Supr)",
|
||||
parentDir: "Carpeta superior (Retroceso)",
|
||||
refresh: "Actualizar",
|
||||
clearFilter: "Borrar filtro (Esc)",
|
||||
sshConfig: "~/.ssh/config",
|
||||
connectingTo: "Conectando con {name}…",
|
||||
emptyDir: "Carpeta vacía",
|
||||
noMatches: "Sin coincidencias",
|
||||
matches: { one: "{count} coincidencia · Esc", other: "{count} coincidencias · Esc" },
|
||||
},
|
||||
connMgr: {
|
||||
title: "Conexiones",
|
||||
importWinscp: "Importar de WinSCP…",
|
||||
importWinscpHint: "Importar sesiones de una exportación WinSCP.ini",
|
||||
newConnection: "Conexión",
|
||||
newConnectionHint: "Nueva conexión",
|
||||
newStack: "Grupo",
|
||||
newStackHint: "Nuevo grupo",
|
||||
expand: "Expandir",
|
||||
collapse: "Contraer",
|
||||
renameStack: "Renombrar grupo",
|
||||
deleteStack: "Eliminar grupo",
|
||||
openStack: "Abrir grupo en pestañas",
|
||||
empty: "vacío",
|
||||
connectionsHeader: "Conexiones",
|
||||
noneTitle: "Aún no hay conexiones guardadas.",
|
||||
noneBody: "Crea una o importa tus sesiones de WinSCP.",
|
||||
name: "Nombre",
|
||||
namePlaceholder: "mi servidor",
|
||||
host: "Servidor",
|
||||
port: "Puerto",
|
||||
stack: "Grupo",
|
||||
stackNone: "(ninguno)",
|
||||
username: "Usuario",
|
||||
remotePath: "Ruta remota (opcional)",
|
||||
remotePathPlaceholder: "carpeta de inicio",
|
||||
auth: "Autenticación",
|
||||
authPassword: "Contraseña",
|
||||
authKey: "Clave privada",
|
||||
password: "Contraseña",
|
||||
privateKeyFile: "Archivo de clave privada",
|
||||
passphrase: "Frase de contraseña (opcional)",
|
||||
localDir: "Carpeta local (opcional)",
|
||||
localDirPlaceholder: "~/proyectos/mi-servidor",
|
||||
localDirHint: "El otro panel se abre aquí cuando está en Local y no se ha navegado.",
|
||||
more: "Más…",
|
||||
less: "Menos…",
|
||||
selectPrompt: "Selecciona una conexión o crea una nueva.",
|
||||
newStackTitle: "Nuevo grupo",
|
||||
newStackPrompt: "nombre del grupo",
|
||||
renameStackTitle: "Renombrar grupo",
|
||||
deleteStackTitle: "Eliminar grupo",
|
||||
deleteStackBody: '¿Eliminar el grupo "{name}"? Sus conexiones se mantienen, sin agrupar.',
|
||||
deleteConnectionTitle: "Eliminar conexión",
|
||||
deleteConnectionBody: '¿Eliminar "{name}"?',
|
||||
},
|
||||
editor: {
|
||||
noFileTitle: "Ningún archivo que editar",
|
||||
noFileBody: "Esta ventana se abrió sin contexto de editor. Abre archivos desde la aplicación.",
|
||||
wrap: "Ajustar",
|
||||
wrapHint: "Ajustar líneas largas — oculta los números de línea ({alt}Z)",
|
||||
findHint: "Buscar ({mod}F)",
|
||||
findPlaceholder: "Buscar en el archivo",
|
||||
prevMatch: "Coincidencia anterior (⇧↵)",
|
||||
nextMatch: "Coincidencia siguiente (↵)",
|
||||
closeHint: "Cerrar (Esc)",
|
||||
disconnected: "Desconectado de {name} — no se podrá guardar, pero tu texto se conserva en esta ventana.",
|
||||
cantOpen: "No se puede abrir {name}",
|
||||
closeWindow: "Cerrar ventana",
|
||||
shortcuts: "{mod}S guardar · {mod}F buscar · {mod}W cerrar",
|
||||
lines: { one: "{count} línea", other: "{count} líneas" },
|
||||
close: "Cerrar",
|
||||
save: "Guardar",
|
||||
saveChangesTitle: '¿Guardar los cambios en "{name}"?',
|
||||
saveChangesBody: "Perderás tus cambios si no los guardas.",
|
||||
dontSave: "No guardar",
|
||||
countLabel: "{current} de {total}",
|
||||
noMatches: "Sin coincidencias",
|
||||
},
|
||||
transfer: {
|
||||
summary: "{active} activas · {finished} completadas",
|
||||
clearFinished: "Limpiar completadas",
|
||||
cancel: "Cancelar",
|
||||
dismiss: "Descartar",
|
||||
showDetails: "Ver detalles de transferencias",
|
||||
copying: "Copiando {name} · {percent}%{speed}",
|
||||
queued: "{count} en cola",
|
||||
failed: { one: "{count} transferencia fallida", other: "{count} transferencias fallidas" },
|
||||
finished: "Transferencias completadas",
|
||||
ready: "Listo",
|
||||
items: "{count} elementos",
|
||||
selected: "{count} seleccionados",
|
||||
queuedState: "En cola",
|
||||
scanning: "Analizando…",
|
||||
failedState: "Fallida",
|
||||
cancelled: "Cancelada",
|
||||
completedFiles: { one: "{count} archivo · {size}", other: "{count} archivos · {size}" },
|
||||
left: "{eta} restante",
|
||||
},
|
||||
dialogs: {
|
||||
chmodTitle: "Permisos",
|
||||
chmodItems: "{count} elementos",
|
||||
read: "Lectura",
|
||||
write: "Escritura",
|
||||
execute: "Ejecución",
|
||||
roleOwner: "Propietario",
|
||||
roleGroup: "Grupo",
|
||||
roleOthers: "Otros",
|
||||
octal: "Octal",
|
||||
mergeFolder: "Combinar carpeta",
|
||||
replace: "Reemplazar",
|
||||
merge: "Combinar",
|
||||
mergeAll: "Combinar todo",
|
||||
replaceAll: "Reemplazar todo",
|
||||
skip: "Omitir",
|
||||
skipAll: "Omitir todo",
|
||||
ofTotal: "{index} de {total}",
|
||||
overwriteDirBody: "El destino ya tiene una carpeta con este nombre. Combinar puede reemplazar archivos dentro.",
|
||||
overwriteFileBody: "El destino ya tiene un archivo con este nombre.",
|
||||
source: "Origen",
|
||||
destination: "Destino",
|
||||
newer: "más reciente",
|
||||
},
|
||||
toasts: {
|
||||
movedToTrash: 'Se movió "{name}" a la papelera',
|
||||
editingExternal: "Editando {name} — los cambios se suben automáticamente",
|
||||
nothingToCopy: "Nada que copiar (los enlaces simbólicos se omiten)",
|
||||
nothingToCopyAllSkipped: "Nada que copiar — se omitieron todos los elementos en conflicto",
|
||||
sameFolder: "Ambos paneles muestran la misma carpeta",
|
||||
sameFile: 'Se omitió "{name}" — es el mismo archivo',
|
||||
typeMismatch: 'Se omitió "{name}" — hay otro tipo de elemento en el camino',
|
||||
transferFailed: 'La transferencia "{name}" falló: {error}',
|
||||
unknownError: "error desconocido",
|
||||
saved: "Se guardó {name}",
|
||||
disconnectedReason: "{title}: desconectado ({reason})",
|
||||
imported: { one: "Se importó {count} conexión", other: "Se importaron {count} conexiones" },
|
||||
importedIntoStacks: { one: " en {count} grupo nuevo", other: " en {count} grupos nuevos" },
|
||||
importedSkipped: " ({skipped} omitidas)",
|
||||
leftoverTitle: "Archivos editados sobrantes",
|
||||
leftoverMore: ", +{count} más",
|
||||
leftoverBody: {
|
||||
one: "Una sesión anterior dejó {count} archivo editado temporal ({names}). ¿Eliminarlo?",
|
||||
other: "Una sesión anterior dejó {count} archivos editados temporales ({names}). ¿Eliminarlos?",
|
||||
},
|
||||
leftoverClear: "Eliminar",
|
||||
},
|
||||
fileActions: {
|
||||
deleteTitle: "Eliminar",
|
||||
deleteBody: "¿Eliminar {what}? Las carpetas se eliminan de forma recursiva. Esto no se puede deshacer.",
|
||||
deleteConfirm: "Eliminar",
|
||||
renameTitle: 'Renombrar "{name}"',
|
||||
renameConfirm: "Renombrar",
|
||||
newFolderTitle: "Nueva carpeta",
|
||||
newFolderPlaceholder: "nombre de la carpeta",
|
||||
newFileTitle: "Nuevo archivo",
|
||||
newFilePlaceholder: "nombre del archivo",
|
||||
createConfirm: "Crear",
|
||||
itemsCount: "{count} elementos",
|
||||
},
|
||||
menu: {
|
||||
about: "Acerca de {app}",
|
||||
quit: "Salir",
|
||||
file: "Archivo",
|
||||
newTab: "Nueva pestaña",
|
||||
closeTab: "Cerrar pestaña",
|
||||
newFolder: "Nueva carpeta",
|
||||
newFile: "Nuevo archivo",
|
||||
editFile: "Editar archivo",
|
||||
connect: "Conectar",
|
||||
connectionManager: "Gestor de conexiones…",
|
||||
edit: "Edición",
|
||||
view: "Ver",
|
||||
refresh: "Actualizar",
|
||||
window: "Ventana",
|
||||
},
|
||||
ctx: {
|
||||
size: "Tamaño",
|
||||
modified: "Modificado",
|
||||
kind: "Tipo",
|
||||
rights: "Permisos",
|
||||
owner: "Propietario",
|
||||
group: "Grupo",
|
||||
revealFinder: "Mostrar en Finder",
|
||||
revealExplorer: "Mostrar en el Explorador",
|
||||
revealFileManager: "Mostrar en el gestor de archivos",
|
||||
moveToTrash: "Mover a la papelera",
|
||||
moveToRecycleBin: "Mover a la papelera de reciclaje",
|
||||
newFolder: "Nueva carpeta",
|
||||
newFile: "Nuevo archivo",
|
||||
refresh: "Actualizar",
|
||||
open: "Abrir",
|
||||
openDefault: "Abrir con la aplicación predeterminada",
|
||||
edit: "Editar",
|
||||
copyToOther: "Copiar al otro panel",
|
||||
rename: "Renombrar",
|
||||
permissions: "Permisos",
|
||||
copyPath: "Copiar ruta",
|
||||
delete: "Eliminar",
|
||||
columns: "Columnas",
|
||||
trashTooltip: "La opción Restaurar de Finder no está disponible para elementos enviados a la papelera desde aquí",
|
||||
},
|
||||
errors: {
|
||||
sshAgentUnavailable: "ssh-agent no disponible (SSH_AUTH_SOCK no está definido)",
|
||||
identityFileNotFound: "archivo de identidad no encontrado: {path}",
|
||||
sessionNotConnected: 'La sesión "{id}" no está conectada',
|
||||
localCannotDisconnect: "La sesión local no se puede desconectar",
|
||||
notADirectory: '"{path}" existe y no es una carpeta',
|
||||
sameFileTransfer: '"{name}": el origen y el destino son el mismo archivo',
|
||||
sameFileNoName: "El origen y el destino son el mismo archivo",
|
||||
folderOntoItself: "No se puede copiar una carpeta sobre sí misma",
|
||||
folderIntoItself: "No se puede copiar una carpeta dentro de sí misma",
|
||||
},
|
||||
} as const;
|
||||
Reference in New Issue
Block a user