Merge reviewed synchronisation fixes and translations for Setup URI integration

This commit is contained in:
vorotamoroz
2026-10-01 01:06:37 +00:00
15 changed files with 3691 additions and 731 deletions
File diff suppressed because it is too large Load Diff
+103 -103
View File
@@ -1,22 +1,22 @@
{
", please select the option that best describes the current state of your Vault. The application will then check your files in the most appropriate way based on your selection.": ", selecciona la opción que mejor describa el estado actual de tu Vault. La aplicación comprobará entonces tus archivos de la forma más adecuada según tu elección.",
", please select the option that best describes the current state of your Vault. The application will then check your files in the most appropriate way based on your selection.": ", selecciona la opción que mejor describa el estado actual de tu bóveda. La aplicación comprobará entonces tus archivos de la forma más adecuada según tu elección.",
"(Active)": "(Activo)",
"(BETA) Always overwrite with a newer file": "(BETA) Sobrescribir siempre con archivo más nuevo",
"(Beta) Use ignore files": "(Beta) Usar archivos de ignorar",
"(Beta) Use ignore files": "(Beta) Usar archivos ignore",
"(Days passed, 0 to disable automatic-deletion)": "(Días transcurridos, 0 para desactivar)",
"(e.g., after editing many files whilst offline)": "(p. ej., tras editar muchos archivos sin conexión)",
"(e.g., after editing many files whilst offline)": "(p. ej., tras editar muchos archivos estando sin conexión)",
"(e.g., immediately after restoring on another computer, or having recovered from a backup)": "(p. ej., justo después de restaurar en otro ordenador o de recuperar una copia de seguridad)",
"(e.g., setting up for the first time on a new smartphone, starting from a clean slate)": "(p. ej., configurando por primera vez un móvil nuevo, empezando de cero)",
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": "(Ej: Leer chunks online) Lee chunks directamente en línea. Aumente tamaño de chunks personalizados",
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": "(MB) Saltar cambios en archivos locales/remotos mayores a este tamaño. Si se reduce, se usará versión nueva",
"(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.": "(Ej: Leer chunks online) Lee chunks directamente en línea. Aumenta tamaño de chunks personalizados.",
"(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.": "(MB) Si se activa, se saltarán cambios en archivos locales y remotos mayores a este tamaño. Si tamaño del archivo se reduce se usará la versión nueva.",
"(Mega chars)": "(Millones de caracteres)",
"(Missing)": "(Falta)",
"(Not recommended) If set, credentials will be stored in the file.": "(No recomendado) Almacena credenciales en el archivo",
"(Obsolete) Use an old adapter for compatibility": "(Obsoleto) Usar adaptador antiguo",
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": "(RegExp) Déjelo vacío para sincronizar todos los archivos. Defina un filtro como expresión regular para limitar los archivos que se sincronizan.",
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": "(RegExp) Si se establece, se omitirá cualquier cambio en archivos locales y remotos que coincida con este patrón.",
"(Select this if another device is already using LiveSync.) This option adds this device to that existing synchronisation setup.": "(Seleccione esto si ya utiliza la sincronización en otro ordenador o teléfono). Esta opción es adecuada si desea añadir este dispositivo a una configuración de LiveSync existente。",
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": "(Seleccione esto si está configurando este dispositivo como el primer dispositivo de sincronización). Esta opción es adecuada si es nuevo en LiveSync y desea configurarlo desde cero。",
"(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.": "(RegExp) Déjalo vacío para sincronizar todos los archivos. Definaeun filtro como expresión regular para limitar los archivos sincronizados.",
"(RegExp) If this is set, any changes to local and remote files that match this will be skipped.": "(RegExp) Si se establece, se omitirá cualquier cambio en los archivos locales y remotos que coincidan con este patrón.",
"(Select this if another device is already using LiveSync.) This option adds this device to that existing synchronisation setup.": "(Seleccione esto si ya utilizas la sincronización en otro ordenador o teléfono). Esta opción es adecuada si quieres añadir este dispositivo a una configuración de LiveSync existente。",
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.": "(Selecciona esto si estás configurando este dispositivo como el primer dispositivo de sincronización). Esta opción es adecuada si eres nuevo en LiveSync y quieres configurarlo desde cero。",
"↑: Overwrite Remote": "↑: Sobrescribir remoto",
"↓: Overwrite Local": "↓: Sobrescribir local",
"⇅: Use newer": "⇅: Usar el más nuevo",
@@ -34,7 +34,7 @@
"🗑 Delete": "🗑 Eliminar",
"🟢 Connected": "🟢 Conectado",
"${count} issue(s) detected!": "¡${count} problema(s) detectado(s)!",
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": "Un URI de configuración es una única cadena de texto que contiene la dirección del servidor y los datos de autenticación. Si el script de instalación de su servidor generó un URI, usarlo proporciona una configuración sencilla y segura。",
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.": "Un URI de configuración es una única cadena de texto que contiene la dirección del servidor y los datos de autenticación. Si el script de instalación de tu servidor generó un URI, usarla proporciona una configuración sencilla y segura。",
"Accept": "Aceptar",
"Accept in session": "Aceptar en esta sesión",
"ACCEPTED": "ACEPTADO",
@@ -46,25 +46,25 @@
"Active Remote Configuration": "Configuración remota activa",
"Add default patterns": "Añadir patrones predeterminados",
"Add new connection": "Añadir conexión",
"AddOn Module (ConfigSync) has not been loaded. This is very unexpected situation. Please report this issue.": "El módulo complementario (ConfigSync) no se ha cargado. Esta situación es muy inesperada. Informa de este problema.",
"AddOn Module (HiddenFileSync) has not been loaded. This is very unexpected situation. Please report this issue.": "El módulo complementario (HiddenFileSync) no se ha cargado. Esta situación es muy inesperada. Informa de este problema.",
"AddOn Module (ConfigSync) has not been loaded. This is very unexpected situation. Please report this issue.": "El módulo complementario (ConfigSync) no se ha cargado. Esta situación es muy inesperada. Por favor informa de este problema.",
"AddOn Module (HiddenFileSync) has not been loaded. This is very unexpected situation. Please report this issue.": "El módulo complementario (HiddenFileSync) no se ha cargado. Esta situación es muy inesperada. Por favor informa de este problema.",
"Advanced": "Avanzado",
"Advanced Settings": "Ajustes avanzados",
"After restarting, the data on this device will be uploaded to the server as the 'master copy'. Please be aware that any unintended data currently on the server will be completely overwritten.": "Tras reiniciar, los datos de este dispositivo se subirán al servidor como «copia maestra». Ten en cuenta que cualquier dato no deseado que haya ahora en el servidor se sobrescribirá por completo.",
"After restarting, the database on this device will be rebuilt using data from the server. If there are any unsynchronised files in this vault, conflicts may occur with the server data.": "Tras reiniciar, la base de datos de este dispositivo se reconstruirá con los datos del servidor. Si hay archivos sin sincronizar en este vault, pueden producirse conflictos con los datos del servidor.",
"After that, synchronise to a brand new vault on each other device with the new remote one by one.": "Después, sincroniza con un vault totalmente nuevo en cada uno de los demás dispositivos, uno por uno, usando el nuevo remoto.",
"After restarting, the data on this device will be uploaded to the server as the 'master copy'. Please be aware that any unintended data currently on the server will be completely overwritten.": "Tras reiniciar, los datos de este dispositivo se subirán al servidor como «copia maestra». Ten en cuenta que cualquier dato en el servidor se sobrescribirá por completo.",
"After restarting, the database on this device will be rebuilt using data from the server. If there are any unsynchronised files in this vault, conflicts may occur with the server data.": "Tras reiniciar, la base de datos de este dispositivo se reconstruirá con los datos del servidor. Si hay archivos sin sincronizar en esta bóveda pueden producirse conflictos con los datos del servidor.",
"After that, synchronise to a brand new vault on each other device with the new remote one by one.": "Después, sincroniza con una bóveda totalmente nueva en cada uno de los demás dispositivos, uno por uno, usando el nuevo remoto.",
"All checks passed successfully!": "¡Todas las comprobaciones se han superado correctamente!",
"All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.": "Todos los dispositivos tienen el mismo valor de progreso (${progress}). Parece que están sincronizados, por lo que se puede continuar con la recolección de basura.",
"All the same or non-existent": "Todo igual o inexistente",
"Allow in session": "Permitir en esta sesión",
"Allow permanently": "Permitir permanentemente",
"Also, please note that if you are using Peer-to-Peer synchronization, this configuration will be used when you switch to other methods and connect to a remote server in the future.": "Además, si usas sincronización punto a punto, esta configuración se aplicará cuando en el futuro cambies a otros métodos y te conectes a un servidor remoto.",
"Always prompt merge conflicts": "Siempre preguntar en conflictos",
"Also, please note that if you are using Peer-to-Peer synchronization, this configuration will be used when you switch to other methods and connect to a remote server in the future.": "Además, si usas sincronización punto a punto, esta configuración también se aplicará en el futuro si cambias a otros métodos de sincronización y te conectas a un servidor remoto.",
"Always prompt merge conflicts": "Siempre preguntar cuando haya conflictos",
"Analyse": "Analizar",
"Analyse database usage": "Analizar el uso de la base de datos",
"Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.": "Analiza el uso de la base de datos y genera un informe TSV para que puedas diagnosticarlo tú mismo. Puedes pegar el informe generado en la hoja de cálculo que prefieras.",
"Apply All Selected": "Aplicar todo lo seleccionado",
"Apply Latest Change if Conflicting": "Aplicar último cambio en conflictos",
"Apply Latest Change if Conflicting": "Aplicar último cambio si hay conflictos",
"Apply preset configuration": "Aplicar configuración predefinida",
"Apply the settings": "Aplicar los ajustes",
"Ask a passphrase at every launch": "Solicitar la frase de contraseña en cada inicio",
@@ -75,11 +75,11 @@
"Available Peers": "Pares disponibles",
"Back": "Volver",
"Back to non-configured": "Volver a no configurado",
"Batch database update": "Actualización por lotes de BD",
"Batch database update": "Actualización de base de datos por lotes",
"Batch limit": "Límite de lotes",
"Batch size": "Tamaño de lote",
"Batch size of on-demand fetching": "Tamaño de lote para obtención bajo demanda",
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": "Antes de v0.17.16 usábamos adaptador antiguo. Nuevo adaptador requiere reconstruir BD local. Desactive cuando pueda",
"Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.": "Antes de v0.17.16 se usaba el adaptador antiguo. El nuevo adaptador requiere reconstruir la base de datos local. Por favor desactiva esta opción cuando puedas. Si está activa cuando se sincroniza la base de datos se intentará desactivar de nuevo.",
"Broadcasting?": "¿Difusión?",
"Bucket Name": "Nombre del bucket",
"by resetting the remote, you will be informed on other devices.": "al restablecer el remoto, se te avisará en los demás dispositivos.",
@@ -101,7 +101,7 @@
"Comma separated `.gitignore, .dockerignore`": "Separados por comas: `.gitignore, .dockerignore`",
"Command": "Comando",
"Communicating": "Comunicando",
"Compaction in progress on remote database...": "Compactación en curso en la base de datos remota...",
"Compaction in progress on remote database...": "Compactación en curso de la base de datos remota...",
"Compaction on remote database completed successfully.": "La compactación de la base de datos remota se ha completado correctamente.",
"Compaction on remote database failed.": "La compactación de la base de datos remota ha fallado.",
"Compaction on remote database timed out.": "La compactación de la base de datos remota ha superado el tiempo de espera.",
@@ -121,7 +121,7 @@
"Configure And Change Remote": "Configurar y cambiar remoto",
"Configure E2EE": "Configurar E2EE",
"Configure Remote": "Configurar remoto",
"Configure the same server information as your other devices again, manually, very advanced users only.": "Configure manualmente la misma información del servidor que en sus otros dispositivos. Solo para usuarios muy avanzados。",
"Configure the same server information as your other devices again, manually, very advanced users only.": "Configura manualmente la misma información del servidor que en sus otros dispositivos. Solo para usuarios muy avanzados。",
"Connect": "Conectar",
"Connect to existing database and continue": "Conectar a la base de datos existente y continuar",
"Connected to Signaling Server (as Peer ID: ${peerId})": "Conectado al servidor de señalización (como ID de par: ${peerId})",
@@ -181,9 +181,9 @@
"Device Setup Method": "Método de configuración del dispositivo",
"Devices:": "Dispositivos:",
"Diagnostic RTCPeerConnection is enabled": "El RTCPeerConnection de diagnóstico está habilitado",
"dialog.yourLanguageAvailable": "Self-hosted LiveSync tenía traducciones para tu idioma, así que se ha activado el ajuste %{Display Language}.\n\nNota: no todos los mensajes están traducidos. ¡Esperamos tus contribuciones!\nNota 2: si abres una incidencia, **vuelve antes a %{lang-def}** y luego haz las capturas de pantalla y recoge los mensajes y registros. Puedes hacerlo desde el diálogo de ajustes.\n¡Que lo disfrutes!",
"dialog.yourLanguageAvailable": "Self-hosted LiveSync tiene traducciones para tu idioma, así que se ha activado el ajuste %{Display Language}.\n\nNota: no todos los mensajes están traducidos. ¡Esperamos tus contribuciones!\nNota 2: si abres una incidencia, **vuelve antes a %{lang-def}** y luego haz las capturas de pantalla y recoge los mensajes y registros. Puedes hacerlo desde el diálogo de ajustes.\n¡Que lo disfrutes!",
"dialog.yourLanguageAvailable.btnRevertToDefault": "Mantener %{lang-def}",
"dialog.yourLanguageAvailable.Title": " ¡Hay traducción disponible!",
"dialog.yourLanguageAvailable.Title": " ¡Hay una traducción disponible!",
"Diff": "Diferencias",
"Different": "Distinto",
"Disables all synchronization and restart.": "Desactiva toda la sincronización y reinicia la aplicación.",
@@ -202,7 +202,7 @@
"Doctor.Button.No": "No",
"Doctor.Button.Skip": "Dejarlo como está",
"Doctor.Button.Yes": "Sí",
"Doctor.Dialogue.Main": "¡Hola! El Doctor de configuración se ha activado por ${activateReason}.\nPor desgracia, se han detectado algunos ajustes como posibles problemas.\nTranquilo: los resolveremos uno a uno.\n\nPara que lo sepas de antemano, te preguntaremos por los siguientes puntos.\n\n${issues}\n\n¿Empezamos?",
"Doctor.Dialogue.Main": "¡Hola! El Doctor de configuración se ha activado por ${activateReason}.\nPor desgracia, se han detectado algunos ajustes como posibles problemas.\nTranquilo: los resolveremos uno a uno.\n\nPara que lo sepas de antemano, te preguntaremos por lo siguiente.\n\n${issues}\n\n¿Empezamos?",
"Doctor.Dialogue.MainFix": "\n## ${name}\n\n| Actual | Ideal |\n|:---:|:---:|\n| ${current} | ${ideal} |\n\n**Nivel de recomendación:** ${level}\n\n### ¿Por qué se ha detectado?\n\n${reason}\n\n${note}\n\n¿Ajustarlo al valor ideal?",
"Doctor.Dialogue.Title": "Doctor de configuración de Self-hosted LiveSync",
"Doctor.Dialogue.TitleAlmostDone": "¡Casi hemos terminado!",
@@ -212,8 +212,8 @@
"Doctor.Level.Optional": "Opcional",
"Doctor.Level.Recommended": "Recomendado",
"Doctor.Message.NoIssues": "¡No se ha detectado ningún problema!",
"Doctor.Message.RebuildLocalRequired": "¡Atención! Hay que reconstruir la base de datos local para aplicar esto.",
"Doctor.Message.RebuildRequired": "¡Atención! Hay que reconstruir para aplicar esto.",
"Doctor.Message.RebuildLocalRequired": "¡Atención! Hay que reconstruir la base de datos local",
"Doctor.Message.RebuildRequired": "¡Atención! Hay que reconstruir la base de datos",
"Doctor.Message.SomeSkipped": "Hemos dejado algunos problemas sin resolver. ¿Quieres que te lo pregunte de nuevo en el próximo inicio?",
"Doctor.RULES.E2EE_V02500.REASON": "El cifrado de extremo a extremo es ahora más robusto y más rápido. Además, una nueva revisión del código reveló que el E2EE anterior estaba comprometido, por lo que conviene aplicarlo cuanto antes. Lamentamos de veras las molestias. Este ajuste no es compatible con versiones anteriores: todos los dispositivos sincronizados deben actualizarse a la v0.25.0 o superior. No es necesario reconstruir (los datos se convertirán al nuevo formato durante la transferencia), pero se recomienda hacerlo siempre que sea posible.",
"Document History": "Historial del documento",
@@ -233,8 +233,8 @@
"Enable this if your Object Storage doesn't support CORS": "Habilitar si su almacenamiento no soporta CORS",
"Enable this option to automatically apply the most recent change to documents even when it conflicts": "Aplicar cambios recientes automáticamente aunque generen conflictos",
"Enabled": "Habilitado",
"Enabling end-to-end encryption ensures that your data is encrypted on your device before being sent to the remote server. This means that even if someone gains access to the server, they won't be able to read your data without the passphrase. Make sure to remember your passphrase, as it will be required to decrypt your data on other devices.": "Activar el cifrado de extremo a extremo garantiza que tus datos se cifren en tu dispositivo antes de enviarse al servidor remoto. Así, aunque alguien acceda al servidor, no podrá leer tus datos sin la frase de contraseña. Recuérdala bien, porque será necesaria para descifrar tus datos en los demás dispositivos.",
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": "Cifrar contenido en la base de datos remota. Se recomienda habilitar si usa la sincronización del plugin.",
"Enabling end-to-end encryption ensures that your data is encrypted on your device before being sent to the remote server. This means that even if someone gains access to the server, they won't be able to read your data without the passphrase. Make sure to remember your passphrase, as it will be required to decrypt your data on other devices.": "Activar el cifrado de extremo a extremo garantiza que tus datos se cifren en tu dispositivo antes de enviarse al servidor remoto. Así, aunque alguien acceda al servidor, no podrá leer tus datos sin la frase de contraseña. Recuérdala bien porque será necesaria para descifrar tus datos en los demás dispositivos.",
"Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.": "Cifrar contenido en la base de datos remota. Se recomienda habilitar si usa la sincronización del complemento.",
"Encrypting sensitive configuration items": "Cifrando elementos sensibles",
"Encryption Algorithm": "Algoritmo de cifrado",
"Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.": "Frase de cifrado. Si la cambia, sobrescriba la base del servidor con los nuevos archivos cifrados.",
@@ -269,13 +269,13 @@
"Failed to connect to the server. Please check your settings.": "No se pudo conectar al servidor. Revisa tus ajustes.",
"Failed to connect to the signalling relay: ${reason}": "No se pudo conectar al relé de señalización: ${reason}",
"Failed to create replicator instance.": "No se pudo crear la instancia del replicador.",
"Failed to parse Setup-URI.": "No se pudo interpretar el Setup-URI.",
"Failed to parse Setup-URI.": "No se pudo interpretar el Setup URI.",
"Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.": "No se pudo iniciar la replicación puntual previa a la recolección de basura. Recolección de basura cancelada.",
"Failed to start replication after Garbage Collection.": "No se pudo iniciar la replicación después de la recolección de basura.",
"Failed:": "Fallidas:",
"Fetch": "Obtener",
"Fetch chunks on demand": "Obtener chunks bajo demanda",
"Fetch database with previous behaviour": "Obtener BD con comportamiento anterior",
"Fetch database with previous behaviour": "Obtener base de datos con comportamiento anterior",
"Fetch remote settings": "Obtener ajustes remotos",
"FETCHING": "OBTENIENDO",
"Fetching status...": "Obteniendo el estado...",
@@ -284,12 +284,12 @@
"File to view History": "Archivo cuyo historial se va a ver",
"Filename": "Nombre de archivo",
"Final Confirmation: Overwrite Server Data with This Device's Files": "Confirmación final: sobrescribir los datos del servidor con los archivos de este dispositivo",
"First, please select the option that best describes your current situation.": "Primero, seleccione la opción que describa mejor su situación actual。",
"First, please select the option that best describes your current situation.": "Primero, seleccione la opción que mejor describa tu situación actual。",
"Fix": "Corregir",
"Flag and restart": "Marcar y reiniciar",
"Flagged Selective": "Selectivo marcado",
"Folder Prefix": "Prefijo de carpeta",
"For HS256/HS512 algorithms, provide the shared secret key. For ES256/ES512 algorithms, provide the pkcs8 PEM-formatted private key.": "Para los algoritmos HS256/HS512, indica la clave secreta compartida. Para ES256/ES512, indica la clave privada en formato PEM pkcs8.",
"For HS256/HS512 algorithms, provide the shared secret key. For ES256/ES512 algorithms, provide the pkcs8 PEM-formatted private key.": "Indica la clave secreta compartida para los algoritmos HS256/HS512. Para ES256/ES512, indica la clave privada en formato PEM pkcs8.",
"Forces the file to be synced when opened.": "Forzar sincronización al abrir archivo",
"Fresh Start Wipe": "Borrado para reinicio completo",
"Furthermore, if conflicts are already present in the server data, they will be synchronised to this device as they are, and you will need to resolve them locally.": "Además, si ya hay conflictos en los datos del servidor, se sincronizarán tal cual a este dispositivo y tendrás que resolverlos localmente.",
@@ -313,37 +313,37 @@
"Higher (${local} > ${remote})": "Superior (${local} > ${remote})",
"Highlight diff": "Resaltar las diferencias",
"How to display network errors when the sync server is unreachable.": "Cómo mostrar los errores de red cuando el servidor de sincronización no está disponible.",
"How would you like to configure the connection to your server?": "¿Cómo desea configurar la conexión con su servidor?",
"How would you like to configure the connection to your server?": "¿Cómo quieres configurar la conexión con tu servidor?",
"However, This should not be enabled if you want to increase your secrecy more.": "Sin embargo, esto no debería habilitarse si quieres aumentar aún más tu privacidad.",
"I am adding a device to an existing synchronisation setup": "Estoy agregando un dispositivo a una configuración de sincronización existente",
"I am setting this up for the first time": "Estoy configurando esto por primera vez",
"I am setting up a new server for the first time / I want to reset my existing server.": "Estoy configurando un servidor nuevo por primera vez / quiero restablecer mi servidor actual.",
"I am unable to create a backup of my Vault.": "No puedo crear una copia de seguridad de mi Vault.",
"I am unable to create a backup of my Vaults.": "No puedo crear una copia de seguridad de mis Vaults.",
"I have created a backup of my Vault.": "He creado una copia de seguridad de mi Vault.",
"I know my server details, let me enter them": "Conozco los datos de mi servidor; permítame introducirlos",
"I am unable to create a backup of my Vault.": "No puedo crear una copia de seguridad de mi bóveda.",
"I am unable to create a backup of my Vaults.": "No puedo crear una copia de seguridad de mis bóvedas.",
"I have created a backup of my Vault.": "He creado una copia de seguridad de mi bóveda.",
"I know my server details, let me enter them": "Conozco los datos de mi servidor; déjame introducirlos",
"I understand that all changes made on other smartphones or computers possibly could be lost.": "Entiendo que todos los cambios hechos en otros móviles u ordenadores podrían perderse.",
"I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.": "Entiendo que los demás dispositivos ya no podrán sincronizar y que habrá que restablecer su información de sincronización.",
"I understand that this action is irreversible once performed.": "Entiendo que esta acción es irreversible una vez realizada.",
"I understand the risks and will proceed without a backup.": "Entiendo los riesgos y continuaré sin copia de seguridad.",
"I Understand, Overwrite Server": "Lo entiendo, sobrescribir el servidor",
"If \"Auto Start P2P Connection\" is enabled, the P2P connection will be started automatically when the plug-in launches.": "Si «Iniciar la conexión P2P automáticamente» está activado, la conexión P2P se iniciará al arrancar el complemento.",
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": "Si se desactiva, chunks se dividen en hilo UI (comportamiento anterior)",
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": "Habilita sincronización eficiente por archivo. Requiere migración y actualizar todos dispositivos a v0.23.18. Pierde compatibilidad con versiones antiguas",
"If \"Auto Start P2P Connection\" is enabled, the P2P connection will be started automatically when the plug-in launches.": "Si «Iniciar la conexión P2P automáticamente» está activada, la conexión P2P se iniciará al arrancar el complemento.",
"If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": "Si se desactiva, los chunks se dividen en el hilo de UI (comportamiento anterior)",
"If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.": "Habilita sincronización eficiente por archivo. Requiere migración y actualizar todos los dispositivos a v0.23.18. Pierde compatibilidad con versiones antiguas.",
"If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.": "Divide chunks en máximo 100 ítems. Menos eficiente en deduplicación",
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": "Chunks nuevos se mantienen temporalmente en el documento hasta estabilizarse",
"If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.": "Chunks nuevos se mantienen temporalmente en el documento hasta estabilizarse.",
"If enabled, the ⛔ icon will be shown inside the status instead of the file warnings banner. No details will be shown.": "Si se activa, se mostrará el icono ⛔ en el estado en lugar del banner de advertencia de archivos. No se mostrarán detalles.",
"If enabled, the file under 1kb will be processed in the UI thread.": "Archivos <1kb se procesan en hilo UI",
"If enabled, the file under 1kb will be processed in the UI thread.": "Archivos <1kb se procesan en el hilo de UI",
"If enabled, the notification of hidden files change will be suppressed.": "Si se habilita, se suprimirá la notificación de cambios en archivos ocultos.",
"If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour)": "Si se habilita, todos los chunks se almacenan con la revisión hecha desde su contenido. (comportamiento anterior)",
"If this enabled, All files are handled as case-Sensitive (Previous behaviour).": "Si se habilita, todos los archivos se manejan como sensibles a mayúsculas (comportamiento anterior)",
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": "Divide chunks en segmentos semánticos. No todos los sistemas lo soportan",
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": "Saltar cambios en archivos locales que coincidan con ignore files. Cambios remotos usan ignore files locales",
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": "Mantiene conexión 60s. Si no hay cambios, reinicia socket. Útil con proxies limitantes",
"If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.": "Divide chunks en segmentos semánticos. No todos los sistemas lo soportan.",
"If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.": "Saltar cambios en archivos locales que coincidan con ignore files. Cambios remotos usan ignore files locales.",
"If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.": "Mantiene una conexión abierta por 60s en CouchDB. Si no hay cambios, se reinicia socket en vez de dejarlo abierto de forma indefinida. Útil con proxies limitantes pero puede aumentar el uso de recursos.",
"If you cannot avoid CORS issues, you might want to try this option. It uses Obsidian's internal API to communicate with the CouchDB server. Not compliant with web standards, but works. Note that this might break in future Obsidian versions.": "Si no puedes evitar problemas de CORS, prueba esta opción. Usa la API interna de Obsidian para comunicarse con el servidor CouchDB. No cumple los estándares web, pero funciona. Ten en cuenta que podría dejar de funcionar en versiones futuras de Obsidian.",
"If you cannot avoid CORS issues, you might want to try this option. It uses Obsidian's internal API to communicate with the S3 server. Not compliant with web standards, but works. Note that this might break in future Obsidian versions.": "Si no puedes evitar problemas de CORS, prueba esta opción. Usa la API interna de Obsidian para comunicarse con el servidor S3. No cumple los estándares web, pero funciona. Ten en cuenta que podría dejar de funcionar en versiones futuras de Obsidian.",
"If you have unsynchronised changes in your Vault on this device, they will likely diverge from the server's versions after the reset. This may result in a large number of file conflicts.": "Si tienes cambios sin sincronizar en el Vault de este dispositivo, es probable que divergan de las versiones del servidor tras el restablecimiento. Esto puede provocar un gran número de conflictos de archivos.",
"If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value.": "Si alcanzas el límite de tamaño de carga al usar IBM Cloudant, reduce el tamaño de lote y el límite de lote.",
"If you have unsynchronised changes in your Vault on this device, they will likely diverge from the server's versions after the reset. This may result in a large number of file conflicts.": "Si tienes cambios sin sincronizar en la bóveda de este dispositivo, es probable que diverjan de las versiones del servidor tras el restablecimiento. Esto puede provocar un gran número de conflictos de archivos.",
"If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value.": "Si alcanzas el límite de tamaño de carga al usar IBM Cloudant, por favor reduce el tamaño de lote y el límite de lote.",
"If you understand the risks and still wish to proceed, select so.": "Si entiendes los riesgos y aun así quieres continuar, indícalo.",
"If you want to store the data in a specific folder within the bucket, you can specify a folder prefix here. Otherwise, leave it blank to store data at the root of the bucket.": "Si quieres guardar los datos en una carpeta concreta del bucket, indica aquí un prefijo de carpeta. Si no, déjalo vacío para guardarlos en la raíz del bucket.",
"If you want to use `LiveSync`, you should broadcast changes. All `watching` peers which detects this will start the replication for fetching.": "Si quieres usar `LiveSync`, debes difundir los cambios. Todos los pares que estén `observando` y lo detecten iniciarán la replicación para obtenerlos.",
@@ -353,7 +353,7 @@
"Ignore patterns": "Patrones de exclusión",
"Import connection": "Importar conexión",
"IMPORTANT": "IMPORTANTE",
"In most cases, you should stick with the default algorithm (${algorithm}), This setting is only required if you have an existing Vault encrypted in a different format.": "En la mayoría de los casos deberías mantener el algoritmo predeterminado (${algorithm}). Este ajuste solo es necesario si ya tienes un Vault cifrado en otro formato.",
"In most cases, you should stick with the default algorithm (${algorithm}), This setting is only required if you have an existing Vault encrypted in a different format.": "En la mayoría de los casos deberías mantener el algoritmo predeterminado (${algorithm}). Este ajuste solo es necesario si ya tienes una bóveda cifrada en otro formato.",
"In this scenario, Self-hosted LiveSync will recreate metadata for every file and deliberately generate conflicts. Where the file content is identical, these conflicts will be resolved automatically.": "En este caso, Self-hosted LiveSync recreará los metadatos de todos los archivos y generará conflictos a propósito. Cuando el contenido del archivo sea idéntico, esos conflictos se resolverán automáticamente.",
"Incoming:": "Entrantes:",
"Incubate Chunks in Document": "Incubar chunks en documento",
@@ -470,16 +470,16 @@
"moduleInputUIObsidian.defaultTitleSelect": "Seleccionar",
"moduleInputUIObsidian.optionNo": "No",
"moduleInputUIObsidian.optionYes": "Sí",
"moduleLiveSyncMain.logAdditionalSafetyScan": "Escanéo de seguridad adicional...",
"moduleLiveSyncMain.logAdditionalSafetyScan": "Escaneo de seguridad adicional...",
"moduleLiveSyncMain.logLoadingPlugin": "Cargando complemento...",
"moduleLiveSyncMain.logPluginInitCancelled": "La inicialización del complemento fue cancelada por un módulo",
"moduleLiveSyncMain.logPluginVersion": "Self-hosted LiveSync v${manifestVersion} ${packageVersion}",
"moduleLiveSyncMain.logReadChangelog": "LiveSync se ha actualizado, ¡por favor lee el registro de cambios!",
"moduleLiveSyncMain.logSafetyScanCompleted": "Escanéo de seguridad adicional completado",
"moduleLiveSyncMain.logSafetyScanCompleted": "Escaneo de seguridad adicional completado",
"moduleLiveSyncMain.logSafetyScanFailed": "El escaneo de seguridad adicional ha fallado en un módulo",
"moduleLiveSyncMain.logUnloadingPlugin": "Descargando complemento...",
"moduleLiveSyncMain.logVersionUpdate": "LiveSync se ha actualizado, en caso de actualizaciones que rompan, toda la sincronización automática se ha desactivado temporalmente. Asegúrate de que todos los dispositivos estén actualizados antes de habilitar.",
"moduleLiveSyncMain.msgScramEnabled": "Self-hosted LiveSync se ha configurado para ignorar algunos eventos. ¿Es esto correcto?\n\n| Tipo | Estado | Nota |\n|:---:|:---:|---|\n| Eventos de almacenamiento | ${fileWatchingStatus} | Se ignorará cada modificación |\n| Eventos de base de datos | ${parseReplicationStatus} | Cada cambio sincronizado se pospondrá |\n\n¿Quieres reanudarlos y reiniciar Obsidian?\n\n> [!DETAILS]-\n> Estas banderas son establecidas por el complemento mientras se reconstruye o se obtiene. Si el proceso termina de forma anormal, puede mantenerse sin querer.\n> Si no estás seguro, puedes intentar volver a ejecutar estos procesos. Asegúrate de hacer una copia de seguridad de tu bóveda.\n",
"moduleLiveSyncMain.msgScramEnabled": "Self-hosted LiveSync se ha configurado para ignorar algunos eventos. ¿Es esto correcto?\n\n| Tipo | Estado | Nota |\n|:---:|:---:|---|\n| Eventos de almacenamiento | ${fileWatchingStatus} | Se ignorará cada modificación |\n| Eventos de base de datos | ${parseReplicationStatus} | Cada cambio sincronizado se pospondrá |\n\n¿Quieres reanudarlos y reiniciar Obsidian?\n\n> [!DETAILS]-\n> Estas banderas son establecidas por el complemento mientras se reconstruye o se obtiene. Si el proceso termina de forma anormal, puede mantenerse sin querer.\n> Si no estás seguro puedes intentar volver a ejecutar estos procesos. Asegúrate de hacer una copia de seguridad de tu bóveda.\n",
"moduleLiveSyncMain.optionKeepLiveSyncDisabled": "Mantener LiveSync desactivado",
"moduleLiveSyncMain.optionResumeAndRestart": "Reanudar y reiniciar Obsidian",
"moduleLiveSyncMain.titleScramEnabled": "Scram habilitado",
@@ -495,7 +495,7 @@
"moduleMigration.insecureChunkExist.buttons.later": "Lo haré más tarde",
"moduleMigration.insecureChunkExist.buttons.rebuild": "Reconstruir todo",
"moduleMigration.insecureChunkExist.laterMessage": "¡Te recomendamos encarecidamente solucionarlo cuanto antes!",
"moduleMigration.insecureChunkExist.message": "Algunos chunks no se almacenan de forma segura y no están cifrados en las bases de datos.\n**Reconstruye la base de datos para solucionarlo**.\n\nSi tu base de datos remota no está configurada con SSL o usa credenciales poco seguras, **corres el riesgo de exponer datos sensibles**.\n\nNota: actualiza Self-hosted LiveSync a la v0.25.6 o superior en todos tus dispositivos y haz una copia de seguridad fiable de tu vault.\nNota 2: reconstruir todo y obtener los datos consume algo de tiempo y de tráfico; hazlo en horas de poco uso y con una conexión de red estable.\n",
"moduleMigration.insecureChunkExist.message": "Algunos chunks no se almacenan de forma segura y no están cifrados en las bases de datos.\n**Reconstruye la base de datos para solucionarlo**.\n\nSi tu base de datos remota no está configurada con SSL o usa credenciales poco seguras, **corres el riesgo de exponer datos sensibles**.\n\nNota: actualiza Self-hosted LiveSync a la v0.25.6 o superior en todos tus dispositivos y haz una copia de seguridad fiable de tu bóveda.\nNota 2: reconstruir todo y obtener los datos consume algo de tiempo y de tráfico; hazlo en horas de poco uso y con una conexión de red estable.\n",
"moduleMigration.insecureChunkExist.title": "¡Se han encontrado chunks no seguros!",
"moduleMigration.logBulkSendCorrupted": "El envío de fragmentos en bloque se ha habilitado, sin embargo, esta función se ha corrompido. Disculpe las molestias. Deshabilitado automáticamente.",
"moduleMigration.logFetchRemoteTweakFailed": "Error al obtener los valores de ajuste remoto",
@@ -626,7 +626,7 @@
"obsidianLiveSyncSettingTab.msgEnableCorsChttpd": "Establecer chttpd.enable_cors",
"obsidianLiveSyncSettingTab.msgEnableEncryptionRecommendation": "Recomendamos habilitar el cifrado de extremo a extremo y la obfuscación de ruta. ¿Estás seguro de querer continuar sin cifrado?",
"obsidianLiveSyncSettingTab.msgFetchConfigFromRemote": "¿Quieres obtener la configuración del servidor remoto?",
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": "Si la configuración del servidor no es persistente (por ejemplo, ejecutándose en docker), los valores aquí pueden cambiar. Una vez que puedas conectarte, por favor actualiza las configuraciones en el local.ini del servidor.",
"obsidianLiveSyncSettingTab.msgIfConfigNotPersistent": "Si la configuración del servidor no es persistente (por ejemplo, ejecutándose en Docker), los valores aquí pueden cambiar. Una vez que puedas conectarte, por favor actualiza las configuraciones en el local.ini del servidor.",
"obsidianLiveSyncSettingTab.msgInvalidPassphrase": "Tu frase de contraseña de cifrado podría ser inválida. ¿Estás seguro de querer continuar?",
"obsidianLiveSyncSettingTab.msgNewVersionNote": "¿Aquí debido a una notificación de actualización? Por favor, revise el historial de versiones. Si está satisfecho, haga clic en el botón. Una nueva actualización volverá a mostrar esto.",
"obsidianLiveSyncSettingTab.msgNonHTTPSInfo": "Configurado como URI que no es HTTPS. Ten en cuenta que esto puede no funcionar en dispositivos móviles.",
@@ -659,15 +659,15 @@
"obsidianLiveSyncSettingTab.okAdminPrivileges": "✔ Tienes privilegios de administrador.",
"obsidianLiveSyncSettingTab.okCorsCredentials": "✔ cors.credentials está correcto.",
"obsidianLiveSyncSettingTab.okCorsCredentialsForOrigin": "CORS credenciales OK",
"obsidianLiveSyncSettingTab.okCorsOriginMatched": "✔ Origen de CORS correcto",
"obsidianLiveSyncSettingTab.okCorsOrigins": "✔ cors.origins está correcto.",
"obsidianLiveSyncSettingTab.okEnableCors": "✔ httpd.enable_cors está correcto.",
"obsidianLiveSyncSettingTab.okCorsOriginMatched": "✔ Origen de CORS es correcto",
"obsidianLiveSyncSettingTab.okCorsOrigins": "✔ cors.origins es correcto.",
"obsidianLiveSyncSettingTab.okEnableCors": "✔ httpd.enable_cors es correcto.",
"obsidianLiveSyncSettingTab.okEnableCorsChttpd": "✔ chttpd.enable_cors es correcto.",
"obsidianLiveSyncSettingTab.okMaxDocumentSize": "✔ couchdb.max_document_size está correcto.",
"obsidianLiveSyncSettingTab.okMaxRequestSize": "✔ chttpd.max_http_request_size está correcto.",
"obsidianLiveSyncSettingTab.okRequireValidUser": "✔ chttpd.require_valid_user está correcto.",
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": "✔ chttpd_auth.require_valid_user está correcto.",
"obsidianLiveSyncSettingTab.okWwwAuth": "✔ httpd.WWW-Authenticate está correcto.",
"obsidianLiveSyncSettingTab.okMaxDocumentSize": "✔ couchdb.max_document_size es correcto.",
"obsidianLiveSyncSettingTab.okMaxRequestSize": "✔ chttpd.max_http_request_size es correcto.",
"obsidianLiveSyncSettingTab.okRequireValidUser": "✔ chttpd.require_valid_user es correcto.",
"obsidianLiveSyncSettingTab.okRequireValidUserAuth": "✔ chttpd_auth.require_valid_user es correcto.",
"obsidianLiveSyncSettingTab.okWwwAuth": "✔ httpd.WWW-Authenticate es correcto.",
"obsidianLiveSyncSettingTab.optionApply": "Aplicar",
"obsidianLiveSyncSettingTab.optionCancel": "Cancelar",
"obsidianLiveSyncSettingTab.optionCouchDB": "CouchDB",
@@ -680,7 +680,7 @@
"obsidianLiveSyncSettingTab.optionOnEvents": "En eventos",
"obsidianLiveSyncSettingTab.optionPeriodicAndEvents": "Periódico y en eventos",
"obsidianLiveSyncSettingTab.optionPeriodicWithBatch": "Periódico con lote",
"obsidianLiveSyncSettingTab.optionRebuildBoth": "Reconstructuir ambos desde este dispositivo",
"obsidianLiveSyncSettingTab.optionRebuildBoth": "Reconstruir ambos desde este dispositivo",
"obsidianLiveSyncSettingTab.optionSaveOnlySettings": "(Peligro) Guardar solo configuración",
"obsidianLiveSyncSettingTab.panelChangeLog": "Registro de cambios",
"obsidianLiveSyncSettingTab.panelGeneralSettings": "Configuraciones generales",
@@ -726,7 +726,7 @@
"On": "Activado",
"On the source device, from the command palette, run the 'Show settings as a QR code' command.": "En el dispositivo de origen, ejecuta desde la paleta de comandos «Show settings as a QR code».",
"On the source device, open Obsidian.": "En el dispositivo de origen, abre Obsidian.",
"On this device, please keep this Vault open.": "En este dispositivo, mantén este Vault abierto.",
"On this device, please keep this Vault open.": "En este dispositivo, mantén esta bóveda abierta.",
"On this device, switch to the camera app or use a QR code scanner to scan the displayed QR code.": "En este dispositivo, cambia a la aplicación de cámara o usa un lector de QR para escanear el código mostrado.",
"Open": "Abrir",
"Open connection": "Abrir conexión",
@@ -746,7 +746,7 @@
"P2P.FailedToOpen": "No se pudo abrir la conexión P2P con el servidor de señalización.",
"P2P.NoAutoSyncPeers": "No se han encontrado pares de sincronización automática. Configúralos en el panel de %{long_p2p_sync}.",
"P2P.NoKnownPeers": "No se ha detectado ningún par; esperando a que se conecten otros...",
"P2P.Note.description": " Este replicador permite sincronizar el vault con otros dispositivos\nmediante una conexión punto a punto. Así se puede sincronizar con nuestros otros dispositivos sin usar un servicio en la nube.\nEl replicador se basa en Trystero. Usa además un servidor de señalización para establecer la conexión entre dispositivos. Ese servidor sirve para intercambiar la información de conexión y no conoce (ni debería almacenar) ninguno de nuestros datos.\n\nCualquiera puede alojar el servidor de señalización: es simplemente un relé Nostr. Por comodidad y para poder comprobar el comportamiento del replicador, vrtmrz aloja una instancia. Puedes usar ese servidor experimental o cualquier otro.\n\nPor cierto, aunque el servidor de señalización no almacene nuestros datos, sí puede ver la información de conexión de algunos de nuestros dispositivos. Tenlo en cuenta y ten precaución al usar un servidor de terceros.",
"P2P.Note.description": " Este replicador permite sincronizar la bóveda con otros dispositivos\nmediante una conexión punto a punto. Así se puede sincronizar con nuestros otros dispositivos sin usar un servicio en la nube.\nEl replicador se basa en Trystero. Usa además un servidor de señalización para establecer la conexión entre dispositivos. Ese servidor sirve para intercambiar la información de conexión y no conoce (ni debería almacenar) ninguno de nuestros datos.\n\nCualquiera puede alojar el servidor de señalización: es simplemente un relé Nostr. Por comodidad y para poder comprobar el comportamiento del replicador, vrtmrz aloja una instancia. Puedes usar ese servidor experimental o cualquier otro.\n\nPor cierto, aunque el servidor de señalización no almacene nuestros datos, sí puede ver la información de conexión de algunos de nuestros dispositivos. Tenlo en cuenta y ten precaución al usar un servidor de terceros.",
"P2P.Note.important_note": "Replicador punto a punto.",
"P2P.Note.important_note_sub": "Esta función sigue siendo muy experimental. Asegúrate de tener una copia de seguridad de tus datos antes de usarla. Y nos alegraría mucho que quisieras contribuir a su desarrollo.",
"P2P.Note.Summary": "¿Qué es esta función? (incluye notas importantes; léelas al menos una vez)",
@@ -768,7 +768,7 @@
"password": "contraseña",
"Password": "Contraseña",
"Paste a connection string": "Pegar cadena de conexión",
"Paste the Setup URI generated from one of your active devices.": "Pegue el URI de configuración generado desde uno de sus dispositivos activos。",
"Paste the Setup URI generated from one of your active devices.": "Pega el URI de configuración generado desde uno de tus dispositivos activos。",
"Path": "Ruta",
"Path Obfuscation": "Ofuscación de rutas",
"Patterns to match files for overwriting instead of merging": "Patrones para identificar archivos que se sobrescribirán en lugar de fusionarse",
@@ -794,16 +794,16 @@
"Please enter the CouchDB server information below.": "Introduce a continuación los datos del servidor CouchDB.",
"Please enter the details required to connect to your S3/MinIO/R2 compatible object storage service.": "Introduce los datos necesarios para conectarte a tu servicio de almacenamiento de objetos compatible con S3/MinIO/R2.",
"Please enter the Peer-to-Peer Synchronisation information below.": "Introduce a continuación los datos de la sincronización punto a punto.",
"Please enter the Setup URI that was generated during server installation or on another device, along with the vault passphrase.": "Introduce el Setup URI generado durante la instalación del servidor o en otro dispositivo, junto con la frase de contraseña del vault.",
"Please enter the Setup URI that was generated during server installation or on another device, along with the vault passphrase.": "Introduce el Setup URI generado durante la instalación del servidor o en otro dispositivo, junto con la frase de contraseña de la bóveda.",
"Please follow the steps below to import settings from your existing device.": "Sigue los pasos siguientes para importar los ajustes desde tu dispositivo actual.",
"PLEASE NOTE": "TEN EN CUENTA",
"Please select 'Cancel' explicitly to cancel this operation.": "Selecciona «Cancelar» de forma explícita para cancelar esta operación.",
"Please select a method to import the settings from another device.": "Seleccione un método para importar la configuración desde otro dispositivo。",
"Please select a method to import the settings from another device.": "Selecciona un método para importar la configuración desde otro dispositivo。",
"Please select an active P2P remote configuration to change P2P sync targets.": "Selecciona una configuración remota P2P activa para cambiar los destinos de sincronización P2P.",
"Please select an option to proceed": "Seleccione una opción para continuar",
"Please select an option to proceed": "Selecciona una opción para continuar",
"Please select the button below to restart and proceed to the data fetching confirmation.": "Pulsa el botón de abajo para reiniciar y pasar a la confirmación de la obtención de datos.",
"Please select the button below to restart and proceed to the final confirmation.": "Pulsa el botón de abajo para reiniciar y pasar a la confirmación final.",
"Please select the type of server to which you are connecting.": "Seleccione el tipo de servidor al que se está conectando。",
"Please select the type of server to which you are connecting.": "Selecciona el tipo de servidor al que se está conectando。",
"Please select your situation.": "Selecciona tu situación.",
"Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.": "Define un nombre para identificar este dispositivo. Debe ser único entre tus dispositivos. Mientras no esté configurado, no podremos habilitar esta función.",
"Please set this device name": "Define el nombre de este dispositivo",
@@ -840,7 +840,7 @@
"RedFlag.FetchRemoteConfig.Message": "¿Quieres obtener y aplicar en este dispositivo los ajustes de preferencias guardados en el remoto?",
"RedFlag.FetchRemoteConfig.Title": "Obtener la configuración remota",
"Reduces storage space by discarding all non-latest revisions. This requires the same amount of free space on the remote server and the local client.": "Reduce el espacio de almacenamiento descartando todas las revisiones que no sean la última. Requiere la misma cantidad de espacio libre en el servidor remoto y en el cliente local.",
"Reducing the frequency with which on-disk changes are reflected into the DB": "Reducir frecuencia de actualizaciones de disco a BD",
"Reducing the frequency with which on-disk changes are reflected into the DB": "Reducir frecuencia de actualizaciones de disco a base de datos",
"Refresh": "Actualizar",
"Region": "Región",
"Relay settings": "Ajustes del relé",
@@ -870,7 +870,7 @@
"Replicator.Message.SomeModuleFailed": "La replicación se ha cancelado por el fallo de algún módulo",
"Replicator.Message.VersionUpFlash": "Se ha detectado una actualización. Abre el diálogo de ajustes y consulta el registro de cambios. La replicación se ha cancelado.",
"Requires restart of Obsidian": "Requiere reiniciar Obsidian",
"Requires restart of Obsidian.": "Requiere reiniciar Obsidian",
"Requires restart of Obsidian.": "Requiere reiniciar Obsidian.",
"Rerun Onboarding Wizard": "Volver a ejecutar el asistente de configuración inicial",
"Rerun the onboarding wizard to set up Self-hosted LiveSync again.": "Vuelve a ejecutar el asistente de configuración inicial para configurar Self-hosted LiveSync de nuevo.",
"Rerun Wizard": "Volver a ejecutar el asistente",
@@ -923,19 +923,19 @@
"Scan for hidden files before replication": "Escanear archivos ocultos antes de replicar",
"Scan hidden files periodically": "Escanear archivos ocultos periódicamente",
"Scan QR Code": "Escanear código QR",
"Scan the QR code displayed on an active device using this device's camera.": "Escanee con la cámara de este dispositivo el código QR mostrado en un dispositivo activo。",
"Scan the QR code displayed on an active device using this device's camera.": "Escanea con la cámara de este dispositivo el código QR mostrado en un dispositivo activo。",
"Schedule and Restart": "Programar y reiniciar",
"Scram Switches": "Interruptores de emergencia",
"Scram!": "Medidas de emergencia",
"Seconds, 0 to disable": "Segundos, 0 para desactivar",
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": "Segundos. Guardado en BD local se retrasará hasta este valor tras dejar de escribir/guardar",
"Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.": "Segundos. Guardado en base de datos local se retrasará hasta este valor tras dejar de escribir o guardar.",
"Secret Access Key": "Clave de acceso secreta",
"Secret Key": "Clave secreta",
"Select active P2P remote": "Seleccionar el remoto P2P activo",
"Select All Shiny": "Seleccionar todo lo nuevo",
"Select Flagged Shiny": "Seleccionar lo nuevo marcado",
"Select P2P remote...": "Seleccionar remoto P2P...",
"Select the database adapter to use.": "Selecciona el adaptador de base de datos que se usará.",
"Select the database adapter to use.": "Selecciona el adaptador de base de datos.",
"Selecting this option will result in the current data on this device being used to initialise the server. Any existing data on the server will be completely overwritten.": "Al elegir esta opción, los datos actuales de este dispositivo se usarán para inicializar el servidor. Cualquier dato existente en el servidor se sobrescribirá por completo.",
"Selecting this option will result in this device joining the existing server. You need to fetching the existing synchronisation data from the server to this device.": "Al elegir esta opción, este dispositivo se unirá al servidor existente. Tendrás que obtener del servidor los datos de sincronización ya existentes.",
"Selective": "Selectivo",
@@ -1012,7 +1012,7 @@
"Setup.RemoteE2EE.AlgorithmWarning": "Cambiar el algoritmo de cifrado impedirá el acceso a cualquier dato cifrado anteriormente con otro algoritmo. Asegúrate de que todos tus dispositivos estén configurados para usar el mismo algoritmo y así mantener el acceso a tus datos.",
"Setup.RemoteE2EE.ButtonCancel": "Cancelar",
"Setup.RemoteE2EE.ButtonProceed": "Continuar",
"Setup.RemoteE2EE.DefaultAlgorithmDesc": "En la mayoría de los casos, debes mantener el algoritmo predeterminado (${algorithm}). Este ajuste solo es necesario si ya tienes un Vault cifrado con un formato diferente.",
"Setup.RemoteE2EE.DefaultAlgorithmDesc": "En la mayoría de los casos, debes mantener el algoritmo predeterminado (${algorithm}). Este ajuste solo es necesario si ya tienes una bóveda cifrada con un formato diferente.",
"Setup.RemoteE2EE.Guidance": "Configura tus ajustes de cifrado de extremo a extremo.",
"Setup.RemoteE2EE.LabelEncrypt": "Cifrado de extremo a extremo",
"Setup.RemoteE2EE.LabelEncryptionAlgorithm": "Algoritmo de cifrado",
@@ -1028,7 +1028,7 @@
"Setup.RemoteE2EE.Title": "Cifrado de extremo a extremo",
"Setup.ScanQRCode.ButtonClose": "Cerrar este diálogo",
"Setup.ScanQRCode.Guidance": "Sigue los pasos de abajo para importar los ajustes desde tu dispositivo actual.",
"Setup.ScanQRCode.Step1": "En este dispositivo, mantén este Vault abierto.",
"Setup.ScanQRCode.Step1": "En este dispositivo, mantén esta bóveda abierta.",
"Setup.ScanQRCode.Step2": "En el dispositivo de origen, abre Obsidian.",
"Setup.ScanQRCode.Step3": "En el dispositivo de origen, ejecuta desde la paleta de comandos la orden \"Mostrar ajustes como código QR\".",
"Setup.ScanQRCode.Step4": "En este dispositivo, cambia a la cámara o usa un escáner QR para escanear el código mostrado.",
@@ -1044,13 +1044,13 @@
"Setup.UseSetupURI.ButtonCancel": "Cancelar",
"Setup.UseSetupURI.ButtonProceed": "Probar ajustes y continuar",
"Setup.UseSetupURI.ErrorFailedToParse": "No se pudo procesar la URI de configuración. Revisa la URI y la frase de contraseña.",
"Setup.UseSetupURI.ErrorPassphraseRequired": "Introduce la frase de contraseña del Vault.",
"Setup.UseSetupURI.GuidanceLine1": "Introduce la URI de configuración que se generó durante la instalación del servidor o en otro dispositivo, junto con la frase de contraseña del Vault.",
"Setup.UseSetupURI.ErrorPassphraseRequired": "Introduce la frase de contraseña de la bóveda.",
"Setup.UseSetupURI.GuidanceLine1": "Introduce la URI de configuración que se generó durante la instalación del servidor o en otro dispositivo, junto con la frase de contraseña de la bóveda.",
"Setup.UseSetupURI.GuidanceLine2": "Ten en cuenta que puedes generar una nueva URI de configuración ejecutando el comando \"Copiar ajustes como nueva URI de configuración\" desde la paleta de comandos.",
"Setup.UseSetupURI.InvalidInfo": "La URI de configuración no es válida. Revísala e inténtalo de nuevo.",
"Setup.UseSetupURI.LabelPassphrase": "Frase de contraseña del Vault",
"Setup.UseSetupURI.LabelPassphrase": "Frase de contraseña de la bóveda",
"Setup.UseSetupURI.LabelSetupURI": "URI de configuración",
"Setup.UseSetupURI.PlaceholderPassphrase": "Introduce la frase de contraseña del Vault",
"Setup.UseSetupURI.PlaceholderPassphrase": "Introduce la frase de contraseña de la bóveda",
"Setup.UseSetupURI.Title": "Introducir URI de configuración",
"Setup.UseSetupURI.ValidInfo": "La URI de configuración es válida y está lista para usarse.",
"Should we keep folders that don't have any files inside?": "¿Mantener carpetas vacías?",
@@ -1080,7 +1080,7 @@
"Stats": "Estadísticas",
"Stop ⚡": "Detener ⚡",
"Stop Broadcasting": "Detener difusión",
"Stop reflecting database changes to storage files.": "Dejar de reflejar cambios de BD en archivos",
"Stop reflecting database changes to storage files.": "Dejar de reflejar cambios de base de datos en archivos",
"Stop watching for file changes.": "Dejar de monitorear cambios en archivos",
"Storage -> Database": "Almacenamiento -> Base de datos",
"Strongly Recommended": "Muy recomendado",
@@ -1108,7 +1108,7 @@
"Testing only - Resolve file conflicts by syncing newer copies of the file, this can overwrite modified files. Be Warned.": "Solo pruebas - Resolver conflictos sincronizando copias nuevas (puede sobrescribir modificaciones)",
"The connection to the server has been configured successfully. As the next step,": "La conexión con el servidor se ha configurado correctamente. Como paso siguiente,",
"The delay for consecutive on-demand fetches": "Retraso entre obtenciones consecutivas",
"The files in this Vault are almost identical to the server's.": "Los archivos de este Vault son casi idénticos a los del servidor.",
"The files in this Vault are almost identical to the server's.": "Los archivos de esta bóveda son casi idénticos a los del servidor.",
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": "A los siguientes nodos aceptados les falta su información de nodo:\n- ${missingNodes}\n\nEsto indica que llevan tiempo sin conectarse o que se han quedado en una versión antigua.\nSi es posible, conviene actualizar todos los dispositivos. Si tienes dispositivos que ya no usas, puedes borrar todos los nodos aceptados bloqueando el remoto una vez.",
"The Group ID and passphrase are used to identify your group of devices. Make sure to use the same Group ID and passphrase on all devices you want to synchronise.": "El ID de grupo y la frase de contraseña identifican tu grupo de dispositivos. Usa el mismo ID de grupo y la misma frase de contraseña en todos los dispositivos que quieras sincronizar.",
"The Hash algorithm for chunk IDs": "Algoritmo hash para IDs de chunks",
@@ -1126,7 +1126,7 @@
"the synchronisation data on the server will be built based on the current data on this device.": "los datos de sincronización del servidor se construirán a partir de los datos actuales de este dispositivo.",
"Themes": "Temas",
"There is a way to resolve this on other devices.": "Hay una forma de resolver esto en los demás dispositivos.",
"There may be differences between the files in this Vault and the server.": "Puede haber diferencias entre los archivos de este Vault y los del servidor.",
"There may be differences between the files in this Vault and the server.": "Puede haber diferencias entre los archivos de esta bóveda y los del servidor.",
"Therefore, we ask that you exercise extreme caution when configuring server information manually. If an incorrect passphrase is entered, the data on the server will become corrupted.": "Por tanto, extrema la precaución al configurar manualmente los datos del servidor. Si introduces una frase de contraseña incorrecta, los datos del servidor se corromperán.",
"This can isolate your connections between devices. Use the same Room ID for the same devices.": "Esto permite aislar tus conexiones entre dispositivos. Usa el mismo ID de sala para los mismos dispositivos.",
"This device": "Este dispositivo",
@@ -1134,14 +1134,14 @@
"This feature enables direct synchronisation between devices. No server is required, but both devices must be online at the same time for synchronisation to occur, and some features may be limited. Internet connection is only required to signalling (detecting peers) and not for data transfer.": "Esta función permite la sincronización directa entre dispositivos. No requiere servidor, pero ambos dispositivos deben estar en línea al mismo tiempo para que la sincronización se produzca, y algunas funciones pueden ser limitadas. La conexión a Internet solo se necesita para la señalización (detección de pares), no para la transferencia de datos。",
"This first setup has several short steps because it confirms encryption, the connection method, and which device provides the initial data. Once it is complete, additional devices can reuse a Setup URI.": "Esta primera configuración consta de varios pasos breves, ya que confirma el cifrado, el método de conexión y qué dispositivo aporta los datos iniciales. Una vez completada, los demás dispositivos podrán reutilizar un Setup URI.",
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": "Esta es una opción avanzada para usuarios que no disponen de un URI o que desean configurar parámetros detallados。",
"This is an extremely powerful operation. We strongly recommend that you copy your Vault folder to a safe location.": "Esta es una operación extremadamente potente. Te recomendamos encarecidamente copiar la carpeta de tu Vault a un lugar seguro.",
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": "Este es el método de sincronización más adecuado para el diseño. Todas las funciones están disponibles. Debe tener configurada una instancia de CouchDB。",
"This is an extremely powerful operation. We strongly recommend that you copy your Vault folder to a safe location.": "Esta es una operación extremadamente potente. Te recomendamos encarecidamente copiar la carpeta de tu bóveda a un lugar seguro.",
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": "Este es el método de sincronización más adecuado para el diseño del complemento. Todas las funciones están disponibles. Debe tener configurada una instancia de CouchDB。",
"This optional check uses Obsidian's internal request API and sends the credentials above to the CouchDB server. Use it only with a server you trust; administrator access may be required.": "Esta comprobación opcional usa la API interna de solicitudes de Obsidian y envía las credenciales anteriores al servidor CouchDB. Utilízala solo con un servidor de confianza; puede requerir acceso de administrador.",
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": "Esta frase no se copia a otros dispositivos. Usará `Default` hasta reconfigurar",
"This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": "Esta frase no se copia a otros dispositivos. Usará `Default` hasta que lo configures de nuevo.",
"This password is used to encrypt the connection. Use something long enough.": "Esta contraseña se usa para cifrar la conexión. Usa algo suficientemente largo.",
"This procedure will first delete all existing synchronisation data from the server. Following this, the server data will be completely rebuilt, using the current state of your Vault on this device (including its local database) as": "Este procedimiento eliminará primero todos los datos de sincronización existentes en el servidor. A continuación, los datos del servidor se reconstruirán por completo usando el estado actual del Vault de este dispositivo (incluida su base de datos local) como",
"This procedure will first delete all existing synchronisation data from the server. Following this, the server data will be completely rebuilt, using the current state of your Vault on this device (including its local database) as": "Este procedimiento eliminará primero todos los datos de sincronización existentes en el servidor. A continuación, los datos del servidor se reconstruirán por completo usando el estado actual de la bóveda de este dispositivo (incluida su base de datos local) como",
"This setting must be the same even when connecting to multiple synchronisation destinations.": "Este ajuste debe ser el mismo incluso si te conectas a varios destinos de sincronización.",
"This Vault is empty, or contains only new files that are not on the server.": "Este Vault está vacío o solo contiene archivos nuevos que no están en el servidor.",
"This Vault is empty, or contains only new files that are not on the server.": "Esta bóveda está vacía o solo contiene archivos nuevos que no están en el servidor.",
"This will rebuild the local database on this device using the most recent data from the server. This action is designed to resolve synchronisation inconsistencies and restore correct functionality.": "Esto reconstruirá la base de datos local de este dispositivo con los datos más recientes del servidor. La acción está pensada para resolver inconsistencias de sincronización y restaurar el funcionamiento correcto.",
"This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "Esto recreará los fragmentos de todos los archivos. Si faltaban fragmentos, esto puede corregir los errores.",
"To minimise the creation of new conflicts": "Para minimizar la creación de nuevos conflictos",
@@ -1273,9 +1273,9 @@
"Ui.Settings.Maintenance.SendChunks": "Enviar los chunks",
"Ui.Settings.Maintenance.Syncing": "Sincronización",
"Ui.Settings.Maintenance.WarningLockedReadyAction": "Estoy listo, desbloquear la base de datos",
"Ui.Settings.Maintenance.WarningLockedReadyText": "Para evitar que el vault se corrompa, la base de datos remota se ha bloqueado para la sincronización. (Este dispositivo está marcado como «resuelto».) Cuando todos tus dispositivos estén marcados como «resueltos», desbloquea la base de datos. Este aviso seguirá apareciendo hasta que la replicación confirme que el dispositivo está resuelto.",
"Ui.Settings.Maintenance.WarningLockedReadyText": "Para evitar que la bóveda se corrompa, la base de datos remota se ha bloqueado para la sincronización. (Este dispositivo está marcado como «resuelto».) Cuando todos tus dispositivos estén marcados como «resueltos», desbloquea la base de datos. Este aviso seguirá apareciendo hasta que la replicación confirme que el dispositivo está resuelto.",
"Ui.Settings.Maintenance.WarningLockedResolveAction": "He hecho una copia de seguridad, marcar este dispositivo como resuelto",
"Ui.Settings.Maintenance.WarningLockedResolveText": "La base de datos remota está bloqueada para la sincronización a fin de evitar que el vault se corrompa, porque este dispositivo no está marcado como «resuelto». Haz una copia de seguridad de tu vault, restablece la base de datos local y selecciona «Marcar este dispositivo como resuelto». Este aviso seguirá apareciendo hasta que la replicación confirme que el dispositivo está resuelto.",
"Ui.Settings.Maintenance.WarningLockedResolveText": "La base de datos remota está bloqueada para la sincronización a fin de evitar que la bóveda se corrompa, porque este dispositivo no está marcado como «resuelto». Haz una copia de seguridad de tu bóveda, restablece la base de datos local y selecciona «Marcar este dispositivo como resuelto». Este aviso seguirá apareciendo hasta que la replicación confirme que el dispositivo está resuelto.",
"Ui.Settings.Maintenance.WriteRedFlagAndRestart": "Marcar y reiniciar",
"Ui.Settings.Patches.CompatibilityConflict": "Compatibilidad (comportamiento ante conflictos)",
"Ui.Settings.Patches.CompatibilityDatabase": "Compatibilidad (estructura de la base de datos)",
@@ -1304,7 +1304,7 @@
"Ui.Settings.Patches.RemediationNoLimit": "Sin límite configurado",
"Ui.Settings.Patches.RemediationRestarting": "Se ha cambiado el ajuste de remediación. Reiniciando Obsidian...",
"Ui.Settings.Patches.RemediationRestartLater": "Más tarde",
"Ui.Settings.Patches.RemediationRestartMessage": "Se recomienda encarecidamente reiniciar Obsidian. Hasta que lo hagas, puede que algunos cambios no surtan efecto y que la interfaz se muestre de forma inconsistente. ¿Seguro que quieres reiniciar ahora?",
"Ui.Settings.Patches.RemediationRestartMessage": "Se recomienda encarecidamente reiniciar Obsidian. Hasta que lo hagas puede que algunos cambios no surtan efecto y que la interfaz se muestre de forma inconsistente. ¿Seguro que quieres reiniciar ahora?",
"Ui.Settings.Patches.RemediationRestartNow": "Reiniciar ahora",
"Ui.Settings.Patches.RemediationSuffixChanged": "El sufijo ha cambiado. Reabriendo la base de datos...",
"Ui.Settings.Patches.RemediationWithValue": "Límite: ${date} (${timestamp})",
@@ -1331,7 +1331,7 @@
"Ui.Settings.Remote.DisplayName": "Nombre visible",
"Ui.Settings.Remote.DuplicateRemote": "Duplicar el remoto",
"Ui.Settings.Remote.DuplicateRemoteSuffix": "${name} (copia)",
"Ui.Settings.Remote.E2EEConfiguration": "Configuración del E2EE",
"Ui.Settings.Remote.E2EEConfiguration": "Configuración de E2EE",
"Ui.Settings.Remote.Export": "Exportar",
"Ui.Settings.Remote.FetchRemoteSettings": "Obtener los ajustes remotos",
"Ui.Settings.Remote.ImportConnection": "Importar conexión",
@@ -1392,7 +1392,7 @@
"Ui.SetupWizard.OutroAskUserMode.Question": "Selecciona tu situación.",
"Ui.SetupWizard.OutroAskUserMode.Title": "Casi terminado: se requiere una decisión",
"Ui.SetupWizard.OutroNewP2PUser.GuidanceNotice": "En P2P no hay una copia en un servidor central que sobrescribir. Este paso prepara solo este dispositivo; mantenlo conectado cuando otro dispositivo obtenga sus datos iniciales.",
"Ui.SetupWizard.OutroNewP2PUser.GuidancePrimary": "La conexión punto a punto se ha configurado correctamente. A continuación, la base de datos local de LiveSync se construirá a partir de los archivos actuales de este Vault.",
"Ui.SetupWizard.OutroNewP2PUser.GuidancePrimary": "La conexión punto a punto se ha configurado correctamente. A continuación, la base de datos local de LiveSync se construirá a partir de los archivos actuales de esta bóveda.",
"Ui.SetupWizard.OutroNewP2PUser.Important": "TEN EN CUENTA",
"Ui.SetupWizard.OutroNewP2PUser.Proceed": "Reiniciar y preparar este dispositivo",
"Ui.SetupWizard.OutroNewP2PUser.Question": "Pulsa el botón de abajo para reiniciar y pasar a la confirmación de la inicialización local.",
@@ -1404,10 +1404,10 @@
"Ui.SetupWizard.OutroNewUser.Question": "Pulsa el botón de abajo para reiniciar y pasar a la confirmación final.",
"Ui.SetupWizard.OutroNewUser.Title": "Configuración completada: preparando la inicialización del servidor",
"Ui.SetupWizard.RebuildEverythingP2P.ConfirmLocalReset": "Entiendo que esto restablece únicamente la base de datos de sincronización local de este dispositivo.",
"Ui.SetupWizard.RebuildEverythingP2P.ConfirmLocalResetNote": "Se usarán los archivos que hay ahora en este Vault para reconstruirla.",
"Ui.SetupWizard.RebuildEverythingP2P.ConfirmLocalResetNote": "Se usarán los archivos que hay ahora en esta bóveda para reconstruirla.",
"Ui.SetupWizard.RebuildEverythingP2P.ConfirmTitle": "⚠️ Confirma lo siguiente",
"Ui.SetupWizard.RebuildEverythingP2P.Guidance": "Este procedimiento descartará la base de datos local de LiveSync de este dispositivo y la reconstruirá a partir de los archivos actuales de este Vault. No elimina ni sobrescribe datos de otro dispositivo.",
"Ui.SetupWizard.RebuildEverythingP2P.Note": "Mantén este dispositivo conectado después de la inicialización para que otro dispositivo pueda obtener el Vault desde él.",
"Ui.SetupWizard.RebuildEverythingP2P.Guidance": "Este procedimiento descartará la base de datos local de LiveSync de este dispositivo y la reconstruirá a partir de los archivos actuales de esta bóveda. No elimina ni sobrescribe datos de otro dispositivo.",
"Ui.SetupWizard.RebuildEverythingP2P.Note": "Mantén este dispositivo conectado después de la inicialización para que otro dispositivo pueda obtener la bóveda desde él.",
"Ui.SetupWizard.RebuildEverythingP2P.Proceed": "Lo entiendo, preparar este dispositivo",
"Ui.SetupWizard.RebuildEverythingP2P.Title": "Confirmación final: preparar este dispositivo para P2P",
"Ui.SetupWizard.SelectExisting.Guidance": "Estás añadiendo este dispositivo a una configuración de sincronización existente.",
@@ -1433,7 +1433,7 @@
"Ui.SetupWizard.SelectNew.Title": "Método de conexión",
"Ui.SetupWizard.SetupRemote.BucketOption": "Almacenamiento de objetos compatible con S3",
"Ui.SetupWizard.SetupRemote.BucketOptionDesc": "Sincronización mediante archivos de diario. Necesitas tener ya un servicio de almacenamiento de objetos compatible con S3, como Amazon S3, MinIO o Cloudflare R2.",
"Ui.SetupWizard.SetupRemote.CouchDbOptionDesc": "Es el método de sincronización más adecuado para el diseño actual y ofrece todas las funciones. Necesitas tener ya una instancia de CouchDB en marcha.",
"Ui.SetupWizard.SetupRemote.CouchDbOptionDesc": "Es el método de sincronización más adecuado para el diseño actual y ofrece todas las funciones. Necesitas tener una instancia de CouchDB en marcha.",
"Ui.SetupWizard.SetupRemote.Guidance": "Selecciona el tipo de remoto para esta configuración de sincronización.",
"Ui.SetupWizard.SetupRemote.P2POption": "Punto a punto (P2P)",
"Ui.SetupWizard.SetupRemote.P2POptionDesc": "Permite la sincronización directa entre dispositivos. No hace falta servidor, pero ambos dispositivos deben estar conectados a la vez y algunas funciones pueden estar limitadas. Solo se necesita internet para la señalización, no para transferir los datos.",
@@ -1446,7 +1446,7 @@
"Updating list...": "Actualizando lista...",
"URL": "URL",
"Use a custom passphrase": "Usar una frase de contraseña personalizada",
"Use a Setup URI (Recommended)": "Usar un URI de configuración (recomendado)",
"Use a Setup URI (Recommended)": "Usar URI de configuración (recomendado)",
"Use Custom HTTP Handler": "Usar manejador HTTP personalizado",
"Use Diagnostic RTCPeerConnection for statistics": "Usar el RTCPeerConnection de diagnóstico para las estadísticas",
"Use dynamic iteration count": "Usar conteo de iteraciones dinámico",
@@ -1471,8 +1471,8 @@
"We can use only Secure (HTTPS) connections on Obsidian Mobile.": "En Obsidian Mobile solo se pueden usar conexiones seguras (HTTPS).",
"We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": "No podemos cambiar el nombre del dispositivo mientras esta función esté habilitada. Deshabilita la función para cambiarlo.",
"We have to configure the device name": "Hay que configurar el nombre del dispositivo",
"We recommend that you copy your Vault folder to a safe location. This will provide a safeguard in case a large number of conflicts arise, or if you accidentally synchronise with an incorrect destination.": "Te recomendamos copiar la carpeta de tu Vault a un lugar seguro. Así tendrás una salvaguarda en caso de que surjan muchos conflictos o de que sincronices por error con un destino incorrecto.",
"We will now guide you through a few questions to simplify the synchronisation setup.": "Ahora le guiaremos con unas pocas preguntas para simplificar la configuración de la sincronización。",
"We recommend that you copy your Vault folder to a safe location. This will provide a safeguard in case a large number of conflicts arise, or if you accidentally synchronise with an incorrect destination.": "Te recomendamos copiar la carpeta de tu bóveda a un lugar seguro. Así tendrás una copia de seguridad en caso de que surjan muchos conflictos o de que sincronices por error con un destino incorrecto.",
"We will now guide you through a few questions to simplify the synchronisation setup.": "Ahora te guiaremos con unas pocas preguntas para simplificar la configuración de la sincronización。",
"We will now proceed with the server configuration.": "Ahora continuaremos con la configuración del servidor。",
"Welcome to Self-hosted LiveSync": "Bienvenido a Self-hosted LiveSync",
"When you save a file in the editor, start a sync automatically": "Iniciar sincronización automática al guardar en editor",
@@ -1482,9 +1482,9 @@
"xxhash64 (Fastest)": "xxhash64 (el más rápido)",
"Yes, I want to add this device to my existing synchronisation": "Sí, quiero añadir este dispositivo a mi sincronización existente",
"Yes, I want to set up a new synchronisation": "Sí, quiero configurar una nueva sincronización",
"You are adding this device to an existing synchronisation setup.": "Está añadiendo este dispositivo a una configuración de sincronización existente。",
"You are adding this device to an existing synchronisation setup.": "Estás añadiendo este dispositivo a una configuración de sincronización existente。",
"You can configure in the Obsidian Plugin Settings.": "Puedes configurarlo en los ajustes del complemento de Obsidian.",
"You should create a new synchronisation destination and rebuild your data there.": "Deberías crear un nuevo destino de sincronización y reconstruir allí tus datos.",
"You should perform this operation only in exceptional circumstances, such as when the server data is completely corrupted, when changes on all other devices are no longer needed, or when the database size has become unusually large in comparison to the Vault size.": "Solo deberías realizar esta operación en circunstancias excepcionales: cuando los datos del servidor estén completamente corruptos, cuando ya no necesites los cambios de los demás dispositivos o cuando el tamaño de la base de datos sea inusualmente grande respecto al del Vault.",
"You should perform this operation only in exceptional circumstances, such as when the server data is completely corrupted, when changes on all other devices are no longer needed, or when the database size has become unusually large in comparison to the Vault size.": "Solo deberías realizar esta operación en circunstancias excepcionales: cuando los datos del servidor estén completamente corruptos, cuando ya no necesites los cambios de los demás dispositivos o cuando el tamaño de la base de datos sea inusualmente grande respecto a la bóveda.",
"you wanted(Thank you)!": "tu solicitud (¡gracias!)"
}
File diff suppressed because it is too large Load Diff
+124 -124
View File
@@ -1,32 +1,32 @@
", please select the option that best describes the current state of your Vault. The application will then check your files in the most appropriate way based on your selection.":
", selecciona la opción que mejor describa el estado actual de tu Vault. La
", selecciona la opción que mejor describa el estado actual de tu bóveda. La
aplicación comprobará entonces tus archivos de la forma más adecuada según tu
elección."
(Active): (Activo)
(BETA) Always overwrite with a newer file: (BETA) Sobrescribir siempre con archivo más nuevo
(Beta) Use ignore files: (Beta) Usar archivos de ignorar
(Beta) Use ignore files: (Beta) Usar archivos ignore
(Days passed, 0 to disable automatic-deletion): (Días transcurridos, 0 para desactivar)
(e.g., after editing many files whilst offline): (p. ej., tras editar muchos archivos sin conexión)
(e.g., after editing many files whilst offline): (p. ej., tras editar muchos archivos estando sin conexión)
(e.g., immediately after restoring on another computer, or having recovered from a backup):
(p. ej., justo después de restaurar en otro ordenador o de recuperar una copia
de seguridad)
(e.g., setting up for the first time on a new smartphone, starting from a clean slate): (p. ej., configurando por primera vez un móvil nuevo, empezando de cero)
(ex. Read chunks online) If this option is enabled, LiveSync reads chunks online directly instead of replicating them locally. Increasing Custom chunk size is recommended.:
"(Ej: Leer chunks online) Lee chunks directamente en línea. Aumente tamaño de
chunks personalizados"
"(Ej: Leer chunks online) Lee chunks directamente en línea. Aumenta tamaño de
chunks personalizados."
(MB) If this is set, changes to local and remote files that are larger than this will be skipped. If the file becomes smaller again, a newer one will be used.:
(MB) Saltar cambios en archivos locales/remotos mayores a este tamaño. Si se
reduce, se usará versión nueva
(MB) Si se activa, se saltarán cambios en archivos locales y remotos mayores a este tamaño. Si tamaño del archivo se reduce
se usará la versión nueva.
(Mega chars): (Millones de caracteres)
(Missing): (Falta)
(Not recommended) If set, credentials will be stored in the file.: (No recomendado) Almacena credenciales en el archivo
(Obsolete) Use an old adapter for compatibility: (Obsoleto) Usar adaptador antiguo
(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files.:
(RegExp) Déjelo vacío para sincronizar todos los archivos. Defina un filtro
como expresión regular para limitar los archivos que se sincronizan.
(RegExp) Déjalo vacío para sincronizar todos los archivos. Definaeun filtro
como expresión regular para limitar los archivos sincronizados.
(RegExp) If this is set, any changes to local and remote files that match this will be skipped.:
(RegExp) Si se establece, se omitirá cualquier cambio en archivos locales y
remotos que coincida con este patrón.
(RegExp) Si se establece, se omitirá cualquier cambio en los archivos locales y
remotos que coincidan con este patrón.
"↑: Overwrite Remote": "↑: Sobrescribir remoto"
"↓: Overwrite Local": "↓: Sobrescribir local"
"⇅: Use newer": "⇅: Usar el más nuevo"
@@ -59,22 +59,22 @@ Add default patterns: Añadir patrones predeterminados
Add new connection: Añadir conexión
AddOn Module (ConfigSync) has not been loaded. This is very unexpected situation. Please report this issue.:
El módulo complementario (ConfigSync) no se ha cargado. Esta situación es muy
inesperada. Informa de este problema.
inesperada. Por favor informa de este problema.
AddOn Module (HiddenFileSync) has not been loaded. This is very unexpected situation. Please report this issue.:
El módulo complementario (HiddenFileSync) no se ha cargado. Esta situación es
muy inesperada. Informa de este problema.
muy inesperada. Por favor informa de este problema.
Advanced: Avanzado
Advanced Settings: Ajustes avanzados
After restarting, the data on this device will be uploaded to the server as the 'master copy'. Please be aware that any unintended data currently on the server will be completely overwritten.:
Tras reiniciar, los datos de este dispositivo se subirán al servidor como
«copia maestra». Ten en cuenta que cualquier dato no deseado que haya ahora en
«copia maestra». Ten en cuenta que cualquier dato en
el servidor se sobrescribirá por completo.
After restarting, the database on this device will be rebuilt using data from the server. If there are any unsynchronised files in this vault, conflicts may occur with the server data.:
Tras reiniciar, la base de datos de este dispositivo se reconstruirá con los
datos del servidor. Si hay archivos sin sincronizar en este vault, pueden
datos del servidor. Si hay archivos sin sincronizar en esta bóveda pueden
producirse conflictos con los datos del servidor.
After that, synchronise to a brand new vault on each other device with the new remote one by one.:
Después, sincroniza con un vault totalmente nuevo en cada uno de los demás
Después, sincroniza con una bóveda totalmente nueva en cada uno de los demás
dispositivos, uno por uno, usando el nuevo remoto.
All checks passed successfully!: ¡Todas las comprobaciones se han superado correctamente!
All devices have the same progress value (${progress}). Your devices seem to be synchronised. And be able to proceed with Garbage Collection.:
@@ -85,10 +85,10 @@ All the same or non-existent: Todo igual o inexistente
Allow in session: Permitir en esta sesión
Allow permanently: Permitir permanentemente
Also, please note that if you are using Peer-to-Peer synchronization, this configuration will be used when you switch to other methods and connect to a remote server in the future.:
Además, si usas sincronización punto a punto, esta configuración se aplicará
cuando en el futuro cambies a otros métodos y te conectes a un servidor
Además, si usas sincronización punto a punto, esta configuración también se aplicará
en el futuro si cambias a otros métodos de sincronización y te conectas a un servidor
remoto.
Always prompt merge conflicts: Siempre preguntar en conflictos
Always prompt merge conflicts: Siempre preguntar cuando haya conflictos
Analyse: Analizar
Analyse database usage: Analizar el uso de la base de datos
Analyse database usage and generate a TSV report for diagnosis yourself. You can paste the generated report with any spreadsheet you like.:
@@ -96,7 +96,7 @@ Analyse database usage and generate a TSV report for diagnosis yourself. You can
diagnosticarlo tú mismo. Puedes pegar el informe generado en la hoja de
cálculo que prefieras.
Apply All Selected: Aplicar todo lo seleccionado
Apply Latest Change if Conflicting: Aplicar último cambio en conflictos
Apply Latest Change if Conflicting: Aplicar último cambio si hay conflictos
Apply preset configuration: Aplicar configuración predefinida
Apply the settings: Aplicar los ajustes
Ask a passphrase at every launch: Solicitar la frase de contraseña en cada inicio
@@ -107,13 +107,13 @@ Automatically Sync all files when opening Obsidian.: Sincronizar automáticament
Available Peers: Pares disponibles
Back: Volver
Back to non-configured: Volver a no configurado
Batch database update: Actualización por lotes de BD
Batch database update: Actualización de base de datos por lotes
Batch limit: Límite de lotes
Batch size: Tamaño de lote
Batch size of on-demand fetching: Tamaño de lote para obtención bajo demanda
Before v0.17.16, we used an old adapter for the local database. Now the new adapter is preferred. However, it needs local database rebuilding. Please disable this toggle when you have enough time. If leave it enabled, also while fetching from the remote database, you will be asked to disable this.:
Antes de v0.17.16 usábamos adaptador antiguo. Nuevo adaptador requiere
reconstruir BD local. Desactive cuando pueda
Antes de v0.17.16 se usaba el adaptador antiguo. El nuevo adaptador requiere
reconstruir la base de datos local. Por favor desactiva esta opción cuando puedas. Si está activa cuando se sincroniza la base de datos se intentará desactivar de nuevo.
Broadcasting?: ¿Difusión?
Bucket Name: Nombre del bucket
by resetting the remote, you will be informed on other devices.: al restablecer el remoto, se te avisará en los demás dispositivos.
@@ -144,7 +144,7 @@ cmdConfigSync:
Comma separated `.gitignore, .dockerignore`: "Separados por comas: `.gitignore, .dockerignore`"
Command: Comando
Communicating: Comunicando
Compaction in progress on remote database...: Compactación en curso en la base de datos remota...
Compaction in progress on remote database...: Compactación en curso de la base de datos remota...
Compaction on remote database completed successfully.: La compactación de la base de datos remota se ha completado correctamente.
Compaction on remote database failed.: La compactación de la base de datos remota ha fallado.
Compaction on remote database timed out.: La compactación de la base de datos remota ha superado el tiempo de espera.
@@ -229,7 +229,7 @@ Diagnostic RTCPeerConnection is enabled: El RTCPeerConnection de diagnóstico es
dialog:
yourLanguageAvailable:
_value: >-
Self-hosted LiveSync tenía traducciones para tu idioma, así que se ha
Self-hosted LiveSync tiene traducciones para tu idioma, así que se ha
activado el ajuste %{Display Language}.
@@ -241,7 +241,7 @@ dialog:
hacerlo desde el diálogo de ajustes.
¡Que lo disfrutes!
Title: " ¡Hay traducción disponible!"
Title: " ¡Hay una traducción disponible!"
btnRevertToDefault: Mantener %{lang-def}
Diff: Diferencias
Different: Distinto
@@ -271,13 +271,13 @@ Doctor:
Por desgracia, se han detectado algunos ajustes como posibles problemas.
Tranquilo: los resolveremos uno a uno.
Para que lo sepas de antemano, te preguntaremos por los siguientes puntos.
Para que lo sepas de antemano, te preguntaremos por lo siguiente.
${issues}
¿Empezamos?
MainFix: |-
## ${name}
| Actual | Ideal |
@@ -303,8 +303,8 @@ Doctor:
Recommended: Recomendado
Message:
NoIssues: ¡No se ha detectado ningún problema!
RebuildLocalRequired: ¡Atención! Hay que reconstruir la base de datos local para aplicar esto.
RebuildRequired: ¡Atención! Hay que reconstruir para aplicar esto.
RebuildLocalRequired: ¡Atención! Hay que reconstruir la base de datos local
RebuildRequired: ¡Atención! Hay que reconstruir la base de datos
SomeSkipped: Hemos dejado algunos problemas sin resolver. ¿Quieres que te lo
pregunte de nuevo en el próximo inicio?
RULES:
@@ -338,11 +338,11 @@ Enabling end-to-end encryption ensures that your data is encrypted on your devic
Activar el cifrado de extremo a extremo garantiza que tus datos se cifren en
tu dispositivo antes de enviarse al servidor remoto. Así, aunque alguien
acceda al servidor, no podrá leer tus datos sin la frase de contraseña.
Recuérdala bien, porque será necesaria para descifrar tus datos en los demás
Recuérdala bien porque será necesaria para descifrar tus datos en los demás
dispositivos.
Encrypt contents on the remote database. If you use the plugin's synchronization feature, enabling this is recommended.:
Cifrar contenido en la base de datos remota. Se recomienda habilitar si usa la
sincronización del plugin.
sincronización del complemento.
Encrypting sensitive configuration items: Cifrando elementos sensibles
Encryption Algorithm: Algoritmo de cifrado
Encryption phassphrase. If changed, you should overwrite the server's database with the new (encrypted) files.:
@@ -377,7 +377,7 @@ Failed to connect to remote for compaction. ${reason}: No se pudo conectar al re
Failed to connect to the server. Please check your settings.: No se pudo conectar al servidor. Revisa tus ajustes.
"Failed to connect to the signalling relay: ${reason}": "No se pudo conectar al relé de señalización: ${reason}"
Failed to create replicator instance.: No se pudo crear la instancia del replicador.
Failed to parse Setup-URI.: No se pudo interpretar el Setup-URI.
Failed to parse Setup-URI.: No se pudo interpretar el Setup URI.
Failed to start one-shot replication before Garbage Collection. Garbage Collection Cancelled.:
No se pudo iniciar la replicación puntual previa a la recolección de basura.
Recolección de basura cancelada.
@@ -385,7 +385,7 @@ Failed to start replication after Garbage Collection.: No se pudo iniciar la rep
"Failed:": "Fallidas:"
Fetch: Obtener
Fetch chunks on demand: Obtener chunks bajo demanda
Fetch database with previous behaviour: Obtener BD con comportamiento anterior
Fetch database with previous behaviour: Obtener base de datos con comportamiento anterior
Fetch remote settings: Obtener ajustes remotos
FETCHING: OBTENIENDO
Fetching status...: Obteniendo el estado...
@@ -401,7 +401,7 @@ Flag and restart: Marcar y reiniciar
Flagged Selective: Selectivo marcado
Folder Prefix: Prefijo de carpeta
For HS256/HS512 algorithms, provide the shared secret key. For ES256/ES512 algorithms, provide the pkcs8 PEM-formatted private key.:
Para los algoritmos HS256/HS512, indica la clave secreta compartida. Para
Indica la clave secreta compartida para los algoritmos HS256/HS512. Para
ES256/ES512, indica la clave privada en formato PEM pkcs8.
Forces the file to be synced when opened.: Forzar sincronización al abrir archivo
Fresh Start Wipe: Borrado para reinicio completo
@@ -444,9 +444,9 @@ However, This should not be enabled if you want to increase your secrecy more.:
I am setting up a new server for the first time / I want to reset my existing server.:
Estoy configurando un servidor nuevo por primera vez / quiero restablecer mi
servidor actual.
I am unable to create a backup of my Vault.: No puedo crear una copia de seguridad de mi Vault.
I am unable to create a backup of my Vaults.: No puedo crear una copia de seguridad de mis Vaults.
I have created a backup of my Vault.: He creado una copia de seguridad de mi Vault.
I am unable to create a backup of my Vault.: No puedo crear una copia de seguridad de mi bóveda.
I am unable to create a backup of my Vaults.: No puedo crear una copia de seguridad de mis bóvedas.
I have created a backup of my Vault.: He creado una copia de seguridad de mi bóveda.
I understand that all changes made on other smartphones or computers possibly could be lost.:
Entiendo que todos los cambios hechos en otros móviles u ordenadores podrían
perderse.
@@ -457,18 +457,18 @@ I understand that this action is irreversible once performed.: Entiendo que esta
I understand the risks and will proceed without a backup.: Entiendo los riesgos y continuaré sin copia de seguridad.
I Understand, Overwrite Server: Lo entiendo, sobrescribir el servidor
If "Auto Start P2P Connection" is enabled, the P2P connection will be started automatically when the plug-in launches.:
Si «Iniciar la conexión P2P automáticamente» está activado, la conexión P2P se
Si «Iniciar la conexión P2P automáticamente» está activada, la conexión P2P se
iniciará al arrancar el complemento.
If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).: Si se desactiva, chunks se dividen en hilo UI (comportamiento anterior)
If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).: Si se desactiva, los chunks se dividen en el hilo de UI (comportamiento anterior)
If enabled per-filed efficient customization sync will be used. We need a small migration when enabling this. And all devices should be updated to v0.23.18. Once we enabled this, we lost a compatibility with old versions.:
Habilita sincronización eficiente por archivo. Requiere migración y actualizar
todos dispositivos a v0.23.18. Pierde compatibilidad con versiones antiguas
todos los dispositivos a v0.23.18. Pierde compatibilidad con versiones antiguas.
If enabled, chunks will be split into no more than 100 items. However, dedupe is slightly weaker.: Divide chunks en máximo 100 ítems. Menos eficiente en deduplicación
If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.: Chunks nuevos se mantienen temporalmente en el documento hasta estabilizarse
If enabled, newly created chunks are temporarily kept within the document, and graduated to become independent chunks once stabilised.: Chunks nuevos se mantienen temporalmente en el documento hasta estabilizarse.
If enabled, the ⛔ icon will be shown inside the status instead of the file warnings banner. No details will be shown.:
Si se activa, se mostrará el icono ⛔ en el estado en lugar del banner de
advertencia de archivos. No se mostrarán detalles.
If enabled, the file under 1kb will be processed in the UI thread.: Archivos <1kb se procesan en hilo UI
If enabled, the file under 1kb will be processed in the UI thread.: Archivos <1kb se procesan en el hilo de UI
If enabled, the notification of hidden files change will be suppressed.: Si se habilita, se suprimirá la notificación de cambios en archivos ocultos.
If this enabled, all chunks will be stored with the revision made from its content. (Previous behaviour):
Si se habilita, todos los chunks se almacenan con la revisión hecha desde su
@@ -476,13 +476,13 @@ If this enabled, all chunks will be stored with the revision made from its conte
If this enabled, All files are handled as case-Sensitive (Previous behaviour).:
Si se habilita, todos los archivos se manejan como sensibles a mayúsculas
(comportamiento anterior)
If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.: Divide chunks en segmentos semánticos. No todos los sistemas lo soportan
If this enabled, chunks will be split into semantically meaningful segments. Not all platforms support this feature.: Divide chunks en segmentos semánticos. No todos los sistemas lo soportan.
If this is set, changes to local files which are matched by the ignore files will be skipped. Remote changes are determined using local ignore files.:
Saltar cambios en archivos locales que coincidan con ignore files. Cambios
remotos usan ignore files locales
remotos usan ignore files locales.
If this option is enabled, PouchDB will hold the connection open for 60 seconds, and if no change arrives in that time, close and reopen the socket, instead of holding it open indefinitely. Useful when a proxy limits request duration but can increase resource usage.:
Mantiene conexión 60s. Si no hay cambios, reinicia socket. Útil con proxies
limitantes
Mantiene una conexión abierta por 60s en CouchDB. Si no hay cambios, se reinicia socket en vez de dejarlo abierto de forma indefinida. Útil con proxies
limitantes pero puede aumentar el uso de recursos.
If you cannot avoid CORS issues, you might want to try this option. It uses Obsidian's internal API to communicate with the CouchDB server. Not compliant with web standards, but works. Note that this might break in future Obsidian versions.:
Si no puedes evitar problemas de CORS, prueba esta opción. Usa la API interna
de Obsidian para comunicarse con el servidor CouchDB. No cumple los estándares
@@ -494,11 +494,11 @@ If you cannot avoid CORS issues, you might want to try this option. It uses Obsi
pero funciona. Ten en cuenta que podría dejar de funcionar en versiones
futuras de Obsidian.
If you have unsynchronised changes in your Vault on this device, they will likely diverge from the server's versions after the reset. This may result in a large number of file conflicts.:
Si tienes cambios sin sincronizar en el Vault de este dispositivo, es probable
que divergan de las versiones del servidor tras el restablecimiento. Esto
Si tienes cambios sin sincronizar en la bóveda de este dispositivo, es probable
que diverjan de las versiones del servidor tras el restablecimiento. Esto
puede provocar un gran número de conflictos de archivos.
If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value.:
Si alcanzas el límite de tamaño de carga al usar IBM Cloudant, reduce el
Si alcanzas el límite de tamaño de carga al usar IBM Cloudant, por favor reduce el
tamaño de lote y el límite de lote.
If you understand the risks and still wish to proceed, select so.: Si entiendes los riesgos y aun así quieres continuar, indícalo.
If you want to store the data in a specific folder within the bucket, you can specify a folder prefix here. Otherwise, leave it blank to store data at the root of the bucket.:
@@ -516,7 +516,7 @@ Import connection: Importar conexión
IMPORTANT: IMPORTANTE
In most cases, you should stick with the default algorithm (${algorithm}), This setting is only required if you have an existing Vault encrypted in a different format.:
En la mayoría de los casos deberías mantener el algoritmo predeterminado
(${algorithm}). Este ajuste solo es necesario si ya tienes un Vault cifrado en
(${algorithm}). Este ajuste solo es necesario si ya tienes una bóveda cifrada en
otro formato.
In this scenario, Self-hosted LiveSync will recreate metadata for every file and deliberately generate conflicts. Where the file content is identical, these conflicts will be resolved automatically.:
En este caso, Self-hosted LiveSync recreará los metadatos de todos los
@@ -712,12 +712,12 @@ moduleInputUIObsidian:
optionNo: No
optionYes: Sí
moduleLiveSyncMain:
logAdditionalSafetyScan: Escanéo de seguridad adicional...
logAdditionalSafetyScan: Escaneo de seguridad adicional...
logLoadingPlugin: Cargando complemento...
logPluginInitCancelled: La inicialización del complemento fue cancelada por un módulo
logPluginVersion: Self-hosted LiveSync v${manifestVersion} ${packageVersion}
logReadChangelog: LiveSync se ha actualizado, ¡por favor lee el registro de cambios!
logSafetyScanCompleted: Escanéo de seguridad adicional completado
logSafetyScanCompleted: Escaneo de seguridad adicional completado
logSafetyScanFailed: El escaneo de seguridad adicional ha fallado en un módulo
logUnloadingPlugin: Descargando complemento...
logVersionUpdate: LiveSync se ha actualizado, en caso de actualizaciones que
@@ -749,7 +749,7 @@ moduleLiveSyncMain:
o se obtiene. Si el proceso termina de forma anormal, puede mantenerse sin
querer.
> Si no estás seguro, puedes intentar volver a ejecutar estos procesos.
> Si no estás seguro puedes intentar volver a ejecutar estos procesos.
Asegúrate de hacer una copia de seguridad de tu bóveda.
optionKeepLiveSyncDisabled: Mantener LiveSync desactivado
optionResumeAndRestart: Reanudar y reiniciar Obsidian
@@ -885,7 +885,7 @@ moduleMigration:
Nota: actualiza Self-hosted LiveSync a la v0.25.6 o superior en todos tus
dispositivos y haz una copia de seguridad fiable de tu vault.
dispositivos y haz una copia de seguridad fiable de tu bóveda.
Nota 2: reconstruir todo y obtener los datos consume algo de tiempo y de
tráfico; hazlo en horas de poco uso y con una conexión de red estable.
@@ -934,7 +934,7 @@ On the source device, from the command palette, run the 'Show settings as a QR c
En el dispositivo de origen, ejecuta desde la paleta de comandos «Show
settings as a QR code».
On the source device, open Obsidian.: En el dispositivo de origen, abre Obsidian.
On this device, please keep this Vault open.: En este dispositivo, mantén este Vault abierto.
On this device, please keep this Vault open.: En este dispositivo, mantén esta bóveda abierta.
On this device, switch to the camera app or use a QR code scanner to scan the displayed QR code.:
En este dispositivo, cambia a la aplicación de cámara o usa un lector de QR
para escanear el código mostrado.
@@ -956,7 +956,7 @@ P2P:
Note:
Summary: ¿Qué es esta función? (incluye notas importantes; léelas al menos una vez)
description: >2-
Este replicador permite sincronizar el vault con otros dispositivos
Este replicador permite sincronizar la bóveda con otros dispositivos
mediante una conexión punto a punto. Así se puede sincronizar con nuestros
otros dispositivos sin usar un servicio en la nube.
@@ -1015,7 +1015,7 @@ Please enter the details required to connect to your S3/MinIO/R2 compatible obje
Please enter the Peer-to-Peer Synchronisation information below.: Introduce a continuación los datos de la sincronización punto a punto.
Please enter the Setup URI that was generated during server installation or on another device, along with the vault passphrase.:
Introduce el Setup URI generado durante la instalación del servidor o en otro
dispositivo, junto con la frase de contraseña del vault.
dispositivo, junto con la frase de contraseña de la bóveda.
Please follow the steps below to import settings from your existing device.:
Sigue los pasos siguientes para importar los ajustes desde tu dispositivo
actual.
@@ -1259,7 +1259,7 @@ Setup:
LabelEncryptionAlgorithm: Algoritmo de cifrado
DefaultAlgorithmDesc: En la mayoría de los casos, debes mantener el algoritmo
predeterminado (${algorithm}). Este ajuste solo es necesario si ya tienes
un Vault cifrado con un formato diferente.
una bóveda cifrada con un formato diferente.
AlgorithmWarning: Cambiar el algoritmo de cifrado impedirá el acceso a cualquier
dato cifrado anteriormente con otro algoritmo. Asegúrate de que todos tus
dispositivos estén configurados para usar el mismo algoritmo y así
@@ -1278,16 +1278,16 @@ Setup:
Title: Introducir URI de configuración
GuidanceLine1: Introduce la URI de configuración que se generó durante la
instalación del servidor o en otro dispositivo, junto con la frase de
contraseña del Vault.
contraseña de la bóveda.
GuidanceLine2: Ten en cuenta que puedes generar una nueva URI de configuración
ejecutando el comando "Copiar ajustes como nueva URI de configuración"
desde la paleta de comandos.
LabelSetupURI: URI de configuración
ValidInfo: La URI de configuración es válida y está lista para usarse.
InvalidInfo: La URI de configuración no es válida. Revísala e inténtalo de nuevo.
LabelPassphrase: Frase de contraseña del Vault
PlaceholderPassphrase: Introduce la frase de contraseña del Vault
ErrorPassphraseRequired: Introduce la frase de contraseña del Vault.
LabelPassphrase: Frase de contraseña de la bóveda
PlaceholderPassphrase: Introduce la frase de contraseña de la bóveda
ErrorPassphraseRequired: Introduce la frase de contraseña de la bóveda.
ErrorFailedToParse: No se pudo procesar la URI de configuración. Revisa la URI y
la frase de contraseña.
ButtonProceed: Probar ajustes y continuar
@@ -1296,7 +1296,7 @@ Setup:
Title: Escanear código QR
Guidance: Sigue los pasos de abajo para importar los ajustes desde tu
dispositivo actual.
Step1: En este dispositivo, mantén este Vault abierto.
Step1: En este dispositivo, mantén esta bóveda abierta.
Step2: En el dispositivo de origen, abre Obsidian.
Step3: En el dispositivo de origen, ejecuta desde la paleta de comandos la orden
"Mostrar ajustes como código QR".
@@ -1559,7 +1559,7 @@ obsidianLiveSyncSettingTab:
cifrado?
msgFetchConfigFromRemote: ¿Quieres obtener la configuración del servidor remoto?
msgIfConfigNotPersistent: Si la configuración del servidor no es persistente
(por ejemplo, ejecutándose en docker), los valores aquí pueden cambiar. Una
(por ejemplo, ejecutándose en Docker), los valores aquí pueden cambiar. Una
vez que puedas conectarte, por favor actualiza las configuraciones en el
local.ini del servidor.
msgInvalidPassphrase: Tu frase de contraseña de cifrado podría ser inválida.
@@ -1669,14 +1669,14 @@ obsidianLiveSyncSettingTab:
okAdminPrivileges: ✔ Tienes privilegios de administrador.
okCorsCredentials: ✔ cors.credentials está correcto.
okCorsCredentialsForOrigin: CORS credenciales OK
okCorsOriginMatched: ✔ Origen de CORS correcto
okCorsOrigins: ✔ cors.origins está correcto.
okEnableCors: ✔ httpd.enable_cors está correcto.
okMaxDocumentSize: ✔ couchdb.max_document_size está correcto.
okMaxRequestSize: ✔ chttpd.max_http_request_size está correcto.
okRequireValidUser: ✔ chttpd.require_valid_user está correcto.
okRequireValidUserAuth: ✔ chttpd_auth.require_valid_user está correcto.
okWwwAuth: ✔ httpd.WWW-Authenticate está correcto.
okCorsOriginMatched: ✔ Origen de CORS es correcto
okCorsOrigins: ✔ cors.origins es correcto.
okEnableCors: ✔ httpd.enable_cors es correcto.
okMaxDocumentSize: ✔ couchdb.max_document_size es correcto.
okMaxRequestSize: ✔ chttpd.max_http_request_size es correcto.
okRequireValidUser: ✔ chttpd.require_valid_user es correcto.
okRequireValidUserAuth: ✔ chttpd_auth.require_valid_user es correcto.
okWwwAuth: ✔ httpd.WWW-Authenticate es correcto.
optionApply: Aplicar
optionCancel: Cancelar
optionCouchDB: CouchDB
@@ -1689,7 +1689,7 @@ obsidianLiveSyncSettingTab:
optionOnEvents: En eventos
optionPeriodicAndEvents: Periódico y en eventos
optionPeriodicWithBatch: Periódico con lote
optionRebuildBoth: Reconstructuir ambos desde este dispositivo
optionRebuildBoth: Reconstruir ambos desde este dispositivo
optionSaveOnlySettings: (Peligro) Guardar solo configuración
panelChangeLog: Registro de cambios
panelGeneralSettings: Configuraciones generales
@@ -1778,7 +1778,7 @@ Rebuild local and remote database with local files.: Reconstruye la base de dato
Rebuilding Operations (Remote Only): Operaciones de reconstrucción (solo remoto)
Recreate all: Recrear todo
Recreate missing chunks for all files: Recrear fragmentos faltantes para todos los archivos
Reducing the frequency with which on-disk changes are reflected into the DB: Reducir frecuencia de actualizaciones de disco a BD
Reducing the frequency with which on-disk changes are reflected into the DB: Reducir frecuencia de actualizaciones de disco a base de datos
Region: Región
Remediation: Remediación
Remediation Setting Changed: La configuración de remediación cambió
@@ -1789,7 +1789,7 @@ Remote server type: Tipo de servidor remoto
Remote Type: Tipo de remoto
Rename: Renombrar
Requires restart of Obsidian: Requiere reiniciar Obsidian
Requires restart of Obsidian.: Requiere reiniciar Obsidian
Requires restart of Obsidian.: Requiere reiniciar Obsidian.
Resend: Reenviar
Resend all chunks to the remote.: Reenvía todos los chunks al remoto.
Reset: Restablecer
@@ -1828,10 +1828,10 @@ Schedule and Restart: Programar y reiniciar
Scram!: Medidas de emergencia
Seconds, 0 to disable: Segundos, 0 para desactivar
Seconds. Saving to the local database will be delayed until this value after we stop typing or saving.:
Segundos. Guardado en BD local se retrasará hasta este valor tras dejar de
escribir/guardar
Segundos. Guardado en base de datos local se retrasará hasta este valor tras dejar de
escribir o guardar.
Secret Key: Clave secreta
Select the database adapter to use.: Selecciona el adaptador de base de datos que se usará.
Select the database adapter to use.: Selecciona el adaptador de base de datos.
Send: Enviar
Send chunks: Enviar chunks
Server URI: URI del servidor
@@ -1947,7 +1947,7 @@ Stat: Estado
Stats: Estadísticas
Stop ⚡: Detener ⚡
Stop Broadcasting: Detener difusión
Stop reflecting database changes to storage files.: Dejar de reflejar cambios de BD en archivos
Stop reflecting database changes to storage files.: Dejar de reflejar cambios de base de datos en archivos
Stop watching for file changes.: Dejar de monitorear cambios en archivos
Storage -> Database: Almacenamiento -> Base de datos
Strongly Recommended: Muy recomendado
@@ -1981,7 +1981,7 @@ The connection to the server has been configured successfully. As the next step,
La conexión con el servidor se ha configurado correctamente. Como paso
siguiente,
The delay for consecutive on-demand fetches: Retraso entre obtenciones consecutivas
The files in this Vault are almost identical to the server's.: Los archivos de este Vault son casi idénticos a los del servidor.
The files in this Vault are almost identical to the server's.: Los archivos de esta bóveda son casi idénticos a los del servidor.
"The following accepted nodes are missing its node information:\n- ${missingNodes}\n\nThis indicates that they have not been connected for some time or have been left on an older version.\nIt is preferable to update all devices if possible. If you have any devices that are no longer in use, you can clear all accepted nodes by locking the remote once.": >-
A los siguientes nodos aceptados les falta su información de nodo:
@@ -2026,7 +2026,7 @@ the synchronisation data on the server will be built based on the current data o
actuales de este dispositivo.
Themes: Temas
There is a way to resolve this on other devices.: Hay una forma de resolver esto en los demás dispositivos.
There may be differences between the files in this Vault and the server.: Puede haber diferencias entre los archivos de este Vault y los del servidor.
There may be differences between the files in this Vault and the server.: Puede haber diferencias entre los archivos de esta bóveda y los del servidor.
Therefore, we ask that you exercise extreme caution when configuring server information manually. If an incorrect passphrase is entered, the data on the server will become corrupted.:
Por tanto, extrema la precaución al configurar manualmente los datos del
servidor. Si introduces una frase de contraseña incorrecta, los datos del
@@ -2042,23 +2042,23 @@ This first setup has several short steps because it confirms encryption, the con
Una vez completada, los demás dispositivos podrán reutilizar un Setup URI.
This is an extremely powerful operation. We strongly recommend that you copy your Vault folder to a safe location.:
Esta es una operación extremadamente potente. Te recomendamos encarecidamente
copiar la carpeta de tu Vault a un lugar seguro.
copiar la carpeta de tu bóveda a un lugar seguro.
This optional check uses Obsidian's internal request API and sends the credentials above to the CouchDB server. Use it only with a server you trust; administrator access may be required.:
Esta comprobación opcional usa la API interna de solicitudes de Obsidian y
envía las credenciales anteriores al servidor CouchDB. Utilízala solo con un
servidor de confianza; puede requerir acceso de administrador.
This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.: Esta frase no se copia a otros dispositivos. Usará `Default` hasta reconfigurar
This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.: Esta frase no se copia a otros dispositivos. Usará `Default` hasta que lo configures de nuevo.
This password is used to encrypt the connection. Use something long enough.: Esta contraseña se usa para cifrar la conexión. Usa algo suficientemente largo.
This procedure will first delete all existing synchronisation data from the server. Following this, the server data will be completely rebuilt, using the current state of your Vault on this device (including its local database) as:
Este procedimiento eliminará primero todos los datos de sincronización
existentes en el servidor. A continuación, los datos del servidor se
reconstruirán por completo usando el estado actual del Vault de este
reconstruirán por completo usando el estado actual de la bóveda de este
dispositivo (incluida su base de datos local) como
This setting must be the same even when connecting to multiple synchronisation destinations.:
Este ajuste debe ser el mismo incluso si te conectas a varios destinos de
sincronización.
This Vault is empty, or contains only new files that are not on the server.:
Este Vault está vacío o solo contiene archivos nuevos que no están en el
Esta bóveda está vacía o solo contiene archivos nuevos que no están en el
servidor.
This will rebuild the local database on this device using the most recent data from the server. This action is designed to resolve synchronisation inconsistencies and restore correct functionality.:
Esto reconstruirá la base de datos local de este dispositivo con los datos más
@@ -2090,13 +2090,13 @@ TweakMismatchResolve:
UseRemoteWithRebuild: Aplicar los ajustes a este dispositivo y volver a obtener los datos
Message:
AutoAcceptCompatibleUndefined: >-
Parece que los ajustes son distintos en cada dispositivo. Ahora se pueden
aplicar automáticamente los cambios compatibles a estas configuraciones.
¿Quieres activar la aceptación automática (`auto-accept`)?
Main: >-
Los ajustes de la base de datos remota son los siguientes. Los han
configurado otros dispositivos que se han sincronizado con este al menos
una vez.
@@ -2131,7 +2131,7 @@ TweakMismatchResolve:
${additionalMessage}
UseRemote:
WarningRebuildRecommended: >-
>[!NOTICE]
> Algunos cambios son compatibles, pero pueden consumir almacenamiento y
@@ -2140,7 +2140,7 @@ TweakMismatchResolve:
> ***Asegúrate de tener tiempo y una red estable antes de aplicarlo.***
WarningRebuildRequired: >-
>[!WARNING]
> Algunas configuraciones remotas no son compatibles con la base de
@@ -2148,7 +2148,7 @@ TweakMismatchResolve:
> ***Asegúrate de tener tiempo y una red estable antes de aplicarlo.***
WarningIncompatibleRebuildRecommended: >-
>[!NOTICE]
> Hemos detectado que algunos valores difieren de forma que hacen
@@ -2161,7 +2161,7 @@ TweakMismatchResolve:
> Si decides reconstruir, tardará unos minutos o más. **Asegúrate de que
es seguro hacerlo ahora.**
WarningIncompatibleRebuildRequired: >-
>[!WARNING]
> Hemos detectado que algunos valores difieren de forma que hacen
@@ -2316,7 +2316,7 @@ Ui:
SendChunks: Enviar los chunks
Syncing: Sincronización
WarningLockedReadyAction: Estoy listo, desbloquear la base de datos
WarningLockedReadyText: Para evitar que el vault se corrompa, la base de datos
WarningLockedReadyText: Para evitar que la bóveda se corrompa, la base de datos
remota se ha bloqueado para la sincronización. (Este dispositivo está
marcado como «resuelto».) Cuando todos tus dispositivos estén marcados
como «resueltos», desbloquea la base de datos. Este aviso seguirá
@@ -2324,9 +2324,9 @@ Ui:
resuelto.
WarningLockedResolveAction: He hecho una copia de seguridad, marcar este dispositivo como resuelto
WarningLockedResolveText: La base de datos remota está bloqueada para la
sincronización a fin de evitar que el vault se corrompa, porque este
sincronización a fin de evitar que la bóveda se corrompa, porque este
dispositivo no está marcado como «resuelto». Haz una copia de seguridad
de tu vault, restablece la base de datos local y selecciona «Marcar este
de tu bóveda, restablece la base de datos local y selecciona «Marcar este
dispositivo como resuelto». Este aviso seguirá apareciendo hasta que la
replicación confirme que el dispositivo está resuelto.
WriteRedFlagAndRestart: Marcar y reiniciar
@@ -2366,7 +2366,7 @@ Ui:
RemediationNoLimit: Sin límite configurado
RemediationRestartLater: Más tarde
RemediationRestartMessage: Se recomienda encarecidamente reiniciar Obsidian.
Hasta que lo hagas, puede que algunos cambios no surtan efecto y que la
Hasta que lo hagas puede que algunos cambios no surtan efecto y que la
interfaz se muestre de forma inconsistente. ¿Seguro que quieres
reiniciar ahora?
RemediationRestartNow: Reiniciar ahora
@@ -2399,7 +2399,7 @@ Ui:
DisplayName: Nombre visible
DuplicateRemote: Duplicar el remoto
DuplicateRemoteSuffix: ${name} (copia)
E2EEConfiguration: Configuración del E2EE
E2EEConfiguration: Configuración de E2EE
Export: Exportar
FetchRemoteSettings: Obtener los ajustes remotos
ImportConnection: Importar conexión
@@ -2493,7 +2493,7 @@ Ui:
dispositivo obtenga sus datos iniciales.
GuidancePrimary: La conexión punto a punto se ha configurado correctamente. A
continuación, la base de datos local de LiveSync se construirá a partir
de los archivos actuales de este Vault.
de los archivos actuales de esta bóveda.
Important: TEN EN CUENTA
Proceed: Reiniciar y preparar este dispositivo
Question: Pulsa el botón de abajo para reiniciar y pasar a la confirmación de la
@@ -2513,13 +2513,13 @@ Ui:
RebuildEverythingP2P:
ConfirmLocalReset: Entiendo que esto restablece únicamente la base de datos de
sincronización local de este dispositivo.
ConfirmLocalResetNote: Se usarán los archivos que hay ahora en este Vault para reconstruirla.
ConfirmLocalResetNote: Se usarán los archivos que hay ahora en esta bóveda para reconstruirla.
ConfirmTitle: ⚠️ Confirma lo siguiente
Guidance: Este procedimiento descartará la base de datos local de LiveSync de
este dispositivo y la reconstruirá a partir de los archivos actuales de
este Vault. No elimina ni sobrescribe datos de otro dispositivo.
esta bóveda. No elimina ni sobrescribe datos de otro dispositivo.
Note: Mantén este dispositivo conectado después de la inicialización para que
otro dispositivo pueda obtener el Vault desde él.
otro dispositivo pueda obtener la bóveda desde él.
Proceed: Lo entiendo, preparar este dispositivo
Title: "Confirmación final: preparar este dispositivo para P2P"
SelectExisting:
@@ -2560,7 +2560,7 @@ Ui:
un servicio de almacenamiento de objetos compatible con S3, como Amazon
S3, MinIO o Cloudflare R2.
CouchDbOptionDesc: Es el método de sincronización más adecuado para el diseño
actual y ofrece todas las funciones. Necesitas tener ya una instancia de
actual y ofrece todas las funciones. Necesitas tener una instancia de
CouchDB en marcha.
Guidance: Selecciona el tipo de remoto para esta configuración de sincronización.
P2POption: Punto a punto (P2P)
@@ -2611,8 +2611,8 @@ We cannot change the device name while this feature is enabled. Please disable t
habilitada. Deshabilita la función para cambiarlo.
We have to configure the device name: Hay que configurar el nombre del dispositivo
We recommend that you copy your Vault folder to a safe location. This will provide a safeguard in case a large number of conflicts arise, or if you accidentally synchronise with an incorrect destination.:
Te recomendamos copiar la carpeta de tu Vault a un lugar seguro. Así tendrás
una salvaguarda en caso de que surjan muchos conflictos o de que sincronices
Te recomendamos copiar la carpeta de tu bóveda a un lugar seguro. Así tendrás
una copia de seguridad en caso de que surjan muchos conflictos o de que sincronices
por error con un destino incorrecto.
When you save a file in the editor, start a sync automatically: Iniciar sincronización automática al guardar en editor
Write credentials in the file: Escribir credenciales en archivo
@@ -2621,60 +2621,60 @@ xxhash32 (Fast but less collision resistance): xxhash32 (rápido, pero con menor
xxhash64 (Fastest): xxhash64 (el más rápido)
"Welcome to Self-hosted LiveSync": "Bienvenido a Self-hosted LiveSync"
"We will now guide you through a few questions to simplify the synchronisation setup.":
"Ahora le guiaremos con unas pocas preguntas para simplificar la configuración
"Ahora te guiaremos con unas pocas preguntas para simplificar la configuración
de la sincronización。"
"First, please select the option that best describes your current situation.": "Primero, seleccione la opción que describa mejor su situación actual。"
"First, please select the option that best describes your current situation.": "Primero, seleccione la opción que mejor describa tu situación actual。"
"I am setting this up for the first time": "Estoy configurando esto por primera vez"
"(Select this if you are configuring this device as the first synchronisation device.) This option is suitable if you are new to LiveSync and want to set it up from scratch.":
"(Seleccione esto si está configurando este dispositivo como el primer
dispositivo de sincronización). Esta opción es adecuada si es nuevo en
LiveSync y desea configurarlo desde cero。"
"(Selecciona esto si estás configurando este dispositivo como el primer
dispositivo de sincronización). Esta opción es adecuada si eres nuevo en
LiveSync y quieres configurarlo desde cero。"
"I am adding a device to an existing synchronisation setup":
"Estoy agregando un dispositivo a una configuración de sincronización
existente"
"(Select this if another device is already using LiveSync.) This option adds this device to that existing synchronisation setup.":
"(Seleccione esto si ya utiliza la sincronización en otro ordenador o
teléfono). Esta opción es adecuada si desea añadir este dispositivo a una
"(Seleccione esto si ya utilizas la sincronización en otro ordenador o
teléfono). Esta opción es adecuada si quieres añadir este dispositivo a una
configuración de LiveSync existente。"
"Yes, I want to set up a new synchronisation": "Sí, quiero configurar una nueva sincronización"
"Yes, I want to add this device to my existing synchronisation": "Sí, quiero añadir este dispositivo a mi sincronización existente"
"No, please take me back": "No, volver atrás"
"Device Setup Method": "Método de configuración del dispositivo"
"You are adding this device to an existing synchronisation setup.":
"Está añadiendo este dispositivo a una configuración de sincronización
"Estás añadiendo este dispositivo a una configuración de sincronización
existente。"
"Please select a method to import the settings from another device.": "Seleccione un método para importar la configuración desde otro dispositivo。"
"Use a Setup URI (Recommended)": "Usar un URI de configuración (recomendado)"
"Paste the Setup URI generated from one of your active devices.": "Pegue el URI de configuración generado desde uno de sus dispositivos activos。"
"Please select a method to import the settings from another device.": "Selecciona un método para importar la configuración desde otro dispositivo。"
"Use a Setup URI (Recommended)": "Usar URI de configuración (recomendado)"
"Paste the Setup URI generated from one of your active devices.": "Pega el URI de configuración generado desde uno de tus dispositivos activos。"
"Scan a QR Code (Recommended for mobile)": "Escanear un código QR (recomendado para móviles)"
"Scan the QR code displayed on an active device using this device's camera.":
"Escanee con la cámara de este dispositivo el código QR mostrado en un
"Escanea con la cámara de este dispositivo el código QR mostrado en un
dispositivo activo。"
"Enter the server information manually": "Introducir manualmente la información del servidor"
"Configure the same server information as your other devices again, manually, very advanced users only.":
"Configure manualmente la misma información del servidor que en sus otros
"Configura manualmente la misma información del servidor que en sus otros
dispositivos. Solo para usuarios muy avanzados。"
"Proceed with Setup URI": "Continuar con el URI de configuración"
"I know my server details, let me enter them": "Conozco los datos de mi servidor; permítame introducirlos"
"Please select an option to proceed": "Seleccione una opción para continuar"
"I know my server details, let me enter them": "Conozco los datos de mi servidor; déjame introducirlos"
"Please select an option to proceed": "Selecciona una opción para continuar"
"Connection Method": "Método de conexión"
"We will now proceed with the server configuration.": "Ahora continuaremos con la configuración del servidor。"
"How would you like to configure the connection to your server?": "¿Cómo desea configurar la conexión con su servidor?"
"How would you like to configure the connection to your server?": "¿Cómo quieres configurar la conexión con tu servidor?"
"A Setup URI is a single string of text containing your server address and authentication details. Using a URI, if one was generated by your server installation script, provides a simple and secure configuration.":
"Un URI de configuración es una única cadena de texto que contiene la
dirección del servidor y los datos de autenticación. Si el script de
instalación de su servidor generó un URI, usarlo proporciona una configuración
instalación de tu servidor generó un URI, usarla proporciona una configuración
sencilla y segura。"
"This is an advanced option for users who do not have a URI or who wish to configure detailed settings.":
"Esta es una opción avanzada para usuarios que no disponen de un URI o que
desean configurar parámetros detallados。"
"Enter Server Information": "Introducir información del servidor"
"Please select the type of server to which you are connecting.": "Seleccione el tipo de servidor al que se está conectando。"
"Please select the type of server to which you are connecting.": "Selecciona el tipo de servidor al que se está conectando。"
"Continue to CouchDB setup": "Continuar con la configuración de CouchDB"
"Continue to S3/MinIO/R2 setup": "Continuar con la configuración de S3/MinIO/R2"
"Continue to Peer-to-Peer only setup": "Continuar con la configuración solo Peer-to-Peer"
"This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.":
"Este es el método de sincronización más adecuado para el diseño. Todas las
"Este es el método de sincronización más adecuado para el diseño del complemento. Todas las
funciones están disponibles. Debe tener configurada una instancia de CouchDB。"
"S3/MinIO/R2 Object Storage": "Almacenamiento de objetos S3/MinIO/R2"
"Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.":
@@ -2694,4 +2694,4 @@ You should perform this operation only in exceptional circumstances, such as whe
"Solo deberías realizar esta operación en circunstancias excepcionales: cuando
los datos del servidor estén completamente corruptos, cuando ya no necesites
los cambios de los demás dispositivos o cuando el tamaño de la base de datos
sea inusualmente grande respecto al del Vault."
sea inusualmente grande respecto a la bóveda."
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,57 @@
import { afterEach, describe, expect, it } from "vitest";
import { allMessages } from "./messages/combinedMessages.prod";
import { $msg, setLang } from "./translation";
function interpolationNames(message: string): string[] {
return [...message.matchAll(/\$\{([^}]+)\}/g)].map((match) => match[1]).sort();
}
describe("Russian catalogue interpolation", () => {
afterEach(() => setLang("def"));
it("retains the English interpolation values in each translated message", () => {
const mismatches = Object.entries(allMessages).flatMap(([key, messages]) => {
if (!messages.def || !messages.ru) return [];
const expected = interpolationNames(messages.def);
const actual = interpolationNames(messages.ru);
return JSON.stringify(actual) === JSON.stringify(expected) ? [] : [{ key, expected, actual }];
});
expect(mismatches).toEqual([]);
});
it("renders the generated QR image inside its display container", () => {
setLang("ru");
const qrImage = '<img src="data:image/png;base64,cXI=" alt="Fixture QR code">';
const message = $msg("Setup.QRCode", { qr_image: qrImage });
expect(message).toContain(`<div class="sls-qr">${qrImage}</div>`);
expect(message).not.toContain("${qr_image}");
});
it("shows both generated keys in their individual and combined copy areas", () => {
setLang("ru");
const publicKey = "PUBLIC-KEY-FIXTURE";
const privateKey = "PRIVATE-KEY-FIXTURE";
const message = $msg("Setting.GenerateKeyPair.Desc", { public_key: publicKey, private_key: privateKey });
expect(message.split(publicKey)).toHaveLength(3);
expect(message.split(privateKey)).toHaveLength(3);
expect(message).toContain(`${publicKey}\n${privateKey}`);
expect(message).not.toMatch(/\$\{(?:public_key|private_key)\}/);
});
it("keeps the measured and configured database sizes in the comparison table", () => {
setLang("ru");
const message = $msg("moduleCheckRemoteSize.msgDatabaseGrowing", {
estimatedSize: "123 MB",
maxSize: "456 MB",
});
expect(message).toContain("| 123 MB | 456 MB |");
expect(message).not.toMatch(/\$\{(?:estimatedSize|maxSize)\}/);
});
});
@@ -52,7 +52,7 @@ vi.mock("@/common/obsidianCommunityPlugins.ts", () => ({
}));
import { cancelTask } from "@/common/utils.ts";
import { ConfigSync } from "./CmdConfigSync";
import { ConfigSync, PluginDataExDisplayV2, type IPluginDataExDisplay } from "./CmdConfigSync";
describe("ConfigSync commands", () => {
it("shows the Customisation Sync command only whilst the feature is enabled", () => {
@@ -111,3 +111,25 @@ describe("ConfigSync commands", () => {
expect(periodicPluginSweepProcessor.disable).toHaveBeenCalledOnce();
});
});
describe("PluginDataExDisplayV2", () => {
const entryWithModifiedTimes = (mtimes: number[]) =>
new PluginDataExDisplayV2({
documentPath: "ix:device/plugin_main/example",
category: "PLUGIN_MAIN",
name: "example",
term: "device",
files: mtimes.map((mtime, index) => ({ filename: `file-${index}`, mtime, data: [] })),
} as unknown as IPluginDataExDisplay);
it("averages millisecond modification times without truncating them to 32 bits", () => {
const mtime = Date.UTC(2026, 8, 15);
expect(entryWithModifiedTimes([mtime, mtime, mtime]).mtime).toBe(mtime);
});
it("keeps a newer copy newer than an older one", () => {
const newer = entryWithModifiedTimes([Date.UTC(2026, 8, 15)]);
const older = entryWithModifiedTimes([Date.UTC(2026, 8, 2)]);
expect(newer.mtime).toBeGreaterThan(older.mtime);
});
});
+2 -1
View File
@@ -368,7 +368,8 @@ export class PluginDataExDisplayV2 {
return this._version;
}
get mtime(): number {
return ~~this.files.reduce((a, b) => a + b.mtime, 0) / this.files.length;
// Millisecond timestamps exceed 32 bits, so `~~` would wrap them.
return Math.floor(this.files.reduce((a, b) => a + b.mtime, 0) / this.files.length);
}
}
export type PluginDataEx = {
+14 -17
View File
@@ -12,6 +12,7 @@
// import { askString } from "../../common/utils";
import { Menu } from "@/deps.ts";
import { $msg as translateMessage } from "@/common/translation";
import { selectSourceTerms } from "./PluginTerms.ts";
export let list: IPluginDataExDisplay[] = [];
export let thisTerm = "";
@@ -182,24 +183,20 @@
}
}
async function updateTerms(list: IPluginDataExDisplay[], selectNewest: boolean, isMaintenanceMode: boolean) {
async function updateTerms(
list: IPluginDataExDisplay[],
selectNewest: boolean,
isMaintenanceMode: boolean,
hideNotApplicable: boolean
) {
const local = list.find((e) => e.term == thisTerm);
// selected = "";
if (isMaintenanceMode) {
terms = [...new Set(list.map((e) => e.term))];
} else if (hideNotApplicable) {
const termsTmp = [];
const wk = [...new Set(list.map((e) => e.term))];
for (const termName of wk) {
const remote = list.find((e) => e.term == termName);
if ((await comparePlugin(local, remote)).canApply) {
termsTmp.push(termName);
}
}
terms = [...termsTmp];
} else {
terms = [...new Set(list.map((e) => e.term))].filter((e) => e != thisTerm);
}
terms = await selectSourceTerms(
list,
thisTerm,
{ isMaintenanceMode, hideNotApplicable },
async (local, remote) => (await comparePlugin(local, remote)).canApply
);
let newest: IPluginDataExDisplay | undefined = local;
if (selectNewest) {
for (const term of terms) {
@@ -230,7 +227,7 @@
}
// currentSelectNewest = selectNewest;
}
updateTerms(list, doSelectNewest, isMaintenanceMode);
updateTerms(list, doSelectNewest, isMaintenanceMode, hideNotApplicable);
currentSelectNewest = selectNewest;
}
$: {
+2 -1
View File
@@ -32,7 +32,8 @@
export let core :LiveSyncBaseCore;
// $: core = plugin.core;
$: hideNotApplicable = false;
// Comparing every copy is only worth it while the user asks to hide the unchanged ones.
$: hideNotApplicable = hideEven;
$: thisTerm = core.services.setting.getDeviceAndVaultName();
const addOn = core.getAddOn<ConfigSync>(ConfigSync.name)!;
+32
View File
@@ -0,0 +1,32 @@
import type { IPluginDataExDisplay } from "./CmdConfigSync.ts";
export type CanApplyFrom = (
local: IPluginDataExDisplay | undefined,
remote: IPluginDataExDisplay | undefined
) => Promise<boolean>;
/**
* Devices offered as sources for one item in the Customisation Sync dialogue.
*
* Maintenance mode lists every device, including this one. Otherwise every other
* device that has the item is listed; with `hideNotApplicable`, only devices whose
* copy can actually be applied remain, so an item that is the same everywhere ends
* up with no source and is shown as "All the same or non-existent".
*/
export async function selectSourceTerms(
list: IPluginDataExDisplay[],
thisTerm: string,
options: { isMaintenanceMode: boolean; hideNotApplicable: boolean },
canApplyFrom: CanApplyFrom
): Promise<string[]> {
const terms = [...new Set(list.map((e) => e.term))];
if (options.isMaintenanceMode) return terms;
if (!options.hideNotApplicable) return terms.filter((term) => term != thisTerm);
const local = list.find((e) => e.term == thisTerm);
const applicable: string[] = [];
for (const term of terms) {
const remote = list.find((e) => e.term == term);
if (await canApplyFrom(local, remote)) applicable.push(term);
}
return applicable;
}
@@ -0,0 +1,54 @@
import { describe, expect, it, vi } from "vitest";
import type { IPluginDataExDisplay } from "./CmdConfigSync.ts";
import { selectSourceTerms } from "./PluginTerms.ts";
const copyOn = (term: string) => ({ term, files: [] }) as unknown as IPluginDataExDisplay;
const list = [copyOn("desktop"), copyOn("phone"), copyOn("tablet")];
const differsOn =
(...terms: string[]) =>
(_local: IPluginDataExDisplay | undefined, remote: IPluginDataExDisplay | undefined) =>
Promise.resolve(terms.includes(remote?.term ?? ""));
describe("selectSourceTerms", () => {
it("offers every other device without comparing copies by default", async () => {
const canApplyFrom = vi.fn(differsOn());
const terms = await selectSourceTerms(
list,
"desktop",
{ isMaintenanceMode: false, hideNotApplicable: false },
canApplyFrom
);
expect(terms).toEqual(["phone", "tablet"]);
expect(canApplyFrom).not.toHaveBeenCalled();
});
it("offers every device, including this one, in maintenance mode", async () => {
const terms = await selectSourceTerms(
list,
"desktop",
{ isMaintenanceMode: true, hideNotApplicable: true },
differsOn()
);
expect(terms).toEqual(["desktop", "phone", "tablet"]);
});
it("leaves out devices whose copy is the same when hiding items that are not applicable", async () => {
const terms = await selectSourceTerms(
list,
"desktop",
{ isMaintenanceMode: false, hideNotApplicable: true },
differsOn("tablet")
);
expect(terms).toEqual(["tablet"]);
});
it("offers no source for an item that is the same on every device", async () => {
const terms = await selectSourceTerms(
list,
"desktop",
{ isMaintenanceMode: false, hideNotApplicable: true },
differsOn()
);
expect(terms).toEqual([]);
});
});
+2
View File
@@ -225,6 +225,8 @@ This proves in real Obsidian the plug-in behaviour shared by supported platforms
`test:e2e:obsidian:customisation-sync` runs a two-vault Customisation Sync workflow. It scans a real snippet CSS file, config JSON file, and sample plug-in fixture into per-file Customisation Sync data, synchronises the entries through CouchDB, applies them on the second vault, verifies the resulting `.obsidian` files, propagates a snippet update, and verifies deletion of the source-vault snippet sync data without confusing it with the target vault's own applied copy.
The workflow also opens the Customisation Sync dialogue. `--case=visibility` checks that **Hide not applicable items** hides an identical snippet, preserves a different snippet and its source selector, and restores the identical snippet when cleared. `--case=mtime` gives the multi-file plug-in fixture modern millisecond timestamps and requires an older remote copy to remain labelled **Older** and unselected by **Select All Shiny**. With no case argument, both checks run before the existing apply, update, and deletion workflow.
`test:e2e:obsidian:received-change-readiness` uses two sequential real Obsidian sessions and isolated CouchDB databases. The source creates ordinary notes and their Chunks; the target starts continuous replication, resets readiness through the public lifecycle service, and receives those documents while its Vault files remain absent. Marking the target ready twice must emit one readiness event and reflect the queued content. A second note remains absent after readiness while database reflecting is explicitly suspended, then appears when that setting is resumed. This focused scenario is outside `test:e2e:obsidian:local-suite`.
`test:e2e:obsidian:remote-feature-change` starts real Obsidian with continuous CouchDB replication, then changes the remote version document from generation 12 to generation 13 with an unknown feature. It waits for the control document to reach the local database and the active Replicator to retire, checks that another replication is refused, and verifies that an already accepted Vault note remains intact. After restarting the same Vault, the current remote declaration still blocks finite replication and the actual continuous connection attempt. No KV feature history is involved. It is a focused test outside `test:e2e:obsidian:local-suite`; recovery with a future compatible client remains a separate validation boundary.
+228 -8
View File
@@ -1,4 +1,4 @@
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
import { mkdir, readFile, rm, utimes, writeFile } from "node:fs/promises";
import { dirname, join } from "node:path";
import { VERSIONING_DOCID } from "@vrtmrz/livesync-commonlib/compat/common/types";
import { ENCRYPTED_INTERNAL_METADATA_FEATURE, REMOTE_FEATURE_GENERATION } from "@vrtmrz/livesync-commonlib/replication";
@@ -25,7 +25,9 @@ import {
waitForLiveSyncCoreReady,
} from "../runner/liveSyncWorkflow.ts";
import { startObsidianLiveSyncSession, type ObsidianLiveSyncSession } from "../runner/session.ts";
import { waitForVisibleObsidianDialogue, withObsidianPage } from "../runner/ui.ts";
import { createTemporaryVault, type TemporaryVault } from "../runner/vault.ts";
import type { Locator } from "playwright";
process.env.E2E_OBSIDIAN_CLI_TIMEOUT_MS ??= "30000";
process.env.E2E_OBSIDIAN_COUCHDB_TIMEOUT_MS ??= "20000";
@@ -57,6 +59,11 @@ const pluginDir = ".obsidian/plugins/livesync-e2e-sample";
const pluginManifestPath = `${pluginDir}/manifest.json`;
const pluginMainPath = `${pluginDir}/main.js`;
const pluginStylesPath = `${pluginDir}/styles.css`;
const identicalSnippetPath = ".obsidian/snippets/livesync-customisation-e2e-identical.css";
const identicalSnippetContent = ".livesync-customisation-identical { color: #3d6f54; }\n";
const differentSnippetPath = ".obsidian/snippets/livesync-customisation-e2e-different.css";
const sourceDifferentSnippetContent = ".livesync-customisation-different { color: #73548f; }\n";
const targetDifferentSnippetContent = ".livesync-customisation-different { color: #3d6f54; }\n";
const pluginManifestContent =
JSON.stringify(
{
@@ -80,8 +87,28 @@ const pluginMainContent = [
"",
].join("\n");
const pluginStylesContent = ".livesync-e2e-sample { color: #73548f; }\n";
const targetPluginStylesContent = ".livesync-e2e-sample { color: #3d6f54; }\n";
// These dates straddle a signed 32-bit wrap boundary for millisecond timestamps.
const sourcePluginMtime = new Date("2026-09-01T12:00:00.000Z");
const targetPluginMtime = new Date("2026-09-15T12:00:00.000Z");
const matchingMtime = new Date("2026-09-15T12:00:00.000Z");
const sourceDeviceName = "customisation-sync-a";
const targetDeviceName = "customisation-sync-b";
const visibilityFixtures = [
{ path: identicalSnippetPath, source: identicalSnippetContent, target: identicalSnippetContent },
{ path: differentSnippetPath, source: sourceDifferentSnippetContent, target: targetDifferentSnippetContent },
] as const;
const pluginFixtures = [
{ path: pluginManifestPath, source: pluginManifestContent, target: pluginManifestContent },
{ path: pluginMainPath, source: pluginMainContent, target: pluginMainContent },
{ path: pluginStylesPath, source: pluginStylesContent, target: targetPluginStylesContent },
] as const;
type CustomisationSyncCase = "all" | "visibility" | "mtime";
type CustomisationSyncTestGlobal = typeof globalThis & {
app?: { commands?: { executeCommandById(commandId: string): boolean } };
};
type RunnerContext = {
binary: string;
@@ -110,6 +137,113 @@ async function writeVaultFile(vaultPath: string, path: string, content: string):
await writeFile(fullPath, content, "utf-8");
}
async function setVaultFileMtime(vaultPath: string, path: string, mtime: Date): Promise<void> {
const fullPath = join(vaultPath, path);
await utimes(fullPath, mtime, mtime);
}
function selectedCase(): CustomisationSyncCase {
const args = process.argv.slice(2);
if (args.length === 0) return "all";
const arg = args[0];
if (args.length !== 1 || !arg?.startsWith("--case=")) {
throw new Error("Usage: test:e2e:obsidian:customisation-sync [--case=all|visibility|mtime]");
}
const selected = arg.slice("--case=".length);
if (selected === "all" || selected === "visibility" || selected === "mtime") return selected;
throw new Error(`Unknown Customisation Sync E2E case: ${selected}`);
}
async function assertSourceCandidate(row: Locator, term: string, name: string): Promise<void> {
const candidate = row.locator(`select option[value="${term}"]`);
try {
await candidate.waitFor({ state: "attached", timeout: 10000 });
} catch {
throw new Error(`Customisation Sync ${name} source candidate was not available: ${term}`);
}
}
async function inspectCustomisationVisibility(session: ObsidianLiveSyncSession): Promise<void> {
await withObsidianPage(session.remoteDebuggingPort, async (page) => {
const opened = await page.evaluate(() =>
(globalThis as CustomisationSyncTestGlobal).app?.commands?.executeCommandById(
"obsidian-livesync:livesync-plugin-dialog-ex"
)
);
if (opened !== true) throw new Error("Could not open the Customisation Sync dialogue command.");
const dialogue = await waitForVisibleObsidianDialogue(page, "Customization Sync (Beta3)");
const identicalName = identicalSnippetPath.split("/").pop() ?? identicalSnippetPath;
const differentName = differentSnippetPath.split("/").pop() ?? differentSnippetPath;
const identicalRow = dialogue.locator(".labelrow").filter({ hasText: identicalName }).first();
const differentRow = dialogue.locator(".labelrow").filter({ hasText: differentName }).first();
const hideCheckbox = dialogue
.locator("label")
.filter({ hasText: "Hide not applicable items" })
.locator('input[type="checkbox"]');
await identicalRow.waitFor({ state: "visible", timeout: 10000 });
await differentRow.waitFor({ state: "visible", timeout: 10000 });
await assertSourceCandidate(identicalRow, sourceDeviceName, "identical item");
await assertSourceCandidate(differentRow, sourceDeviceName, "different item");
if (await hideCheckbox.isChecked()) throw new Error("Hide not applicable items started checked.");
await hideCheckbox.check();
await identicalRow.waitFor({ state: "hidden", timeout: 10000 });
await differentRow.waitFor({ state: "visible", timeout: 10000 });
await assertSourceCandidate(differentRow, sourceDeviceName, "different item while hiding identical items");
await hideCheckbox.uncheck();
await identicalRow.waitFor({ state: "visible", timeout: 10000 });
await assertSourceCandidate(identicalRow, sourceDeviceName, "identical item after unhiding");
await page.keyboard.press("Escape");
await dialogue.waitFor({ state: "hidden", timeout: 10000 });
});
}
async function inspectPluginFreshnessAndNewestSelection(session: ObsidianLiveSyncSession): Promise<void> {
await withObsidianPage(session.remoteDebuggingPort, async (page) => {
const opened = await page.evaluate(() =>
(globalThis as CustomisationSyncTestGlobal).app?.commands?.executeCommandById(
"obsidian-livesync:livesync-plugin-dialog-ex"
)
);
if (opened !== true) throw new Error("Could not open the Customisation Sync dialogue command.");
const dialogue = await waitForVisibleObsidianDialogue(page, "Customization Sync (Beta3)");
const pluginMainRow = dialogue.locator(`.filerow:has(select option[value="${sourceDeviceName}"])`).first();
const sourceOption = pluginMainRow.locator(`select option[value="${sourceDeviceName}"]`);
const sourceSelect = pluginMainRow.locator("select");
const failures: string[] = [];
await sourceOption.waitFor({ state: "attached", timeout: 10000 });
await sourceSelect.selectOption(sourceDeviceName);
try {
await pluginMainRow.locator(".chip.modified").filter({ hasText: "Older" }).waitFor({
state: "visible",
timeout: 10000,
});
} catch {
const freshness = (await pluginMainRow.locator(".chip.modified").textContent())?.trim() || "(empty)";
failures.push(`Expected the remote multi-file plug-in copy to be Older; found '${freshness}'.`);
}
await dialogue.getByRole("button", { name: "Deselect all", exact: true }).click();
await sourceSelect.waitFor({ state: "visible", timeout: 10000 });
await page.waitForTimeout(50);
if ((await sourceSelect.inputValue()) !== "") {
throw new Error("Deselect all did not clear the selected Customisation Sync source.");
}
await dialogue.getByRole("button", { name: "Select All Shiny", exact: true }).click();
await page.waitForTimeout(100);
if ((await sourceSelect.inputValue()) !== "") {
failures.push("Select All Shiny chose the older multi-file plug-in copy.");
}
if (failures.length > 0) throw new Error(failures.join("\n"));
await page.keyboard.press("Escape");
await dialogue.waitFor({ state: "hidden", timeout: 10000 });
});
}
async function removeVaultFile(vaultPath: string, path: string): Promise<void> {
await rm(join(vaultPath, path), { force: true });
}
@@ -437,6 +571,9 @@ async function applyRemoteCustomisationGroup(
}
async function main(): Promise<void> {
const testCase = selectedCase();
const testVisibility = testCase === "all" || testCase === "visibility";
const testMtime = testCase === "all" || testCase === "mtime";
const binary = requireObsidianBinary();
const cli = discoverObsidianCli();
if (!cli.binary) {
@@ -467,15 +604,43 @@ async function main(): Promise<void> {
await writeVaultFile(vaultA.path, pluginManifestPath, pluginManifestContent);
await writeVaultFile(vaultA.path, pluginMainPath, pluginMainContent);
await writeVaultFile(vaultA.path, pluginStylesPath, pluginStylesContent);
if (testVisibility) {
for (const fixture of visibilityFixtures) {
await writeVaultFile(vaultA.path, fixture.path, fixture.source);
await setVaultFileMtime(vaultA.path, fixture.path, matchingMtime);
}
}
if (testMtime) {
for (const fixture of pluginFixtures) {
await setVaultFileMtime(vaultA.path, fixture.path, sourcePluginMtime);
}
}
if (testVisibility) {
for (const fixture of visibilityFixtures) {
await writeVaultFile(vaultB.path, fixture.path, fixture.target);
await setVaultFileMtime(vaultB.path, fixture.path, matchingMtime);
}
}
if (testMtime) {
for (const fixture of pluginFixtures) {
await writeVaultFile(vaultB.path, fixture.path, fixture.target);
await setVaultFileMtime(vaultB.path, fixture.path, targetPluginMtime);
}
}
let session = await startConfiguredSession(context, vaultA, sourceDeviceName);
const scanResult = await scanCustomisations(context.cliBinary, session.cliEnv);
console.log(`Customisation scan files: ${scanResult.files.join(", ") || "(none)"}`);
await storeCustomisationFile(context.cliBinary, session.cliEnv, snippetPath);
await storeCustomisationFile(context.cliBinary, session.cliEnv, configPath);
await storeCustomisationFile(context.cliBinary, session.cliEnv, pluginManifestPath);
await storeCustomisationFile(context.cliBinary, session.cliEnv, pluginMainPath);
await storeCustomisationFile(context.cliBinary, session.cliEnv, pluginStylesPath);
for (const fixture of pluginFixtures) {
await storeCustomisationFile(context.cliBinary, session.cliEnv, fixture.path);
}
if (testVisibility) {
for (const fixture of visibilityFixtures) {
await storeCustomisationFile(context.cliBinary, session.cliEnv, fixture.path);
}
}
const entry = await waitForCustomisationEntry(context.cliBinary, session.cliEnv, "SNIPPET", snippetName);
const configEntry = await waitForCustomisationEntry(context.cliBinary, session.cliEnv, "CONFIG", configName);
const pluginEntries = await waitForCustomisationEntries(
@@ -495,21 +660,76 @@ async function main(): Promise<void> {
});
for (const target of [entry, configEntry, ...pluginEntries]) {
const remoteEntry = await fetchCouchDbDocument(context.couchDb, context.dbName, target.id);
if (!remoteEntry.path?.startsWith("/\\:") || remoteEntry.children?.length !== 0 ||
remoteEntry.ctime !== 0 || remoteEntry.mtime !== 0 || remoteEntry.size !== 0) {
if (
!remoteEntry.path?.startsWith("/\\:") ||
remoteEntry.children?.length !== 0 ||
remoteEntry.ctime !== 0 ||
remoteEntry.mtime !== 0 ||
remoteEntry.size !== 0
) {
throw new Error(`Customisation Sync Metadata was not encrypted for ${target.id}.`);
}
}
const versionInfo = await fetchCouchDbDocument(context.couchDb, context.dbName, VERSIONING_DOCID);
if (versionInfo.version !== REMOTE_FEATURE_GENERATION ||
!(versionInfo.used_features as unknown[] | undefined)?.includes(ENCRYPTED_INTERNAL_METADATA_FEATURE)) {
if (
versionInfo.version !== REMOTE_FEATURE_GENERATION ||
!(versionInfo.used_features as unknown[] | undefined)?.includes(ENCRYPTED_INTERNAL_METADATA_FEATURE)
) {
throw new Error("The remote feature list does not declare encrypted internal Metadata.");
}
await session.app.stop();
session = await startConfiguredSession(context, vaultB, targetDeviceName);
if (testVisibility) {
for (const fixture of visibilityFixtures) {
await storeCustomisationFile(context.cliBinary, session.cliEnv, fixture.path);
}
}
if (testMtime) {
for (const fixture of pluginFixtures) {
await storeCustomisationFile(context.cliBinary, session.cliEnv, fixture.path);
}
}
await pushLocalChanges(context.cliBinary, session.cliEnv);
await waitForCustomisationEntry(context.cliBinary, session.cliEnv, "SNIPPET", snippetName, sourceDeviceName);
if (testVisibility) {
for (const fixture of visibilityFixtures) {
const name = fixture.path.split("/").pop() ?? fixture.path;
for (const term of [sourceDeviceName, targetDeviceName]) {
await waitForCustomisationEntry(context.cliBinary, session.cliEnv, "SNIPPET", name, term);
}
}
}
if (testMtime) {
await waitForCustomisationEntries(
context.cliBinary,
session.cliEnv,
"PLUGIN_MAIN",
pluginName,
3,
sourceDeviceName
);
await waitForCustomisationEntries(
context.cliBinary,
session.cliEnv,
"PLUGIN_MAIN",
pluginName,
3,
targetDeviceName
);
}
try {
if (testVisibility) await inspectCustomisationVisibility(session);
if (testMtime) await inspectPluginFreshnessAndNewestSelection(session);
} catch (error) {
await session.app.stop().catch(() => undefined);
throw error;
}
if (testCase !== "all") {
await session.app.stop();
console.log(`Customisation Sync ${testCase} regression case passed.`);
return;
}
assertEqual(
await pathExists(vaultB.path, snippetPath),
false,
+15
View File
@@ -42,6 +42,21 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi
#### Fixed
- Received changes held during start-up or a fetch are applied when LiveSync becomes ready, without waiting for another change or a settings save. **Suspend database reflecting** continues to hold changes (#1200).
- Customisation Sync now compares full millisecond timestamps, so the freshness labels and **Select All Shiny** no longer mistake an older copy for a newer one because of timestamp truncation. (#1194)
- **Hide not applicable items** now hides identical Customisation Sync items and refreshes the list when toggled. Items with applicable differences stay visible. (#1193)
### Interface and translation
#### Improved
- More settings and messages are now available in Russian. (#1187)
- Dialogues show generated QR codes, key pairs, and database sizes again.
### Interface and translation
#### Improved
- We now have refreshed Spanish translations for settings and messages. (#1212)
### Setup