diff --git a/src/common/messages/combinedMessages.prod.ts b/src/common/messages/combinedMessages.prod.ts index a5b12d87..140a5af8 100644 --- a/src/common/messages/combinedMessages.prod.ts +++ b/src/common/messages/combinedMessages.prod.ts @@ -777,6 +777,10 @@ export const allMessages: Readonly Storage": "Database -> Storage", "Database Adapter": "Database Adapter", @@ -159,6 +163,8 @@ "Delete all data on the remote server.": "Delete all data on the remote server.", "Delete All of": "Delete All of", "Delete local database to reset or uninstall Self-hosted LiveSync": "Delete local database to reset or uninstall Self-hosted LiveSync", + "Delete local files if deleted on remote": "Delete local files if deleted on remote", + "Delete local files if not on remote": "Delete local files if not on remote", "Delete old metadata of deleted files on start-up": "Delete old metadata of deleted files on start-up", "Delete Remote Configuration": "Delete Remote Configuration", "Delete remote configuration '{name}'?": "Delete remote configuration '{name}'?", @@ -283,6 +289,7 @@ "File to view History": "File to view History", "Filename": "Filename", "Final Confirmation: Overwrite Server Data with This Device's Files": "Final Confirmation: Overwrite Server Data with This Device's Files", + "Finalise the process and resume normal operation": "Finalise the process and resume normal operation", "First, please select the option that best describes your current situation.": "First, please select the option that best describes your current situation.", "Fix": "Fix", "Flag and restart": "Flag and restart", @@ -311,15 +318,19 @@ "Hide password": "Hide password", "Higher (${local} > ${remote})": "Higher (${local} > ${remote})", "Highlight diff": "Highlight diff", + "How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.", "How to display network errors when the sync server is unreachable.": "How to display network errors when the sync server is unreachable.", + "How to handle extra existing local files?": "How to handle extra existing local files?", "How would you like to configure the connection to your server?": "How would you like to configure the connection to your server?", "However, This should not be enabled if you want to increase your secrecy more.": "However, This should not be enabled if you want to increase your secrecy more.", "I am adding a device to an existing synchronisation setup": "I am adding a device to an existing synchronisation setup", + "I am ready, unlock the database": "I am ready, unlock the database", "I am setting this up for the first time": "I am setting this up for the first time", "I am setting up a new server for the first time / I want to reset my existing server.": "I am setting up a new server for the first time / I want to reset my existing server.", "I am unable to create a backup of my Vault.": "I am unable to create a backup of my Vault.", "I am unable to create a backup of my Vaults.": "I am unable to create a backup of my Vaults.", "I have created a backup of my Vault.": "I have created a backup of my Vault.", + "I have made a backup, mark this device as resolved": "I have made a backup, mark this device as resolved", "I know my server details, let me enter them": "I know my server details, let me enter them", "I understand that all changes made on other smartphones or computers possibly could be lost.": "I understand that all changes made on other smartphones or computers possibly could be lost.", "I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.": "I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.", @@ -379,6 +390,8 @@ "K.short_p2p_sync": "P2P Sync", "K.title_p2p_sync": "Peer-to-Peer Sync", "Keep empty folder": "Keep empty folder", + "Keep local files even if deleted on remote": "Keep local files even if deleted on remote", + "Keep local files even if not on remote": "Keep local files even if not on remote", "lang_def": "Default", "lang-de": "Deutsche", "lang-def": "%{lang_def}", @@ -742,6 +755,7 @@ "Open the dialog": "Open the dialog", "Other files": "Other files", "Overwrite": "Overwrite", + "Overwrite all with remote files": "Overwrite all with remote files", "Overwrite patterns": "Overwrite patterns", "Overwrite remote": "Overwrite remote", "Overwrite remote with local DB and passphrase.": "Overwrite remote with local DB and passphrase.", @@ -833,6 +847,7 @@ "PureJS fallback (Fast, W/O WebAssembly)": "PureJS fallback (Fast, W/O WebAssembly)", "Purge all download/upload cache.": "Purge all download/upload cache.", "Purge all journal counter": "Purge all journal counter", + "Reboot to re-run the process": "Reboot to re-run the process", "Rebuild local and remote database with local files.": "Rebuild local and remote database with local files.", "Rebuilding Operations (Remote Only)": "Rebuilding Operations (Remote Only)", "Recovery and Repair": "Recovery and Repair", @@ -1036,9 +1051,11 @@ "Show verbose log. Please enable if you report an issue.": "Show verbose log. Please enable if you report an issue.", "Signaling Server Connection": "Signaling Server Connection", "Signalling Status": "Signalling Status", + "Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.", "Skip and close": "Skip and close", "Snippets": "Snippets", "Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": "Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.", + "Some files failed to synchronise. What would you like to do?": "Some files failed to synchronise. What would you like to do?", "Start Broadcasting": "Start Broadcasting", "Start change-broadcasting on Connect": "Start change-broadcasting on Connect", "Start Sync & Close": "Start Sync & Close", @@ -1065,6 +1082,7 @@ "Sync on Save": "Sync on Save", "Sync on Startup": "Sync on Startup", "Sync once": "Sync once", + "Synchronisation Issues Detected": "Synchronisation Issues Detected", "Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": "Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.", "Synchronising files": "Synchronising files", "Syncing": "Syncing", @@ -1087,6 +1105,7 @@ "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.", "The minimum interval for automatic synchronisation on event.": "The minimum interval for automatic synchronisation on event.", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.", "The remote is already set up, and the configuration is compatible (or got compatible by this operation).": "The remote is already set up, and the configuration is compatible (or got compatible by this operation).", "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.": "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.", "The Setup-URI is valid and ready to use.": "The Setup-URI is valid and ready to use.", @@ -1113,6 +1132,7 @@ "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.": "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.", "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.", "To minimise the creation of new conflicts": "To minimise the creation of new conflicts", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.", "Transfer Tweak": "Transfer Tweak", "TURN Credential": "TURN Credential", "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.": "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.", @@ -1242,10 +1262,6 @@ "Ui.Settings.Maintenance.Scram": "Scram!", "Ui.Settings.Maintenance.SendChunks": "Send chunks", "Ui.Settings.Maintenance.Syncing": "Syncing", - "Ui.Settings.Maintenance.WarningLockedReadyAction": "I am ready, unlock the database", - "Ui.Settings.Maintenance.WarningLockedReadyText": "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.", - "Ui.Settings.Maintenance.WarningLockedResolveAction": "I have made a backup, mark this device as resolved", - "Ui.Settings.Maintenance.WarningLockedResolveText": "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.", "Ui.Settings.Maintenance.WriteRedFlagAndRestart": "Flag and restart", "Ui.Settings.Patches.CompatibilityConflict": "Compatibility (Conflict Behaviour)", "Ui.Settings.Patches.CompatibilityDatabase": "Compatibility (Database structure)", @@ -1449,6 +1465,7 @@ "Use Random Number": "Use Random Number", "Use Segmented-splitter": "Use Segmented-splitter", "Use splitting-limit-capped chunk splitter": "Use splitting-limit-capped chunk splitter", + "Use the detailed flow": "Use the detailed flow", "Use the trash bin": "Use the trash bin", "Use timeouts instead of heartbeats": "Use timeouts instead of heartbeats", "Use vrtmrz's relay": "Use vrtmrz's relay", @@ -1459,6 +1476,7 @@ "Verify and repair all files": "Verify and repair all files", "Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": "Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.", "WATCHING": "WATCHING", + "We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.": "We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.", "We can not use \"/\" to the device name": "We can not use \"/\" to the device name", "We can use only Secure (HTTPS) connections on Obsidian Mobile.": "We can use only Secure (HTTPS) connections on Obsidian Mobile.", "We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.": "We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.", diff --git a/src/common/messagesJson/es.json b/src/common/messagesJson/es.json index 7880592f..2b771fd3 100644 --- a/src/common/messagesJson/es.json +++ b/src/common/messagesJson/es.json @@ -84,6 +84,7 @@ "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.", "Cancel": "Cancelar", + "Cancel all and reboot": "Cancelar todo y reiniciar", "Cancel Garbage Collection": "Cancelar la recolección de basura", "Changing the encryption algorithm will prevent access to any data previously encrypted with a different algorithm. Ensure that all your devices are configured to use the same algorithm to maintain access to your data.": "Cambiar el algoritmo de cifrado impedirá acceder a los datos cifrados previamente con otro algoritmo. Asegúrate de que todos tus dispositivos usen el mismo algoritmo para no perder el acceso a tus datos.", "Changing this setting requires migrating existing data (a bit time may be taken) and restarting Obsidian. Please make sure to back up your data before proceeding.": "Cambiar este ajuste requiere migrar los datos existentes (puede tardar un poco) y reiniciar Obsidian. Asegúrate de hacer una copia de seguridad de tus datos antes de continuar.", @@ -107,6 +108,7 @@ "Compaction on remote database timed out.": "La compactación de la base de datos remota ha superado el tiempo de espera.", "Compare file": "Comparar archivo", "Compare the content of files between on local database and storage. If not matched, you will be asked which one you want to keep.": "Compara el contenido de los archivos entre la base de datos local y el almacenamiento. Si no coinciden, se te preguntará cuál deseas conservar.", + "Compare time and take newer": "Comparar fechas y usar la más reciente", "Compatibility (Conflict Behaviour)": "Compatibilidad (comportamiento de conflictos)", "Compatibility (Database structure)": "Compatibilidad (estructura de la base de datos)", "Compatibility (Internal API Usage)": "Compatibilidad (uso de la API interna)", @@ -122,6 +124,7 @@ "Configure E2EE": "Configurar E2EE", "Configure Remote": "Configurar remoto", "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。", + "Conflict & Deletion Options": "Opciones de conflictos y eliminación", "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})", @@ -146,6 +149,7 @@ "Customization Sync": "Sincronización de personalización", "Customization Sync (Beta3)": "Sincronización de personalización (Beta3)", "Data Compression": "Compresión de datos", + "Data retrieval scheduled": "Obtención de datos programada", "Data to Copy": "Datos a copiar", "Database -> Storage": "Base de datos -> Almacenamiento", "Database Adapter": "Adaptador de base de datos", @@ -160,6 +164,8 @@ "Delete all data on the remote server.": "Eliminar todos los datos del servidor remoto.", "Delete All of": "Eliminar todo de", "Delete local database to reset or uninstall Self-hosted LiveSync": "Eliminar la base de datos local para restablecer o desinstalar Self-hosted LiveSync", + "Delete local files if deleted on remote": "Eliminar los archivos locales si se eliminaron en el remoto", + "Delete local files if not on remote": "Eliminar los archivos locales que no estén en el remoto", "Delete old metadata of deleted files on start-up": "Borrar metadatos viejos al iniciar", "Delete Remote Configuration": "Eliminar configuración remota", "Delete remote configuration '{name}'?": "¿Eliminar la configuración remota '{name}'?", @@ -284,6 +290,7 @@ "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", + "Finalise the process and resume normal operation": "Finalizar el proceso y reanudar el funcionamiento normal", "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", @@ -312,15 +319,19 @@ "Hide password": "Ocultar contraseña", "Higher (${local} > ${remote})": "Superior (${local} > ${remote})", "Highlight diff": "Resaltar las diferencias", + "How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "¿Cómo se deben gestionar los archivos que se eliminaron en otros dispositivos?\n\n- **${NEWER_CLEANUP}**: elimina los archivos locales si se eliminaron en el remoto.\n Es útil si quieres mantener tu vault limpio y coherente entre dispositivos; asegúrate de tener una copia de seguridad si ya tienes datos importantes en tu vault.\n- **${NEWER_SYNC_ALL}**: vuelve a crear los archivos remotos aunque se hayan eliminado en el remoto.\n Esta opción mantiene todos tus archivos locales, pero puede causar duplicados si hay archivos que existen en local pero no en el remoto. Puedes limpiar esos duplicados manualmente después de sincronizar.", "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 to handle extra existing local files?": "¿Cómo gestionar los archivos locales adicionales?", "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 ready, unlock the database": "Estoy listo, desbloquear la base de datos", "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 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 have made a backup, mark this device as resolved": "He hecho una copia de seguridad, marcar este dispositivo como resuelto", "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.", @@ -380,6 +391,8 @@ "K.short_p2p_sync": "Sincronización P2P", "K.title_p2p_sync": "Sincronización punto a punto", "Keep empty folder": "Mantener carpetas vacías", + "Keep local files even if deleted on remote": "Mantener los archivos locales aunque se hayan eliminado en el remoto", + "Keep local files even if not on remote": "Mantener los archivos locales aunque no estén en el remoto", "lang_def": "Predeterminado", "lang-de": "Alemán", "lang-def": "%{lang_def}", @@ -734,6 +747,7 @@ "Open the dialog": "Abrir el diálogo", "Other files": "Otros archivos", "Overwrite": "Sobrescribir", + "Overwrite all with remote files": "Sobrescribir todo con los archivos remotos", "Overwrite patterns": "Patrones de sobrescritura", "Overwrite remote": "Sobrescribir remoto", "Overwrite remote with local DB and passphrase.": "Sobrescribe el remoto con la base de datos local y la frase de contraseña.", @@ -825,6 +839,7 @@ "PureJS fallback (Fast, W/O WebAssembly)": "Alternativa PureJS (rápida, sin WebAssembly)", "Purge all download/upload cache.": "Purga toda la caché de descarga y carga.", "Purge all journal counter": "Purgar todos los contadores del diario", + "Reboot to re-run the process": "Reiniciar para volver a ejecutar el proceso", "Rebuild local and remote database with local files.": "Reconstruye la base de datos local y remota usando los archivos locales.", "Rebuilding Operations (Remote Only)": "Operaciones de reconstrucción (solo remoto)", "Recovery and Repair": "Recuperación y reparación", @@ -1069,9 +1084,11 @@ "Show verbose log. Please enable if you report an issue.": "Mostrar registro detallado. Actívelo si reporta un problema.", "Signaling Server Connection": "Conexión al servidor de señalización", "Signalling Status": "Estado de la señalización", + "Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "Como has elegido sobrescribir todos los archivos locales con los datos remotos, **¿cómo quieres gestionar los archivos locales que no existen en la base de datos remota?**\n\n- **${DELETE_ALL}**: se eliminarán los archivos que solo existen en local y los que se han borrado en el remoto.\n Esta opción hará que tu vault local sea exactamente igual que la base de datos remota; asegúrate de tener una copia de seguridad si tienes datos importantes en tu vault.\n- **${DELETE_NONE}**: se conservarán todos los archivos locales existentes.\n Esta opción mantiene todos tus archivos locales, pero puede causar duplicados si hay archivos que existen en local pero no en el remoto. Puedes limpiar esos duplicados manualmente después de sincronizar.", "Skip and close": "Omitir y cerrar", "Snippets": "Fragmentos", "Some devices have differing progress values (max: ${maxProgress}, min: ${minProgress}).\nThis may indicate that some devices have not completed synchronisation, which could lead to conflicts. Strongly recommend confirming that all devices are synchronised before proceeding.": "Algunos dispositivos tienen valores de progreso distintos (máx.: ${maxProgress}, mín.: ${minProgress}).\nEsto puede indicar que algunos no han terminado de sincronizar, lo que podría provocar conflictos. Se recomienda encarecidamente confirmar que todos los dispositivos están sincronizados antes de continuar.", + "Some files failed to synchronise. What would you like to do?": "Algunos archivos no se pudieron sincronizar. ¿Qué quieres hacer?", "Start Broadcasting": "Iniciar difusión", "Start change-broadcasting on Connect": "Iniciar la difusión de cambios al conectar", "Start Sync & Close": "Iniciar sincronización y cerrar", @@ -1098,6 +1115,7 @@ "Sync on Save": "Sincronizar al guardar", "Sync on Startup": "Sincronizar al iniciar", "Sync once": "Sincronizar una vez", + "Synchronisation Issues Detected": "Se han detectado problemas de sincronización", "Synchronisation utilising journal files. You must have set up an S3/MinIO/R2 compatible object storage.": "Sincronización mediante archivos de registro. Debe haber configurado un almacenamiento de objetos compatible con S3/MinIO/R2。", "Synchronising files": "Archivos sincronizados", "Syncing": "Sincronización", @@ -1119,6 +1137,7 @@ "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": "Número máximo de chunks que pueden incubarse en el documento. Excedentes se independizan", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "Tamaño total máximo de chunks incubados. Excedentes se independizan", "The minimum interval for automatic synchronisation on event.": "Intervalo mínimo para la sincronización automática al producirse un evento.", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "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.", "The remote is already set up, and the configuration is compatible (or got compatible by this operation).": "El remoto ya está configurado y la configuración es compatible (o pasa a serlo con esta operación).", "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.": "El Setup-URI no parece válido. Comprueba que lo hayas copiado correctamente.", "The Setup-URI is valid and ready to use.": "El Setup-URI es válido y está listo para usarse.", @@ -1145,6 +1164,7 @@ "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", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "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.", "Transfer Tweak": "Ajustes de transferencia", "TURN Credential": "Credencial de TURN", "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.": "Los ajustes del servidor TURN solo son necesarios si estás detrás de un NAT estricto o de un cortafuegos que impide las conexiones P2P directas. En la mayoría de los casos puedes dejar estos campos vacíos.", @@ -1272,10 +1292,6 @@ "Ui.Settings.Maintenance.Scram": "¡Parada de emergencia!", "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 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 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)", @@ -1457,6 +1473,7 @@ "Use Random Number": "Usar número aleatorio", "Use Segmented-splitter": "Usar divisor segmentado", "Use splitting-limit-capped chunk splitter": "Usar divisor de chunks con límite", + "Use the detailed flow": "Usar el flujo detallado", "Use the trash bin": "Usar papelera", "Use timeouts instead of heartbeats": "Usar timeouts en lugar de latidos", "Use vrtmrz's relay": "Usar el relé de vrtmrz", @@ -1467,6 +1484,7 @@ "Verify and repair all files": "Verificar y reparar todos los archivos", "Warning! This will have a serious impact on performance. And the logs will not be synchronised under the default name. Please be careful with logs; they often contain your confidential information.": "¡Advertencia! Impacta rendimiento. Los logs no se sincronizan con nombre predeterminado. Contienen información confidencial", "WATCHING": "OBSERVANDO", + "We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.": "Vamos a obtener los datos remotos.\n\nEn primer lugar, ¿cómo quieres gestionar los datos obtenidos de este origen remoto?\n\n- **${NEWER_WINS}**: compara la fecha de modificación de los archivos y usa la más reciente.\n Si has estado usando Self-hosted LiveSync y has hecho cambios en varios dispositivos, esta opción puede ser adecuada, ya que intenta combinar los cambios según la fecha de modificación.\n- **${REMOTE_WINS}**: los datos remotos son la fuente de la verdad.\n Si eres nuevo en Self-hosted LiveSync, esta opción puede ser la más fácil de entender para empezar.\n Sobrescribirá todos tus archivos locales con los datos remotos, así que asegúrate de tener una copia de seguridad si tienes datos importantes en tu vault.\n- **${DETAILED}**: abre el asistente de configuración detallado.\n Si quieres tener más control sobre el proceso de sincronización, o revisar los cambios antes de aplicarlos, elige esta opción para usar el flujo detallado.", "We can not use \"/\" to the device name": "No se puede usar \"/\" en el nombre del dispositivo", "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.", diff --git a/src/common/messagesJson/ko.json b/src/common/messagesJson/ko.json index 0f4095bd..7efd0411 100644 --- a/src/common/messagesJson/ko.json +++ b/src/common/messagesJson/ko.json @@ -309,11 +309,13 @@ "How would you like to configure the connection to your server?": "서버 연결을 어떻게 구성하시겠습니까?", "However, This should not be enabled if you want to increase your secrecy more.": "다만 기밀성을 더 높이고 싶다면 이 옵션은 활성화하지 않는 것이 좋습니다.", "I am adding a device to an existing synchronisation setup": "기존 동기화 구성에 기기를 추가합니다", + "I am ready, unlock the database": "준비되었습니다. 데이터베이스 잠금 해제", "I am setting this up for the first time": "처음으로 설정합니다", "I am setting up a new server for the first time / I want to reset my existing server.": "새 서버를 처음 설정하거나, 기존 서버를 초기화하려고 합니다.", "I am unable to create a backup of my Vault.": "보관함을 백업할 수 없습니다.", "I am unable to create a backup of my Vaults.": "보관함들을 백업할 수 없습니다.", "I have created a backup of my Vault.": "보관함을 백업했습니다.", + "I have made a backup, mark this device as resolved": "백업했습니다. 이 기기를 해결됨으로 표시", "I know my server details, let me enter them": "서버 정보를 알고 있으니 직접 입력하겠습니다", "I understand that all changes made on other smartphones or computers possibly could be lost.": "다른 스마트폰이나 컴퓨터에서 변경한 내용이 모두 사라질 수 있다는 점을 이해합니다.", "I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.": "다른 기기는 더 이상 동기화할 수 없게 되며, 동기화 정보를 초기화해야 한다는 점을 이해합니다.", @@ -1068,6 +1070,7 @@ "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": "문서 안에 임시 보관할 수 있는 청크의 최대 개수입니다. 이 개수를 넘긴 청크는 즉시 독립된 청크로 분리됩니다.", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "문서 안에 임시 보관할 수 있는 청크의 최대 총 크기입니다. 이 크기를 넘긴 청크는 즉시 독립된 청크로 분리됩니다.", "The minimum interval for automatic synchronisation on event.": "이벤트 발생 시 자동 동기화의 최소 간격입니다.", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "이 기기가 '해결됨'으로 표시되어 있지 않아, 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. 보관함을 백업하고 로컬 데이터베이스를 재설정한 뒤 '이 기기를 해결됨으로 표시'를 선택해 주세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다.", "The remote is already set up, and the configuration is compatible (or got compatible by this operation).": "원격은 이미 설정되어 있으며, 구성도 호환됩니다(또는 이번 작업으로 호환되었습니다).", "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.": "Setup-URI가 유효하지 않은 것으로 보입니다. 올바르게 복사했는지 확인해 주세요.", "The Setup-URI is valid and ready to use.": "Setup-URI가 유효하며 사용할 준비가 되었습니다.", @@ -1092,6 +1095,7 @@ "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.": "서버의 최신 데이터를 사용해 이 기기의 로컬 데이터베이스를 재구축합니다. 이 작업은 동기화 불일치를 해결하고 정상적인 동작을 복구하기 위한 것입니다.", "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "모든 파일의 청크를 다시 생성합니다. 누락된 청크가 있었다면 이 작업으로 오류가 해결될 수 있습니다.", "To minimise the creation of new conflicts": "새로운 충돌 발생을 최소화하기 위해", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "의도치 않은 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. (이 기기는 '해결됨'으로 표시되어 있습니다.) 모든 기기가 '해결됨'으로 표시되면 데이터베이스 잠금을 해제하세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다.", "Transfer Tweak": "전송 조정", "TURN Credential": "TURN 자격 증명", "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.": "TURN 서버 설정은 직접적인 P2P 연결을 막는 엄격한 NAT나 방화벽 뒤에 있는 경우에만 필요합니다. 대부분의 경우 이 항목들은 비워 두어도 됩니다.", @@ -1219,10 +1223,6 @@ "Ui.Settings.Maintenance.Scram": "긴급 정지", "Ui.Settings.Maintenance.SendChunks": "청크 보내기", "Ui.Settings.Maintenance.Syncing": "동기화", - "Ui.Settings.Maintenance.WarningLockedReadyAction": "준비되었습니다. 데이터베이스 잠금 해제", - "Ui.Settings.Maintenance.WarningLockedReadyText": "의도치 않은 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. (이 기기는 '해결됨'으로 표시되어 있습니다.) 모든 기기가 '해결됨'으로 표시되면 데이터베이스 잠금을 해제하세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다.", - "Ui.Settings.Maintenance.WarningLockedResolveAction": "백업했습니다. 이 기기를 해결됨으로 표시", - "Ui.Settings.Maintenance.WarningLockedResolveText": "이 기기가 '해결됨'으로 표시되어 있지 않아, 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. 보관함을 백업하고 로컬 데이터베이스를 재설정한 뒤 '이 기기를 해결됨으로 표시'를 선택해 주세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다.", "Ui.Settings.Maintenance.WriteRedFlagAndRestart": "표시 후 재시작", "Ui.Settings.Patches.CompatibilityConflict": "호환성 (충돌 동작)", "Ui.Settings.Patches.CompatibilityDatabase": "호환성 (데이터베이스 구조)", diff --git a/src/common/messagesJson/ru.json b/src/common/messagesJson/ru.json index 6c4dd112..b39e9262 100644 --- a/src/common/messagesJson/ru.json +++ b/src/common/messagesJson/ru.json @@ -325,11 +325,13 @@ "How would you like to configure the connection to your server?": "Как вы хотите настроить подключение к серверу?", "However, This should not be enabled if you want to increase your secrecy more.": "Но если вам нужна повышенная скрытность, не включайте это.", "I am adding a device to an existing synchronisation setup": "Я добавляю устройство к существующей настройке синхронизации", + "I am ready, unlock the database": "Я готов, разблокировать базу", "I am setting this up for the first time": "Я настраиваю это впервые", "I am setting up a new server for the first time / I want to reset my existing server.": "Я настраиваю новый сервер впервые / хочу сбросить существующий сервер.", "I am unable to create a backup of my Vault.": "Я не могу сделать резервную копию хранилища.", "I am unable to create a backup of my Vaults.": "Я не могу сделать резервные копии хранилищ.", "I have created a backup of my Vault.": "Я сделал резервную копию хранилища.", + "I have made a backup, mark this device as resolved": "Я сделал резервную копию, отметить это устройство как разрешённое", "I know my server details, let me enter them": "Я знаю параметры сервера, позвольте ввести их вручную", "I understand that all changes made on other smartphones or computers possibly could be lost.": "Я понимаю, что изменения на других смартфонах и компьютерах могут пропасть.", "I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.": "Я понимаю, что другие устройства перестанут синхронизироваться и на них надо будет сбросить данные синхронизации.", @@ -1105,6 +1107,7 @@ "The maximum total size of chunks that can be incubated within the document.": "Максимальный общий размер инкубируемых чанков в документе.", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "Максимальный общий размер инкубируемых чанков в документе. Чанки, превысившие этот размер, сразу перейдут в независимые чанки.", "The minimum interval for automatic synchronisation on event.": "Минимальный интервал автоматической синхронизации по событию.", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "Удалённая база заблокирована для синхронизации, чтобы хранилище не испортилось: это устройство не помечено как «разрешённое». Сделайте резервную копию хранилища, сбросьте локальную базу и выберите «Отметить это устройство как разрешённое». Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено.", "The remote is already set up, and the configuration is compatible (or got compatible by this operation).": "Удалённая база уже настроена, и настройки совместимы (или стали совместимы после этой операции).", "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.": "Setup-URI выглядит неверным. Проверьте, что скопировали его правильно.", "The Setup-URI is valid and ready to use.": "Setup-URI верный и готов к работе.", @@ -1132,6 +1135,7 @@ "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.": "Локальная база на этом устройстве будет пересобрана по самым свежим данным с сервера. Так решаются расхождения синхронизации и восстанавливается правильная работа.", "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "Это пересоздаст чанки для всех файлов. Если какие-то чанки отсутствовали, это может исправить ошибки.", "To minimise the creation of new conflicts": "Чтобы создавалось меньше новых конфликтов", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "Чтобы хранилище не испортилось, удалённая база заблокирована для синхронизации. (Это устройство помечено как «разрешённое».) Когда все ваши устройства будут помечены как «разрешённые», разблокируйте базу. Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено.", "Transfer Tweak": "Настройки передачи", "TURN Credential": "Пароль TURN", "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.": "Настройки сервера TURN нужны только за строгим NAT или межсетевым экраном, который не даёт устройствам соединяться напрямую. Обычно эти поля можно оставить пустыми.", @@ -1261,10 +1265,6 @@ "Ui.Settings.Maintenance.Scram": "Аварийная остановка!", "Ui.Settings.Maintenance.SendChunks": "Отправить чанки", "Ui.Settings.Maintenance.Syncing": "Синхронизация", - "Ui.Settings.Maintenance.WarningLockedReadyAction": "Я готов, разблокировать базу", - "Ui.Settings.Maintenance.WarningLockedReadyText": "Чтобы хранилище не испортилось, удалённая база заблокирована для синхронизации. (Это устройство помечено как «разрешённое».) Когда все ваши устройства будут помечены как «разрешённые», разблокируйте базу. Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено.", - "Ui.Settings.Maintenance.WarningLockedResolveAction": "Я сделал резервную копию, отметить это устройство как разрешённое", - "Ui.Settings.Maintenance.WarningLockedResolveText": "Удалённая база заблокирована для синхронизации, чтобы хранилище не испортилось: это устройство не помечено как «разрешённое». Сделайте резервную копию хранилища, сбросьте локальную базу и выберите «Отметить это устройство как разрешённое». Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено.", "Ui.Settings.Maintenance.WriteRedFlagAndRestart": "Поставить флаг и перезапустить", "Ui.Settings.Patches.CompatibilityConflict": "Совместимость (поведение при конфликтах)", "Ui.Settings.Patches.CompatibilityDatabase": "Совместимость (структура базы)", diff --git a/src/common/messagesJson/zh-tw.json b/src/common/messagesJson/zh-tw.json index 3f75a7cf..1239e5f8 100644 --- a/src/common/messagesJson/zh-tw.json +++ b/src/common/messagesJson/zh-tw.json @@ -309,11 +309,13 @@ "How would you like to configure the connection to your server?": "你希望如何設定與伺服器的連線?", "However, This should not be enabled if you want to increase your secrecy more.": "不過,如果你想加強保密性,不建議啟用此選項。", "I am adding a device to an existing synchronisation setup": "我要將裝置加入既有同步設定", + "I am ready, unlock the database": "我已準備好,解鎖資料庫", "I am setting this up for the first time": "我是第一次進行設定", "I am setting up a new server for the first time / I want to reset my existing server.": "我是第一次設定新的伺服器/我想要重設現有的伺服器。", "I am unable to create a backup of my Vault.": "我無法備份我的 Vault。", "I am unable to create a backup of my Vaults.": "我無法備份我的 Vault。", "I have created a backup of my Vault.": "我已經備份了我的 Vault。", + "I have made a backup, mark this device as resolved": "我已完成備份,將此裝置標記為已處理", "I know my server details, let me enter them": "我知道伺服器資訊,讓我手動輸入", "I understand that all changes made on other smartphones or computers possibly could be lost.": "我了解其他手機或電腦上的所有變更可能會遺失。", "I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.": "我了解其他裝置將無法再進行同步,且需要重設其同步資訊。", @@ -1065,6 +1067,7 @@ "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": "文件中可暫存的 chunks 最大數量。超過此數量的 chunks 會立即成為獨立 chunks。", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "文件中可暫存的 chunks 總大小上限。超過此大小的 chunks 會立即成為獨立 chunks。", "The minimum interval for automatic synchronisation on event.": "事件觸發自動同步的最小間隔。", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "由於此裝置尚未標記為「已處理」,為避免 Vault 損毀,遠端資料庫已鎖定同步。請先備份你的 Vault、重設本機資料庫,然後選擇「將此裝置標記為已處理」。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。", "The remote is already set up, and the configuration is compatible (or got compatible by this operation).": "遠端已經設定完成,且設定相容(或透過此操作變得相容)。", "The Setup-URI does not appear to be valid. Please check that you have copied it correctly.": "這個 Setup URI 似乎無效,請檢查是否複製正確。", "The Setup-URI is valid and ready to use.": "Setup URI 有效,可以使用。", @@ -1089,6 +1092,7 @@ "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.": "這會使用伺服器上最新的資料,重建此裝置上的本機資料庫。此操作旨在解決同步不一致的問題,並恢復正常功能。", "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "這會為所有檔案重新建立 chunks。若先前有遺失的 chunks,這可能修復相關錯誤。", "To minimise the creation of new conflicts": "為了盡量減少新增衝突", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "為避免 Vault 發生非預期的損毀,遠端資料庫已鎖定同步。(此裝置已標記為「已處理」。)當你所有的裝置都標記為「已處理」後,即可解鎖資料庫。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。", "Transfer Tweak": "傳輸調校", "TURN Credential": "TURN 憑證", "TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.": "只有在你身處嚴格的 NAT 或防火牆之後、無法建立直接 P2P 連線時,才需要設定 TURN 伺服器。多數情況下這些欄位可以留空。", @@ -1216,10 +1220,6 @@ "Ui.Settings.Maintenance.Scram": "緊急處置", "Ui.Settings.Maintenance.SendChunks": "傳送 chunks", "Ui.Settings.Maintenance.Syncing": "同步中", - "Ui.Settings.Maintenance.WarningLockedReadyAction": "我已準備好,解鎖資料庫", - "Ui.Settings.Maintenance.WarningLockedReadyText": "為避免 Vault 發生非預期的損毀,遠端資料庫已鎖定同步。(此裝置已標記為「已處理」。)當你所有的裝置都標記為「已處理」後,即可解鎖資料庫。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。", - "Ui.Settings.Maintenance.WarningLockedResolveAction": "我已完成備份,將此裝置標記為已處理", - "Ui.Settings.Maintenance.WarningLockedResolveText": "由於此裝置尚未標記為「已處理」,為避免 Vault 損毀,遠端資料庫已鎖定同步。請先備份你的 Vault、重設本機資料庫,然後選擇「將此裝置標記為已處理」。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。", "Ui.Settings.Maintenance.WriteRedFlagAndRestart": "標記後重新啟動", "Ui.Settings.Patches.CompatibilityConflict": "相容性(衝突行為)", "Ui.Settings.Patches.CompatibilityDatabase": "相容性(資料庫結構)", diff --git a/src/common/messagesJson/zh.json b/src/common/messagesJson/zh.json index 66411d61..8f7ceb5c 100644 --- a/src/common/messagesJson/zh.json +++ b/src/common/messagesJson/zh.json @@ -172,7 +172,9 @@ "How to display network errors when the sync server is unreachable.": "当同步服务器不可达时,如何显示网络错误。", "How would you like to configure the connection to your server?": "你希望如何配置与服务器的连接?", "I am adding a device to an existing synchronisation setup": "我要将设备加入现有同步配置", + "I am ready, unlock the database": "我已准备好,立即解锁数据库", "I am setting this up for the first time": "我是第一次进行设置", + "I have made a backup, mark this device as resolved": "我已完成备份,将此设备标记为“已确认”", "I know my server details, let me enter them": "我知道服务器详情,让我手动输入", "If disabled(toggled), chunks will be split on the UI thread (Previous behaviour).": "如果禁用(切换),chunks 将在 UI 线程上分割(以前的行为)", "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.": "如果启用,将使用基于文件的、高效的自定义同步。启用此功能需要进行一次小的迁移。所有设备都应更新到 v0.23.18。一旦启用此功能,我们将失去与旧版本的兼容性", @@ -769,11 +771,13 @@ "The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.": "文档中可以孵化的数据块的最大数量。超过此数量的数据块将立即成为独立数据块 ", "The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.": "文档中可以孵化的数据块的最大总大小。超过此大小的数据块将立即成为独立数据块 ", "The minimum interval for automatic synchronisation on event.": "基于事件自动同步的最小间隔。", + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "为防止数据仓库损坏,由于此设备尚未标记为“已确认”,远程数据库已被锁定,暂停同步。请先备份你的仓库、重置本地数据库,然后选择“将此设备标记为已确认”。在复制过程确认此设备已完成确认之前,此警告会持续显示。", "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.": "此功能可在设备之间直接同步,无需服务器;但同步时两台设备必须同时在线,且部分功能可能受限。互联网连接仅用于信令(发现对端),不用于数据传输。", "This is an advanced option for users who do not have a URI or who wish to configure detailed settings.": "这是面向没有 URI 或希望手动配置详细参数的高级选项。", "This is the most suitable synchronisation method for the design. All functions are available. You must have set up a CouchDB instance.": "这是最符合当前设计的同步方式,所有功能均可用。你需要事先部署好 CouchDB 实例。", "This passphrase will not be copied to another device. It will be set to `Default` until you configure it again.": "此密码不会复制到另一台设备。在您再次配置之前,它将设置为 `Default` ", "This will recreate chunks for all files. If there were missing chunks, this may fix the errors.": "这会为所有文件重新生成 chunks。如果之前存在缺失的 chunks,这可能修复相关错误。", + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "为防止意外的数据仓库损坏,远程数据库已被锁定,暂停同步。(此设备已被标记为“已确认”)当你的所有设备都标记为“已确认”后,再解锁数据库。在复制过程确认此设备已完成确认之前,此警告会持续显示。", "TweakMismatchResolve.Action.Dismiss": "Dismiss", "TweakMismatchResolve.Action.UseConfigured": "Use configured settings", "TweakMismatchResolve.Action.UseMine": "Update remote database settings", @@ -890,10 +894,6 @@ "Ui.Settings.Maintenance.Scram": "紧急处理", "Ui.Settings.Maintenance.SendChunks": "发送数据块", "Ui.Settings.Maintenance.Syncing": "同步", - "Ui.Settings.Maintenance.WarningLockedReadyAction": "我已准备好,立即解锁数据库", - "Ui.Settings.Maintenance.WarningLockedReadyText": "为防止意外的数据仓库损坏,远程数据库已被锁定,暂停同步。(此设备已被标记为“已确认”)当你的所有设备都标记为“已确认”后,再解锁数据库。在复制过程确认此设备已完成确认之前,此警告会持续显示。", - "Ui.Settings.Maintenance.WarningLockedResolveAction": "我已完成备份,将此设备标记为“已确认”", - "Ui.Settings.Maintenance.WarningLockedResolveText": "为防止数据仓库损坏,由于此设备尚未标记为“已确认”,远程数据库已被锁定,暂停同步。请先备份你的仓库、重置本地数据库,然后选择“将此设备标记为已确认”。在复制过程确认此设备已完成确认之前,此警告会持续显示。", "Ui.Settings.Maintenance.WriteRedFlagAndRestart": "标记并重启", "Ui.Settings.Patches.CompatibilityConflict": "兼容性(冲突行为)", "Ui.Settings.Patches.CompatibilityDatabase": "兼容性(数据库结构)", diff --git a/src/common/messagesYAML/en.yaml b/src/common/messagesYAML/en.yaml index bbc7d996..134517bb 100644 --- a/src/common/messagesYAML/en.yaml +++ b/src/common/messagesYAML/en.yaml @@ -2235,10 +2235,6 @@ Ui: Scram: Scram! SendChunks: Send chunks Syncing: Syncing - WarningLockedReadyAction: I am ready, unlock the database - WarningLockedReadyText: To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved. - WarningLockedResolveAction: I have made a backup, mark this device as resolved - WarningLockedResolveText: The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved. WriteRedFlagAndRestart: Flag and restart Patches: CompatibilityConflict: Compatibility (Conflict Behaviour) @@ -2456,3 +2452,25 @@ You should perform this operation only in exceptional circumstances, such as whe 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. +"I am ready, unlock the database": "I am ready, unlock the database" +"To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved." +"I have made a backup, mark this device as resolved": "I have made a backup, mark this device as resolved" +"The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved." +"Cancel all and reboot": "Cancel all and reboot" +"Compare time and take newer": "Compare time and take newer" +"Conflict & Deletion Options": "Conflict & Deletion Options" +"Data retrieval scheduled": "Data retrieval scheduled" +"Delete local files if deleted on remote": "Delete local files if deleted on remote" +"Delete local files if not on remote": "Delete local files if not on remote" +"Finalise the process and resume normal operation": "Finalise the process and resume normal operation" +"How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation." +"How to handle extra existing local files?": "How to handle extra existing local files?" +"Keep local files even if deleted on remote": "Keep local files even if deleted on remote" +"Keep local files even if not on remote": "Keep local files even if not on remote" +"Overwrite all with remote files": "Overwrite all with remote files" +"Reboot to re-run the process": "Reboot to re-run the process" +"Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation." +"Some files failed to synchronise. What would you like to do?": "Some files failed to synchronise. What would you like to do?" +"Synchronisation Issues Detected": "Synchronisation Issues Detected" +"Use the detailed flow": "Use the detailed flow" +"We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.": "We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow." diff --git a/src/common/messagesYAML/es.yaml b/src/common/messagesYAML/es.yaml index 8fa4b72a..8b715769 100644 --- a/src/common/messagesYAML/es.yaml +++ b/src/common/messagesYAML/es.yaml @@ -2315,20 +2315,6 @@ Ui: Scram: ¡Parada de emergencia! SendChunks: Enviar los chunks Syncing: Sincronización - WarningLockedReadyAction: Estoy listo, desbloquear 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á - apareciendo hasta que la replicación confirme que el dispositivo está - 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 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. WriteRedFlagAndRestart: Marcar y reiniciar Patches: CompatibilityConflict: Compatibilidad (comportamiento ante conflictos) @@ -2695,3 +2681,25 @@ You should perform this operation only in exceptional circumstances, such as whe 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." +"I am ready, unlock the database": "Estoy listo, desbloquear la base de datos" +"To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "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." +"I have made a backup, mark this device as resolved": "He hecho una copia de seguridad, marcar este dispositivo como resuelto" +"The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "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." +"Cancel all and reboot": "Cancelar todo y reiniciar" +"Compare time and take newer": "Comparar fechas y usar la más reciente" +"Conflict & Deletion Options": "Opciones de conflictos y eliminación" +"Data retrieval scheduled": "Obtención de datos programada" +"Delete local files if deleted on remote": "Eliminar los archivos locales si se eliminaron en el remoto" +"Delete local files if not on remote": "Eliminar los archivos locales que no estén en el remoto" +"Finalise the process and resume normal operation": "Finalizar el proceso y reanudar el funcionamiento normal" +"How should files that were deleted on other devices be handled?\n\n- **${NEWER_CLEANUP}**: Delete local files if they were deleted on remote.\n This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault.\n- **${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "¿Cómo se deben gestionar los archivos que se eliminaron en otros dispositivos?\n\n- **${NEWER_CLEANUP}**: elimina los archivos locales si se eliminaron en el remoto.\n Es útil si quieres mantener tu vault limpio y coherente entre dispositivos; asegúrate de tener una copia de seguridad si ya tienes datos importantes en tu vault.\n- **${NEWER_SYNC_ALL}**: vuelve a crear los archivos remotos aunque se hayan eliminado en el remoto.\n Esta opción mantiene todos tus archivos locales, pero puede causar duplicados si hay archivos que existen en local pero no en el remoto. Puedes limpiar esos duplicados manualmente después de sincronizar." +"How to handle extra existing local files?": "¿Cómo gestionar los archivos locales adicionales?" +"Keep local files even if deleted on remote": "Mantener los archivos locales aunque se hayan eliminado en el remoto" +"Keep local files even if not on remote": "Mantener los archivos locales aunque no estén en el remoto" +"Overwrite all with remote files": "Sobrescribir todo con los archivos remotos" +"Reboot to re-run the process": "Reiniciar para volver a ejecutar el proceso" +"Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?**\n\n- **${DELETE_ALL}**: Local-only files and remote-deleted files will be removed.\n This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault.\n- **${DELETE_NONE}**: All existing local files will be preserved.\n This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.": "Como has elegido sobrescribir todos los archivos locales con los datos remotos, **¿cómo quieres gestionar los archivos locales que no existen en la base de datos remota?**\n\n- **${DELETE_ALL}**: se eliminarán los archivos que solo existen en local y los que se han borrado en el remoto.\n Esta opción hará que tu vault local sea exactamente igual que la base de datos remota; asegúrate de tener una copia de seguridad si tienes datos importantes en tu vault.\n- **${DELETE_NONE}**: se conservarán todos los archivos locales existentes.\n Esta opción mantiene todos tus archivos locales, pero puede causar duplicados si hay archivos que existen en local pero no en el remoto. Puedes limpiar esos duplicados manualmente después de sincronizar." +"Some files failed to synchronise. What would you like to do?": "Algunos archivos no se pudieron sincronizar. ¿Qué quieres hacer?" +"Synchronisation Issues Detected": "Se han detectado problemas de sincronización" +"Use the detailed flow": "Usar el flujo detallado" +"We are about to retrieve the remote data.\n\nFirstly, how shall we handle the data retrieved from this remote source?\n\n- **${NEWER_WINS}**: Compares the modified time of files and takes the newer one.\n If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time.\n- **${REMOTE_WINS}**: Remote data is the source of truth.\n If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with.\n It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault.\n- **${DETAILED}**: Opens the detailed setup wizard.\n If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.": "Vamos a obtener los datos remotos.\n\nEn primer lugar, ¿cómo quieres gestionar los datos obtenidos de este origen remoto?\n\n- **${NEWER_WINS}**: compara la fecha de modificación de los archivos y usa la más reciente.\n Si has estado usando Self-hosted LiveSync y has hecho cambios en varios dispositivos, esta opción puede ser adecuada, ya que intenta combinar los cambios según la fecha de modificación.\n- **${REMOTE_WINS}**: los datos remotos son la fuente de la verdad.\n Si eres nuevo en Self-hosted LiveSync, esta opción puede ser la más fácil de entender para empezar.\n Sobrescribirá todos tus archivos locales con los datos remotos, así que asegúrate de tener una copia de seguridad si tienes datos importantes en tu vault.\n- **${DETAILED}**: abre el asistente de configuración detallado.\n Si quieres tener más control sobre el proceso de sincronización, o revisar los cambios antes de aplicarlos, elige esta opción para usar el flujo detallado." diff --git a/src/common/messagesYAML/ko.yaml b/src/common/messagesYAML/ko.yaml index 80475d20..dcaaadc9 100644 --- a/src/common/messagesYAML/ko.yaml +++ b/src/common/messagesYAML/ko.yaml @@ -1609,10 +1609,6 @@ Ui: Scram: 긴급 정지 SendChunks: 청크 보내기 Syncing: 동기화 - WarningLockedReadyAction: 준비되었습니다. 데이터베이스 잠금 해제 - WarningLockedReadyText: 의도치 않은 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. (이 기기는 '해결됨'으로 표시되어 있습니다.) 모든 기기가 '해결됨'으로 표시되면 데이터베이스 잠금을 해제하세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다. - WarningLockedResolveAction: 백업했습니다. 이 기기를 해결됨으로 표시 - WarningLockedResolveText: 이 기기가 '해결됨'으로 표시되어 있지 않아, 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. 보관함을 백업하고 로컬 데이터베이스를 재설정한 뒤 '이 기기를 해결됨으로 표시'를 선택해 주세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다. WriteRedFlagAndRestart: 표시 후 재시작 Patches: CompatibilityConflict: 호환성 (충돌 동작) @@ -1840,3 +1836,7 @@ You are adding this device to an existing synchronisation setup.: 이 기기를 You can configure in the Obsidian Plugin Settings.: Obsidian 플러그인 설정에서 구성할 수 있습니다. You should create a new synchronisation destination and rebuild your data there.: 새로운 동기화 대상을 만들고 그곳에서 데이터를 재구축해야 합니다. 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.: 이 작업은 서버 데이터가 완전히 손상된 경우, 다른 모든 기기의 변경 사항이 더 이상 필요하지 않은 경우, 또는 데이터베이스 크기가 보관함 크기에 비해 비정상적으로 커진 경우처럼 예외적인 상황에서만 수행해야 합니다. +"I am ready, unlock the database": "준비되었습니다. 데이터베이스 잠금 해제" +"To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "의도치 않은 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. (이 기기는 '해결됨'으로 표시되어 있습니다.) 모든 기기가 '해결됨'으로 표시되면 데이터베이스 잠금을 해제하세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다." +"I have made a backup, mark this device as resolved": "백업했습니다. 이 기기를 해결됨으로 표시" +"The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "이 기기가 '해결됨'으로 표시되어 있지 않아, 보관함 손상을 막기 위해 원격 데이터베이스가 동기화 잠금 상태입니다. 보관함을 백업하고 로컬 데이터베이스를 재설정한 뒤 '이 기기를 해결됨으로 표시'를 선택해 주세요. 이 경고는 복제를 통해 기기가 해결되었음이 확인될 때까지 계속 표시됩니다." diff --git a/src/common/messagesYAML/ru.yaml b/src/common/messagesYAML/ru.yaml index 393fa851..38331d09 100644 --- a/src/common/messagesYAML/ru.yaml +++ b/src/common/messagesYAML/ru.yaml @@ -1992,18 +1992,6 @@ Ui: Scram: Аварийная остановка! SendChunks: Отправить чанки Syncing: Синхронизация - WarningLockedReadyAction: Я готов, разблокировать базу - WarningLockedReadyText: Чтобы хранилище не испортилось, удалённая база - заблокирована для синхронизации. (Это устройство помечено как - «разрешённое».) Когда все ваши устройства будут помечены как - «разрешённые», разблокируйте базу. Предупреждение будет появляться, пока - репликация не подтвердит, что устройство разрешено. - WarningLockedResolveAction: Я сделал резервную копию, отметить это устройство как разрешённое - WarningLockedResolveText: "Удалённая база заблокирована для синхронизации, чтобы - хранилище не испортилось: это устройство не помечено как «разрешённое». - Сделайте резервную копию хранилища, сбросьте локальную базу и выберите - «Отметить это устройство как разрешённое». Предупреждение будет - появляться, пока репликация не подтвердит, что устройство разрешено." WriteRedFlagAndRestart: Поставить флаг и перезапустить Patches: CompatibilityConflict: Совместимость (поведение при конфликтах) @@ -2324,3 +2312,7 @@ You should perform this operation only in exceptional circumstances, such as whe испорчены, изменения на всех других устройствах больше не нужны или база стала непомерно большой по сравнению с хранилищем." you wanted(Thank you)!: которую вы хотели (спасибо!) +"I am ready, unlock the database": "Я готов, разблокировать базу" +"To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "Чтобы хранилище не испортилось, удалённая база заблокирована для синхронизации. (Это устройство помечено как «разрешённое».) Когда все ваши устройства будут помечены как «разрешённые», разблокируйте базу. Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено." +"I have made a backup, mark this device as resolved": "Я сделал резервную копию, отметить это устройство как разрешённое" +"The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "Удалённая база заблокирована для синхронизации, чтобы хранилище не испортилось: это устройство не помечено как «разрешённое». Сделайте резервную копию хранилища, сбросьте локальную базу и выберите «Отметить это устройство как разрешённое». Предупреждение будет появляться, пока репликация не подтвердит, что устройство разрешено." diff --git a/src/common/messagesYAML/zh-tw.yaml b/src/common/messagesYAML/zh-tw.yaml index 9c22c16f..30f7a7fa 100644 --- a/src/common/messagesYAML/zh-tw.yaml +++ b/src/common/messagesYAML/zh-tw.yaml @@ -1383,10 +1383,6 @@ Ui: Scram: 緊急處置 SendChunks: 傳送 chunks Syncing: 同步中 - WarningLockedReadyAction: 我已準備好,解鎖資料庫 - WarningLockedReadyText: 為避免 Vault 發生非預期的損毀,遠端資料庫已鎖定同步。(此裝置已標記為「已處理」。)當你所有的裝置都標記為「已處理」後,即可解鎖資料庫。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。 - WarningLockedResolveAction: 我已完成備份,將此裝置標記為已處理 - WarningLockedResolveText: 由於此裝置尚未標記為「已處理」,為避免 Vault 損毀,遠端資料庫已鎖定同步。請先備份你的 Vault、重設本機資料庫,然後選擇「將此裝置標記為已處理」。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。 WriteRedFlagAndRestart: 標記後重新啟動 Patches: CompatibilityConflict: 相容性(衝突行為) @@ -1839,3 +1835,7 @@ Setup: "Garbage Collection completed. Deleted chunks: ${deletedChunks} / ${totalChunks}. Time taken: ${seconds} seconds.": |- 垃圾回收完成。已刪除 chunks:${deletedChunks} / ${totalChunks}。耗時:${seconds} 秒。 "Failed to start replication after Garbage Collection.": 垃圾回收後無法啟動複寫。 +"I am ready, unlock the database": "我已準備好,解鎖資料庫" +"To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.": "為避免 Vault 發生非預期的損毀,遠端資料庫已鎖定同步。(此裝置已標記為「已處理」。)當你所有的裝置都標記為「已處理」後,即可解鎖資料庫。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。" +"I have made a backup, mark this device as resolved": "我已完成備份,將此裝置標記為已處理" +"The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.": "由於此裝置尚未標記為「已處理」,為避免 Vault 損毀,遠端資料庫已鎖定同步。請先備份你的 Vault、重設本機資料庫,然後選擇「將此裝置標記為已處理」。在複寫程序確認此裝置已處理完畢之前,這則警告會持續顯示。" diff --git a/src/common/messagesYAML/zh.yaml b/src/common/messagesYAML/zh.yaml index 2de448b6..ff2cfb05 100644 --- a/src/common/messagesYAML/zh.yaml +++ b/src/common/messagesYAML/zh.yaml @@ -226,7 +226,7 @@ Doctor: 我们开始处理吗? MainFix: |- - + ## ${name} | Current | Ideal | @@ -365,11 +365,13 @@ How to display network errors when the sync server is unreachable.: 当同步服 How would you like to configure the connection to your server?: 你希望如何配置与服务器的连接? However, This should not be enabled if you want to increase your secrecy more.: 不过,如果你希望进一步提高保密性,则不应启用此项。 I am adding a device to an existing synchronisation setup: 我要将设备加入现有同步配置 +I am ready, unlock the database: 我已准备好,立即解锁数据库 I am setting this up for the first time: 我是第一次进行设置 I am setting up a new server for the first time / I want to reset my existing server.: 我是第一次设置新服务器/我想重置现有服务器。 I am unable to create a backup of my Vault.: 我无法备份我的库。 I am unable to create a backup of my Vaults.: 我无法备份我的库。 I have created a backup of my Vault.: 我已备份我的库。 +I have made a backup, mark this device as resolved: 我已完成备份,将此设备标记为“已确认” I know my server details, let me enter them: 我知道服务器详情,让我手动输入 I understand that all changes made on other smartphones or computers possibly could be lost.: 我明白在其他手机或电脑上所做的更改可能会丢失。 I understand that other devices will no longer be able to synchronise, and will need to be reset the synchronisation information.: 我明白其他设备将无法继续同步,需要重置同步信息。 @@ -1524,6 +1526,8 @@ The maximum duration for which chunks can be incubated within the document. Chun The maximum number of chunks that can be incubated within the document. Chunks exceeding this number will immediately graduate to independent chunks.: "文档中可以孵化的数据块的最大数量。超过此数量的数据块将立即成为独立数据块 " The maximum total size of chunks that can be incubated within the document. Chunks exceeding this size will immediately graduate to independent chunks.: "文档中可以孵化的数据块的最大总大小。超过此大小的数据块将立即成为独立数据块 " The minimum interval for automatic synchronisation on event.: 基于事件自动同步的最小间隔。 +The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved.: + 为防止数据仓库损坏,由于此设备尚未标记为“已确认”,远程数据库已被锁定,暂停同步。请先备份你的仓库、重置本地数据库,然后选择“将此设备标记为已确认”。在复制过程确认此设备已完成确认之前,此警告会持续显示。 The remote is already set up, and the configuration is compatible (or got compatible by this operation).: 远端已设置好,且配置兼容(或经此操作后已兼容)。 The Setup-URI does not appear to be valid. Please check that you have copied it correctly.: 设置 URI 似乎无效。请检查是否完整复制。 The Setup-URI is valid and ready to use.: 设置 URI 有效,可以使用。 @@ -1550,6 +1554,8 @@ This Vault is empty, or contains only new files that are not on the server.: 本 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.: 这将用服务器上的最新数据重建本设备的本地数据库。此操作旨在解决同步不一致并恢复正常功能。 This will recreate chunks for all files. If there were missing chunks, this may fix the errors.: 这会为所有文件重新生成 chunks。如果之前存在缺失的 chunks,这可能修复相关错误。 To minimise the creation of new conflicts: 以减少新冲突的产生 +To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved.: + 为防止意外的数据仓库损坏,远程数据库已被锁定,暂停同步。(此设备已被标记为“已确认”)当你的所有设备都标记为“已确认”后,再解锁数据库。在复制过程确认此设备已完成确认之前,此警告会持续显示。 Transfer Tweak: 传输微调 TURN Credential: TURN 凭据 TURN server settings are only necessary if you are behind a strict NAT or firewall that prevents direct P2P connections. In most cases, you can leave these fields blank.: 只有当处于阻止直接 P2P 连接的严格 NAT 或防火墙之后时,才需要 TURN 服务器设置。大多数情况下这些字段可以留空。 @@ -1569,11 +1575,11 @@ TweakMismatchResolve: UseRemoteWithRebuild: Apply settings to this device, and fetch again Message: AutoAcceptCompatibleUndefined: |- - + 各设备的设置似乎存在差异。你现在可以自动应用兼容的更改到这些配置。 是否要启用此「自动接受」设置? Main: >- - + The settings in the remote database are as follows. These values are configured by other devices, which are synchronised with this device at least once. @@ -1610,7 +1616,7 @@ TweakMismatchResolve: remoteUpdated: 远端存储的配置已更新。 UseRemote: WarningRebuildRecommended: >- - + >[!NOTICE] > Some changes are compatible but may consume extra storage and transfer @@ -1620,7 +1626,7 @@ TweakMismatchResolve: > ***Please ensure that you have time and are connected to a stable network to apply!*** WarningRebuildRequired: >- - + >[!WARNING] > Some remote configurations are not compatible with the local database @@ -1629,7 +1635,7 @@ TweakMismatchResolve: > ***Please ensure that you have time and are connected to a stable network to apply!*** WarningIncompatibleRebuildRecommended: >- - + >[!NOTICE] > We have detected that some of the values are different to make @@ -1642,7 +1648,7 @@ TweakMismatchResolve: > If you want to rebuild, it takes a few minutes or more. **Make sure it is safe to perform it now.** WarningIncompatibleRebuildRequired: >- - + >[!WARNING] > We have detected that some of the values are different to make @@ -1770,10 +1776,6 @@ Ui: Scram: 紧急处理 SendChunks: 发送数据块 Syncing: 同步 - WarningLockedReadyAction: 我已准备好,立即解锁数据库 - WarningLockedReadyText: 为防止意外的数据仓库损坏,远程数据库已被锁定,暂停同步。(此设备已被标记为“已确认”)当你的所有设备都标记为“已确认”后,再解锁数据库。在复制过程确认此设备已完成确认之前,此警告会持续显示。 - WarningLockedResolveAction: 我已完成备份,将此设备标记为“已确认” - WarningLockedResolveText: 为防止数据仓库损坏,由于此设备尚未标记为“已确认”,远程数据库已被锁定,暂停同步。请先备份你的仓库、重置本地数据库,然后选择“将此设备标记为已确认”。在复制过程确认此设备已完成确认之前,此警告会持续显示。 WriteRedFlagAndRestart: 标记并重启 Patches: CompatibilityConflict: 兼容性(冲突行为) diff --git a/src/modules/features/SettingDialogue/PaneCustomisationSync.ts b/src/modules/features/SettingDialogue/PaneCustomisationSync.ts index 927050de..e6f48149 100644 --- a/src/modules/features/SettingDialogue/PaneCustomisationSync.ts +++ b/src/modules/features/SettingDialogue/PaneCustomisationSync.ts @@ -3,6 +3,7 @@ import { EVENT_REQUEST_OPEN_PLUGIN_SYNC_DIALOG, eventHub } from "@/common/events import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts"; import type { PageFunctions } from "./SettingPane.ts"; import { enableOnly, visibleOnly } from "./SettingPane.ts"; +import { $msg } from "@/common/translation"; export function paneCustomisationSync( this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, @@ -10,7 +11,7 @@ export function paneCustomisationSync( ): void { // With great respect, thank you TfTHacker! // Refer: https://github.com/TfTHacker/obsidian42-brat/blob/main/src/features/BetaPlugins.ts - void addPanel(paneEl, "Customization Sync").then((paneEl) => { + void addPanel(paneEl, $msg("Customization Sync")).then((paneEl) => { const enableOnlyOnPluginSyncIsNotEnabled = enableOnly(() => this.isConfiguredAs("usePluginSync", false)); const visibleOnlyOnPluginSyncEnabled = visibleOnly(() => this.isConfiguredAs("usePluginSync", true)); @@ -18,7 +19,9 @@ export function paneCustomisationSync( paneEl, "div", { - text: "Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature.", + text: $msg( + "Please set device name to identify this device. This name should be unique among your devices. While not configured, we cannot enable this feature." + ), cls: "op-warn", }, (c) => {}, @@ -28,7 +31,9 @@ export function paneCustomisationSync( paneEl, "div", { - text: "We cannot change the device name while this feature is enabled. Please disable this feature to change the device name.", + text: $msg( + "We cannot change the device name while this feature is enabled. Please disable this feature to change the device name." + ), cls: "op-warn-info", }, (c) => {}, @@ -60,11 +65,11 @@ export function paneCustomisationSync( }); new Setting(paneEl) - .setName("Open") - .setDesc("Open the dialog") + .setName($msg("Open")) + .setDesc($msg("Open the dialog")) .addButton((button) => { button - .setButtonText("Open") + .setButtonText($msg("Open")) .setDisabled(false) .onClick(() => { // this.plugin.getAddOn(ConfigSync.name)?.showPluginSyncModal(); diff --git a/src/modules/features/SettingDialogue/PaneHatch.ts b/src/modules/features/SettingDialogue/PaneHatch.ts index 2426c2bc..d0653ee5 100644 --- a/src/modules/features/SettingDialogue/PaneHatch.ts +++ b/src/modules/features/SettingDialogue/PaneHatch.ts @@ -83,7 +83,7 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, .setDesc($msg("Setting.TroubleShooting.ScanBrokenFiles.Desc")) .addButton((button) => button - .setButtonText("Scan for Broken files") + .setButtonText($msg("Scan for Broken files")) .setCta() .setDisabled(false) .onClick(() => { @@ -136,7 +136,7 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, new Setting(paneEl).autoWireToggle("writeLogToTheFile"); }); - void addPanel(paneEl, "Scram Switches").then((paneEl) => { + void addPanel(paneEl, $msg("Scram Switches")).then((paneEl) => { new Setting(paneEl).autoWireToggle("suspendFileWatching"); this.addOnSaved("suspendFileWatching", () => this.services.appLifecycle.askRestart()); @@ -144,7 +144,7 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, this.addOnSaved("suspendParseReplicationResult", () => this.services.appLifecycle.askRestart()); }); - void addPanel(paneEl, "Recovery and Repair").then((paneEl) => { + void addPanel(paneEl, $msg("Recovery and Repair")).then((paneEl) => { const resultArea = paneEl.createDiv({ text: "", cls: "sls-repair-results" }); type RepairMenuAction = { title: string; @@ -1071,13 +1071,15 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, }) ); new Setting(paneEl) - .setName("Resolve All conflicted files by the newer one") + .setName($msg("Resolve All conflicted files by the newer one")) .setDesc( - "Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one." + $msg( + "Resolve all conflicted files by the newer one. Caution: This will overwrite the older one, and cannot resurrect the overwritten one." + ) ) .addButton((button) => button - .setButtonText("Resolve All") + .setButtonText($msg("Resolve All")) .setCta() .onClick(async () => { const confirmed = @@ -1097,11 +1099,11 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, }) ); new Setting(paneEl) - .setName("Check and convert non-path-obfuscated files") + .setName($msg("Check and convert non-path-obfuscated files")) .setDesc("") .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Perform") + .setButtonText($msg("Perform")) .setDisabled(false) .onClick(async () => { for await (const docName of this.core.localDatabase.findAllDocNames()) { @@ -1174,10 +1176,10 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, }) ); }); - void addPanel(paneEl, "Reset").then((paneEl) => { - new Setting(paneEl).setName("Back to non-configured").addButton((button) => + void addPanel(paneEl, $msg("Reset")).then((paneEl) => { + new Setting(paneEl).setName($msg("Back to non-configured")).addButton((button) => button - .setButtonText("Back") + .setButtonText($msg("Back")) .setDisabled(false) .onClick(async () => { this.editingSettings.isConfigured = false; @@ -1186,9 +1188,9 @@ export function paneHatch(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, }) ); - new Setting(paneEl).setName("Delete all customization sync data").addButton((button) => + new Setting(paneEl).setName($msg("Delete all customization sync data")).addButton((button) => setButtonDestructiveState(button) - .setButtonText("Delete") + .setButtonText($msg("Delete")) .setDisabled(false) .onClick(async () => { Logger(`Deleting customization sync data`, LOG_LEVEL_NOTICE); diff --git a/src/modules/features/SettingDialogue/PaneMaintenance.ts b/src/modules/features/SettingDialogue/PaneMaintenance.ts index 9767eb71..096baf3c 100644 --- a/src/modules/features/SettingDialogue/PaneMaintenance.ts +++ b/src/modules/features/SettingDialogue/PaneMaintenance.ts @@ -24,7 +24,9 @@ export function paneMaintenance( paneEl, "div", { - text: "The remote database is locked for synchronization to prevent vault corruption because this device isn't marked as 'resolved'. Please backup your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until the device is confirmed as resolved by replication.", + text: $msg( + "The remote database is locked for synchronisation to prevent vault corruption because this device is not marked as 'resolved'. Please back up your vault, reset the local database, and select 'Mark this device as resolved'. This warning will persist until replication confirms the device is resolved." + ), cls: "op-warn", }, (c) => { @@ -32,7 +34,7 @@ export function paneMaintenance( c, "button", { - text: "I've made a backup, mark this device 'resolved'", + text: $msg("I have made a backup, mark this device as resolved"), cls: "mod-warning", }, (e) => { @@ -51,7 +53,9 @@ export function paneMaintenance( paneEl, "div", { - text: "To prevent unwanted vault corruption, the remote database has been locked for synchronization. (This device is marked 'resolved') When all your devices are marked 'resolved', unlock the database. This warning kept showing until confirming the device is resolved by the replication", + text: $msg( + "To prevent unwanted vault corruption, the remote database has been locked for synchronisation. (This device is marked as 'resolved'.) When all your devices are marked as 'resolved', unlock the database. This warning will continue to appear until replication confirms the device is resolved." + ), cls: "op-warn", }, (c) => @@ -59,7 +63,7 @@ export function paneMaintenance( c, "button", { - text: "I'm ready, unlock the database", + text: $msg("I am ready, unlock the database"), cls: "mod-warning", }, (e) => { @@ -74,13 +78,13 @@ export function paneMaintenance( visibleOnly(isRemoteLocked) ); - void addPanel(paneEl, "Scram!").then((paneEl) => { + void addPanel(paneEl, $msg("Scram!")).then((paneEl) => { new Setting(paneEl) - .setName("Lock Server") - .setDesc("Lock the remote server to prevent synchronization with other devices.") + .setName($msg("Lock Server")) + .setDesc($msg("Lock the remote server to prevent synchronization with other devices.")) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Lock") + .setButtonText($msg("Lock")) .setDisabled(false) .onClick(async () => { await this.services.replication.markLocked(); @@ -89,11 +93,11 @@ export function paneMaintenance( .addOnUpdate(this.onlyOnCouchDBOrMinIO); new Setting(paneEl) - .setName("Emergency restart") - .setDesc("Disables all synchronization and restart.") + .setName($msg("Emergency restart")) + .setDesc($msg("Disables all synchronization and restart.")) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Flag and restart") + .setButtonText($msg("Flag and restart")) .setDisabled(false) .onClick(async () => { await this.core.storageAccess.writeFileAuto(FlagFilesOriginal.SUSPEND_ALL, ""); @@ -102,13 +106,13 @@ export function paneMaintenance( ); }); - void addPanel(paneEl, "Reset Synchronisation information").then((paneEl) => { + void addPanel(paneEl, $msg("Reset Synchronisation information")).then((paneEl) => { new Setting(paneEl) - .setName("Reset Synchronisation on This Device") - .setDesc("Restore or reconstruct local database from remote.") + .setName($msg("Reset Synchronisation on This Device")) + .setDesc($msg("Restore or reconstruct local database from remote.")) .addButton((button) => button - .setButtonText("Schedule and Restart") + .setButtonText($msg("Schedule and Restart")) .setCta() .setDisabled(false) .onClick(async () => { @@ -117,11 +121,11 @@ export function paneMaintenance( }) ); new Setting(paneEl) - .setName("Overwrite Server Data with This Device's Files") - .setDesc("Rebuild local and remote database with local files.") + .setName($msg("Overwrite Server Data with This Device's Files")) + .setDesc($msg("Rebuild local and remote database with local files.")) .addButton((button) => button - .setButtonText("Schedule and Restart") + .setButtonText($msg("Schedule and Restart")) .setCta() .setDisabled(false) .onClick(async () => { @@ -131,13 +135,13 @@ export function paneMaintenance( ); }); - void addPanel(paneEl, "Syncing", () => {}, this.onlyOnCouchDBOrMinIO).then((paneEl) => { + void addPanel(paneEl, $msg("Syncing"), () => {}, this.onlyOnCouchDBOrMinIO).then((paneEl) => { new Setting(paneEl) - .setName("Resend") - .setDesc("Resend all chunks to the remote.") + .setName($msg("Resend")) + .setDesc($msg("Resend all chunks to the remote.")) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Send chunks") + .setButtonText($msg("Send chunks")) .setDisabled(false) .onClick(async () => { if (this.core.replicator instanceof LiveSyncCouchDBReplicator) { @@ -148,13 +152,15 @@ export function paneMaintenance( .addOnUpdate(this.onlyOnCouchDB); new Setting(paneEl) - .setName("Reset journal received history") + .setName($msg("Reset journal received history")) .setDesc( - "Initialise journal received history. On the next sync, every item except this device sent will be downloaded again." + $msg( + "Initialise journal received history. On the next sync, every item except this device sent will be downloaded again." + ) ) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Reset received") + .setButtonText($msg("Reset received")) .setDisabled(false) .onClick(async () => { await this.getMinioJournalSyncClient().updateCheckPointInfo((info) => ({ @@ -168,13 +174,15 @@ export function paneMaintenance( .addOnUpdate(this.onlyOnMinIO); new Setting(paneEl) - .setName("Reset journal sent history") + .setName($msg("Reset journal sent history")) .setDesc( - "Initialise journal sent history. On the next sync, every item except this device received will be sent again." + $msg( + "Initialise journal sent history. On the next sync, every item except this device received will be sent again." + ) ) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Reset sent history") + .setButtonText($msg("Reset sent history")) .setDisabled(false) .onClick(async () => { await this.getMinioJournalSyncClient().updateCheckPointInfo((info) => ({ @@ -188,13 +196,13 @@ export function paneMaintenance( ) .addOnUpdate(this.onlyOnMinIO); }); - void addPanel(paneEl, "Garbage Collection V3 (Beta)", (e) => e, this.onlyOnCouchDB).then((paneEl) => { + void addPanel(paneEl, $msg("Garbage Collection V3 (Beta)"), (e) => e, this.onlyOnCouchDB).then((paneEl) => { new Setting(paneEl) - .setName("Perform Garbage Collection") - .setDesc("Perform Garbage Collection to remove unused chunks and reduce database size.") + .setName($msg("Perform Garbage Collection")) + .setDesc($msg("Perform Garbage Collection to remove unused chunks and reduce database size.")) .addButton((button) => button - .setButtonText("Perform Garbage Collection") + .setButtonText($msg("Perform Garbage Collection")) .setDisabled(false) .onClick(() => { this.closeSetting(); @@ -289,97 +297,103 @@ export function paneMaintenance( // } // ); - void addPanel(paneEl, "Rebuilding Operations (Remote Only)", () => {}, this.onlyOnCouchDBOrMinIO).then((paneEl) => { - new Setting(paneEl) - .setName("Perform cleanup") - .setDesc( - "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." - ) - .addButton((button) => - button - .setButtonText("Perform") - .setDisabled(false) - .onClick(async () => { - const replicator = this.core.replicator as LiveSyncCouchDBReplicator; - Logger(`Cleanup has been began`, LOG_LEVEL_NOTICE, "compaction"); - if (await replicator.compactRemote(this.editingSettings)) { - Logger(`Cleanup has been completed!`, LOG_LEVEL_NOTICE, "compaction"); - } else { - Logger(`Cleanup has been failed!`, LOG_LEVEL_NOTICE, "compaction"); - } - }) - ) - .addOnUpdate(this.onlyOnCouchDB); + void addPanel(paneEl, $msg("Rebuilding Operations (Remote Only)"), () => {}, this.onlyOnCouchDBOrMinIO).then( + (paneEl) => { + new Setting(paneEl) + .setName($msg("Perform cleanup")) + .setDesc( + $msg( + "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." + ) + ) + .addButton((button) => + button + .setButtonText($msg("Perform")) + .setDisabled(false) + .onClick(async () => { + const replicator = this.core.replicator as LiveSyncCouchDBReplicator; + Logger(`Cleanup has been began`, LOG_LEVEL_NOTICE, "compaction"); + if (await replicator.compactRemote(this.editingSettings)) { + Logger(`Cleanup has been completed!`, LOG_LEVEL_NOTICE, "compaction"); + } else { + Logger(`Cleanup has been failed!`, LOG_LEVEL_NOTICE, "compaction"); + } + }) + ) + .addOnUpdate(this.onlyOnCouchDB); - new Setting(paneEl) - .setName("Overwrite remote") - .setDesc("Overwrite remote with local DB and passphrase.") - .addButton((button) => - setButtonDestructiveState(button) - .setButtonText("Send") - .setDisabled(false) - .onClick(async () => { - await this.rebuildDB("remoteOnly"); - }) - ); + new Setting(paneEl) + .setName($msg("Overwrite remote")) + .setDesc($msg("Overwrite remote with local DB and passphrase.")) + .addButton((button) => + setButtonDestructiveState(button) + .setButtonText($msg("Send")) + .setDisabled(false) + .onClick(async () => { + await this.rebuildDB("remoteOnly"); + }) + ); - new Setting(paneEl) - .setName("Reset all journal counter") - .setDesc("Initialise all journal history, On the next sync, every item will be received and sent.") - .addButton((button) => - setButtonDestructiveState(button) - .setButtonText("Reset all") - .setDisabled(false) - .onClick(async () => { - await this.getMinioJournalSyncClient().resetCheckpointInfo(); - Logger(`Journal exchange history has been cleared.`, LOG_LEVEL_NOTICE); - }) - ) - .addOnUpdate(this.onlyOnMinIO); + new Setting(paneEl) + .setName($msg("Reset all journal counter")) + .setDesc( + $msg("Initialise all journal history, On the next sync, every item will be received and sent.") + ) + .addButton((button) => + setButtonDestructiveState(button) + .setButtonText($msg("Reset all")) + .setDisabled(false) + .onClick(async () => { + await this.getMinioJournalSyncClient().resetCheckpointInfo(); + Logger(`Journal exchange history has been cleared.`, LOG_LEVEL_NOTICE); + }) + ) + .addOnUpdate(this.onlyOnMinIO); - new Setting(paneEl) - .setName("Purge all journal counter") - .setDesc("Purge all download/upload cache.") - .addButton((button) => - setButtonDestructiveState(button) - .setButtonText("Reset all") - .setDisabled(false) - .onClick(() => { - this.getMinioJournalSyncClient().resetAllCaches(); - Logger(`Journal download/upload cache has been cleared.`, LOG_LEVEL_NOTICE); - }) - ) - .addOnUpdate(this.onlyOnMinIO); + new Setting(paneEl) + .setName($msg("Purge all journal counter")) + .setDesc($msg("Purge all download/upload cache.")) + .addButton((button) => + setButtonDestructiveState(button) + .setButtonText($msg("Reset all")) + .setDisabled(false) + .onClick(() => { + this.getMinioJournalSyncClient().resetAllCaches(); + Logger(`Journal download/upload cache has been cleared.`, LOG_LEVEL_NOTICE); + }) + ) + .addOnUpdate(this.onlyOnMinIO); - new Setting(paneEl) - .setName("Fresh Start Wipe") - .setDesc("Delete all data on the remote server.") - .addButton((button) => - setButtonDestructiveState(button) - .setButtonText("Delete") - .setDisabled(false) - .onClick(async () => { - await this.getMinioJournalSyncClient().updateCheckPointInfo((info) => ({ - ...info, - receivedFiles: new Set(), - knownIDs: new Set(), - lastLocalSeq: 0, - sentIDs: new Set(), - sentFiles: new Set(), - })); - const reset = await this.resetRemoteBucket(); - Logger( - reset - ? `Deleted all data on remote server` - : `Fresh Start Wipe did not complete. Keep all synchronising devices stopped and run it again.`, - LOG_LEVEL_NOTICE - ); - }) - ) - .addOnUpdate(this.onlyOnMinIO); - }); + new Setting(paneEl) + .setName($msg("Fresh Start Wipe")) + .setDesc($msg("Delete all data on the remote server.")) + .addButton((button) => + setButtonDestructiveState(button) + .setButtonText($msg("Delete")) + .setDisabled(false) + .onClick(async () => { + await this.getMinioJournalSyncClient().updateCheckPointInfo((info) => ({ + ...info, + receivedFiles: new Set(), + knownIDs: new Set(), + lastLocalSeq: 0, + sentIDs: new Set(), + sentFiles: new Set(), + })); + const reset = await this.resetRemoteBucket(); + Logger( + reset + ? `Deleted all data on remote server` + : `Fresh Start Wipe did not complete. Keep all synchronising devices stopped and run it again.`, + LOG_LEVEL_NOTICE + ); + }) + ) + .addOnUpdate(this.onlyOnMinIO); + } + ); - void addPanel(paneEl, "Reset").then((paneEl) => { + void addPanel(paneEl, $msg("Reset")).then((paneEl) => { new Setting(paneEl) .setName($msg("obsidianLiveSyncSettingTab.nameDiscardSettings")) .addButton((button) => { @@ -405,10 +419,10 @@ export function paneMaintenance( .addOnUpdate(visibleOnly(() => this.isConfiguredAs("isConfigured", true))); new Setting(paneEl) - .setName("Delete local database to reset or uninstall Self-hosted LiveSync") + .setName($msg("Delete local database to reset or uninstall Self-hosted LiveSync")) .addButton((button) => setButtonDestructiveState(button) - .setButtonText("Delete") + .setButtonText($msg("Delete")) .setDisabled(false) .onClick(async () => { await this.services.database.resetDatabase(); diff --git a/src/modules/features/SettingDialogue/PanePatches.ts b/src/modules/features/SettingDialogue/PanePatches.ts index dbc99b7e..4e8cb83e 100644 --- a/src/modules/features/SettingDialogue/PanePatches.ts +++ b/src/modules/features/SettingDialogue/PanePatches.ts @@ -18,7 +18,7 @@ import { usesLegacyIndexedDBAdapter } from "@/common/compatibilitySettings.ts"; import { $msg } from "@/common/translation"; export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, { addPanel }: PageFunctions): void { - void addPanel(paneEl, "Compatibility (Metadata)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Metadata)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("deleteMetadataOfDeletedFiles"); new Setting(paneEl).autoWireNumeric("automaticallyDeleteMetadataOfDeletedFiles", { @@ -26,12 +26,12 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen }); }); - void addPanel(paneEl, "Compatibility (Conflict Behaviour)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Conflict Behaviour)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("disableMarkdownAutoMerge"); new Setting(paneEl).autoWireToggle("writeDocumentsIfConflicted"); }); - void addPanel(paneEl, "Compatibility (Database structure)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Database structure)")).then((paneEl) => { const migrateAllToIndexedDB = async () => { const dbToName = this.core.localDatabase.dbname + SuffixDatabaseName + ExtraSuffixIndexedDB; const options = { @@ -80,16 +80,20 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen const useIndexedDBAdapter = usesLegacyIndexedDBAdapter(this.editingSettings); const infoClass = useIndexedDBAdapter ? "op-warn" : "op-warn-info"; paneEl.createDiv({ - text: "The IndexedDB adapter often offers superior performance in certain scenarios, but it has been found to cause memory leaks when used with LiveSync mode. When using LiveSync mode, please use IDB adapter instead.", + text: $msg( + "The IndexedDB adapter often offers superior performance in certain scenarios, but it has been found to cause memory leaks when used with LiveSync mode. When using LiveSync mode, please use IDB adapter instead." + ), cls: infoClass, }); paneEl.createDiv({ - text: "Changing this setting requires migrating existing data (a bit time may be taken) and restarting Obsidian. Please make sure to back up your data before proceeding.", + text: $msg( + "Changing this setting requires migrating existing data (a bit time may be taken) and restarting Obsidian. Please make sure to back up your data before proceeding." + ), cls: "op-warn-info", }); const setting = new Setting(paneEl) - .setName("Database Adapter") - .setDesc("Select the database adapter to use. "); + .setName($msg("Database Adapter")) + .setDesc($msg("Select the database adapter to use.")); const el = setting.controlEl.createDiv({}); el.setText(`Current adapter: ${useIndexedDBAdapter ? "IndexedDB" : "IDB"}`); if (!useIndexedDBAdapter) { @@ -119,10 +123,10 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen new Setting(paneEl).autoWireToggle("handleFilenameCaseSensitive", { holdValue: true }); }); - void addPanel(paneEl, "Compatibility (Internal API Usage)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Internal API Usage)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("watchInternalFileChanges", { invert: true }); }); - void addPanel(paneEl, "Compatibility (Remote Database)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Remote Database)")).then((paneEl) => { new Setting(paneEl).autoWireDropDown("E2EEAlgorithm", { options: E2EEAlgorithmNames, }); @@ -136,7 +140,7 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen ), }); - void addPanel(paneEl, "Edge case addressing (Database)").then((paneEl) => { + void addPanel(paneEl, $msg("Edge case addressing (Database)")).then((paneEl) => { new Setting(paneEl) .autoWireText("additionalSuffixOfDatabaseName", { holdValue: true }) .addApplyButton(["additionalSuffixOfDatabaseName"]); @@ -161,13 +165,13 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen await this.core.localDatabase._prepareHashFunctions(); }); }); - void addPanel(paneEl, "Edge case addressing (Behaviour)").then((paneEl) => { + void addPanel(paneEl, $msg("Edge case addressing (Behaviour)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("doNotSuspendOnFetching"); new Setting(paneEl).autoWireToggle("doNotDeleteFolder"); new Setting(paneEl).autoWireToggle("processSizeMismatchedFiles"); }); - void addPanel(paneEl, "Edge case addressing (Processing)").then((paneEl) => { + void addPanel(paneEl, $msg("Edge case addressing (Processing)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("disableWorkerForGeneratingChunks"); new Setting(paneEl).autoWireToggle("processSmallFilesInUIThread", { @@ -177,10 +181,10 @@ export function panePatches(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElemen // void addPanel(paneEl, "Edge case addressing (Networking)").then((paneEl) => { // new Setting(paneEl).autoWireToggle("useRequestAPI"); // }); - void addPanel(paneEl, "Compatibility (Trouble addressed)").then((paneEl) => { + void addPanel(paneEl, $msg("Compatibility (Trouble addressed)")).then((paneEl) => { new Setting(paneEl).autoWireToggle("disableCheckingConfigMismatch"); }); - void addPanel(paneEl, "Remediation").then((paneEl) => { + void addPanel(paneEl, $msg("Remediation")).then((paneEl) => { const setting = setSettingAdditionalActionsState(new Setting(paneEl)); const dateEl = setting.controlEl.createSpan(); setting diff --git a/src/modules/features/SettingDialogue/PanePowerUsers.ts b/src/modules/features/SettingDialogue/PanePowerUsers.ts index 976ca827..b254544f 100644 --- a/src/modules/features/SettingDialogue/PanePowerUsers.ts +++ b/src/modules/features/SettingDialogue/PanePowerUsers.ts @@ -2,18 +2,21 @@ import { type ConfigPassphraseStore } from "@vrtmrz/livesync-commonlib/compat/co import { LiveSyncSetting as Setting } from "./LiveSyncSetting.ts"; import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts"; import type { PageFunctions } from "./SettingPane.ts"; +import { $msg } from "@/common/translation"; export function panePowerUsers( this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, { addPanel }: PageFunctions ): void { - void addPanel(paneEl, "CouchDB Connection Tweak", undefined, this.onlyOnCouchDB).then((paneEl) => { + void addPanel(paneEl, $msg("CouchDB Connection Tweak"), undefined, this.onlyOnCouchDB).then((paneEl) => { this.createEl( paneEl, "div", { - text: `If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value.`, + text: $msg( + "If you reached the payload size limit when using IBM Cloudant, please decrease batch size and batch limit to a lower value." + ), }, undefined, this.onlyOnCouchDB @@ -26,15 +29,15 @@ export function panePowerUsers( }); new Setting(paneEl).autoWireToggle("useTimeouts", { onUpdate: this.onlyOnCouchDB }); }); - void addPanel(paneEl, "Configuration Encryption").then((paneEl) => { + void addPanel(paneEl, $msg("Configuration Encryption")).then((paneEl) => { const passphrase_options: Record = { - "": "Default", - LOCALSTORAGE: "Use a custom passphrase", - ASK_AT_LAUNCH: "Ask an passphrase at every launch", + "": $msg("Default"), + LOCALSTORAGE: $msg("Use a custom passphrase"), + ASK_AT_LAUNCH: $msg("Ask a passphrase at every launch"), }; new Setting(paneEl) - .setName("Encrypting sensitive configuration items") + .setName($msg("Encrypting sensitive configuration items")) .autoWireDropDown("configPassphraseStore", { options: passphrase_options, holdValue: true, @@ -45,7 +48,7 @@ export function panePowerUsers( })); new Setting(paneEl).addApplyButton(["configPassphrase", "configPassphraseStore"]); }); - void addPanel(paneEl, "Developer").then((paneEl) => { + void addPanel(paneEl, $msg("Developer")).then((paneEl) => { new Setting(paneEl).autoWireToggle("enableDebugTools"); }); } diff --git a/src/modules/features/SettingDialogue/PaneRemoteConfig.ts b/src/modules/features/SettingDialogue/PaneRemoteConfig.ts index 61310e4d..8c608165 100644 --- a/src/modules/features/SettingDialogue/PaneRemoteConfig.ts +++ b/src/modules/features/SettingDialogue/PaneRemoteConfig.ts @@ -112,10 +112,10 @@ export function paneRemoteConfig( info: getE2EEConfigSummary(this.editingSettings), }); }; - void addPanel(paneEl, "E2EE Configuration", () => {}).then((paneEl) => { + void addPanel(paneEl, $msg("E2EE Configuration"), () => {}).then((paneEl) => { const infoPanel = new SveltePanel(InfoPanel, paneEl, E2EESummaryWritable); this.lifetimeComponent.register(() => infoPanel.destroy()); - const setupButton = setSettingAdditionalActionsState(new Setting(paneEl).setName("Configure E2EE")); + const setupButton = setSettingAdditionalActionsState(new Setting(paneEl).setName($msg("Configure E2EE"))); setupButton .addButton((button) => setButtonDestructiveState(button) @@ -146,7 +146,7 @@ export function paneRemoteConfig( } updateE2EESummary(); }) - .setButtonText("Configure") + .setButtonText($msg("Configure")) ) .addButton((button) => setButtonDestructiveState(setButtonAdditionalActionState(button)) @@ -156,7 +156,7 @@ export function paneRemoteConfig( await setupManager.onConfigureManually(originalSettings, UserMode.Update); updateE2EESummary(); }) - .setButtonText("Configure And Change Remote") + .setButtonText($msg("Configure And Change Remote")) ); updateE2EESummary(); }); diff --git a/src/modules/features/SettingDialogue/PaneSelector.ts b/src/modules/features/SettingDialogue/PaneSelector.ts index 3a6f8e4b..bfd7c0b1 100644 --- a/src/modules/features/SettingDialogue/PaneSelector.ts +++ b/src/modules/features/SettingDialogue/PaneSelector.ts @@ -6,12 +6,15 @@ import { mount, unmount } from "svelte"; import type { ObsidianLiveSyncSettingTab } from "./ObsidianLiveSyncSettingTab.ts"; import type { PageFunctions } from "./SettingPane.ts"; import { visibleOnly } from "./SettingPane.ts"; +import { $msg } from "@/common/translation"; export function paneSelector(this: ObsidianLiveSyncSettingTab, paneEl: HTMLElement, { addPanel }: PageFunctions): void { - void addPanel(paneEl, "Normal Files").then((paneEl) => { + void addPanel(paneEl, $msg("Normal Files")).then((paneEl) => { const syncFilesSetting = new Setting(paneEl) - .setName("Synchronising files") + .setName($msg("Synchronising files")) .setDesc( - "(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files." + $msg( + "(RegExp) Empty to sync all files. Set filter as a regular expression to limit synchronising files." + ) ); const syncFilesControl = mount(MultipleRegExpControl, { target: syncFilesSetting.controlEl, @@ -28,8 +31,10 @@ export function paneSelector(this: ObsidianLiveSyncSettingTab, paneEl: HTMLEleme this.lifetimeComponent.register(() => void unmount(syncFilesControl)); const nonSyncFilesSetting = new Setting(paneEl) - .setName("Non-Synchronising files") - .setDesc("(RegExp) If this is set, any changes to local and remote files that match this will be skipped."); + .setName($msg("Non-Synchronising files")) + .setDesc( + $msg("(RegExp) If this is set, any changes to local and remote files that match this will be skipped.") + ); const nonSyncFilesControl = mount(MultipleRegExpControl, { target: nonSyncFilesSetting.controlEl, @@ -51,10 +56,10 @@ export function paneSelector(this: ObsidianLiveSyncSettingTab, paneEl: HTMLEleme onUpdate: visibleOnly(() => this.isConfiguredAs("useIgnoreFiles", true)), }); }); - void addPanel(paneEl, "Hidden Files", undefined, undefined, LEVEL_ADVANCED).then((paneEl) => { + void addPanel(paneEl, $msg("Hidden Files"), undefined, undefined, LEVEL_ADVANCED).then((paneEl) => { const targetPatternSetting = new Setting(paneEl) - .setName("Target patterns") - .setDesc("Patterns to match files for syncing"); + .setName($msg("Target patterns")) + .setDesc($msg("Patterns to match files for syncing")); const patTarget = splitCustomRegExpList(this.editingSettings.syncInternalFilesTargetPatterns, ","); const targetPatternControl = mount(MultipleRegExpControl, { target: targetPatternSetting.controlEl, @@ -75,7 +80,7 @@ export function paneSelector(this: ObsidianLiveSyncSettingTab, paneEl: HTMLEleme defaultSkipPattern + ",\\/workspace$ ,\\/workspace.json$,\\/workspace-mobile.json$"; const pat = splitCustomRegExpList(this.editingSettings.syncInternalFilesIgnorePatterns, ","); - const patSetting = new Setting(paneEl).setName("Ignore patterns").setDesc(""); + const patSetting = new Setting(paneEl).setName($msg("Ignore patterns")).setDesc(""); const ignorePatternControl = mount(MultipleRegExpControl, { target: patSetting.controlEl, @@ -104,21 +109,21 @@ export function paneSelector(this: ObsidianLiveSyncSettingTab, paneEl: HTMLEleme }; new Setting(paneEl) - .setName("Add default patterns") + .setName($msg("Add default patterns")) .addButton((button) => { - button.setButtonText("Default").onClick(async () => { + button.setButtonText($msg("Default")).onClick(async () => { await addDefaultPatterns(defaultSkipPattern); }); }) .addButton((button) => { - button.setButtonText("Cross-platform").onClick(async () => { + button.setButtonText($msg("Cross-platform")).onClick(async () => { await addDefaultPatterns(defaultSkipPatternXPlat); }); }); const overwritePatterns = new Setting(paneEl) - .setName("Overwrite patterns") - .setDesc("Patterns to match files for overwriting instead of merging"); + .setName($msg("Overwrite patterns")) + .setDesc($msg("Patterns to match files for overwriting instead of merging")); const patTarget2 = splitCustomRegExpList(this.editingSettings.syncInternalFileOverwritePatterns, ","); const overwritePatternControl = mount(MultipleRegExpControl, { target: overwritePatterns.controlEl, diff --git a/src/serviceFeatures/redFlag.simpleFetch.ts b/src/serviceFeatures/redFlag.simpleFetch.ts index 90355a26..4ce84e29 100644 --- a/src/serviceFeatures/redFlag.simpleFetch.ts +++ b/src/serviceFeatures/redFlag.simpleFetch.ts @@ -11,6 +11,8 @@ import { type FullScanOptions, } from "@vrtmrz/livesync-commonlib/compat/serviceFeatures/offlineScanner"; import { adjustSettingToRemoteIfNeeded, cancelScheduledInitialisation, processVaultInitialisation } from "./redFlag"; +import { $msg } from "@/common/translation"; +import type { AllMessageKeys } from "@/common/rosetta"; export const SIMPLE_FETCH_STAGE1_REMOTE_WINS = "Overwrite all with remote files"; export const SIMPLE_FETCH_STAGE1_NEWER_WINS = "Compare time and take newer"; @@ -85,26 +87,47 @@ function clearRememberedSimpleFetchMode(host: NecessaryServices<"setting", never host.services.setting.deleteSmallConfig(SIMPLE_FETCH_MODE_KEY); } +async function confirmTranslatedChoice( + host: NecessaryServices<"UI", never>, + title: string, + message: string, + buttons: AllMessageKeys[], + defaultAction: AllMessageKeys +): Promise { + const labels: string[] = buttons.map((key) => $msg(key)); + const selected = await host.services.UI.confirm.confirmWithMessage(title, message, labels, $msg(defaultAction), 0); + if (selected === false) return false; + const index = labels.indexOf(selected); + return index < 0 ? false : buttons[index]; +} + export async function askSimpleFetchMode( host: NecessaryServices<"UI" | "setting", never> ): Promise<{ mode: string; options: Partial } | "cancelled" | "aborted"> { const remembered = getRememberedSimpleFetchMode(host); if (remembered) return remembered; - const msg = `We are about to retrieve the remote data. + const msg = $msg( + `We are about to retrieve the remote data. Firstly, how shall we handle the data retrieved from this remote source? -- **${SIMPLE_FETCH_STAGE1_NEWER_WINS}**: Compares the modified time of files and takes the newer one. +- **\${NEWER_WINS}**: Compares the modified time of files and takes the newer one. If you have been using Self-hosted LiveSync and have made changes on multiple devices, this option may be suitable for you as it tries to merge changes based on modified time. -- **${SIMPLE_FETCH_STAGE1_REMOTE_WINS}**: Remote data is the source of truth. +- **\${REMOTE_WINS}**: Remote data is the source of truth. If you are new to using Self-hosted LiveSync. This option may be easiest to understand and get started with. It will overwrite all your local files with the remote data, so please make sure you have a backup if there is any important data in your vault. -- **${SIMPLE_FETCH_STAGE1_DETAILED}**: Opens the detailed setup wizard. - If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow. - `; - const stage1 = await host.services.UI.confirm.confirmWithMessage( - "Data retrieval scheduled", +- **\${DETAILED}**: Opens the detailed setup wizard. + If you want to have more control over the synchronisation process, or want to review the changes before applying, you can choose this option to use the detailed flow.`, + { + NEWER_WINS: $msg(SIMPLE_FETCH_STAGE1_NEWER_WINS), + REMOTE_WINS: $msg(SIMPLE_FETCH_STAGE1_REMOTE_WINS), + DETAILED: $msg(SIMPLE_FETCH_STAGE1_DETAILED), + } + ); + const stage1 = await confirmTranslatedChoice( + host, + $msg("Data retrieval scheduled"), msg, [ SIMPLE_FETCH_STAGE1_NEWER_WINS, @@ -112,8 +135,7 @@ Firstly, how shall we handle the data retrieved from this remote source? SIMPLE_FETCH_STAGE1_DETAILED, SIMPLE_FETCH_STAGE1_CANCEL, ], - SIMPLE_FETCH_STAGE1_NEWER_WINS, - 0 + SIMPLE_FETCH_STAGE1_NEWER_WINS ); if (!stage1 || stage1 === SIMPLE_FETCH_STAGE1_CANCEL) return "cancelled"; @@ -123,19 +145,25 @@ Firstly, how shall we handle the data retrieved from this remote source? } if (stage1 === SIMPLE_FETCH_STAGE1_REMOTE_WINS) { - const msg = `Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?** + const msg = $msg( + `Since you have chosen to overwrite all local files with remote data, **how would you like to handle local files that are not present in the remote database?** -- **${SIMPLE_FETCH_STAGE2_REMOTE_DELETE_ALL}**: Local-only files and remote-deleted files will be removed. +- **\${DELETE_ALL}**: Local-only files and remote-deleted files will be removed. This option will make your local vault exactly the same as the remote database, but please make sure you have a backup if there is any important data in your vault. -- **${SIMPLE_FETCH_STAGE2_REMOTE_DELETE_NONE}**: All existing local files will be preserved. - This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.`; +- **\${DELETE_NONE}**: All existing local files will be preserved. + This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.`, + { + DELETE_ALL: $msg(SIMPLE_FETCH_STAGE2_REMOTE_DELETE_ALL), + DELETE_NONE: $msg(SIMPLE_FETCH_STAGE2_REMOTE_DELETE_NONE), + } + ); - const stage2 = await host.services.UI.confirm.confirmWithMessage( - "How to handle extra existing local files?", + const stage2 = await confirmTranslatedChoice( + host, + $msg("How to handle extra existing local files?"), msg, [SIMPLE_FETCH_STAGE2_REMOTE_DELETE_ALL, SIMPLE_FETCH_STAGE2_REMOTE_DELETE_NONE, STAGE2_ABORT], - SIMPLE_FETCH_STAGE2_REMOTE_DELETE_NONE, - 0 + SIMPLE_FETCH_STAGE2_REMOTE_DELETE_NONE ); if (!stage2) return "cancelled"; if (stage2 === STAGE2_ABORT) { @@ -146,20 +174,25 @@ Firstly, how shall we handle the data retrieved from this remote source? } if (stage1 === SIMPLE_FETCH_STAGE1_NEWER_WINS) { - const msg = `How should files that were deleted on other devices be handled? + const msg = $msg( + `How should files that were deleted on other devices be handled? -- **${SIMPLE_FETCH_STAGE2_NEWER_CLEANUP}**: Delete local files if they were deleted on remote. +- **\${NEWER_CLEANUP}**: Delete local files if they were deleted on remote. This is useful if you want to keep your vault clean and consistent across devices, but please make sure you have a backup if there is already any important data in your vault. -- **${SIMPLE_FETCH_STAGE2_NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote. - This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation. - `; +- **\${NEWER_SYNC_ALL}**: Recreate remote files even if they were deleted on remote. + This option will keep all your local files, but it may cause duplicates if there are files that exist on local but not on remote. You can clean up these duplicates manually after the synchronisation.`, + { + NEWER_CLEANUP: $msg(SIMPLE_FETCH_STAGE2_NEWER_CLEANUP), + NEWER_SYNC_ALL: $msg(SIMPLE_FETCH_STAGE2_NEWER_SYNC_ALL), + } + ); - const stage2 = await host.services.UI.confirm.confirmWithMessage( - "Conflict & Deletion Options", + const stage2 = await confirmTranslatedChoice( + host, + $msg("Conflict & Deletion Options"), msg, [SIMPLE_FETCH_STAGE2_NEWER_CLEANUP, SIMPLE_FETCH_STAGE2_NEWER_SYNC_ALL, STAGE2_ABORT], - SIMPLE_FETCH_STAGE2_NEWER_SYNC_ALL, - 0 + SIMPLE_FETCH_STAGE2_NEWER_SYNC_ALL ); if (!stage2) return "cancelled"; if (stage2 === STAGE2_ABORT) { @@ -245,12 +278,14 @@ export async function askAndPerformFastSetupOnScheduledFetchAll( }) ); if (!syncResult) { + const rerunProcess = $msg(RERUN_PROCESS); + const releaseFlagProcess = $msg(RELEASE_FLAG_PROCESS); const canRelease = await host.services.UI.confirm.askSelectStringDialogue( - "Some files failed to synchronise. What would you like to do?", - [RERUN_PROCESS, RELEASE_FLAG_PROCESS], - { defaultAction: RELEASE_FLAG_PROCESS, title: "Synchronisation Issues Detected" } + $msg("Some files failed to synchronise. What would you like to do?"), + [rerunProcess, releaseFlagProcess], + { defaultAction: releaseFlagProcess, title: $msg("Synchronisation Issues Detected") } ); - if (canRelease === RERUN_PROCESS) { + if (canRelease === rerunProcess) { log("User chose to reboot and re-run the process.", LOG_LEVEL_NOTICE); // Prevent to delete the flag, so that the process will be re-run after reboot. // await cleanupFlag(); diff --git a/src/serviceFeatures/redFlag.simpleFetch.unit.spec.ts b/src/serviceFeatures/redFlag.simpleFetch.unit.spec.ts new file mode 100644 index 00000000..73b3d9c0 --- /dev/null +++ b/src/serviceFeatures/redFlag.simpleFetch.unit.spec.ts @@ -0,0 +1,116 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import type { NecessaryServices } from "@vrtmrz/livesync-commonlib/compat/interfaces/ServiceModule"; +import { FullScanModes } from "@vrtmrz/livesync-commonlib/compat/serviceFeatures/offlineScanner"; +import { $msg, setLang } from "@/common/translation"; +import { askSimpleFetchMode } from "./redFlag.simpleFetch"; + +const REMOTE_WINS = "Overwrite all with remote files"; +const KEEP_LOCAL = "Keep local files even if not on remote"; + +function createHost(savedChoice?: string) { + const smallConfig = new Map(); + if (savedChoice) smallConfig.set("simple-fetch-mode", savedChoice); + const confirmWithMessage = + vi.fn<(title: string, message: string, buttons: string[], defaultAction: string) => Promise>(); + const host = { + services: { + UI: { confirm: { confirmWithMessage } }, + setting: { + getSmallConfig: (key: string) => smallConfig.get(key) ?? "", + setSmallConfig: (key: string, value: string) => smallConfig.set(key, value), + deleteSmallConfig: (key: string) => smallConfig.delete(key), + }, + }, + } as unknown as NecessaryServices<"UI" | "setting", never>; + return { host, confirmWithMessage, smallConfig }; +} + +afterEach(() => setLang("def")); + +describe("Fast Setup translated choices", () => { + it("uses the current language after the module has loaded and saves stable choice values", async () => { + const { host, confirmWithMessage, smallConfig } = createHost(); + setLang("es"); + confirmWithMessage.mockImplementation(async (_title, _message, buttons) => buttons[1]); + + await expect(askSimpleFetchMode(host)).resolves.toEqual({ + mode: "remote-only", + options: { mode: FullScanModes.DB_APPLY, extraOnRemote: undefined }, + }); + + const [title, message, buttons] = confirmWithMessage.mock.calls[0]; + expect(title).toBe($msg("Data retrieval scheduled")); + expect(buttons[1]).toBe($msg(REMOTE_WINS)); + expect(buttons[1]).not.toBe(REMOTE_WINS); + expect(message).toContain($msg(REMOTE_WINS)); + expect(confirmWithMessage.mock.calls[1][2][1]).toBe($msg(KEEP_LOCAL)); + expect(JSON.parse(smallConfig.get("simple-fetch-mode")!)).toEqual({ + stage1: REMOTE_WINS, + stage2: KEEP_LOCAL, + }); + }); + + it("restores choices saved by the previous English implementation while displaying Spanish", async () => { + const savedChoice = JSON.stringify({ stage1: REMOTE_WINS, stage2: KEEP_LOCAL }); + const { host, confirmWithMessage, smallConfig } = createHost(savedChoice); + setLang("es"); + + await expect(askSimpleFetchMode(host)).resolves.toEqual({ + mode: "remote-only", + options: { mode: FullScanModes.DB_APPLY, extraOnRemote: undefined }, + }); + + expect(confirmWithMessage).not.toHaveBeenCalled(); + expect(smallConfig.get("simple-fetch-mode")).toBe(savedChoice); + }); + + it("uses the new language in the second dialogue without changing the first choice", async () => { + const { host, confirmWithMessage, smallConfig } = createHost(); + setLang("def"); + confirmWithMessage + .mockImplementationOnce(async (_title, _message, buttons) => { + setLang("es"); + return buttons[1]; + }) + .mockImplementationOnce(async (_title, _message, buttons) => buttons[1]); + + await expect(askSimpleFetchMode(host)).resolves.toMatchObject({ mode: "remote-only" }); + + expect(confirmWithMessage.mock.calls[0][2][1]).toBe(REMOTE_WINS); + expect(confirmWithMessage.mock.calls[1][2][1]).toBe($msg(KEEP_LOCAL)); + expect(JSON.parse(smallConfig.get("simple-fetch-mode")!)).toEqual({ + stage1: REMOTE_WINS, + stage2: KEEP_LOCAL, + }); + }); + + it("recognises the translated cancellation choice", async () => { + const { host, confirmWithMessage, smallConfig } = createHost(); + setLang("es"); + confirmWithMessage.mockImplementationOnce(async (_title, _message, buttons) => buttons[3]); + + await expect(askSimpleFetchMode(host)).resolves.toBe("cancelled"); + + expect(confirmWithMessage.mock.calls[0][2][3]).toBe($msg("Cancel")); + expect(smallConfig.size).toBe(0); + }); + + it("saves English-compatible values when the module initially loads in Spanish", async () => { + vi.resetModules(); + const translation = await import("@/common/translation"); + translation.setLang("es"); + const { askSimpleFetchMode: askAfterSpanishStartup } = await import("./redFlag.simpleFetch"); + const { host, confirmWithMessage, smallConfig } = createHost(); + confirmWithMessage.mockImplementation(async (_title, _message, buttons) => buttons[1]); + + try { + await expect(askAfterSpanishStartup(host)).resolves.toMatchObject({ mode: "remote-only" }); + expect(JSON.parse(smallConfig.get("simple-fetch-mode")!)).toEqual({ + stage1: REMOTE_WINS, + stage2: KEEP_LOCAL, + }); + } finally { + translation.setLang("def"); + } + }); +}); diff --git a/test/e2e-obsidian/scripts/settings-ui.ts b/test/e2e-obsidian/scripts/settings-ui.ts index eb709f1c..c4be1651 100644 --- a/test/e2e-obsidian/scripts/settings-ui.ts +++ b/test/e2e-obsidian/scripts/settings-ui.ts @@ -267,7 +267,7 @@ async function captureDeclarativeMobileSettings(): Promise< const maintenancePage = await settingsNavigator.openPage("Maintenance"); const markResolvedButton = maintenancePage .locator(".op-warn button") - .filter({ hasText: "I've made a backup, mark this device 'resolved'" }) + .filter({ hasText: "I have made a backup, mark this device as resolved" }) .first(); await markResolvedButton.evaluate((button) => { const warning = button.closest(".op-warn"); diff --git a/updates.md b/updates.md index f94c2092..7dcf52ce 100644 --- a/updates.md +++ b/updates.md @@ -12,6 +12,20 @@ Earlier releases remain available in the 1.0 release history, the 1.0 preview hi ## Unreleased +### Localisation + +#### Fixed + +- We can read more settings, maintenance controls, and Fast Setup instructions in Spanish. (#1213, #1214) + - Remote database lock warnings now use the existing translations consistently. + - Fast Setup follows the selected display language while preserving saved choices across restarts and language changes. + +### Acknowledgements + +Thank you for your contributions! + +- @zeedif (#1213, #1214) + ## 1.0.35 5th October, 2026