From ae7c6b4dd2fb97c24d7eca1483f8e40f14ca1634 Mon Sep 17 00:00:00 2001 From: AneoPsy Date: Thu, 5 Mar 2026 20:24:51 -1000 Subject: [PATCH] Add missing i18n keys and remove stale keys across 5 locales Sync all locale files to match EN's 3,054-key structure: - it: add 485 missing keys, remove 1 stale key - pt-BR: add 51 missing keys, remove 10 stale keys - fr: add 47 missing keys - ja: add 47 missing keys, remove 116 stale keys - zh-CN: add 25 missing keys, remove 1 stale key All 655 new keys are properly translated. Stale keys from past refactors are cleaned up (127 total removed). --- frontend/src/i18n/locales/fr.ts | 98 +- frontend/src/i18n/locales/it.ts | 719 +++++++- frontend/src/i18n/locales/ja.ts | 2441 +++++++++++++++------------- frontend/src/i18n/locales/pt-BR.ts | 102 +- frontend/src/i18n/locales/zh-CN.ts | 144 +- 5 files changed, 2295 insertions(+), 1209 deletions(-) diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts index ab281fa69..42c38e45d 100644 --- a/frontend/src/i18n/locales/fr.ts +++ b/frontend/src/i18n/locales/fr.ts @@ -453,7 +453,7 @@ export default { firmwareVersion: 'Firmware', save: 'Enregistrer', clear: 'Effacer', - noEditPermission: "Vous n'avez pas la permission de renommer les unités AMS", + noEditPermission: 'Vous n\'avez pas la permission de renommer les unités AMS', }, // Firmware modal firmwareModal: { @@ -551,6 +551,10 @@ export default { noMatchingTimelapse: 'Pas de timelapse correspondant', failedScanTimelapse: 'Échec scan timelapse', failedAttachTimelapse: 'Échec attache timelapse', + timelapseRemoved: 'Timelapse supprimé', + failedRemoveTimelapse: 'Échec de la suppression du timelapse', + timelapseUploaded: 'Timelapse importé : {{filename}}', + failedUploadTimelapse: 'Échec de l\'importation du timelapse', archiveDeleted: 'Archive supprimée', failedDeleteArchive: 'Échec suppression', addedToFavorites: 'Ajouté aux favoris', @@ -576,6 +580,8 @@ export default { preview3d: 'Aperçu 3D', viewTimelapse: 'Voir le Timelapse', scanForTimelapse: 'Scanner pour Timelapse', + uploadTimelapse: 'Importer un timelapse', + removeTimelapse: 'Supprimer le timelapse', downloadSource3mf: 'Télécharger Source 3MF', uploadSource3mf: 'Téléverser Source 3MF', replaceSource3mf: 'Remplacer Source 3MF', @@ -672,6 +678,8 @@ export default { removeButton: 'Retirer', removeF3d: 'Retirer F3D', removeF3dConfirm: 'Retirer le fichier Fusion 360 de "{{name}}" ?', + removeTimelapse: 'Supprimer le timelapse', + removeTimelapseConfirm: 'Êtes-vous sûr de vouloir supprimer la vidéo timelapse de "{{name}}" ?', timelapse: '{{name}} - Timelapse', selectTimelapse: 'Choisir un Timelapse', selectTimelapseDesc: 'Sélectionnez manuellement le timelapse :', @@ -1035,7 +1043,7 @@ export default { avgTime: 'Moy. temps', filamentByPrints: 'Impressions', timeframe: { - 'today': 'Aujourd\'hui', + today: 'Aujourd\'hui', 'this-week': 'Cette semaine', 'this-month': 'Ce mois', 'last-7': '7 derniers jours', @@ -1043,7 +1051,7 @@ export default { 'last-90': '90 derniers jours', 'this-year': 'Cette année', 'all-time': 'Tout', - 'custom': 'Personnalisé', + custom: 'Personnalisé', from: 'Du', to: 'Au', }, @@ -1095,6 +1103,7 @@ export default { maintenanceTypes: 'Types de maintenance', maintenanceTypesDescription: 'Types système et tâches personnalisées', addCustomType: 'Ajouter un type', + restoreDefaults: 'Restaurer les tâches par défaut', intervalType: 'Type d\'intervalle', intervalValue: 'Intervalle ({{type}})', icon: 'Icône', @@ -1138,11 +1147,14 @@ export default { maintenanceComplete: 'Maintenance marquée comme faite', typeUpdated: 'Type mis à jour', typeDeleted: 'Type supprimé', + defaultsRestored: '{{count}} tâche(s) par défaut restaurée(s)', printHoursUpdated: 'Heures mises à jour', printerAssigned: 'Imprimante assignée', printerRemoved: 'Imprimante retirée', // Confirmation deleteTypeConfirm: 'Supprimer "{{name}}" ?', + deleteSystemTypeTitle: 'Supprimer la tâche de maintenance par défaut ?', + deleteSystemTypeMessage: 'Êtes-vous sûr de vouloir supprimer la tâche de maintenance par défaut "{{name}}" ?', // Permissions noPermissionUpdate: 'Pas d\'autorisation de mise à jour', noPermissionPerform: 'Pas d\'autorisation d\'action', @@ -1408,7 +1420,7 @@ export default { apiKeysDescription: 'Créez des clés pour webhooks et API.', createKey: 'Créer une clé', apiKeyCreated: 'Clé API créée avec succès', - apiKeyCopyWarning: "Copiez cette clé maintenant - elle ne sera plus affichée !", + apiKeyCopyWarning: 'Copiez cette clé maintenant - elle ne sera plus affichée !', useInApiBrowser: 'Utiliser dans l\'explorateur API', createNewApiKey: 'Nouvelle clé API', keyName: 'Nom de la clé', @@ -1773,8 +1785,8 @@ export default { loginFailed: 'Échec de connexion', enterCredentials: 'Entrez vos identifiants', forgotPasswordTitle: 'Mot de passe oublié', - forgotPasswordMessage: "Contactez votre administrateur pour réinitialiser votre accès.", - forgotPasswordEmailMessage: "Entrez votre email pour recevoir un nouveau mot de passe.", + forgotPasswordMessage: 'Contactez votre administrateur pour réinitialiser votre accès.', + forgotPasswordEmailMessage: 'Entrez votre email pour recevoir un nouveau mot de passe.', emailAddress: 'Adresse Email', emailPlaceholder: 'votre.email@exemple.com', cancel: 'Annuler', @@ -2736,6 +2748,10 @@ export default { table: 'Tableau', cards: 'Cartes', net: 'Net', + // Grouping + groupSimilar: 'Grouper', + groupedSpools: '{{count}} bobines identiques', + groupedRows: 'lignes', // Column config columns: 'Colonnes', configureColumns: 'Configurer Colonnes', @@ -3087,14 +3103,6 @@ export default { placeholder: 'Auto (défaut)...', hint: 'Force l\'IP annoncée via SSDP.', }, - bindIp: { - title: 'Interface réseau', - placeholder: 'Sélectionner interface...', - hint: 'Interface réseau sur laquelle cette imprimante virtuelle écoute. Doit être unique par imprimante.', - }, - proxy: { - accessCodeHint: 'En mode proxy, utilisez le code d\'accès de l\'imprimante cible dans le slicer. La connexion est transmise de manière transparente à l\'imprimante réelle.', - }, mode: { title: 'Mode', archive: 'Archiver', @@ -3135,8 +3143,37 @@ export default { failedToUpdate: 'Échec mise à jour', accessCodeRequired: 'Code d\'accès requis', targetPrinterRequired: 'Imprimante cible requise', + bindIpRequired: 'Veuillez d\'abord définir une adresse IP', accessCodeEmpty: 'Le code ne peut pas être vide', accessCodeLength: 'Le code doit faire 8 caractères', + created: 'Imprimante virtuelle créée', + failedToCreate: 'Échec de la création de l\'imprimante virtuelle', + deleted: 'Imprimante virtuelle supprimée', + failedToDelete: 'Échec de la suppression de l\'imprimante virtuelle', + }, + list: { + title: 'Imprimantes virtuelles', + add: 'Ajouter', + addFirst: 'Ajouter une imprimante virtuelle', + empty: 'Aucune imprimante virtuelle configurée. Ajoutez-en une pour commencer.', + }, + bindIp: { + title: 'Interface réseau', + placeholder: 'Sélectionner interface...', + hint: 'Interface réseau sur laquelle cette imprimante virtuelle écoute. Doit être unique par imprimante.', + }, + proxy: { + accessCodeHint: 'En mode proxy, utilisez le code d\'accès de l\'imprimante cible dans le slicer. La connexion est transmise de manière transparente à l\'imprimante réelle.', + }, + addDialog: { + title: 'Ajouter une imprimante virtuelle', + name: 'Nom', + hint: 'Vous pourrez configurer le code d\'accès, l\'imprimante cible et d\'autres paramètres après la création.', + create: 'Créer', + }, + deleteConfirm: { + title: 'Supprimer l\'imprimante virtuelle', + message: 'Êtes-vous sûr de vouloir supprimer "{{name}}" ? Cela arrêtera tous les services de cette imprimante.', }, }, @@ -3613,6 +3650,25 @@ export default { grossWeight: 'Poids brut', spoolSize: 'Taille bobine', close: 'Fermer', + currentSpool: 'Bobine actuelle', + }, + modal: { + spoolDetected: 'Bobine détectée', + assignToAms: 'Assigner à l\'AMS', + syncWeight: 'Synchroniser le poids', + weightSynced: 'Synchronisé !', + syncing: 'Synchronisation...', + newTagDetected: 'Nouveau tag détecté', + addToInventory: 'Ajouter à l\'inventaire', + assignToAmsTitle: 'Assigner à l\'AMS', + selectSlot: 'Sélectionner un emplacement', + assign: 'Assigner', + assigning: 'Attribution...', + assignSuccess: 'Assigné !', + assignError: 'Échec de l\'attribution de la bobine. Veuillez réessayer.', + noPrinterSelected: 'Sélectionner une imprimante...', + noAmsDetected: 'Aucun AMS détecté sur cette imprimante', + slot: 'Emplacement', }, weight: { noReading: 'Pas de lecture', @@ -3741,26 +3797,26 @@ export default { bugReport: { title: 'Signaler un bug', description: 'Description', - descriptionPlaceholder: "Qu'est-ce qui n'a pas fonctionné ? Veuillez décrire le problème...", + descriptionPlaceholder: 'Qu\'est-ce qui n\'a pas fonctionné ? Veuillez décrire le problème...', email: 'E-mail (optionnel)', emailPlaceholder: 'votre@email.fr', - emailPrivacy: "Si fourni, votre e-mail sera inclus dans une section repliée de l'issue GitHub pour que le mainteneur puisse vous contacter.", - screenshot: "Capture d'écran", + emailPrivacy: 'Si fourni, votre e-mail sera inclus dans une section repliée de l\'issue GitHub pour que le mainteneur puisse vous contacter.', + screenshot: 'Capture d\'écran', uploadOrPaste: 'Télécharger, coller ou glisser une image', dataCollectedSummary: 'Quelles données sont incluses dans le rapport ?', dataIncluded: 'Inclus :', - dataIncludedList: "Version de l'app, OS, architecture, version Python, statistiques de base de données (compteurs uniquement), modèles d'imprimantes, nombre de buses, versions firmware, état de connexion, état des intégrations (Spoolman, MQTT, HA), paramètres non sensibles, nombre d'interfaces réseau, détails Docker, versions des dépendances.", + dataIncludedList: 'Version de l\'app, OS, architecture, version Python, statistiques de base de données (compteurs uniquement), modèles d\'imprimantes, nombre de buses, versions firmware, état de connexion, état des intégrations (Spoolman, MQTT, HA), paramètres non sensibles, nombre d\'interfaces réseau, détails Docker, versions des dépendances.', dataNeverIncluded: 'Jamais inclus :', - dataNeverIncludedList: "Noms d'imprimantes, numéros de série, codes d'accès, mots de passe, adresses IP, adresses e-mail, clés API, tokens, URLs de webhook, noms d'hôtes ou noms d'utilisateurs.", + dataNeverIncludedList: 'Noms d\'imprimantes, numéros de série, codes d\'accès, mots de passe, adresses IP, adresses e-mail, clés API, tokens, URLs de webhook, noms d\'hôtes ou noms d\'utilisateurs.', submit: 'Envoyer', collectingLogs: 'Collecte des journaux de diagnostic...', collectingLogsHint: 'Journalisation de débogage activée, interrogation des imprimantes pour des données fraîches.', submitting: 'Envoi du rapport de bug...', submitSuccess: 'Rapport de bug envoyé avec succès !', - submitFailed: "Échec de l'envoi du rapport de bug", + submitFailed: 'Échec de l\'envoi du rapport de bug', thankYou: 'Merci !', submitted: 'Votre rapport de bug a été soumis.', - viewIssue: "Voir l'issue", + viewIssue: 'Voir l\'issue', unexpectedError: 'Une erreur inattendue est survenue', countdownSeconds: '{{seconds}}s', }, diff --git a/frontend/src/i18n/locales/it.ts b/frontend/src/i18n/locales/it.ts index ca8a49427..0cbb753be 100644 --- a/frontend/src/i18n/locales/it.ts +++ b/frontend/src/i18n/locales/it.ts @@ -8,6 +8,7 @@ export default { profiles: 'Profili', maintenance: 'Manutenzione', projects: 'Progetti', + inventory: 'Filamento', files: 'File', settings: 'Impostazioni', system: 'Sistema', @@ -76,6 +77,8 @@ export default { dismiss: 'Chiudi', apply: 'Applica', reset: 'Reimposta', + export: 'Esporta', + import: 'Importa', clear: 'Pulisci', selectAll: 'Seleziona tutto', deselectAll: 'Deseleziona tutto', @@ -231,6 +234,12 @@ export default { nozzleRack: 'Rack Ugelli', nozzleDocked: 'Agganciato', nozzleMounted: 'Montato', + nozzleActive: 'Attivo', + nozzleIdle: 'Inattivo', + nozzleDiameter: 'Diametro', + nozzleType: 'Tipo', + nozzleStatus: 'Stato', + nozzleFilament: 'Filamento', nozzleWear: 'Usura', nozzleMaxTemp: 'Temp Max', nozzleSerial: 'Seriale', @@ -542,6 +551,10 @@ export default { noMatchingTimelapse: 'Nessun timelapse corrispondente', failedScanTimelapse: 'Scansione timelapse non riuscita', failedAttachTimelapse: 'Allegato timelapse non riuscito', + timelapseRemoved: 'Timelapse rimosso', + failedRemoveTimelapse: 'Impossibile rimuovere il timelapse', + timelapseUploaded: 'Timelapse caricato: {{filename}}', + failedUploadTimelapse: 'Impossibile caricare il timelapse', archiveDeleted: 'Archivio eliminato', failedDeleteArchive: 'Eliminazione archivio non riuscita', addedToFavorites: 'Aggiunto ai preferiti', @@ -567,6 +580,8 @@ export default { preview3d: 'Anteprima 3D', viewTimelapse: 'Vedi Timelapse', scanForTimelapse: 'Cerca Timelapse', + uploadTimelapse: 'Carica timelapse', + removeTimelapse: 'Rimuovi timelapse', downloadSource3mf: 'Scarica Sorgente 3MF', uploadSource3mf: 'Carica Sorgente 3MF', replaceSource3mf: 'Sostituisci Sorgente 3MF', @@ -663,6 +678,8 @@ export default { removeButton: 'Rimuovi', removeF3d: 'Rimuovi F3D', removeF3dConfirm: 'Sei sicuro di rimuovere il file Fusion 360 da "{{name}}"?', + removeTimelapse: 'Rimuovi timelapse', + removeTimelapseConfirm: 'Sei sicuro di voler rimuovere il video timelapse da "{{name}}"?', timelapse: '{{name}} - Timelapse', selectTimelapse: 'Seleziona Timelapse', selectTimelapseDesc: 'Nessun abbinamento automatico trovato. Seleziona il timelapse per questa stampa:', @@ -761,6 +778,10 @@ export default { dragToReorder: 'Trascina per riordinare (solo ASAP)', reorderHint: 'La posizione influisce solo sugli elementi ASAP. Quelli programmati partono all\'orario.', addedBy: 'Aggiunto da {{name}}', + nextInQueue: 'Prossimo in coda', + clearPlate: 'Libera piatto e avvia il prossimo', + clearPlateSuccess: 'Piatto liberato — pronto per la prossima stampa', + plateReady: 'Piatto liberato — pronto per la prossima stampa', plateNumber: 'Piatto {{index}}', // Sections sections: { @@ -1022,7 +1043,7 @@ export default { avgTime: 'Media tempo', filamentByPrints: 'Stampe', timeframe: { - 'today': 'Oggi', + today: 'Oggi', 'this-week': 'Questa settimana', 'this-month': 'Questo mese', 'last-7': 'Ultimi 7 giorni', @@ -1030,7 +1051,7 @@ export default { 'last-90': 'Ultimi 90 giorni', 'this-year': 'Quest\'anno', 'all-time': 'Tutto', - 'custom': 'Personalizzato', + custom: 'Personalizzato', from: 'Da', to: 'A', }, @@ -1162,6 +1183,60 @@ export default { virtualPrinter: 'Stampante virtuale', users: 'Utenti', backup: 'Backup', + emailAuth: 'Autenticazione Email', + }, + // Email settings + email: { + smtpSettings: 'Configurazione SMTP', + smtpHost: 'Server SMTP', + smtpPort: 'Porta SMTP', + security: 'Sicurezza', + authentication: 'Autenticazione', + username: 'Nome utente', + password: 'Password', + fromEmail: 'Email mittente', + fromName: 'Nome mittente', + testConnection: 'Testa connessione SMTP', + testRecipient: 'Email destinatario test', + sendTest: 'Invia email di test', + sending: 'Invio...', + save: 'Salva impostazioni', + saving: 'Salvataggio...', + advancedAuth: 'Autenticazione avanzata', + advancedAuthEnabled: 'L\'autenticazione avanzata è abilitata', + advancedAuthEnabledDesc: 'Le funzionalità di gestione utenti via email sono attive. I nuovi utenti riceveranno password generate automaticamente via email e potranno reimpostare la password tramite la funzione di recupero.', + advancedAuthDisabled: 'L\'autenticazione avanzata è disabilitata', + advancedAuthDisabledDesc: 'Abilita l\'autenticazione avanzata per attivare le funzionalità email per la gestione utenti.', + enable: 'Abilita', + disable: 'Disabilita', + feature1: 'Le password vengono generate automaticamente e inviate via email ai nuovi utenti', + feature2: 'Gli utenti possono accedere con nome utente o email', + feature3: 'La funzione di recupero password è disponibile', + feature4: 'Gli amministratori possono reimpostare le password utente via email', + // Error messages + errors: { + requiredFields: 'Compilare tutti i campi obbligatori', + usernameRequired: 'Il nome utente è obbligatorio quando l\'autenticazione è abilitata', + enterTestEmail: 'Inserire un indirizzo email di test', + smtpServerAndEmail: 'Compilare Server SMTP e Email mittente prima di testare', + usernamePasswordRequired: 'Nome utente e password sono obbligatori quando l\'autenticazione è abilitata', + configureSmtpFirst: 'Configurare e testare le impostazioni SMTP prima', + }, + // Success messages + success: { + settingsSaved: 'Impostazioni SMTP salvate con successo', + }, + // Security options + securityOptions: { + starttls: 'STARTTLS (Porta 587)', + ssl: 'SSL/TLS (Porta 465)', + none: 'Nessuna (Porta 25)', + }, + // Authentication options + authOptions: { + enabled: 'Abilitata', + disabled: 'Disabilitata', + }, }, appearance: 'Aspetto', notifications: 'Notifiche', @@ -1175,7 +1250,7 @@ export default { themeDark: 'Scuro', themeSystem: 'Sistema', defaultView: 'Vista predefinita', - defaultViewDescription: "Pagina da mostrare all'apertura dell'app", + defaultViewDescription: 'Pagina da mostrare all\'apertura dell\'app', checkForUpdates: 'Controlla aggiornamenti', autoUpdate: 'Aggiornamento automatico', currentVersion: 'Versione attuale', @@ -1231,11 +1306,44 @@ export default { turnOn: 'Accendi', turnOff: 'Spegni', }, - // Spoolman - spoolmanEnabled: 'Abilita integrazione Spoolman', + // Filament Tracking Mode + filamentTracking: 'Tracciamento filamento', + filamentTrackingDesc: 'Scegli come tracciare le bobine di filamento. Puoi usare l\'inventario integrato o collegare un server Spoolman esterno.', + trackingModeBuiltIn: 'Inventario integrato', + trackingModeBuiltInDesc: 'Riconoscimento RFID automatico e tracciamento dell\'uso inclusi', + trackingModeSpoolmanDesc: 'Server esterno per la gestione del filamento', + builtInFeatureRfid: 'Rileva automaticamente le bobine Bambu Lab RFID nell\'AMS', + builtInFeatureUsage: 'Traccia il consumo di filamento per stampa', + builtInFeatureCatalog: 'Gestisci bobine, colori e profili K-factor', + builtInFeatureThirdParty: 'Le bobine di terze parti possono essere assegnate alle bobine dell\'inventario', + amsSyncButton: 'Sincronizza pesi dall\'AMS', + amsSyncTitle: 'Sincronizza pesi bobine dall\'AMS', + amsSyncMessage: 'Questo sovrascriverà tutti i pesi delle bobine dell\'inventario con i valori attuali di percentuale rimanente dell\'AMS dalle stampanti connesse. Usa questa funzione per recuperare dati di peso corrotti. Le stampanti devono essere online.', + amsSyncing: 'Sincronizzazione...', + amsSyncSuccess: '{{synced}} bobina/e sincronizzata/e, {{skipped}} saltata/e', + amsSyncError: 'Impossibile sincronizzare i pesi dall\'AMS', + // Spoolman settings spoolmanUrl: 'URL Spoolman', + spoolmanUrlHint: 'URL del server Spoolman (es. http://localhost:7912)', spoolmanConnected: 'Connesso', spoolmanDisconnected: 'Disconnesso', + status: 'Stato', + connect: 'Connetti', + disconnect: 'Disconnetti', + howSyncWorks: 'Come funziona la sincronizzazione', + syncInfoRfidOnly: 'Solo le bobine ufficiali Bambu Lab con RFID vengono sincronizzate', + syncInfoAutoCreate: 'Le nuove bobine vengono create automaticamente in Spoolman alla prima sincronizzazione', + syncInfoThirdPartySkipped: 'Le bobine non Bambu Lab (terze parti, ricaricate) vengono saltate', + linkingExistingSpools: 'Collegamento bobine esistenti', + linkingExistingSpoolsDesc: 'Per collegare le bobine Spoolman esistenti all\'AMS, passa il mouse su uno slot AMS e clicca "Collega a Spoolman".', + syncMode: 'Modalità sincronizzazione', + syncModeAuto: 'Automatica', + syncModeManual: 'Solo manuale', + syncModeAutoDesc: 'I dati AMS si sincronizzano automaticamente quando vengono rilevate modifiche', + syncModeManualDesc: 'Sincronizzazione solo quando attivata manualmente', + syncAmsData: 'Sincronizza dati AMS', + syncAmsDataDesc: 'Sincronizza manualmente i dati AMS della stampante su Spoolman', + allPrinters: 'Tutte le stampanti', // Default printer noDefaultPrinter: 'Nessuna predefinita (chiedi ogni volta)', // Sidebar @@ -1312,7 +1420,7 @@ export default { apiKeysDescription: 'Crea chiavi API per integrazioni esterne e webhook.', createKey: 'Crea chiave', apiKeyCreated: 'Chiave API creata con successo', - apiKeyCopyWarning: "Copia questa chiave ora - non verra mostrata di nuovo!", + apiKeyCopyWarning: 'Copia questa chiave ora - non verra mostrata di nuovo!', useInApiBrowser: 'Usa nel Browser API', createNewApiKey: 'Crea nuova chiave API', keyName: 'Nome chiave', @@ -1329,7 +1437,7 @@ export default { control: 'Controllo', createFirstKey: 'Crea la tua prima chiave', webhookEndpoints: 'Endpoint webhook', - webhookApiKeyHint: "Usa la tua chiave API nell'header X-API-Key.", + webhookApiKeyHint: 'Usa la tua chiave API nell\'header X-API-Key.', webhook: { getAllStatus: 'Ottieni stato di tutte le stampanti', getSpecificStatus: 'Ottieni stato di una stampante', @@ -1342,7 +1450,7 @@ export default { apiBrowserDescription: 'Esplora e testa tutti gli endpoint API disponibili.', apiKeyForTesting: 'Chiave API per test', apiKeyPlaceholder: 'Incolla qui la tua chiave API per testare gli endpoint autenticati...', - apiKeyHint: "Questa chiave verra inviata come header X-API-Key.", + apiKeyHint: 'Questa chiave verra inviata come header X-API-Key.', deleteApiKeyTitle: 'Elimina chiave API', deleteApiKeyMessage: 'Sei sicuro di voler eliminare questa chiave API? Le integrazioni che la usano non funzioneranno più.', deleteKey: 'Elimina chiave', @@ -1404,7 +1512,7 @@ export default { deleteGroup: 'Elimina gruppo', // Modal: Disable auth disableAuthenticationTitle: 'Disabilita autenticazione', - disableAuthenticationMessage: "Sei sicuro di voler disabilitare l'autenticazione? Questo renderà la tua istanza Bambuddy accessibile senza login. Tutti gli utenti resteranno nel database ma l'autenticazione sarà disabilitata.", + disableAuthenticationMessage: 'Sei sicuro di voler disabilitare l\'autenticazione? Questo renderà la tua istanza Bambuddy accessibile senza login. Tutti gli utenti resteranno nel database ma l\'autenticazione sarà disabilitata.', disableAuthentication: 'Disabilita autenticazione', // Additional settings configureBambuddy: 'Configura Bambuddy', @@ -1475,6 +1583,77 @@ export default { cameraConnected: 'Camera connessa{{resolution}}', }, testConnection: 'Testa connessione', + catalog: { + spoolCatalog: 'Catalogo bobine', + spoolCatalogDescription: 'Pesi delle bobine vuote per marca/tipo. Utilizzato per la ricerca automatica del peso quando si aggiungono bobine.', + searchCatalog: 'Cerca nel catalogo...', + addNewEntry: 'Aggiungi nuova voce', + namePlaceholder: 'Nome (es. Bambu Lab - Plastica)', + weight: 'Peso', + type: 'Tipo', + default: 'Predefinito', + custom: 'Personalizzato', + noMatch: 'Nessuna voce corrisponde alla ricerca', + empty: 'Nessuna voce nel catalogo', + deleteEntry: 'Elimina voce', + deleteConfirm: 'Sei sicuro di voler eliminare "{{name}}"?', + resetCatalog: 'Ripristina catalogo', + resetConfirm: 'Ripristinare il catalogo ai valori predefiniti? Tutte le voci personalizzate verranno rimosse.', + loadFailed: 'Impossibile caricare il catalogo bobine', + nameWeightRequired: 'Nome e peso sono obbligatori', + entryAdded: 'Voce aggiunta', + addFailed: 'Impossibile aggiungere la voce', + entryUpdated: 'Voce aggiornata', + updateFailed: 'Impossibile aggiornare la voce', + entryDeleted: 'Voce eliminata', + deleteFailed: 'Impossibile eliminare la voce', + resetSuccess: 'Catalogo ripristinato ai valori predefiniti', + resetFailed: 'Impossibile ripristinare il catalogo', + exported: '{{count}} voci esportate', + imported: '{{added}} voci importate ({{skipped}} saltate)', + importFailed: 'Impossibile importare: formato JSON non valido', + exportTooltip: 'Esporta catalogo in JSON', + importTooltip: 'Importa catalogo da JSON', + resetTooltip: 'Ripristina valori predefiniti', + }, + colorCatalog: { + title: 'Catalogo colori', + description: 'Colori del filamento per produttore/materiale. Utilizzato per la ricerca automatica del colore quando si aggiungono bobine.', + searchColors: 'Cerca colori...', + allManufacturers: 'Tutti i produttori', + addNewColor: 'Aggiungi nuovo colore', + manufacturer: 'Produttore', + colorName: 'Nome colore', + hex: 'Hex', + materialOptional: 'Materiale (opzionale)', + showing: 'Visualizzazione di {{filtered}} su {{total}} colori', + noMatch: 'Nessun colore corrisponde alla ricerca', + empty: 'Nessun colore nel catalogo', + deleteColor: 'Elimina colore', + deleteConfirm: 'Sei sicuro di voler eliminare "{{name}}"?', + resetCatalog: 'Ripristina catalogo colori', + resetConfirm: 'Ripristinare il catalogo ai valori predefiniti? Tutti i colori personalizzati verranno rimossi.', + sync: 'Sincronizza', + starting: 'Avvio...', + syncTooltip: 'Sincronizza da FilamentColors.xyz (2000+ colori, potrebbe richiedere un minuto)', + loadFailed: 'Impossibile caricare il catalogo colori', + fieldsRequired: 'Produttore, nome colore e colore hex sono obbligatori', + colorAdded: 'Colore aggiunto', + addFailed: 'Impossibile aggiungere il colore', + colorUpdated: 'Colore aggiornato', + updateFailed: 'Impossibile aggiornare il colore', + colorDeleted: 'Colore eliminato', + deleteFailed: 'Impossibile eliminare il colore', + resetSuccess: 'Catalogo colori ripristinato ai valori predefiniti', + resetFailed: 'Impossibile ripristinare il catalogo', + syncUpToDate: 'Già aggiornato ({{count}} colori verificati)', + syncComplete: '{{added}} nuovi colori aggiunti ({{skipped}} già esistenti)', + syncError: 'Errore di sincronizzazione', + syncFailed: 'Impossibile sincronizzare da FilamentColors.xyz', + exported: '{{count}} colori esportati', + imported: '{{added}} colori importati ({{skipped}} saltati)', + importFailed: 'Impossibile importare: formato JSON non valido', + }, }, // Notifications (for push notifications) @@ -1595,6 +1774,8 @@ export default { subtitle: 'Accedi al tuo account', username: 'Nome utente', usernamePlaceholder: 'Inserisci il nome utente', + usernameOrEmail: 'Nome utente o email', + usernameOrEmailPlaceholder: 'Nome utente o @ Email', password: 'Password', passwordPlaceholder: 'Inserisci la password', signIn: 'Accedi', @@ -1605,6 +1786,12 @@ export default { enterCredentials: 'Inserisci nome utente e password', forgotPasswordTitle: 'Password dimenticata', forgotPasswordMessage: 'Se hai dimenticato la password, contatta il tuo amministratore di sistema per reimpostarla.', + forgotPasswordEmailMessage: 'Inserisci il tuo indirizzo email e ti invieremo una nuova password.', + emailAddress: 'Indirizzo email', + emailPlaceholder: 'tua.email@esempio.com', + cancel: 'Annulla', + sending: 'Invio...', + sendResetEmail: 'Invia email di reimpostazione', howToReset: 'Come reimpostare la password:', resetStep1: 'Contatta il tuo amministratore Bambuddy', resetStep2: 'Chiedi di reimpostare la password in Gestione utenti', @@ -1779,10 +1966,13 @@ export default { creating: 'Creazione...', saving: 'Salvataggio...', saveChanges: 'Salva modifiche', + advancedAuthSubtitle: 'con autenticazione avanzata', }, form: { username: 'Nome utente', usernamePlaceholder: 'Inserisci nome utente', + email: 'Email', + emailPlaceholder: 'utente@esempio.com', password: 'Password', passwordPlaceholder: 'Inserisci password', confirmPassword: 'Conferma password', @@ -1791,6 +1981,11 @@ export default { confirmNewPasswordPlaceholder: 'Conferma nuova password', leaveBlankToKeep: 'lascia vuoto per mantenere attuale', groups: 'Gruppi', + optional: 'opzionale', + autoGeneratedPassword: 'Una password sicura verrà generata automaticamente e inviata via email all\'utente.', + passwordManagedByAdvancedAuth: 'La password è gestita dall\'autenticazione avanzata. Usa "Reimposta password" per inviare una nuova password all\'utente via email.', + resetPassword: 'Reimposta password', + resettingPassword: 'Reimpostazione password...', }, deleteModal: { title: 'Elimina utente', @@ -2484,11 +2679,106 @@ export default { spoolArchived: 'Bobina archiviata', spoolRestored: 'Bobina ripristinata', deleteConfirm: 'Sei sicuro di voler eliminare questa bobina? Questa azione non può essere annullata.', + archiveConfirm: 'Sei sicuro di voler archiviare questa bobina?', advancedSettings: 'Impostazioni Avanzate', - lowStockThresholdError: 'La soglia deve essere tra 0.1 e 99.9', + // Tabs + filamentInfoTab: 'Info filamento', + paProfileTab: 'Profilo PA', + filamentInfo: 'Filamento', + additional: 'Aggiuntivo', + // Cloud + loadingPresets: 'Caricamento preset cloud...', + cloudConnected: 'Cloud connesso', + cloudNotConnected: 'Cloud non connesso (valori predefiniti)', + // Colors + recentColors: 'Recenti', + searchColors: 'Cerca colori...', + searchResults: 'Risultati della ricerca', + allColors: 'Tutti i colori', + commonColors: 'Colori comuni', + showLess: 'Mostra meno', + showAll: 'Mostra tutto', + noColorsFound: 'Nessun colore corrisponde alla ricerca', + noResults: 'Nessun risultato trovato', + // PA Profiles + selectMaterialFirst: 'Selezionare prima un materiale nella scheda Info filamento.', + noPrintersConfigured: 'Nessuna stampante configurata. Aggiungi stampanti per usare i profili PA.', + matchingFilter: 'Corrispondenti', + anyBrand: 'Qualsiasi marca', + anyVariant: 'Qualsiasi variante', + autoSelect: 'Selezione automatica', + matches: 'corrispondenze', + match: 'corrispondenza', + noMatches: 'Nessuna corrispondenza', + connected: 'Connessa', + offline: 'Offline', + printerOffline: 'La stampante è offline. Connetti per visualizzare i profili di calibrazione.', + noKProfilesMatch: 'Nessun profilo K corrisponde al filamento selezionato.', + leftNozzle: 'Ugello sinistro', + rightNozzle: 'Ugello destro', + profilesSelected: 'profili di calibrazione selezionati', + // Stats & enhanced table + totalInventory: 'Inventario totale', + totalConsumed: 'Totale consumato', + byMaterial: 'Per materiale', + inPrinter: 'In stampante', + lowStock: 'Scorta bassa', + sinceTracking: 'Dall\'inizio del tracciamento', + loadedInAms: 'Caricato in AMS/Est', + remaining: 'Rimanente', weightCheck: 'Controllo Peso', lastWeighed: 'Ultima pesatura', neverWeighed: 'Mai pesato', + search: 'Cerca bobine...', + showing: 'Visualizzazione', + to: 'a', + of: 'di', + show: 'Mostra', + spools: 'bobine', + spool: 'bobina', + page: 'Pagina', + noSpoolsMatch: 'Nessun risultato trovato', + noSpoolsMatchDesc: 'Prova a modificare la ricerca o i filtri per trovare quello che cerchi.', + active: 'Attive', + archived: 'Archiviate', + all: 'Tutte', + used: 'Usato', + new: 'Nuovo', + clearFilters: 'Cancella filtri', + table: 'Tabella', + cards: 'Schede', + net: 'Netto', + // Grouping + groupSimilar: 'Raggruppa', + groupedSpools: '{{count}} bobine identiche', + groupedRows: 'righe', + // Column config + columns: 'Colonne', + configureColumns: 'Configura colonne', + configureColumnsDesc: 'Trascina per riordinare le colonne o usa le frecce. Attiva/disattiva la visibilità con l\'icona dell\'occhio.', + visible: 'visibili', + reset: 'Ripristina', + cancel: 'Annulla', + applyChanges: 'Applica modifiche', + moveUp: 'Sposta su', + moveDown: 'Sposta giù', + hideColumn: 'Nascondi colonna', + showColumn: 'Mostra colonna', + // Tag linking + linkToSpool: 'Collega a bobina', + tagLinked: 'Tag collegato alla bobina', + tagLinkFailed: 'Impossibile collegare il tag', + tagAlreadyLinked: 'Tag già collegato a un\'altra bobina', + unknownTag: 'Tag RFID sconosciuto rilevato', + // Usage history + usageHistory: 'Cronologia utilizzo', + noUsageHistory: 'Nessun utilizzo registrato', + printName: 'Nome stampa', + weightConsumed: 'Peso consumato', + clearHistory: 'Cancella', + historyCleared: 'Cronologia utilizzo cancellata', + fillSourceLabel: '(Inv)', + lowStockThresholdError: 'La soglia deve essere tra 0.1 e 99.9', }, // Timelapse @@ -2548,6 +2838,9 @@ export default { noPrintersAvailable: 'Nessuna stampante disponibile', printerBusy: 'Stampante occupata', printerOffline: 'Stampante offline', + sameTypeDifferentColor: 'Stesso tipo, colore diverso', + filamentTypeNotLoaded: 'Tipo di filamento non caricato', + openCalendar: 'Apri calendario', leftNozzle: 'L', rightNozzle: 'R', leftNozzleTooltip: 'Ugello sinistro', @@ -2609,6 +2902,7 @@ export default { }, // Edit archive modal + // Edit Archive Modal editArchive: { title: 'Modifica archivio', name: 'Nome', @@ -2809,14 +3103,6 @@ export default { placeholder: 'Rilevamento automatico (predefinito)...', hint: 'Sovrascrive l\'indirizzo IP pubblicizzato via SSDP e usato nel certificato TLS. Utile quando Bambuddy ha piu interfacce di rete.', }, - bindIp: { - title: 'Interfaccia di rete', - placeholder: 'Seleziona interfaccia...', - hint: 'Interfaccia di rete a cui questa stampante virtuale si collega. Deve essere unica per stampante.', - }, - proxy: { - accessCodeHint: 'In modalita proxy, usa il codice di accesso della stampante di destinazione nello slicer. La connessione viene inoltrata in modo trasparente alla stampante reale.', - }, mode: { title: 'Modalita', archive: 'Archivio', @@ -2857,8 +3143,37 @@ export default { failedToUpdate: 'Aggiornamento impostazioni fallito', accessCodeRequired: 'Imposta prima un codice accesso', targetPrinterRequired: 'Seleziona prima una stampante target', + bindIpRequired: 'Impostare prima un indirizzo IP', accessCodeEmpty: 'Il codice accesso non può essere vuoto', accessCodeLength: 'Il codice accesso deve essere esattamente 8 caratteri', + created: 'Stampante virtuale creata', + failedToCreate: 'Impossibile creare la stampante virtuale', + deleted: 'Stampante virtuale eliminata', + failedToDelete: 'Impossibile eliminare la stampante virtuale', + }, + list: { + title: 'Stampanti virtuali', + add: 'Aggiungi', + addFirst: 'Aggiungi stampante virtuale', + empty: 'Nessuna stampante virtuale configurata. Aggiungine una per iniziare.', + }, + bindIp: { + title: 'Interfaccia di rete', + placeholder: 'Seleziona interfaccia...', + hint: 'Interfaccia di rete a cui questa stampante virtuale si collega. Deve essere unica per stampante.', + }, + proxy: { + accessCodeHint: 'In modalita proxy, usa il codice di accesso della stampante di destinazione nello slicer. La connessione viene inoltrata in modo trasparente alla stampante reale.', + }, + addDialog: { + title: 'Aggiungi stampante virtuale', + name: 'Nome', + hint: 'Potrai configurare il codice di accesso, la stampante di destinazione e altre impostazioni dopo la creazione.', + create: 'Crea', + }, + deleteConfirm: { + title: 'Elimina stampante virtuale', + message: 'Sei sicuro di voler eliminare "{{name}}"? Tutti i servizi di questa stampante verranno interrotti.', }, }, @@ -2912,6 +3227,205 @@ export default { lubricateLeftNozzleRail: 'Lubrifica guida ugello sinistro (serie H2)', }, + // Smart Plugs + smartPlugs: { + offline: 'Offline', + admin: 'Amministrazione', + openPlugAdminPage: 'Apri pagina amministrazione presa', + deleteSmartPlug: 'Elimina presa smart', + turnOnSmartPlug: 'Accendi presa smart', + turnOffSmartPlug: 'Spegni presa smart', + turnOn: 'Accendi', + turnOff: 'Spegni', + addSmartPlug: { + scanningNetwork: 'Scansione rete...', + chooseEntity: 'Scegli un\'entità...', + connectionFailed: 'Connessione fallita', + searchEntities: 'Cerca entità...', + searchPowerSensors: 'Cerca sensori di potenza...', + searchEnergySensors: 'Cerca sensori di energia...', + placeholders: { + plugName: 'Presa soggiorno', + mqttStateOnValue: 'ON, true, 1', + mqttSameAsPower: 'Stesso del topic potenza, o diverso', + }, + }, + }, + + // Rich Text Editor + richTextEditor: { + bold: 'Grassetto', + italic: 'Corsivo', + underline: 'Sottolineato', + bulletList: 'Elenco puntato', + numberedList: 'Elenco numerato', + alignLeft: 'Allinea a sinistra', + alignCenter: 'Allinea al centro', + alignRight: 'Allinea a destra', + addLink: 'Aggiungi link', + removeLink: 'Rimuovi link', + }, + + // External Links + externalLinks: { + noLinksConfigured: 'Nessun link esterno configurato', + deleteLink: 'Elimina link', + removeCustomIcon: 'Rimuovi icona personalizzata', + openInNewTab: 'Apri in nuova scheda', + placeholders: { + linkName: 'Il mio link', + }, + }, + + // Keyboard Shortcuts Modal + keyboardShortcuts: { + title: 'Scorciatoie da tastiera', + navigation: 'Navigazione', + archivesSection: 'Archivi', + kProfilesSection: 'Profili K', + generalSection: 'Generale', + shortcuts: { + goToPrinters: 'Vai a Stampanti', + goToArchives: 'Vai ad Archivi', + goToQueue: 'Vai a Coda', + goToStats: 'Vai a Statistiche', + goToProfiles: 'Vai a Profili cloud', + goToSettings: 'Vai a Impostazioni', + focusSearch: 'Vai alla ricerca', + openUploadModal: 'Apri finestra di caricamento', + clearSelection: 'Cancella selezione / deseleziona input', + contextMenu: 'Menu contestuale sulle schede', + refreshProfiles: 'Aggiorna profili', + newProfile: 'Nuovo profilo', + exitSelectionMode: 'Esci dalla modalità selezione', + showHelp: 'Mostra questa guida', + }, + footer: 'Premi Esc o clicca fuori per chiudere', + }, + + // Notification Log + notificationLog: { + title: 'Registro notifiche', + events: { + printStarted: 'Stampa avviata', + printComplete: 'Stampa completata', + printFailed: 'Stampa fallita', + printStopped: 'Stampa interrotta', + progress: 'Avanzamento', + printerOffline: 'Stampante offline', + printerError: 'Errore stampante', + lowFilament: 'Filamento in esaurimento', + maintenanceDue: 'Manutenzione in scadenza', + test: 'Test', + }, + timeAgo: { + justNow: 'Adesso', + minutesAgo: '{{minutes}} min fa', + hoursAgo: '{{hours}} ore fa', + }, + }, + + // Restore/Backup Modal + restoreBackup: { + title: 'Ripristina backup', + restoring: 'Ripristino...', + restoreComplete: 'Ripristino completato', + restoreFailed: 'Ripristino fallito', + importSettings: 'Importa impostazioni da un file di backup', + pleaseWait: 'Attendere il ripristino dei dati', + clickToSelect: 'Clicca per selezionare il file di backup (.json o .zip)', + howDuplicateHandling: 'Come funziona la gestione dei duplicati:', + categories: { + printers: 'Stampanti', + smartPlugs: 'Prese smart', + notificationProviders: 'Provider di notifica', + filaments: 'Filamenti', + archives: 'Archivi', + pendingUploads: 'Caricamenti in sospeso', + settingsTemplates: 'Impostazioni e modelli', + }, + matchingInfo: { + printers: 'abbinati per numero di serie', + smartPlugs: 'abbinati per indirizzo IP', + notificationProviders: 'abbinati per nome', + filaments: 'abbinati per nome + tipo + marca', + archives: 'abbinati per hash del contenuto', + pendingUploads: 'abbinati per nome file', + settingsTemplates: 'sempre sovrascritti', + }, + replaceExisting: 'Sostituisci dati esistenti', + keepExisting: 'Mantieni dati esistenti', + replaceDescription: 'Sovrascrivi gli elementi già esistenti con i dati del backup', + keepDescription: 'Ripristina solo gli elementi che non esistono già', + caution: 'Attenzione:', + cautionText: 'La sovrascrittura sostituirà le configurazioni attuali con i dati del backup. I codici di accesso delle stampanti non vengono mai sovrascritti per sicurezza.', + itemsRestored: 'Elementi ripristinati', + itemsSkipped: 'Elementi saltati', + restored: 'Ripristinati', + skipped: 'Saltati (già esistenti)', + filesLabel: 'File (3MF, miniature, ecc.)', + newApiKeysGenerated: 'Nuove chiavi API generate', + newApiKeysWarning: 'Queste chiavi vengono mostrate una sola volta. Copiale adesso!', + processingBackup: 'Elaborazione file di backup...', + noDataFound: 'Nessun dato trovato da ripristinare nel file di backup.', + failedToRestore: 'Impossibile ripristinare il backup. Verificare il formato del file.', + }, + + // Backup Export Modal + backupExport: { + title: 'Esporta backup', + selectData: 'Seleziona i dati da includere', + selectAll: 'Seleziona tutto', + selectNone: 'Deseleziona tutto', + categoryDescriptions: { + settings: 'Lingua, tema, preferenze di aggiornamento', + notifications: 'ntfy, Pushover, Discord, ecc.', + templates: 'Modelli di messaggi personalizzati', + smartPlugs: 'Configurazioni prese Tasmota', + externalLinks: 'Link della barra laterale a servizi esterni', + printers: 'Info stampanti (codici di accesso esclusi)', + plateDetection: 'Immagini di riferimento piatto vuoto', + filaments: 'Tipi di filamento e costi', + maintenance: 'Programmi di manutenzione personalizzati', + archives: 'Tutti i dati di stampa + file (3MF, miniature, foto)', + projects: 'Progetti, elementi BOM e allegati', + pendingUploads: 'Caricamenti della stampante virtuale in attesa di revisione', + apiKeys: 'Chiavi API webhook (nuove chiavi generate all\'importazione)', + }, + requiresPrinters: 'Richiede la selezione di Stampanti', + zipFileWarning: 'Verrà creato un file ZIP.', + zipFileDescription: 'Include tutti i file 3MF, miniature, timelapse e foto. Potrebbe richiedere tempo e produrre un file di grandi dimensioni.', + includeAccessCodes: 'Includi codici di accesso', + includeAccessCodesDescription: 'Per il trasferimento su un\'altra macchina', + includeAccessCodesWarning: 'I codici di accesso saranno inclusi in testo semplice. Mantieni sicuro questo file di backup!', + categoriesSelected: '{{selectedCount}} categorie selezionate', + }, + + // Pending Uploads Panel + pendingUploads: { + placeholders: { + notes: 'Aggiungi note su questa stampa...', + }, + discardUpload: 'Scarta caricamento', + archiveAllUploads: 'Archivia tutti i caricamenti', + discardAllUploads: 'Scarta tutti i caricamenti', + archive: 'Archivia', + timeAgo: { + justNow: 'Adesso', + minutesAgo: '{{minutes}} min fa', + hoursAgo: '{{hours}} ore fa', + daysAgo: '{{days}} giorni fa', + }, + }, + + // API Browser + apiBrowser: { + placeholders: { + requestBody: 'Corpo della richiesta JSON...', + searchEndpoints: 'Cerca endpoint...', + }, + }, + // Configure AMS Slot Modal configureAmsSlot: { title: 'Configura Slot AMS', @@ -2947,6 +3461,140 @@ export default { configureSlot: 'Configura slot', }, + // GitHub Backup Settings + githubBackup: { + title: 'Backup GitHub', + history: 'Cronologia', + downloadBackup: 'Scarica backup', + restoreBackup: 'Ripristina backup', + noBackupsYet: 'Nessun backup ancora', + }, + + // Email Settings + emailSettings: { + placeholders: { + fromName: 'BamBuddy', + }, + }, + + // Tag Management Modal + tagManagement: { + searchTags: 'Cerca tag...', + renameTag: 'Rinomina tag', + deleteTag: 'Elimina tag', + }, + + // Notification Template Editor + notificationTemplates: { + placeholders: { + title: 'Titolo notifica...', + body: 'Corpo notifica...', + }, + }, + + // Batch Tag Modal + batchTag: { + placeholders: { + newTag: 'Inserisci nuovo tag...', + }, + }, + + // Photo Gallery Modal + photoGallery: { + deletePhoto: 'Elimina foto', + }, + + // Filament Hover Card + filamentHoverCard: { + copySpoolUuid: 'Copia UUID bobina', + }, + + // K Profiles View + kProfilesView: { + hasNote: 'Ha una nota', + copyProfile: 'Copia profilo', + }, + + // Layout/Navigation + layout: { + openMenu: 'Apri menu', + noPermissionSystemInfo: 'Non hai il permesso di visualizzare le informazioni di sistema', + }, + + // Dashboard + dashboard: { + dragToReorder: 'Trascina per riordinare', + hideWidget: 'Nascondi widget', + }, + + // Notification Provider Card + notificationProviderCard: { + deleteNotificationProvider: 'Elimina provider di notifica', + }, + + // File Manager Modal + fileManagerModal: { + closeFileManager: 'Chiudi gestore file', + sortFiles: 'Ordina file', + goToParentFolder: 'Vai alla cartella superiore', + threeView: 'Vista 3D', + }, + + // Embedded Camera Viewer + embeddedCameraViewer: { + refreshStream: 'Aggiorna stream', + close: 'Chiudi', + zoomOut: 'Rimpicciolisci', + resetZoom: 'Reimposta zoom', + zoomIn: 'Ingrandisci', + dragToResize: 'Trascina per ridimensionare', + }, + + // Timelapse Viewer + timelapseViewer: { + skipBack5s: 'Indietro 5s', + skipForward5s: 'Avanti 5s', + }, + + // Notification Providers + notificationProviders: { + descriptions: { + email: 'Notifiche email via SMTP', + telegram: 'Notifiche tramite bot Telegram', + discord: 'Invia a canale Discord tramite webhook', + ntfy: 'Notifiche push gratuite e self-hostabili', + pushover: 'Notifiche push semplici e affidabili', + callmebot: 'Notifiche WhatsApp gratuite tramite CallMeBot', + webhook: 'POST HTTP generico a qualsiasi URL', + }, + }, + + // Log Viewer + logViewer: { + searchPlaceholder: 'Cerca messaggio o nome logger...', + noLogEntries: 'Nessuna voce di log trovata', + }, + + // Switchbar Popover + switchbarPopover: { + noSwitchesInSwitchbar: 'Nessun interruttore nella barra', + }, + + // Project Page Modal + projectPageModal: { + placeholders: { + title: 'Titolo', + designer: 'Designer', + license: 'Licenza', + description: 'Inserisci descrizione...', + profileTitle: 'Titolo profilo', + profileDescription: 'Descrizione profilo...', + }, + }, + + // Spoolman Settings + spoolmanSettings: {}, + // Time time: { unknown: '-', @@ -3002,6 +3650,25 @@ export default { grossWeight: 'Peso lordo', spoolSize: 'Dimensione bobina', close: 'Chiudi', + currentSpool: 'Bobina attuale', + }, + modal: { + spoolDetected: 'Bobina rilevata', + assignToAms: 'Assegna all\'AMS', + syncWeight: 'Sincronizza peso', + weightSynced: 'Sincronizzato!', + syncing: 'Sincronizzazione...', + newTagDetected: 'Nuovo tag rilevato', + addToInventory: 'Aggiungi all\'inventario', + assignToAmsTitle: 'Assegna all\'AMS', + selectSlot: 'Seleziona uno slot', + assign: 'Assegna', + assigning: 'Assegnazione...', + assignSuccess: 'Assegnato!', + assignError: 'Impossibile assegnare la bobina. Riprovare.', + noPrinterSelected: 'Seleziona una stampante...', + noAmsDetected: 'Nessun AMS rilevato su questa stampante', + slot: 'Slot', }, weight: { noReading: 'Nessuna lettura', @@ -3041,12 +3708,12 @@ export default { addSpool: 'Aggiungi bobina', }, settings: { - // Schede + // Tabs tabDevice: 'Dispositivo', tabDisplay: 'Display', tabScale: 'Bilancia', tabUpdates: 'Aggiornamenti', - // Scheda dispositivo + // Device tab nfcReader: 'Lettore NFC', type: 'Tipo', connection: 'Connessione', @@ -3054,14 +3721,14 @@ export default { deviceInfo: 'Info dispositivo', hostname: 'Host', uptime: 'Tempo di attività', - // Scheda display + // Display tab brightness: 'Luminosità', saved: 'Salvato', noBacklight: 'Nessuna retroilluminazione DSI rilevata. Il controllo luminosità richiede un display DSI.', screenBlank: 'Timeout spegnimento schermo', screenBlankDesc: 'Lo schermo si spegne dopo inattività. Tocca per riattivare.', displayNote: 'La luminosità viene applicata come filtro software.', - // Scheda bilancia + // Scale tab scaleCalibration: 'Calibrazione bilancia', currentWeight: 'Peso attuale', tareOffset: 'Tara', @@ -3083,7 +3750,7 @@ export default { firmware: 'Firmware', scale: 'Bilancia', noDevice: 'Nessun dispositivo SpoolBuddy trovato', - // Scheda aggiornamenti + // Updates tab daemonVersion: 'Versione daemon', currentVersion: 'Attuale', versionPending: 'In attesa del daemon...', @@ -3130,7 +3797,7 @@ export default { bugReport: { title: 'Segnala un bug', description: 'Descrizione', - descriptionPlaceholder: "Cosa è andato storto? Descrivi il problema...", + descriptionPlaceholder: 'Cosa è andato storto? Descrivi il problema...', email: 'Email (opzionale)', emailPlaceholder: 'tua@email.it', emailPrivacy: 'Se fornita, la tua email sarà inclusa in una sezione compressa dell\'issue GitHub per permettere al manutentore di contattarti.', @@ -3146,10 +3813,10 @@ export default { collectingLogsHint: 'Registrazione debug attivata, interrogazione delle stampanti per dati aggiornati.', submitting: 'Invio segnalazione bug...', submitSuccess: 'Segnalazione bug inviata con successo!', - submitFailed: "Impossibile inviare la segnalazione bug", + submitFailed: 'Impossibile inviare la segnalazione bug', thankYou: 'Grazie!', submitted: 'La tua segnalazione bug è stata inviata.', - viewIssue: "Vedi issue", + viewIssue: 'Vedi issue', unexpectedError: 'Si è verificato un errore imprevisto', countdownSeconds: '{{seconds}}s', }, diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts index 970971486..5311aac4a 100644 --- a/frontend/src/i18n/locales/ja.ts +++ b/frontend/src/i18n/locales/ja.ts @@ -1,4 +1,5 @@ export default { + // Navigation nav: { printers: 'プリンター', archives: 'アーカイブ', @@ -15,15 +16,17 @@ export default { expandSidebar: 'サイドバーを開く', update: 'アップデート', updateAvailable: 'アップデートあり: v{{version}}', + updateAvailableBanner: 'バージョン {{version}} が利用可能です!', + viewUpdate: 'アップデートを表示', viewOnGithub: 'GitHubで表示', keyboardShortcuts: 'キーボードショートカット (?)', switchToLight: 'ライトモードに切替', switchToDark: 'ダークモードに切替', smartSwitches: 'スマートスイッチ', logout: 'ログアウト', - updateAvailableBanner: 'バージョン {{version}} が利用可能です!', - viewUpdate: 'アップデートを表示', }, + + // Common common: { save: '保存', saving: '保存中...', @@ -62,67 +65,55 @@ export default { hours: '時間', minutes: '分', seconds: '秒', + days: '日', + enable: '有効化', disable: '無効にする', permissions: '権限', noPrinters: 'プリンターが登録されていません', noData: 'データがありません', + linkNotFound: 'リンクが見つかりません', required: '必須', optional: 'オプション', dismiss: '閉じる', apply: '適用', + reset: 'リセット', + export: 'エクスポート', + import: 'インポート', clear: 'クリア', + selectAll: 'すべて選択', + deselectAll: 'すべて選択解除', noChange: '— 変更なし —', + unchanged: '変更なし', unassigned: '未割当', unknown: '不明', unknownError: '不明なエラー', today: '今日', tomorrow: '明日', asap: '即時', + overdue: '期限超過', now: '今すぐ', collapse: '折りたたむ', expand: '展開', viewArchive: 'アーカイブを表示', viewInFileManager: 'ファイルマネージャーで表示', addedBy: '{{username}}が追加', + prints: 'プリント', more: 'もっと見る', + ascending: '昇順', + descending: '降順', printer: 'プリンター', + remove: '削除', type: '種類', print: '印刷', rename: '名前変更', move: '移動', create: '作成', - days: '日', - enable: '有効化', - linkNotFound: 'リンクが見つかりません', - reset: 'リセット', - export: 'エクスポート', - import: 'インポート', - selectAll: 'すべて選択', - deselectAll: 'すべて選択解除', - unchanged: '変更なし', - overdue: '期限超過', - prints: 'プリント', - ascending: '昇順', - descending: '降順', - remove: '削除', duplicate: '複製', left: '左', right: '右', - done: '完了', - saveChanges: '変更を保存', - turnOn: 'オンにする', - turnOff: 'オフにする', - deletePhoto: '写真を削除', - deletePhotoConfirm: 'この写真を削除しますか?元に戻せません。', - project: 'プロジェクト', - archive: 'アーカイブ', - show: '表示', - hide: '非表示', - back: '戻る', - retry: 'リトライ', - model: 'モデル', - ok: 'OK', }, + + // Printers page printers: { title: 'プリンター', addPrinter: 'プリンターを追加', @@ -141,9 +132,9 @@ export default { printing: '印刷中', paused: '一時停止', offline: 'オフライン', + error: 'エラー', finished: '完了', unknown: '不明', - error: 'エラー', }, temperatures: { nozzle: 'ノズル', @@ -152,10 +143,13 @@ export default { }, progress: '{{percent}}% 完了', timeRemaining: '残り {{time}}', + deleteConfirm: '「{{name}}」を削除しますか?', maintenanceOk: 'メンテナンス正常', maintenanceWarning: '{{count}}件の警告', maintenanceWarning_plural: '{{count}}件の警告', maintenanceDue: '{{count}}件のメンテナンス期限', + maintenanceDue_plural: '{{count}}件の期限', + // Sort options sort: { name: '名前', status: 'ステータス', @@ -164,23 +158,36 @@ export default { ascending: '昇順で並べ替え', descending: '降順で並べ替え', }, + // Card size cardSize: { small: '小', medium: '中', large: '大', extraLarge: '特大', }, + // Controls hideOffline: 'オフラインを非表示', nextAvailable: '次に完了', powerOn: '電源オン', + offlinePrintersWithPlugs: 'スマートプラグ付きオフラインプリンター', noPrintersConfigured: 'プリンターが設定されていません', + // Printer card readyToPrint: '印刷可能', external: '外部', extL: 'Ext-L', extR: 'Ext-R', deleteArchives: '印刷アーカイブを削除', + noLabel: 'ラベルなし', + printPreview: '印刷プレビュー', + width: '幅', + height: '高さ', + noObjectsFound: 'オブジェクトが見つかりません', + objectsLoadedOnPrintStart: 'オブジェクトは印刷開始時に読み込まれます', willBeSkipped: 'スキップされます', name: '名前', + serialCannotBeChanged: 'シリアル番号は変更できません', + locationHelp: 'プリンターのグループ化とキュージョブのフィルタリングに使用', + // WiFi signal strength wifiSignal: { veryWeak: '非常に弱い', weak: '弱い', @@ -188,15 +195,26 @@ export default { good: '良好', excellent: '非常に良い', }, + // Maintenance maintenanceUpToDate: 'すべてのメンテナンスが最新です', + // Chamber light chamberLightOn: 'チャンバーライトをオンにしました', chamberLightOff: 'チャンバーライトをオフにしました', + // Files files: 'ファイル', browseFiles: 'プリンターのファイルを参照', + // Smart plug + autoOffAfterPrint: '印刷後に自動電源オフ', + autoOffExecuted: '自動オフが実行されました - リセットするにはプリンターの電源を入れてください', + // HMS errors hmsErrors: 'クリックしてHMSエラーを表示', + viewHmsErrors: '{{count}}件のHMSエラーを表示', + // Actions resume: '再開', pause: '一時停止', stop: '停止', + camera: 'カメラ', + skipObject: 'オブジェクトスキップ', reconnect: '再接続', mqttDebug: 'MQTTデバッグ', printerInformation: 'プリンター情報', @@ -231,12 +249,19 @@ export default { nozzleFlow: 'フロー', nozzleHighFlow: 'ハイフロー', nozzleStandardFlow: 'スタンダード', + // Firmware + firmwareUpdate: 'ファームウェアアップデート', + firmwareInstructions: 'プリンターのタッチスクリーンで', + firmwareNav: 'に移動', + settings: '設定', + firmware: 'ファームウェア', + // Discovery + discoverPrinters: 'プリンターを検出', + searching: '検索中...', + manualEntry: '手動入力', + addFromCloud: 'クラウドから追加', + // Toast messages toast: { - printStopped: '印刷を停止しました', - printPaused: '印刷を一時停止しました', - printResumed: '印刷を再開しました', - failedToSkipObjects: 'オブジェクトのスキップに失敗しました', - rfidRereadInitiated: 'RFID再読み取りを開始しました', printerDeleted: 'プリンターを削除しました', printerAdded: 'プリンターを追加しました', printerUpdated: 'プリンターを更新しました', @@ -248,16 +273,18 @@ export default { turnedOn: '{{name}} の電源をオンにしました', failedToPowerOn: '{{name}} の電源オンに失敗しました', scriptTriggered: 'スクリプトを実行しました', + printStopped: '印刷を停止しました', + printPaused: '印刷を一時停止しました', + printResumed: '印刷を再開しました', referenceDeleted: 'リファレンスを削除しました', detectionAreaSaved: '検出エリアを保存しました', - failedToDiscover: 'プリンターの検出に失敗しました', - cloudLoginRequired: 'クラウドログインが必要です', failedToRunScript: 'スクリプトの実行に失敗しました', failedToStopPrint: '印刷の停止に失敗しました', failedToPausePrint: '印刷の一時停止に失敗しました', failedToResumePrint: '印刷の再開に失敗しました', failedToControlChamberLight: 'チャンバーライトの制御に失敗しました', failedToUpdateSetting: '設定の更新に失敗しました', + failedToSkipObjects: 'オブジェクトのスキップに失敗しました', failedToRereadRfid: 'RFIDの再読み取りに失敗しました', failedToCheckPlate: 'プレートの確認に失敗しました', failedToUpdateLabel: 'ラベルの更新に失敗しました', @@ -267,60 +294,74 @@ export default { plateCheckDisabled: 'プレートチェックを無効にしました', calibrationSaved: 'キャリブレーションを保存しました!', calibrationFailed: 'キャリブレーションに失敗しました', + rfidRereadInitiated: 'RFID再読み取りを開始しました', }, + // Connection status connection: { connected: '接続中', offline: 'オフライン', }, + // Queue info queue: { inQueue: 'キュー内', inQueue_plural: '{{count}}件がキュー内', }, + // Controls section controls: 'コントロール', + // RFID + rfid: { + reread: 'RFID再読み取り', + }, + // Permissions permission: { - noFiles: 'このディレクトリにファイルがありません', noAdd: 'プリンターを追加する権限がありません', noEdit: 'プリンターを編集する権限がありません', noDelete: 'プリンターを削除する権限がありません', noControl: 'プリンターを制御する権限がありません', + noFiles: 'このディレクトリにファイルがありません', noAmsRfid: 'AMS RFIDを再読み取りする権限がありません', noSmartPlugControl: 'スマートプラグを制御する権限がありません', noCamera: 'カメラを表示する権限がありません', }, + // Add/Edit modal modal: { - selectModel: 'モデルを選択...', - locationGroup: 'ロケーション / グループ', - locationPlaceholder: '例: 工房、オフィス、地下室', - modelOptional: 'モデル(任意)', addTitle: 'プリンターを追加', editTitle: 'プリンターを編集', myPrinter: 'マイプリンター', + selectModel: 'モデルを選択...', + locationGroup: 'ロケーション / グループ', + locationPlaceholder: '例: 工房、オフィス、地下室', autoArchiveLabel: '完了した印刷を自動アーカイブ', fromPrinterSettings: 'プリンターの設定から取得', + modelOptional: 'モデル(任意)', saveChanges: '変更を保存', }, + // Skip objects skipObjects: { - onlyWhilePrinting: 'オブジェクトスキップ(印刷中のみ)', - title: 'オブジェクトスキップ', - skipped: 'スキップ済み', - objectsSkipped: 'オブジェクトをスキップしました', - activeCount: '{{count}}個アクティブ', - waitForLayer: 'オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})', - skip: 'スキップ', tooltip: 'オブジェクトスキップ', + onlyWhilePrinting: 'オブジェクトスキップ(印刷中のみ)', requiresMultiple: 'オブジェクトスキップ(2個以上必要)', + title: 'オブジェクトスキップ', matchIdsInfo: 'プリンター画面のIDと照合してください', printerShowsIds: 'プリンター画面にビルドプレート上のオブジェクトIDが表示されます', skipSelected: '選択をスキップ', skipping: 'スキップ中...', noObjectsSelected: 'オブジェクトが選択されていません', selectObjectsToSkip: '現在の印刷からスキップするオブジェクトを選択してください', + skipped: 'スキップ済み', + objectsSkipped: 'オブジェクトをスキップしました', + activeCount: '{{count}}個アクティブ', + waitForLayer: 'オブジェクトをスキップするにはレイヤー2以降をお待ちください(現在レイヤー{{layer}})', + skip: 'スキップ', confirmTitle: 'オブジェクトをスキップしますか?', confirmMessage: '「{{name}}」をスキップしますか?この操作は元に戻せません。', }, + // Confirm modals confirm: { deleteTitle: 'プリンターを削除', deleteMessage: '「{{name}}」を削除しますか?すべての接続設定が削除されます。', + deleteArchivesNote: 'このプリンターのすべての印刷履歴が完全に削除されます。', + keepArchivesNote: '印刷履歴は保持されますが、このプリンターとの関連は解除されます。', stopTitle: '印刷を停止', stopMessage: '「{{name}}」の現在の印刷を停止しますか?印刷ジョブがキャンセルされます。', stopButton: '印刷を停止', @@ -332,19 +373,29 @@ export default { resumeButton: '印刷を再開', powerOnTitle: 'プリンターの電源をオン', powerOnMessage: '「{{name}}」の電源をオンにしますか?', + powerOnButton: '電源オン', powerOffTitle: 'プリンターの電源をオフ', powerOffMessage: '「{{name}}」の電源をオフにしますか?', powerOffWarning: '警告: 「{{name}}」は現在印刷中です!電源をオフにしますか?印刷が中断され、プリンターが損傷する可能性があります。', - deleteArchivesNote: 'このプリンターのすべての印刷履歴が完全に削除されます。', - keepArchivesNote: '印刷履歴は保持されますが、このプリンターとの関連は解除されます。', - powerOnButton: '電源オン', powerOffButton: '電源オフ', }, + // Discovery discovery: { title: 'プリンター', + searching: '検索中...', scanning: 'スキャン中...', + scanProgress: 'スキャン中... {{scanned}}/{{total}}', + foundPrinters: '{{count}}台のプリンターを検出', + noPrintersFound: 'プリンターが見つかりません', + noPrintersFoundSubnet: '指定されたサブネットにプリンターが見つかりません。', + noPrintersFoundNetwork: 'ネットワーク上にプリンターが見つかりません。', allConfigured: '検出されたすべてのプリンターは既に設定済みです。', + alreadyAdded: '追加済み', + select: '選択', + manualEntry: '手動入力', + addFromCloud: 'クラウドから追加', subnetToScan: 'スキャンするサブネット', + dockerNote: 'Dockerを検出しました。プリンターのサブネットをCIDR表記で入力してください。docker-compose.ymlでnetwork_mode: hostが必要です。', scanSubnet: 'サブネットをスキャンしてプリンターを検出', discoverNetwork: 'ネットワーク上のプリンターを検出', scanningSubnet: 'サブネットでBambuプリンターをスキャン中...', @@ -352,38 +403,19 @@ export default { serialRequired: 'シリアル番号が必要です', unknown: '不明', failedToStart: '印刷の開始に失敗しました', - searching: '検索中...', - scanProgress: 'スキャン中... {{scanned}}/{{total}}', - foundPrinters: '{{count}}台のプリンターを検出', - noPrintersFound: 'プリンターが見つかりません', - noPrintersFoundSubnet: '指定されたサブネットにプリンターが見つかりません。', - noPrintersFoundNetwork: 'ネットワーク上にプリンターが見つかりません。', - alreadyAdded: '追加済み', - select: '選択', - manualEntry: '手動入力', - addFromCloud: 'クラウドから追加', - dockerNote: 'Dockerを検出しました。プリンターのサブネットをCIDR表記で入力してください。docker-compose.ymlでnetwork_mode: hostが必要です。', }, + // Filaments section filaments: 'フィラメント', + // Camera + openCameraOverlay: 'カメラオーバーレイを開く', + openCameraWindow: 'カメラを新しいウィンドウで開く', + // Firmware firmwareUpdateAvailable: 'ファームウェアアップデートあり: {{current}} → {{latest}}', firmwareUpToDate: 'ファームウェア {{version}} — 最新', + firmwareUpdateButton: 'アップデート', + // Plate detection plateDetection: { noPermission: 'このページにアクセスする権限がありません。', - title: 'プレート検出', - description: '印刷前にビルドプレート上のオブジェクトを検出', - referenceCapture: 'リファレンス画像を撮影', - captureReference: 'リファレンスを撮影', - deleteReference: 'リファレンスを削除', - sensitivity: '感度', - detectionArea: '検出エリア', - saveArea: 'エリアを保存', - resetArea: 'エリアをリセット', - testDetection: '検出テスト', - testing: 'テスト中...', - objectsDetected: 'オブジェクトを検出しました', - noObjectsDetected: 'オブジェクトは検出されませんでした', - requiresCamera: 'カメラが必要です', - referenceRequired: 'まずリファレンス画像を撮影してください', enabledClick: 'プレートチェック有効 - クリックして無効化', disabledClick: 'プレートチェック無効 - クリックして有効化', manageCalibration: 'プレート検出キャリブレーションを管理', @@ -392,20 +424,25 @@ export default { calibrationDescription: 'キャリブレーションは空のプレートのリファレンス画像を撮影します。以降のチェックではこのリファレンスと比較してオブジェクトを検出します。', calibrationTip: 'ヒント: 異なるプレート用に最大5つのキャリブレーションを保存できます。チェック時に最適なものが自動的に使用されます。', plateEmpty: 'プレートは空のようです', + objectsDetected: 'オブジェクトを検出しました', confidence: '信頼度', difference: '差分', analysisPreview: '分析プレビュー:', analysisLegend: '緑の枠 = 検出エリア、赤のオーバーレイ = キャリブレーションとの差分', savedReferences: '保存済みリファレンス ({{count}}/{{max}})', + deleteReference: 'リファレンスを削除', labelPlaceholder: 'ラベル...', clickToEdit: '{{label}} - クリックして編集', clickToAddLabel: 'クリックしてラベルを追加', }, + // Fans fans: { partCooling: 'パーツ冷却ファン', auxiliary: '補助ファン', chamber: 'チャンバーファン', }, + // HMS errors + clickToViewHmsErrors: 'クリックしてHMSエラーを表示', estimatedCompletion: '完了予定時刻', slotOptions: 'スロットオプション', // AMS hover popup @@ -418,13 +455,16 @@ export default { clear: 'クリア', noEditPermission: 'AMS ユニットの名前を変更する権限がありません', }, + // Firmware modal firmwareModal: { title: 'ファームウェアアップデート', titleUpToDate: 'ファームウェア情報', currentVersion: '現在のバージョン', latestVersion: '最新バージョン', releaseNotes: 'リリースノート', + checkingPrereqs: '前提条件を確認中...', sdCardReady: 'SDカード準備完了。下をクリックしてファームウェアをアップロードしてください。', + uploadedSuccess: 'ファームウェアをSDカードにアップロードしました!', applyInstructions: 'プリンターでアップデートを適用するには:', step1: 'プリンターのタッチスクリーンで設定に移動', step2: 'ファームウェアに移動', @@ -433,12 +473,11 @@ export default { done: '完了', starting: '開始中...', uploadFirmware: 'ファームウェアをアップロード', - checkingPrereqs: '前提条件を確認中...', - uploadedSuccess: 'ファームウェアをSDカードにアップロードしました!', uploadFailed: 'アップロード開始に失敗しました: {{error}}', uploadedToast: 'ファームウェアをアップロードしました!プリンター画面からアップデートを実行してください。', }, accessCodePlaceholder: 'プリンター設定から取得', + // ROI editor roi: { title: 'プリンター', xStart: 'X開始', @@ -447,52 +486,6 @@ export default { height: '高さ', instruction: 'ビルドプレートに焦点を合わせるように検出エリアを調整してください。プレビューの緑の枠が現在のエリアを示しています。', }, - deleteConfirm: '「{{name}}」を削除しますか?', - maintenanceDue_plural: '{{count}}件の期限', - offlinePrintersWithPlugs: 'スマートプラグ付きオフラインプリンター', - noLabel: 'ラベルなし', - printPreview: '印刷プレビュー', - width: '幅', - height: '高さ', - noObjectsFound: 'オブジェクトが見つかりません', - objectsLoadedOnPrintStart: 'オブジェクトは印刷開始時に読み込まれます', - serialCannotBeChanged: 'シリアル番号は変更できません', - locationHelp: 'プリンターのグループ化とキュージョブのフィルタリングに使用', - autoOffAfterPrint: '印刷後に自動電源オフ', - autoOffExecuted: '自動オフが実行されました - リセットするにはプリンターの電源を入れてください', - viewHmsErrors: '{{count}}件のHMSエラーを表示', - camera: 'カメラ', - skipObject: 'オブジェクトスキップ', - firmwareUpdate: 'ファームウェアアップデート', - firmwareInstructions: 'プリンターのタッチスクリーンで', - firmwareNav: 'に移動', - settings: '設定', - firmware: 'ファームウェア', - discoverPrinters: 'プリンターを検出', - searching: '検索中...', - manualEntry: '手動入力', - addFromCloud: 'クラウドから追加', - cloud: { - title: 'Bambu Cloud プリンター', - loginRequired: 'クラウドにログインしてプリンターを追加してください', - loginFirst: 'まずプロファイルページからBambu Cloudにログインしてください', - goToProfiles: 'プロファイルへ移動', - loadingPrinters: 'クラウドプリンターを読み込み中...', - noPrinters: 'クラウドにプリンターが見つかりません', - alreadyConfigured: '設定済み', - accessCodeRequired: 'アクセスコードが必要です', - addPrinter: 'プリンターを追加', - adding: '追加中...', - }, - name_field: '名前', - nozzleSize: 'ノズルサイズ', - rfid: { - reread: 'RFID再読み取り', - }, - openCameraOverlay: 'カメラオーバーレイを開く', - openCameraWindow: 'カメラを新しいウィンドウで開く', - firmwareUpdateButton: 'アップデート', - clickToViewHmsErrors: 'クリックしてHMSエラーを表示', developerModeWarning: '開発者LANモードが有効になっていません: {{names}}。一部の機能が動作しない可能性があります。', howToEnable: '有効化方法', incompatibleFile: 'このファイルは{{slicedFor}}用にスライスされていますが、このプリンターは{{printerModel}}です', @@ -500,6 +493,8 @@ export default { dropToPrint: 'ドロップして印刷', cannotPrint: 'プリンター使用中', }, + + // Archives page archives: { title: '印刷アーカイブ', searchPlaceholder: 'アーカイブを検索...', @@ -510,8 +505,13 @@ export default { sortOldest: '古い順', sortName: '名前順', sortDuration: '時間順', + sortLargest: '大きい順', + sortSmallest: '小さい順', + sortSize: 'サイズ', noArchives: 'アーカイブが見つかりません', + noArchivesSearch: '検索条件に一致するアーカイブがありません', noArchivesYet: 'アーカイブはまだありません', + loadingArchives: 'アーカイブを読み込み中...', releaseToUpload: 'ドロップしてアップロード', showAll: 'すべて表示', showFavoritesOnly: 'お気に入りのみ表示', @@ -519,6 +519,7 @@ export default { listView: 'リスト表示', calendarView: 'カレンダー表示', logView: '印刷ログ', + manageTags: 'タグを管理', showFailedPrints: '失敗した印刷を表示', hideFailedPrints: '失敗した印刷を非表示', printTime: '印刷時間', @@ -538,36 +539,14 @@ export default { }, toast: { source3mfAttached: 'ソース3MFを添付しました: {{filename}}', - source3mfRemoved: 'ソース3MFを削除しました', - f3dAttached: 'F3Dを添付しました: {{filename}}', - f3dRemoved: 'F3Dを削除しました', - timelapseAttached: 'タイムラプスを添付しました: {{filename}}', - addedToFavorites: 'お気に入りに追加しました', - removedFromFavorites: 'お気に入りから削除しました', - linkCopied: 'リンクをクリップボードにコピーしました', - photoDeleted: '写真を削除しました', - exportDownloaded: 'エクスポートをダウンロードしました', - exportFailed: 'エクスポートに失敗しました', - addedToProject: 'プロジェクトに追加しました', - removedFromProject: 'プロジェクトから削除しました', - failedToAddToProject: 'プロジェクトへの追加に失敗しました', - failedToRemoveFromProject: 'プロジェクトからの削除に失敗しました', - noFile: '印刷ファイルがありません', - slicerOpened: 'スライサーを開きました', - failedToOpenSlicer: 'スライサーの起動に失敗しました', - archived: 'アーカイブしました', - sentToFileManager: 'ファイルマネージャーに送信しました', - deleted: 'アーカイブを削除しました', - updated: 'アーカイブを更新しました', - failedToDelete: 'アーカイブの削除に失敗しました', - failedToUpdate: 'アーカイブの更新に失敗しました', - failedToSend: '送信に失敗しました', - sentToPrinter: 'プリンターに送信しました', - addedToQueue: 'キューに追加しました', failedUploadSource3mf: 'ソース3MFのアップロードに失敗しました', + source3mfRemoved: 'ソース3MFを削除しました', failedRemoveSource3mf: 'ソース3MFの削除に失敗しました', + f3dAttached: 'F3Dを添付しました: {{filename}}', failedUploadF3d: 'F3Dのアップロードに失敗しました', + f3dRemoved: 'F3Dを削除しました', failedRemoveF3d: 'F3Dの削除に失敗しました', + timelapseAttached: 'タイムラプスを添付しました: {{filename}}', timelapseAlreadyAttached: 'タイムラプスは既に添付されています', noMatchingTimelapse: '一致するタイムラプスが見つかりません', failedScanTimelapse: 'タイムラプスのスキャンに失敗しました', @@ -578,20 +557,31 @@ export default { failedUploadTimelapse: 'タイムラプスのアップロードに失敗しました', archiveDeleted: 'アーカイブを削除しました', failedDeleteArchive: 'アーカイブの削除に失敗しました', + addedToFavorites: 'お気に入りに追加しました', + removedFromFavorites: 'お気に入りから削除しました', projectUpdated: 'プロジェクトを更新しました', failedUpdateProject: 'プロジェクトの更新に失敗しました', + linkCopied: 'リンクをクリップボードにコピーしました', failedCopyLink: 'リンクのコピーに失敗しました', + photoDeleted: '写真を削除しました', failedDeletePhoto: '写真の削除に失敗しました', failedDeleteArchives: 'アーカイブの削除に失敗しました', failedUpdateFavorites: 'お気に入りの更新に失敗しました', + exportDownloaded: 'エクスポートをダウンロードしました', + exportFailed: 'エクスポートに失敗しました', }, menu: { + print: '印刷', schedule: 'スケジュール', + openInBambuStudio: 'スライサーで開く', slice: 'スライス', externalLink: '外部リンク', viewOnMakerWorld: 'MakerWorldで表示', preview3d: '3Dプレビュー', viewTimelapse: 'タイムラプスを表示', + scanForTimelapse: 'タイムラプスをスキャン', + uploadTimelapse: 'タイムラプスをアップロード', + removeTimelapse: 'タイムラプスを削除', downloadSource3mf: 'ソース3MFをダウンロード', uploadSource3mf: 'ソース3MFをアップロード', replaceSource3mf: 'ソース3MFを置換', @@ -601,96 +591,101 @@ export default { downloadF3d: 'Fusion 360デザインファイルをダウンロード', removeF3d: 'F3Dを削除', download: 'ダウンロード', + copyDownloadLink: 'ダウンロードリンクをコピー', qrCode: 'QRコード', viewPhotos: '{{count}}枚の写真を表示', - projectPage: 'プロジェクトページ', - goToProject: 'プロジェクトへ: {{name}}', - addToProject: 'プロジェクトに追加', - loading: 'アーカイブを読み込み中...', - select: '選択', - deselect: '選択解除', - print: '印刷', - openInBambuStudio: 'スライサーで開く', - scanForTimelapse: 'タイムラプスをスキャン', - uploadTimelapse: 'タイムラプスをアップロード', - removeTimelapse: 'タイムラプスを削除', - copyDownloadLink: 'ダウンロードリンクをコピー', viewPhotosCount: '写真を表示 ({{count}})', + projectPage: 'プロジェクトページ', addToFavorites: 'お気に入りに追加', removeFromFavorites: 'お気に入りから削除', edit: '編集', + goToProject: 'プロジェクトへ: {{name}}', + addToProject: 'プロジェクトに追加', removeFromProject: 'プロジェクトから削除', + loading: 'アーカイブを読み込み中...', noProjectsAvailable: '利用可能なプロジェクトがありません', + select: '選択', + deselect: '選択解除', delete: '削除', }, + permission: { + noReprint: 'このアーカイブを再印刷する権限がありません', + noAddToQueue: 'キューに追加する権限がありません', + noUpdateArchives: 'アーカイブを更新する権限がありません', + noUploadFiles: 'ファイルをアップロードする権限がありません', + noDownload: 'アーカイブをダウンロードする権限がありません', + noCopyLink: 'ダウンロードリンクをコピーする権限がありません', + noDelete: 'このアーカイブを削除する権限がありません', + noCreate: 'アーカイブを作成する権限がありません', + }, card: { - plateNumber: 'プレート {{number}}', - moreOptions: 'その他のオプション', - failed: '失敗', - openSource3mf: 'ソース3MFをBambu Studioで開く(右クリックでオプション表示)', - downloadF3d: 'Fusion 360デザインファイルをダウンロード', - viewTimelapse: 'タイムラプスを表示', - viewPhotos: '{{count}}枚の写真を表示', - openFolder: 'フォルダーを開く: {{name}}', - source: 'ソース', - project: 'プロジェクト', - layer: 'レイヤー', - layers: 'レイヤー', - objects: '{{count}}オブジェクト', - noPermissionEdit: 'プロファイルを編集する権限がありません', - reprint: '再印刷', - schedulePrint: '印刷をスケジュール', - schedule: 'スケジュール', - slice: 'スライス', - externalLink: '外部リンク', - preview3d: '3Dプレビュー', - download: 'ダウンロード', previousPlate: '前のプレート', nextPlate: '次のプレート', + plateNumber: 'プレート {{number}}', + moreOptions: 'その他のオプション', addToFavorites: 'お気に入りに追加', removeFromFavorites: 'お気に入りから削除', cancelled: 'キャンセル', + failed: '失敗', duplicate: '重複', duplicateTitle: 'このモデルは以前印刷されています', + openSource3mf: 'ソース3MFをBambu Studioで開く(右クリックでオプション表示)', + downloadF3d: 'Fusion 360デザインファイルをダウンロード', + viewTimelapse: 'タイムラプスを表示', viewPhoto: '写真を表示', + viewPhotos: '{{count}}枚の写真を表示', + openFolder: 'フォルダーを開く: {{name}}', slicedFile: 'スライス済みファイル - 印刷可能', sourceFile: 'ソースファイルのみ - AMSマッピング不可', gcode: 'GCODE', + source: 'ソース', + project: 'プロジェクト', estimated: '推定: {{time}}', actual: '実際: {{time}}', accuracy: '精度: {{percent}}%', filament: '{{weight}}g', + layer: 'レイヤー', + layers: 'レイヤー', object: '{{count}}オブジェクト', + objects: '{{count}}オブジェクト', slicedFor: '{{model}}用にスライス', uploadedBy: 'アップロード者', noPermissionReprint: '再印刷する権限がありません', noFileForReprint: '3MFファイルがありません — 印刷記録時にプリンターからファイルをダウンロードできませんでした', + noPermissionEdit: 'プロファイルを編集する権限がありません', noPermissionDelete: 'アーカイブを削除する権限がありません', + reprint: '再印刷', + schedulePrint: '印刷をスケジュール', + schedule: 'スケジュール', openInBambuStudio: 'スライサーで開く', openInBambuStudioToSlice: 'スライサーでスライス', + slice: 'スライス', + externalLink: '外部リンク', makerWorld: 'MakerWorld: {{designer}}', viewProject: 'プロジェクトを表示', noExternalLink: '外部リンクなし', + preview3d: '3Dプレビュー', + download: 'ダウンロード', edit: '編集', delete: '削除', }, modal: { deleteArchive: 'アーカイブを削除', deleteConfirm: 'このアーカイブを削除しますか?', + deleteButton: '削除', removeSource3mf: 'ソース3MFを削除', removeSource3mfConfirm: '"{{name}}"からソース3MFファイルを削除してもよろしいですか?元のスライサープロジェクトファイルが削除されます。', + removeButton: '削除', removeF3d: 'F3Dを削除', removeF3dConfirm: '"{{name}}"からFusion 360デザインファイルを削除してもよろしいですか?', removeTimelapse: 'タイムラプスを削除', removeTimelapseConfirm: '"{{name}}"からタイムラプス動画を削除してもよろしいですか?', + timelapse: '{{name}} - タイムラプス', selectTimelapse: 'タイムラプスを選択', selectTimelapseDesc: '自動一致が見つかりませんでした。この印刷のタイムラプスを選択してください:', deleteArchives: '印刷アーカイブを削除', - deleteCount: '{{count}}件を削除', - deleteButton: '削除', - removeButton: '削除', - timelapse: '{{name}} - タイムラプス', deleteArchivesConfirm: '{{count}}件のアーカイブを削除しますか?この操作は元に戻せません。', + deleteCount: '{{count}}件を削除', }, page: { title: '印刷アーカイブ', @@ -698,27 +693,27 @@ export default { dropFilesHere: '.3mfファイルをここにドロップ', releaseToUpload: 'ドロップしてアップロード', only3mfSupported: '.3mfファイルのみ対応しています', + close: '閉じる', selected: '{{count}}件選択中', selectAll: 'すべて選択', tags: 'タグ', project: 'プロジェクト', favorite: 'お気に入り', - toggledFavorites: '{{count}}件のアーカイブのお気に入りを切替えました', - photoDeleted: '写真を削除しました', - close: '閉じる', delete: '削除', + toggledFavorites: '{{count}}件のアーカイブのお気に入りを切替えました', failedUpdateFavorites: 'お気に入りの更新に失敗しました', archivesDeleted: '{{count}}件のアーカイブを削除しました', failedDeleteArchives: 'アーカイブの削除に失敗しました', + photoDeleted: '写真を削除しました', failedDeletePhoto: '写真の削除に失敗しました', }, list: { - size: 'サイズ', - hasTimelapse: 'タイムラプスあり', name: '名前', printer: 'プリンター', date: '日付', + size: 'サイズ', actions: '操作', + hasTimelapse: 'タイムラプスあり', }, log: { date: '日時', @@ -748,92 +743,25 @@ export default { cleared: '{{count}}件のログエントリを削除しました', clearFailed: '印刷ログの削除に失敗しました', }, - noPrinterAvailable: '利用可能なプリンターがありません', - archiveOrReprint: 'アーカイブまたは再印刷', - multiPrinterPrint: 'マルチプリンター印刷', - noPrintersForReprint: '再印刷用のプリンターがありません', - searchMakerworld: 'MakerWorldで検索', - searchPrintables: 'Printablesで検索', - searchThingiverse: 'Thingiverseで検索', - openInSlicer: 'スライサーで開く', - openWithProtocol: '{{slicer}}で開く', - context: { - reprint: '再印刷', - addToQueue: 'キューに追加', - delete: '削除', - edit: '編集', - compare: '比較', - viewTimelapse: 'タイムラプスを表示', - downloadTimelapse: 'タイムラプスをダウンロード', - openInBambuStudio: 'スライサーで開く', - openInOrcaSlicer: 'OrcaSlicerで開く', - addToProject: 'プロジェクトに追加', - removeFromProject: 'プロジェクトから削除', - downloadGcode: 'GCodeをダウンロード', - download3mf: '3MFをダウンロード', - downloadModel: 'モデルをダウンロード', - viewPhotos: '写真を表示', - searchOnline: 'オンラインで検索', - sendToFileManager: 'ファイルマネージャーに送信', - sendToPrinter: 'プリンターに送信', - openStlViewer: 'STLビューアーで開く', - }, - permissions: { - noReprint: '再印刷する権限がありません', - noDelete: '削除する権限がありません', - noEdit: '編集する権限がありません', - noDownload: 'ダウンロードする権限がありません', - noQueue: 'キューに追加する権限がありません', - noSendToPrinter: 'プリンターに送信する権限がありません', - noSendToFileManager: 'ファイルマネージャーに送信する権限がありません', - noUpload: 'アップロードする権限がありません', - noBulkDelete: '一括削除する権限がありません', - }, - costPerPrint: '印刷あたりのコスト', - energyCost: 'エネルギーコスト', - totalCost: '合計コスト', - noFilament: 'フィラメントデータなし', - printCount: '{{count}}回印刷', - timesShort: '{{count}}回', - perPrint: '/1回あたり', - gcodeAvailable: 'GCode利用可能', - noGcode: 'GCodeなし', - plates: 'プレート', - filaments: 'フィラメント', - settings_label: '設定', - weight: '重量', - printSettings: '印刷設定', - layerHeight: 'レイヤー高さ', - nozzleTemp: 'ノズル温度', - bedTemp: 'ベッド温度', - infill: 'インフィル', - supports: 'サポート', - model3d: '3Dモデル', - noModel: 'モデルなし', - printNumber: '印刷 #{{number}}', - sortLargest: '大きい順', - sortSmallest: '小さい順', - sortSize: 'サイズ', - noArchivesSearch: '検索条件に一致するアーカイブがありません', - loadingArchives: 'アーカイブを読み込み中...', - manageTags: 'タグを管理', - permission: { - noReprint: 'このアーカイブを再印刷する権限がありません', - noAddToQueue: 'キューに追加する権限がありません', - noUpdateArchives: 'アーカイブを更新する権限がありません', - noUploadFiles: 'ファイルをアップロードする権限がありません', - noDownload: 'アーカイブをダウンロードする権限がありません', - noCopyLink: 'ダウンロードリンクをコピーする権限がありません', - noDelete: 'このアーカイブを削除する権限がありません', - noCreate: 'アーカイブを作成する権限がありません', - }, }, + + // Queue page queue: { title: '印刷キュー', + subtitle: '印刷ジョブのスケジュールと管理', addToQueue: 'キューに追加', + // Print modal + print: '印刷', + reprint: '再印刷', schedulePrint: '印刷をスケジュール', editQueueItem: 'キューアイテムを編集', + printToPrinters: '{{count}}台のプリンターで印刷', + queueToPrinters: '{{count}}台のプリンターでキュー追加', + sending: '送信中...', + sendingProgress: '送信中 {{current}}/{{total}}...', adding: '追加中...', + addingProgress: '追加中 {{current}}/{{total}}...', + savingProgress: '保存中 {{current}}/{{total}}...', clearQueue: 'キューをクリア', clearHistory: '履歴をクリア', emptyQueue: 'キューは空です', @@ -846,18 +774,22 @@ export default { viewArchive: 'アーカイブを表示', viewInFileManager: 'ファイルマネージャーで表示', itemCount: '{{count}}件', + itemCount_plural: '{{count}}件のアイテム', dragToReorder: 'ドラッグして並べ替え(ASAPのみ)', + reorderHint: '順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定時刻に実行されます。', addedBy: '{{username}}が追加', nextInQueue: '次のキュー', clearPlate: 'プレートをクリアして次を開始', clearPlateSuccess: 'プレートをクリアしました — 次の印刷の準備完了', plateReady: 'プレートをクリアしました — 次の印刷の準備完了', plateNumber: 'プレート {{index}}', + // Sections sections: { currentlyPrinting: '印刷中', queued: 'キュー中', history: '履歴', }, + // Status status: { pending: '待機中', waiting: '待機中', @@ -868,13 +800,15 @@ export default { skipped: 'スキップ', cancelled: 'キャンセル済み', }, + // Summary cards summary: { printing: '印刷中', queued: 'キュー中', - history: '履歴', totalTime: 'キュー合計時間', totalWeight: 'キュー合計重量', + history: '履歴', }, + // Filters filter: { allPrinters: 'すべてのプリンター', unassigned: '未割当', @@ -882,6 +816,7 @@ export default { allLocations: 'すべてのロケーション', any: 'すべて', }, + // Sort sort: { byPosition: '順番で並べ替え', byName: '名前で並べ替え', @@ -891,40 +826,48 @@ export default { ascendingOldest: '昇順(古い順)', descendingNewest: '降順(新しい順)', }, + // Badges badges: { staged: 'ステージ済み', - autoPowerOff: '自動電源オフ', requiresPrevious: '前の成功が必要', + autoPowerOff: '自動電源オフ', }, + // Empty state empty: { title: 'スケジュールされた印刷はありません', description: 'アーカイブページのコンテキストメニューから「スケジュール」オプションを使用するか、ファイルをドラッグ&ドロップして始めましょう。', }, + // Time time: { asap: '即時', overdue: '期限超過', now: '今すぐ', + lessThanMinute: '1分以内', inMinutes: '{{count}}分後', inHours: '{{count}}時間後', - lessThanMinute: '1分以内', }, + // Actions actions: { stopPrint: '印刷を停止', startPrint: '印刷を開始', requeue: '再キュー', }, + // Bulk edit bulkEdit: { title: '{{count}}件のアイテムを編集', + title_plural: '{{count}}件のアイテムを編集', description: '変更した設定のみが選択されたアイテムに適用されます。', printer: 'プリンター', noChange: '— 変更なし —', queueOptions: 'キューオプション', staged: 'ステージ済み', autoPowerOff: '印刷後に自動電源オフ', + requirePrevious: '前の成功を必要とする', printOptions: '印刷オプション', bedLevelling: 'ベッドレベリング', flowCalibration: 'フローキャリブレーション', vibrationCalibration: '振動キャリブレーション', + layerInspection: '第一層検査', timelapse: 'タイムラプス', useAms: 'AMS使用', applyChanges: '変更を適用', @@ -933,10 +876,8 @@ export default { selected: '{{count}}件選択中', editSelected: '選択を編集', cancelSelected: '選択をキャンセル', - title_plural: '{{count}}件のアイテムを編集', - requirePrevious: '前の成功を必要とする', - layerInspection: '第一層検査', }, + // Confirmations confirm: { cancelTitle: 'スケジュール済み印刷をキャンセル', cancelMessage: '「{{name}}」をキャンセルしますか?', @@ -944,18 +885,19 @@ export default { stopMessage: '現在の印刷「{{name}}」を停止しますか?プリンター上の印刷ジョブがキャンセルされます。', removeTitle: '履歴から削除', removeMessage: '「{{name}}」をキュー履歴から削除しますか?', + clearHistoryTitle: '履歴をクリア', clearHistoryMessage: '{{count}}件の履歴をすべて削除しますか?', cancelButton: '印刷をキャンセル', stopButton: '印刷を停止', thisPrint: 'この印刷', thisItem: 'このアイテム', - clearHistoryTitle: '履歴をクリア', }, + // Toast messages toast: { cancelled: 'キャンセル済み', - removeFailed: 'プロジェクトからのアーカイブ削除に失敗しました', cancelFailed: 'アイテムのキャンセルに失敗しました', removed: 'キューアイテムを削除しました', + removeFailed: 'プロジェクトからのアーカイブ削除に失敗しました', stopped: '印刷を停止しました', stopFailed: '印刷の停止に失敗しました', released: '印刷をキューにリリースしました', @@ -967,17 +909,7 @@ export default { bulkCancelled: '{{count}}件のアイテムをキャンセルしました', bulkCancelFailed: 'アイテムのキャンセルに失敗しました', }, - subtitle: '印刷ジョブのスケジュールと管理', - print: '印刷', - reprint: '再印刷', - printToPrinters: '{{count}}台のプリンターで印刷', - queueToPrinters: '{{count}}台のプリンターでキュー追加', - sending: '送信中...', - sendingProgress: '送信中 {{current}}/{{total}}...', - addingProgress: '追加中 {{current}}/{{total}}...', - savingProgress: '保存中 {{current}}/{{total}}...', - itemCount_plural: '{{count}}件のアイテム', - reorderHint: '順番はASAPアイテムのみに影響します。スケジュール済みアイテムは設定時刻に実行されます。', + // Permissions permissions: { noStopPrint: '印刷を停止する権限がありません', noStartPrint: '印刷を開始する権限がありません', @@ -990,6 +922,7 @@ export default { noCancelItems: 'キューアイテムをキャンセルする権限がありません', }, }, + backgroundDispatch: { unknownFile: '不明なファイル', unknownPrinter: '不明なプリンター', @@ -1016,8 +949,11 @@ export default { completeSuccess: 'バックグラウンド配信完了: {{completed}} 件成功', }, }, + + // Statistics page stats: { title: '統計', + subtitle: 'ウィジェットをドラッグして並べ替え。目のアイコンをクリックして非表示。', overview: '概要', totalPrints: '総印刷数', successRate: '成功率', @@ -1039,9 +975,12 @@ export default { last30Days: '過去30日間', last90Days: '過去90日間', allTime: '全期間', + // Widgets quickStats: 'クイック統計', printActivity: '印刷アクティビティ', filamentTypes: 'フィラメントタイプ', + filamentTrends: 'フィラメントトレンド', + failureAnalysis: '失敗分析', timeAccuracy: '時間精度', successful: '成功', failed: '失敗', @@ -1053,26 +992,27 @@ export default { noPrintDataLast30Days: '過去30日間の印刷データがありません', failureReasons: '失敗理由', topFailureReasons: '主な失敗理由', + failedPrintsCount: '{{failed}} / {{total}} 件の印刷が失敗', + lastWeekRate: '先週: {{rate}}%', + // Actions resetLayout: 'レイアウトをリセット', recalculateCosts: 'コストを再計算', + recalculateCostsHint: '現在のフィラメント価格ですべてのアーカイブコストを再計算', exportStats: '統計をエクスポート', exportAsCsv: 'CSVでエクスポート', exportAsExcel: 'Excelでエクスポート', hiddenCount: '{{count}}件非表示', + // Toast exportDownloaded: 'エクスポートをダウンロードしました', exportFailed: 'エクスポートに失敗しました', layoutReset: 'レイアウトをリセットしました', + recalculatedCosts: '{{count}}件のアーカイブのコストを再計算しました', recalculateFailed: 'コストの再計算に失敗しました', + // Loading + loadingStats: '統計を読み込み中...', + // Permissions noPermissionResetLayout: 'レイアウトをリセットする権限がありません', noPermissionRecalculate: 'コストを再計算する権限がありません', - subtitle: 'ウィジェットをドラッグして並べ替え。目のアイコンをクリックして非表示。', - filamentTrends: 'フィラメントトレンド', - failureAnalysis: '失敗分析', - failedPrintsCount: '{{failed}} / {{total}} 件の印刷が失敗', - lastWeekRate: '先週: {{rate}}%', - recalculateCostsHint: '現在のフィラメント価格ですべてのアーカイブコストを再計算', - recalculatedCosts: '{{count}}件のアーカイブのコストを再計算しました', - loadingStats: '統計を読み込み中...', noPrintDataInRange: '選択した期間にデータがありません', periodFilament: 'フィラメント使用量', periodCost: 'コスト', @@ -1103,7 +1043,7 @@ export default { avgTime: '平均時間', filamentByPrints: '印刷数', timeframe: { - 'today': '今日', + today: '今日', 'this-week': '今週', 'this-month': '今月', 'last-7': '過去7日間', @@ -1111,11 +1051,13 @@ export default { 'last-90': '過去90日間', 'this-year': '今年', 'all-time': '全期間', - 'custom': 'カスタム', + custom: 'カスタム', from: '開始', to: '終了', }, }, + + // Maintenance page maintenance: { title: 'メンテナンス', overview: '概要', @@ -1138,15 +1080,32 @@ export default { noHistory: 'メンテナンス履歴がありません', editPrintHours: '印刷時間を編集', currentHours: '現在の時間', + // Tabs + statusTab: 'ステータス', + settingsTab: '設定', + // Status + overdueCount: '{{count}}件超過', + dueSoonCount: '{{count}}件まもなく期限', dueSoon: 'まもなく期限', allGood: '問題なし', + overdueBy: '{{duration}}超過', + dueIn: 'あと{{duration}}', + timeLeft: '残り{{duration}}', + // Duration formats + day: '1日', days: '日', + week: '1週間', weeks: '{{count}}週間', + month: '1ヶ月', months: '{{count}}ヶ月', + year: '1年', + // Settings maintenanceTypes: 'メンテナンスタイプ', + maintenanceTypesDescription: 'システムタイプとカスタムメンテナンスタスク', addCustomType: 'カスタムタイプを追加', restoreDefaults: 'デフォルトタスクを復元', intervalType: 'インターバルタイプ', + intervalValue: '間隔 ({{type}})', icon: 'アイコン', documentationLink: 'ドキュメントリンク(任意)', assignToPrinters: 'プリンターに割り当て', @@ -1155,12 +1114,19 @@ export default { custom: 'カスタム', printHours: '印刷時間', calendarDays: 'カレンダー日数', + exampleName: '例: HEPAフィルター交換', viewDocumentation: 'ドキュメントを表示', timeBasedInterval: '時間ベースのインターバル', + // Interval overrides intervalOverrides: 'インターバルのオーバーライド', + intervalOverridesDescription: '特定のプリンターの間隔をカスタマイズ', + // Printer assignment assignedToPrinters: '割り当て済みプリンター:', noPrintersAssigned: 'プリンター未割り当て', + addPrinterShort: '追加:', + printersAssignedClick: '{{count}}台のプリンターを割り当て済み - クリックして管理', removeFromPrinter: 'このプリンターから削除', + // Types types: { lubricateCarbonRods: 'カーボンロッドの潤滑', lubricateRails: 'リニアレールの潤滑', @@ -1177,61 +1143,105 @@ export default { replaceCarbonFilter: 'カーボンフィルター交換', lubricateLeftNozzleRail: '左ノズルレールの潤滑', }, + // Toast + maintenanceComplete: 'メンテナンスを完了としてマークしました', typeUpdated: 'メンテナンスタイプを更新しました', typeDeleted: 'メンテナンスタイプを削除しました', defaultsRestored: 'デフォルトタスクを{{count}}件復元しました', + printHoursUpdated: '印刷時間を更新しました', printerAssigned: 'プリンターを割り当てました', printerRemoved: 'プリンターを削除しました', + // Confirmation deleteTypeConfirm: '「{{name}}」を削除しますか?', deleteSystemTypeTitle: 'デフォルトのメンテナンスタスクを削除しますか?', deleteSystemTypeMessage: 'デフォルトのメンテナンスタスク「{{name}}」を削除してもよろしいですか?', + // Permissions noPermissionUpdate: 'メンテナンス記録を更新する権限がありません', noPermissionPerform: 'メンテナンスを実行する権限がありません', noPermissionEditTypes: 'メンテナンスタイプを編集する権限がありません', noPermissionDeleteTypes: 'メンテナンスタイプを削除する権限がありません', noPermissionEditHours: 'メンテナンス時間を編集する権限がありません', - noPermissionEditIntervals: 'メンテナンス間隔を編集する権限がありません', - statusTab: 'ステータス', - settingsTab: '設定', - overdueCount: '{{count}}件超過', - dueSoonCount: '{{count}}件まもなく期限', - overdueBy: '{{duration}}超過', - dueIn: 'あと{{duration}}', - timeLeft: '残り{{duration}}', - day: '1日', - week: '1週間', - month: '1ヶ月', - year: '1年', - maintenanceTypesDescription: 'システムタイプとカスタムメンテナンスタスク', - intervalValue: '間隔 ({{type}})', - exampleName: '例: HEPAフィルター交換', - intervalOverridesDescription: '特定のプリンターの間隔をカスタマイズ', - addPrinterShort: '追加:', - printersAssignedClick: '{{count}}台のプリンターを割り当て済み - クリックして管理', - maintenanceComplete: 'メンテナンスを完了としてマークしました', - printHoursUpdated: '印刷時間を更新しました', noPermissionRemovePrinter: 'プリンターの割り当てを解除する権限がありません', noPermissionAssignPrinter: 'プリンターを割り当てる権限がありません', + noPermissionEditIntervals: 'メンテナンス間隔を編集する権限がありません', + // Configure link configureSettings: 'メンテナンスタイプと間隔を設定', }, + + // Settings page settings: { title: '設定', general: '一般', + // Tab names tabs: { general: '一般', smartPlugs: 'スマートプラグ', notifications: '通知', - apiKeys: 'APIキー', - users: '認証', - backup: 'バックアップ', filament: 'フィラメント', network: 'ネットワーク', + apiKeys: 'APIキー', virtualPrinter: '仮想プリンター', + users: '認証', + backup: 'バックアップ', emailAuth: 'メール認証', }, + // Email settings + email: { + smtpSettings: 'SMTP設定', + smtpHost: 'SMTPサーバー', + smtpPort: 'SMTPポート', + security: 'セキュリティ', + authentication: '認証', + username: 'ユーザー名', + password: 'パスワード', + fromEmail: '送信元メールアドレス', + fromName: '送信者名', + testConnection: 'SMTP接続テスト', + testRecipient: 'テスト受信者メール', + sendTest: 'テストメール送信', + sending: '送信中...', + save: '設定を保存', + saving: '保存中...', + advancedAuth: '高度な認証', + advancedAuthEnabled: '高度な認証が有効です', + advancedAuthEnabledDesc: 'メールベースのユーザー管理機能が有効になっています。新規ユーザーには自動生成されたパスワードがメールで送信され、ユーザーはパスワード忘れ機能でパスワードをリセットできます。', + advancedAuthDisabled: '高度な認証が無効です', + advancedAuthDisabledDesc: '高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。', + enable: '有効にする', + disable: '無効にする', + feature1: 'パスワードは自動生成され、新規ユーザーにメールで送信されます', + feature2: 'ユーザーはユーザー名またはメールでログインできます', + feature3: 'パスワード忘れ機能が利用可能です', + feature4: '管理者はメールでユーザーパスワードをリセットできます', + // Error messages + errors: { + requiredFields: 'すべての必須フィールドに入力してください', + usernameRequired: '認証が有効な場合、ユーザー名は必須です', + enterTestEmail: 'テストメールアドレスを入力してください', + smtpServerAndEmail: 'テストする前にSMTPサーバーと送信元メールを入力してください', + usernamePasswordRequired: '認証が有効な場合、ユーザー名とパスワードは必須です', + configureSmtpFirst: '最初にSMTP設定を構成してテストしてください', + }, + // Success messages + success: { + settingsSaved: 'SMTP設定を保存しました', + }, + // Security options + securityOptions: { + starttls: 'STARTTLS (ポート 587)', + ssl: 'SSL/TLS (ポート 465)', + none: 'なし (ポート 25)', + }, + // Authentication options + authOptions: { + enabled: '有効', + disabled: '無効', + }, + }, appearance: '外観', notifications: '通知', smartPlugs: 'スマートプラグ', + spoolman: 'Spoolman', updates: 'アップデート', language: '言語', languageDescription: '表示言語を選択してください', @@ -1247,6 +1257,7 @@ export default { latestVersion: '最新バージョン', upToDate: '最新です', updateAvailable: 'アップデートあり', + // Notifications notificationLanguage: '通知の言語', notificationLanguageDescription: 'プッシュ通知の言語', bedCooledThreshold: 'ベッド冷却しきい値', @@ -1276,6 +1287,7 @@ export default { maintenanceDue: 'メンテナンス期限', maintenanceDueDescription: 'メンテナンスが必要なときに通知', }, + // Smart Plugs smartPlug: { title: 'スマートプラグ', add: 'スマートプラグを追加', @@ -1294,268 +1306,7 @@ export default { turnOn: '電源オン', turnOff: '電源オフ', }, - // Email settings (Advanced Auth) - email: { - smtpSettings: 'SMTP設定', - smtpHost: 'SMTPサーバー', - smtpPort: 'SMTPポート', - security: 'セキュリティ', - authentication: '認証', - username: 'ユーザー名', - password: 'パスワード', - fromEmail: '送信元メールアドレス', - fromName: '送信者名', - testConnection: 'SMTP接続テスト', - testRecipient: 'テスト受信者メール', - sendTest: 'テストメール送信', - sending: '送信中...', - save: '設定を保存', - saving: '保存中...', - advancedAuth: '高度な認証', - advancedAuthEnabled: '高度な認証が有効です', - advancedAuthEnabledDesc: 'メールベースのユーザー管理機能が有効になっています。新規ユーザーには自動生成されたパスワードがメールで送信され、ユーザーはパスワード忘れ機能でパスワードをリセットできます。', - advancedAuthDisabled: '高度な認証が無効です', - advancedAuthDisabledDesc: '高度な認証を有効にして、ユーザー管理のメールベース機能を有効化してください。', - enable: '有効にする', - disable: '無効にする', - feature1: 'パスワードは自動生成され、新規ユーザーにメールで送信されます', - feature2: 'ユーザーはユーザー名またはメールでログインできます', - feature3: 'パスワード忘れ機能が利用可能です', - feature4: '管理者はメールでユーザーパスワードをリセットできます', - errors: { - requiredFields: 'すべての必須フィールドに入力してください', - usernameRequired: '認証が有効な場合、ユーザー名は必須です', - enterTestEmail: 'テストメールアドレスを入力してください', - smtpServerAndEmail: 'テストする前にSMTPサーバーと送信元メールを入力してください', - usernamePasswordRequired: '認証が有効な場合、ユーザー名とパスワードは必須です', - configureSmtpFirst: '最初にSMTP設定を構成してテストしてください', - }, - success: { - settingsSaved: 'SMTP設定を保存しました', - }, - securityOptions: { - starttls: 'STARTTLS (ポート 587)', - ssl: 'SSL/TLS (ポート 465)', - none: 'なし (ポート 25)', - }, - authOptions: { - enabled: '有効', - disabled: '無効', - }, - }, - noDefaultPrinter: 'デフォルトなし(毎回選択)', - sidebarOrder: 'サイドバーの順序', - saveThumbnails: 'サムネイルを保存', - captureFinishPhoto: '完了写真を撮影', - noPrintersConfigured: 'プリンターが設定されていません', - checkPrinterFirmware: 'プリンターファームウェアの確認', - includeBetaUpdates: 'ベータ版を含める', - includeBetaUpdatesDesc: 'アップデート確認時にベータ版およびプレリリース版を通知する', - enableRetry: 'リトライを有効化', - homeAssistantDescription: 'Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。', - environmentManagedLabel: '(環境変数で管理)', - autoEnabledViaEnv: '環境変数により自動的に有効化されました', - urlFromEnvReadOnly: 'HA_URL環境変数で設定された値(読み取り専用)', - tokenFromEnvReadOnly: 'HA_TOKEN環境変数で設定された値(読み取り専用)', - noSmartPlugsDescription: 'Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。', - noProvidersDescription: 'アラートを受信するにはプロバイダーを追加してください。', - noUsersFound: 'ユーザーが見つかりません', - noGroupsFound: 'グループが見つかりません', - noGroupsAvailable: '利用可能なグループがありません', - passwordsDoNotMatch: 'パスワードが一致しません', - authDisabledTitle: '認証が無効です', - deleteUserConfirm: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。', - actionCannotBeUndone: 'この操作は元に戻せません', - addFirstSmartPlug: '最初のスマートプラグを追加', - providers: 'プロバイダー', - log: 'ログ', - testAll: 'すべてテスト', - testResults: 'テスト結果', - messageTemplates: 'メッセージテンプレート', - apiKeys: 'APIキー', - apiKeysDescription: '外部連携やWebhook用のAPIキーを作成します。', - createKey: 'キーを作成', - apiKeyCreated: 'APIキーを作成しました', - apiKeyCopyWarning: '今すぐこのキーをコピーしてください - 再表示されません!', - createNewApiKey: '新しいAPIキーを作成', - keyName: 'キー名', - readStatus: 'ステータスの読み取り', - readStatusDescription: 'プリンターのステータスとキューを表示', - manageQueue: 'キューの管理', - manageQueueDescription: '印刷キューへのアイテムの追加と削除', - controlPrinter: 'プリンターの制御', - controlPrinterDescription: '印刷の一時停止、再開、停止', - unnamedKey: '名前なしキー', - lastUsed: '最終使用:', - createFirstKey: '最初のキーを作成', - webhookEndpoints: 'Webhookエンドポイント', - webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。', - webhook: { - pausePrint: '印刷を一時停止', - resumePrint: '印刷を再開', - getAllStatus: '全プリンターステータスを取得', - getSpecificStatus: '特定のプリンターステータスを取得', - addToQueue: '印刷キューに追加', - stopPrint: '印刷を停止', - }, - apiBrowser: 'APIブラウザ', - apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。', - apiKeyForTesting: 'テスト用APIキー', - apiKeyPlaceholder: 'CallMeBot APIキー', - deleteApiKeyTitle: 'APIキーを削除', - deleteApiKeyMessage: 'このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。', - deleteKey: 'キーを削除', - amsThresholdsDescription: 'AMS湿度と温度インジケーターの色しきい値を設定します。', - humidity: '湿度', - goodGreen: '良好(緑)≤', - fairOrange: '普通(オレンジ)≤', - aboveFairBad: '普通のしきい値以上は赤(悪い)で表示', - temperature: '温度', - goodBlue: '良好(青)≤', - aboveFairHot: '普通のしきい値以上は赤(高温)で表示', - historyRetention: '履歴の保持', - historyRetentionDescription: '古い湿度と温度データは自動的に削除されます', - printModal: '印刷ダイアログ', - authentication: '認証', - authDisabledDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。', - enableAuthentication: '認証を有効にする', - currentUser: '現在のユーザー', - changePassword: 'パスワードを変更', - admin: '管理者', - users: 'ユーザー', - addUser: 'ユーザーを追加', - groups: 'グループ', - addGroup: 'グループを追加', - noDescription: '説明なし', - createUser: 'ユーザーを作成', - username: 'ユーザー名', - enterUsername: 'ユーザー名を入力', - password: 'パスワード', - enterPassword: 'パスワードを入力(6文字以上)', - confirmPassword: 'パスワードの確認', - confirmPasswordPlaceholder: 'パスワードを確認', - turnAllPlugsOn: 'すべてのプラグをオン', - turnAllPlugsOff: 'すべてのプラグをオフ', - clearLogsMessage: '30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。', - clearLogs: '通知ログを削除', - resetPreferences: '設定をリセット', - deleteGroup: 'グループを削除', - systemDefault: 'システムデフォルト', - archiveSettings: 'アーカイブ設定', - costTracking: 'コスト追跡', - dataManagement: 'データ管理', - storageUsage: 'ストレージ使用量', - storageUsageDescription: 'カテゴリ別のデータ使用量の内訳', - storageUsageTotal: '合計', - storageUsageErrors: 'エラー', - storageUsageOtherBreakdown: 'その他(静的アセット、スクリプト、設定ファイルを含む)', - storageUsageSystem: 'システム', - storageUsageData: 'データ', - storageUsageUnavailable: 'ストレージ使用量情報は利用できません', - enableMqtt: 'MQTTを有効化', - useTls: 'TLSを使用', - enableMetricsEndpoint: 'メトリクスエンドポイントを有効化', - availableMetrics: '利用可能なメトリクス', - editUser: 'ユーザーを編集', - groupName: 'グループ名', - enterNewPassword: '新しいパスワードを入力', - confirmNewPassword: '新しいパスワードを確認', - enterGroupName: 'グループ名を入力', - enterCurrentPassword: '現在のパスワードを入力', - enterNewPasswordMin6: '新しいパスワードを入力(6文字以上)', - toast: { - keyCopied: 'キーをクリップボードにコピーしました', - keyAddedToBrowser: 'キーをAPIブラウザに追加しました', - clearLogsFailed: 'ログの削除に失敗しました', - apiKeyCreated: 'APIキーを作成しました', - apiKeyDeleted: 'APIキーを削除しました', - userCreated: 'ユーザーが正常に作成されました', - userUpdated: 'ユーザーが正常に更新されました', - userDeleted: 'ユーザーが正常に削除されました', - fillRequiredFields: '必須項目をすべて入力してください', - passwordsDoNotMatch: 'パスワードが一致しません', - enterGroupName: 'グループ名を入力', - settingsSaved: '設定を保存しました', - passwordChanged: 'パスワードが正常に変更されました', - connectionFailed: '接続失敗', - testFailed: 'テスト通知の送信に失敗しました', - uiPreferencesReset: 'UI設定をリセットしました。更新中...', - authDisabled: '認証を無効にしました', - authDisableFailed: '認証の無効化に失敗しました', - groupCreated: 'グループを作成しました', - groupUpdated: 'グループを更新しました', - groupDeleted: 'グループを削除しました', - passwordTooShort: 'パスワードは6文字以上必要です', - cameraConnected: 'カメラ接続{{resolution}}', - copyFailed: 'キーのコピーに失敗しました', - cameraSettingsSaved: 'カメラ設定を保存しました', - enterCameraUrl: 'カメラURLを入力してください', - }, - testConnection: '接続テスト', - spoolman: 'Spoolman', - archiveMode: { - always: '常にアーカイブを作成', - never: 'アーカイブを作成しない', - ask: '毎回確認', - }, - checkForUpdatesLabel: 'アップデートを確認', - mqttConnectedTo: '接続先:', - prometheusDescription: 'プリンターデータをPrometheus形式で公開', - noSmartPlugsTitle: 'スマートプラグが設定されていません', - noProvidersTitle: 'プロバイダーが設定されていません', - noTemplatesAvailable: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを生成してください。', - apiPermissionView: 'プリンターステータスとキューを表示', - apiPermissionEdit: '印刷キューにアイテムを追加・削除', - apiKeysEmptyTitle: 'APIキーがありません', - apiKeysEmptyDescription: '外部サービスと連携するためのAPIキーを作成してください。', - systemGroupWarning: 'システムグループ名は変更できません', - authDisabledFeature1: 'システムへのアクセスにログインを要求', - authDisabledFeature2: 'グループベースの権限で複数ユーザーを作成', - authDisabledFeature3: '50以上のきめ細かな権限でアクセスを制御', - userHasCreated: 'このユーザーは以下を作成しています:', - userItemsQuestion: 'これらのアイテムをどうしますか?', - testPassedCount: '{{count}}件成功', - testFailedCount: '{{count}}件失敗', - messageTemplatesDescription: '各イベントの通知メッセージをカスタマイズ。', - useInApiBrowser: 'APIブラウザーで使用', - keyNamePlaceholder: '例: Home Assistant, OctoPrint', - read: '読み取り', - control: '制御', - apiKeyHint: 'このキーはX-API-Keyヘッダーとしてリクエストに送信されます。', - amsDisplayThresholds: 'AMS表示しきい値', - keepSensorHistory: 'センサー履歴の保持期間', - expandCustomMapping: 'カスタムマッピングをデフォルトで展開', - expandCustomMappingDescription: '複数プリンターに印刷する際、プリンターごとのAMSマッピングを展開表示', - authEnabledDescription: 'ユーザー認証でインスタンスが保護されています', - authDisabledMessage: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。', - system: 'システム', - userCount: '{{count}}人のユーザー', - permissionCount: '{{count}}件の権限', - viewReleaseOnGitHub: 'GitHubでリリースを表示', - clearNotificationLogs: '通知ログをクリア', - resetUiPreferences: 'UI設定をリセット', - resetUiPreferencesMessage: 'すべてのUI設定をデフォルトにリセットします:サイドバー順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定は影響を受けません。クリア後にページがリロードされます。', - deleteGroupTitle: 'グループを削除', - deleteGroupMessage: 'このグループを削除しますか?このグループのユーザーはこれらの権限を失います。', - disableAuthenticationTitle: '認証を無効化', - disableAuthenticationMessage: '認証を無効にしますか?Bambuddyインスタンスにログインなしでアクセスできるようになります。ユーザーはデータベースに残りますが、認証は無効になります。', - disableAuthentication: '認証を無効化', - configureBambuddy: 'Bambuddyを設定', - newWindow: '新しいウィンドウ', - embeddedOverlay: '埋め込みオーバーレイ', - preferredSlicer: '優先スライサー', - preferredSlicerDescription: 'ファイルを開くスライサーアプリケーションを選択', - externalCameras: '外部カメラ', - printsOnly: '印刷のみ', - totalConsumption: '総消費量', - clearNotificationLogsDescription: '30日以上前の通知ログを削除', - resetUiPreferencesDescription: 'サイドバー順序、テーマ、表示モード、レイアウト設定をリセット。プリンター、アーカイブ、設定は影響を受けません。', - enableHomeAssistant: 'Home Assistantを有効化', - deleteUserTitle: 'ユーザーを削除', - leaveEmptyForAnonymous: '匿名の場合は空のまま', - leaveEmptyForNoAuth: '認証なしの場合は空のまま', - enterDescriptionOptional: '説明を入力(任意)', - // フィラメント追跡モード + // Filament Tracking Mode filamentTracking: 'フィラメント追跡', filamentTrackingDesc: 'フィラメントスプールの追跡方法を選択してください。内蔵インベントリまたは外部Spoolmanサーバーを使用できます。', trackingModeBuiltIn: '内蔵インベントリ', @@ -1571,7 +1322,7 @@ export default { amsSyncing: '同期中...', amsSyncSuccess: '{{synced}}個のスプールを同期、{{skipped}}個をスキップ', amsSyncError: 'AMSからの重量同期に失敗しました', - // Spoolman設定 + // Spoolman settings spoolmanUrl: 'Spoolman URL', spoolmanUrlHint: 'Spoolmanサーバーのurl(例:http://localhost:7912)', spoolmanConnected: '接続中', @@ -1593,6 +1344,245 @@ export default { syncAmsData: 'AMSデータを同期', syncAmsDataDesc: 'プリンターのAMSデータをSpoolmanに手動同期', allPrinters: '全プリンター', + // Default printer + noDefaultPrinter: 'デフォルトなし(毎回選択)', + // Sidebar + sidebarOrder: 'サイドバーの順序', + // Camera + saveThumbnails: 'サムネイルを保存', + captureFinishPhoto: '完了写真を撮影', + noPrintersConfigured: 'プリンターが設定されていません', + // Archive settings + archiveMode: { + always: '常にアーカイブを作成', + never: 'アーカイブを作成しない', + ask: '毎回確認', + }, + // Updates + checkForUpdatesLabel: 'アップデートを確認', + checkPrinterFirmware: 'プリンターファームウェアの確認', + includeBetaUpdates: 'ベータ版を含める', + includeBetaUpdatesDesc: 'アップデート確認時にベータ版およびプレリリース版を通知する', + // Queue + enableRetry: 'リトライを有効化', + // Home Assistant + homeAssistantDescription: 'Home Assistantに接続してHA REST APIでスマートプラグを制御します。switch、light、input_booleanエンティティに対応しています。', + environmentManagedLabel: '(環境変数で管理)', + autoEnabledViaEnv: '環境変数により自動的に有効化されました', + urlFromEnvReadOnly: 'HA_URL環境変数で設定された値(読み取り専用)', + tokenFromEnvReadOnly: 'HA_TOKEN環境変数で設定された値(読み取り専用)', + // MQTT + mqttConnectedTo: '接続先:', + // Prometheus + prometheusDescription: 'プリンターデータをPrometheus形式で公開', + // Smart plugs empty state + noSmartPlugsTitle: 'スマートプラグが設定されていません', + noSmartPlugsDescription: 'Tasmotaベースのスマートプラグを追加して、エネルギー消費を追跡し、電源制御を自動化します。', + // Notifications empty state + noProvidersTitle: 'プロバイダーが設定されていません', + noProvidersDescription: 'アラートを受信するにはプロバイダーを追加してください。', + noTemplatesAvailable: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを生成してください。', + // API permissions + apiPermissionView: 'プリンターステータスとキューを表示', + apiPermissionEdit: '印刷キューにアイテムを追加・削除', + // API keys + apiKeysEmptyTitle: 'APIキーがありません', + apiKeysEmptyDescription: '外部サービスと連携するためのAPIキーを作成してください。', + // Users + noUsersFound: 'ユーザーが見つかりません', + noGroupsFound: 'グループが見つかりません', + noGroupsAvailable: '利用可能なグループがありません', + passwordsDoNotMatch: 'パスワードが一致しません', + systemGroupWarning: 'システムグループ名は変更できません', + // Auth disabled + authDisabledTitle: '認証が無効です', + authDisabledFeature1: 'システムへのアクセスにログインを要求', + authDisabledFeature2: 'グループベースの権限で複数ユーザーを作成', + authDisabledFeature3: '50以上のきめ細かな権限でアクセスを制御', + // User deletion + userHasCreated: 'このユーザーは以下を作成しています:', + userItemsQuestion: 'これらのアイテムをどうしますか?', + deleteUserConfirm: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。', + actionCannotBeUndone: 'この操作は元に戻せません', + // Smart plugs + addFirstSmartPlug: '最初のスマートプラグを追加', + // Notifications + providers: 'プロバイダー', + log: 'ログ', + testAll: 'すべてテスト', + testResults: 'テスト結果', + testPassedCount: '{{count}}件成功', + testFailedCount: '{{count}}件失敗', + messageTemplates: 'メッセージテンプレート', + messageTemplatesDescription: '各イベントの通知メッセージをカスタマイズ。', + // API Keys section + apiKeys: 'APIキー', + apiKeysDescription: '外部連携やWebhook用のAPIキーを作成します。', + createKey: 'キーを作成', + apiKeyCreated: 'APIキーを作成しました', + apiKeyCopyWarning: '今すぐこのキーをコピーしてください - 再表示されません!', + useInApiBrowser: 'APIブラウザーで使用', + createNewApiKey: '新しいAPIキーを作成', + keyName: 'キー名', + keyNamePlaceholder: '例: Home Assistant, OctoPrint', + readStatus: 'ステータスの読み取り', + readStatusDescription: 'プリンターのステータスとキューを表示', + manageQueue: 'キューの管理', + manageQueueDescription: '印刷キューへのアイテムの追加と削除', + controlPrinter: 'プリンターの制御', + controlPrinterDescription: '印刷の一時停止、再開、停止', + unnamedKey: '名前なしキー', + lastUsed: '最終使用:', + read: '読み取り', + control: '制御', + createFirstKey: '最初のキーを作成', + webhookEndpoints: 'Webhookエンドポイント', + webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。', + webhook: { + getAllStatus: '全プリンターステータスを取得', + getSpecificStatus: '特定のプリンターステータスを取得', + addToQueue: '印刷キューに追加', + pausePrint: '印刷を一時停止', + resumePrint: '印刷を再開', + stopPrint: '印刷を停止', + }, + apiBrowser: 'APIブラウザ', + apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。', + apiKeyForTesting: 'テスト用APIキー', + apiKeyPlaceholder: 'CallMeBot APIキー', + apiKeyHint: 'このキーはX-API-Keyヘッダーとしてリクエストに送信されます。', + deleteApiKeyTitle: 'APIキーを削除', + deleteApiKeyMessage: 'このAPIキーを削除してもよろしいですか?このキーを使用しているすべての連携が動作しなくなります。', + deleteKey: 'キーを削除', + // Filament tab + amsDisplayThresholds: 'AMS表示しきい値', + amsThresholdsDescription: 'AMS湿度と温度インジケーターの色しきい値を設定します。', + humidity: '湿度', + goodGreen: '良好(緑)≤', + fairOrange: '普通(オレンジ)≤', + aboveFairBad: '普通のしきい値以上は赤(悪い)で表示', + temperature: '温度', + goodBlue: '良好(青)≤', + aboveFairHot: '普通のしきい値以上は赤(高温)で表示', + historyRetention: '履歴の保持', + keepSensorHistory: 'センサー履歴の保持期間', + historyRetentionDescription: '古い湿度と温度データは自動的に削除されます', + printModal: '印刷ダイアログ', + expandCustomMapping: 'カスタムマッピングをデフォルトで展開', + expandCustomMappingDescription: '複数プリンターに印刷する際、プリンターごとのAMSマッピングを展開表示', + // User management + authentication: '認証', + authEnabledDescription: 'ユーザー認証でインスタンスが保護されています', + authDisabledDescription: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。', + authDisabledMessage: '認証を有効にして、ユーザーアカウントの作成、権限の管理、Bambuddyインスタンスのセキュリティを確保しましょう。', + enableAuthentication: '認証を有効にする', + currentUser: '現在のユーザー', + changePassword: 'パスワードを変更', + admin: '管理者', + users: 'ユーザー', + addUser: 'ユーザーを追加', + groups: 'グループ', + addGroup: 'グループを追加', + system: 'システム', + noDescription: '説明なし', + userCount: '{{count}}人のユーザー', + permissionCount: '{{count}}件の権限', + createUser: 'ユーザーを作成', + username: 'ユーザー名', + enterUsername: 'ユーザー名を入力', + password: 'パスワード', + enterPassword: 'パスワードを入力(6文字以上)', + confirmPassword: 'パスワードの確認', + confirmPasswordPlaceholder: 'パスワードを確認', + // Title tooltips + viewReleaseOnGitHub: 'GitHubでリリースを表示', + turnAllPlugsOn: 'すべてのプラグをオン', + turnAllPlugsOff: 'すべてのプラグをオフ', + // Modal: Clear logs + clearNotificationLogs: '通知ログをクリア', + clearLogsMessage: '30日以上前のすべての通知ログを完全に削除します。この操作は元に戻せません。', + clearLogs: '通知ログを削除', + // Modal: Reset UI + resetUiPreferences: 'UI設定をリセット', + resetUiPreferencesMessage: 'すべてのUI設定をデフォルトにリセットします:サイドバー順序、テーマ、ダッシュボードレイアウト、表示モード、ソート設定。プリンター、アーカイブ、サーバー設定は影響を受けません。クリア後にページがリロードされます。', + resetPreferences: '設定をリセット', + // Modal: Delete group + deleteGroupTitle: 'グループを削除', + deleteGroupMessage: 'このグループを削除しますか?このグループのユーザーはこれらの権限を失います。', + deleteGroup: 'グループを削除', + // Modal: Disable auth + disableAuthenticationTitle: '認証を無効化', + disableAuthenticationMessage: '認証を無効にしますか?Bambuddyインスタンスにログインなしでアクセスできるようになります。ユーザーはデータベースに残りますが、認証は無効になります。', + disableAuthentication: '認証を無効化', + // Additional settings + configureBambuddy: 'Bambuddyを設定', + systemDefault: 'システムデフォルト', + archiveSettings: 'アーカイブ設定', + newWindow: '新しいウィンドウ', + embeddedOverlay: '埋め込みオーバーレイ', + preferredSlicer: '優先スライサー', + preferredSlicerDescription: 'ファイルを開くスライサーアプリケーションを選択', + externalCameras: '外部カメラ', + costTracking: 'コスト追跡', + printsOnly: '印刷のみ', + totalConsumption: '総消費量', + dataManagement: 'データ管理', + storageUsage: 'ストレージ使用量', + storageUsageDescription: 'カテゴリ別のデータ使用量の内訳', + storageUsageTotal: '合計', + storageUsageErrors: 'エラー', + storageUsageOtherBreakdown: 'その他(静的アセット、スクリプト、設定ファイルを含む)', + storageUsageSystem: 'システム', + storageUsageData: 'データ', + storageUsageUnavailable: 'ストレージ使用量情報は利用できません', + clearNotificationLogsDescription: '30日以上前の通知ログを削除', + resetUiPreferencesDescription: 'サイドバー順序、テーマ、表示モード、レイアウト設定をリセット。プリンター、アーカイブ、設定は影響を受けません。', + enableHomeAssistant: 'Home Assistantを有効化', + enableMqtt: 'MQTTを有効化', + useTls: 'TLSを使用', + enableMetricsEndpoint: 'メトリクスエンドポイントを有効化', + availableMetrics: '利用可能なメトリクス', + editUser: 'ユーザーを編集', + deleteUserTitle: 'ユーザーを削除', + groupName: 'グループ名', + // Placeholders + leaveEmptyForAnonymous: '匿名の場合は空のまま', + leaveEmptyForNoAuth: '認証なしの場合は空のまま', + enterNewPassword: '新しいパスワードを入力', + confirmNewPassword: '新しいパスワードを確認', + enterGroupName: 'グループ名を入力', + enterDescriptionOptional: '説明を入力(任意)', + enterCurrentPassword: '現在のパスワードを入力', + enterNewPasswordMin6: '新しいパスワードを入力(6文字以上)', + toast: { + keyCopied: 'キーをクリップボードにコピーしました', + copyFailed: 'キーのコピーに失敗しました', + keyAddedToBrowser: 'キーをAPIブラウザに追加しました', + clearLogsFailed: 'ログの削除に失敗しました', + uiPreferencesReset: 'UI設定をリセットしました。更新中...', + authDisabled: '認証を無効にしました', + authDisableFailed: '認証の無効化に失敗しました', + apiKeyCreated: 'APIキーを作成しました', + apiKeyDeleted: 'APIキーを削除しました', + userCreated: 'ユーザーが正常に作成されました', + userUpdated: 'ユーザーが正常に更新されました', + userDeleted: 'ユーザーが正常に削除されました', + groupCreated: 'グループを作成しました', + groupUpdated: 'グループを更新しました', + groupDeleted: 'グループを削除しました', + fillRequiredFields: '必須項目をすべて入力してください', + passwordsDoNotMatch: 'パスワードが一致しません', + passwordTooShort: 'パスワードは6文字以上必要です', + enterGroupName: 'グループ名を入力', + settingsSaved: '設定を保存しました', + cameraSettingsSaved: 'カメラ設定を保存しました', + enterCameraUrl: 'カメラURLを入力してください', + passwordChanged: 'パスワードが正常に変更されました', + connectionFailed: '接続失敗', + testFailed: 'テスト通知の送信に失敗しました', + cameraConnected: 'カメラ接続{{resolution}}', + }, + testConnection: '接続テスト', catalog: { spoolCatalog: 'スプールカタログ', spoolCatalogDescription: 'ブランド/タイプ別の空スプール重量。スプール追加時の自動重量検索に使用されます。', @@ -1665,6 +1655,8 @@ export default { importFailed: 'インポートに失敗しました:無効なJSON形式', }, }, + + // Notifications (for push notifications) notification: { printStarted: { title: '印刷開始', @@ -1703,6 +1695,8 @@ export default { body: '{{printer}}: {{items}} の対応が必要です', }, }, + + // Errors errors: { generic: '問題が発生しました', networkError: 'ネットワークエラーです。接続を確認してください。', @@ -1715,83 +1709,109 @@ export default { deleteFailed: '削除に失敗しました', loadFailed: 'データの読み込みに失敗しました', }, + + // HMS Errors modal + hmsErrors: { + title: 'エラー - {{name}}', + noErrors: 'エラーなし', + viewOnWiki: 'Bambu Lab Wikiで表示', + clearInstructions: 'プリンターでエラーをクリアするとここからも消えます。', + clearErrors: 'エラーをクリア', + clearSuccess: 'HMSエラーをクリアしました', + clearFailed: 'HMSエラーのクリアに失敗しました', + }, + + // MQTT Debug modal mqttDebug: { title: 'MQTTデバッグログ', searchPlaceholder: 'トピックまたはペイロードで検索...', noMessages: 'まだメッセージが記録されていません', + startLoggingHint: '「ログ開始」をクリックしてMQTTメッセージのキャプチャを開始', + noMessagesMatch: 'フィルターに一致するメッセージがありません', + adjustFilterHint: '検索条件やフィルター条件を調整してみてください', incoming: '受信', outgoing: '送信', loggingStopped: 'ログ記録停止', loggingActive: 'ログ記録中 - メッセージは自動更新されます', startLogging: 'ログ記録を開始', - topic: 'トピック', - startLoggingHint: '「ログ開始」をクリックしてMQTTメッセージのキャプチャを開始', - noMessagesMatch: 'フィルターに一致するメッセージがありません', - adjustFilterHint: '検索条件やフィルター条件を調整してみてください', stopLogging: 'ログ停止', clearLog: 'ログをクリア', + topic: 'トピック', timestamp: 'タイムスタンプ', direction: '方向', all: 'すべて', }, + + // Printer File Manager modal (printer internal storage) printerFiles: { - filterPlaceholder: 'ファイルを検索...', - deleteFileConfirm: 'このファイルを削除しますか?', - noFiles: 'このディレクトリにファイルがありません', - loadingFiles: 'ファイルを読み込み中...', - failedToLoad: 'ファイルの読み込みに失敗しました', title: 'ファイル管理', storageUsed: '使用中:', storageFree: '空き:', + filterPlaceholder: 'ファイルを検索...', deleteButton: '削除', deleteFiles: '{{count}}件のファイルを削除', + deleteFileConfirm: 'このファイルを削除しますか?', deleteFilesConfirm: '選択した{{count}}件のファイルを削除しますか?元に戻せません。', + noFiles: 'このディレクトリにファイルがありません', + loadingFiles: 'ファイルを読み込み中...', + failedToLoad: 'ファイルの読み込みに失敗しました', toast: { filesDeleted: '{{count}}件のファイルを削除しました', deleteFailed: '削除に失敗: {{error}}', }, }, + + // Confirmations confirm: { delete: '削除しますか?', unsavedChanges: '保存されていない変更があります。このページを離れますか?', clearQueue: 'キューをクリアしますか?', }, + + // Login page login: { title: 'Bambuddy ログイン', subtitle: 'アカウントにサインイン', username: 'ユーザー名', usernamePlaceholder: 'ユーザー名を入力', + usernameOrEmail: 'ユーザー名またはメール', + usernameOrEmailPlaceholder: 'ユーザー名または @ メール', password: 'パスワード', passwordPlaceholder: 'パスワードを入力', signIn: 'サインイン', - enterCredentials: 'ユーザー名とパスワードを入力してください', signingIn: 'ログイン中...', forgotPassword: 'パスワードをお忘れですか?', loginSuccess: 'ログインしました', loginFailed: 'ログインに失敗しました', + enterCredentials: 'ユーザー名とパスワードを入力してください', forgotPasswordTitle: 'パスワードを忘れた場合', forgotPasswordMessage: 'パスワードを忘れた場合は、システム管理者に連絡してリセットしてもらってください。', - howToReset: 'パスワードのリセット方法:', - resetStep1: 'Bambuddy管理者に連絡', - resetStep2: 'ユーザー管理でパスワードリセットを依頼', - resetStep3: '管理者が新しい仮パスワードを設定', - resetStep4: '新しいパスワードでログインし、設定で変更', - gotIt: '了解', - // Advanced Auth (email-based login/reset) - usernameOrEmail: 'ユーザー名またはメール', - usernameOrEmailPlaceholder: 'ユーザー名または @ メール', forgotPasswordEmailMessage: 'メールアドレスを入力すると、新しいパスワードを送信します。', emailAddress: 'メールアドレス', emailPlaceholder: 'your.email@example.com', cancel: 'キャンセル', sending: '送信中...', sendResetEmail: 'リセットメールを送信', + howToReset: 'パスワードのリセット方法:', + resetStep1: 'Bambuddy管理者に連絡', + resetStep2: 'ユーザー管理でパスワードリセットを依頼', + resetStep3: '管理者が新しい仮パスワードを設定', + resetStep4: '新しいパスワードでログインし、設定で変更', + gotIt: '了解', }, + + // Setup page setup: { title: 'Bambuddy セットアップ', + subtitle: 'Bambuddyインスタンスの認証を設定', + enableAuth: '認証を有効化', adminAccount: '管理者アカウント', + adminAccountDesc: '既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効化されます。既存の管理者を使用する場合は下のフィールドを空のままにするか、新しい認証情報を入力して新しい管理者ユーザーを作成してください。', adminUsername: '管理者ユーザー名', adminPassword: '管理者パスワード', + optionalIfAdminExists: '(管理者ユーザーが存在する場合は任意)', + adminUsernamePlaceholder: '管理者ユーザー名を入力(任意)', + adminPasswordPlaceholder: '管理者パスワードを入力(任意)', confirmPassword: 'パスワードの確認', confirmPasswordPlaceholder: 'パスワードを確認', settingUp: 'セットアップ中...', @@ -1800,32 +1820,38 @@ export default { authEnabledAdminCreated: '認証が有効になり、管理者ユーザーが作成されました', authEnabledExistingAdmins: '既存の管理者ユーザーを使用して認証が有効になりました', setupCompleted: 'セットアップが完了しました', - passwordsDoNotMatch: 'パスワードが一致しません', enterBothCredentials: '管理者のユーザー名とパスワードの両方を入力するか、既存の管理者を使用する場合は両方を空にしてください', + passwordsDoNotMatch: 'パスワードが一致しません', passwordTooShort: 'パスワードは6文字以上必要です', }, - adminAccountDesc: '既に管理者ユーザーが存在する場合、既存の管理者アカウントを使用して認証が有効化されます。既存の管理者を使用する場合は下のフィールドを空のままにするか、新しい認証情報を入力して新しい管理者ユーザーを作成してください。', - optionalIfAdminExists: '(管理者ユーザーが存在する場合は任意)', - adminUsernamePlaceholder: '管理者ユーザー名を入力(任意)', - adminPasswordPlaceholder: '管理者パスワードを入力(任意)', - subtitle: 'Bambuddyインスタンスの認証を設定', - enableAuth: '認証を有効化', }, + + // Password change changePassword: { - currentPassword: '現在のパスワード', - newPassword: '新しいパスワード', - confirmPasswordPlaceholder: 'パスワードを確認', title: 'パスワードを変更', + currentPassword: '現在のパスワード', currentPasswordPlaceholder: '現在のパスワードを入力', + newPassword: '新しいパスワード', newPasswordPlaceholder: '新しいパスワードを入力(6文字以上)', confirmPassword: '新しいパスワード確認', + confirmPasswordPlaceholder: 'パスワードを確認', passwordsDoNotMatch: 'パスワードが一致しません', passwordTooShort: 'パスワードは6文字以上必要です', changing: '変更中...', success: 'パスワードを変更しました', failed: 'パスワードの変更に失敗しました', }, + + // Plate detection alert + plateAlert: { + title: '印刷が一時停止されました!', + message: 'ビルドプレート上にオブジェクトが検出されました。印刷が自動的に一時停止されました。プレートをクリアして印刷を再開してください。', + understand: '了解', + }, + + // Camera page camera: { + title: 'カメラビュー', invalidPrinterId: '無効なプリンターID', live: 'ライブ', snapshot: 'スナップショット', @@ -1836,35 +1862,41 @@ export default { connectingToCamera: 'カメラに接続中...', capturingSnapshot: 'スナップショットを撮影中...', connectionLost: '接続が切断されました', + connectionFailed: 'カメラ接続に失敗しました', + reconnecting: '{{countdown}}秒後に再接続... (試行 {{attempt}}/{{max}})', reconnectNow: '今すぐ再接続', cameraUnavailable: 'カメラが利用できません', + cameraUnavailableDesc: 'プリンターの電源がオンで接続されていることを確認してください。', + noCamera: 'カメラがありません', retry: '再試行', cameraStream: 'カメラストリーム', zoomOut: 'ズームアウト', zoomIn: 'ズームイン', resetZoom: 'ズームをリセット', - chamberLight: 'チャンバーライト切替', - title: 'カメラビュー', - connectionFailed: 'カメラ接続に失敗しました', - reconnecting: '{{countdown}}秒後に再接続... (試行 {{attempt}}/{{max}})', - cameraUnavailableDesc: 'プリンターの電源がオンで接続されていることを確認してください。', - noCamera: 'カメラがありません', recording: '録画中', startRecording: '録画開始', stopRecording: '録画停止', + chamberLight: 'チャンバーライト切替', }, + + // Groups management groups: { + title: 'グループ管理', + subtitle: 'アクセス制御の権限グループを管理', backToSettings: '設定に戻る', createGroup: 'グループを作成', noPermission: 'このページにアクセスする権限がありません。', + system: 'システム', noDescription: '説明なし', usersCount: '{{count}}人のユーザー', permissionsCount: '{{count}}個の権限', + edit: '編集', + delete: '削除', toast: { - deleted: 'アーカイブを削除しました', - enterGroupName: 'グループ名を入力', created: 'グループを作成しました', updated: 'グループを更新しました', + deleted: 'アーカイブを削除しました', + enterGroupName: 'グループ名を入力', }, modal: { editGroup: 'グループを編集', @@ -1876,16 +1908,16 @@ export default { }, form: { groupName: 'グループ名', - permissions: '権限', groupNamePlaceholder: 'グループ名を入力', systemGroupWarning: 'システムグループ名は変更できません', description: '説明', descriptionPlaceholder: '説明を入力(任意)', + permissions: '権限', }, deleteModal: { - confirm: '確認', title: 'グループを削除', message: 'このグループを削除しますか?このグループのユーザーはこれらの権限を失います。', + confirm: '確認', }, editor: { title: 'グループを編集', @@ -1896,19 +1928,18 @@ export default { permissionsSelected: '{{count}}件選択', noResults: '検索に一致する権限がありません', }, - title: 'グループ管理', - subtitle: 'アクセス制御の権限グループを管理', - system: 'システム', - edit: '編集', - delete: '削除', }, + + // Users management users: { title: 'ユーザー管理', + subtitle: 'ユーザーとBambuddyインスタンスへのアクセスを管理', backToSettings: '設定に戻る', createUser: 'ユーザーを作成', noPermission: 'このページにアクセスする権限がありません。', admin: '管理者', noGroups: 'グループなし', + active: 'アクティブ', inactive: '非アクティブ', edit: '編集', delete: '削除', @@ -1921,11 +1952,11 @@ export default { actions: 'アクション', }, toast: { - deleted: 'アーカイブを削除しました', - passwordsDoNotMatch: 'パスワードが一致しません', created: 'ユーザーを作成しました', updated: 'ユーザーを更新しました', + deleted: 'アーカイブを削除しました', fillRequired: '必須項目をすべて入力してください', + passwordsDoNotMatch: 'パスワードが一致しません', passwordTooShort: 'パスワードは6文字以上必要です', }, modal: { @@ -1939,17 +1970,17 @@ export default { }, form: { username: 'ユーザー名', + usernamePlaceholder: 'ユーザー名を入力', + email: 'メール', + emailPlaceholder: 'user@example.com', password: 'パスワード', + passwordPlaceholder: 'パスワードを入力', confirmPassword: 'パスワードの確認', confirmPasswordPlaceholder: 'パスワードを確認', + newPasswordPlaceholder: '新しいパスワードを入力', confirmNewPasswordPlaceholder: '新しいパスワードを確認', leaveBlankToKeep: '(現在のパスワードを維持する場合は空白)', groups: 'グループ', - usernamePlaceholder: 'ユーザー名を入力', - passwordPlaceholder: 'パスワードを入力', - newPasswordPlaceholder: '新しいパスワードを入力', - email: 'メール', - emailPlaceholder: 'user@example.com', optional: 'オプション', autoGeneratedPassword: '安全なパスワードが自動的に生成され、ユーザーにメールで送信されます。', passwordManagedByAdvancedAuth: 'パスワードは高度な認証によって管理されています。「パスワードのリセット」を使用して、メールで新しいパスワードをユーザーに送信してください。', @@ -1958,16 +1989,20 @@ export default { }, deleteModal: { title: 'ユーザーを削除', - confirm: 'ユーザーを削除', message: 'このユーザーを削除してもよろしいですか?この操作は元に戻せません。', + confirm: 'ユーザーを削除', }, - subtitle: 'ユーザーとBambuddyインスタンスへのアクセスを管理', - active: 'アクティブ', }, + + // Stream overlay streamOverlay: { + title: 'ストリームオーバーレイ', invalidPrinterId: '無効なプリンターID', cameraStream: 'カメラストリーム', + progress: '進捗', eta: '予想時間 {{minutes}} 分', + printerIdle: 'プリンター待機中', + printerOffline: 'プリンターオフライン', status: { printing: '印刷中', paused: '一時停止', @@ -1976,166 +2011,11 @@ export default { idle: '待機中', unknown: '不明', }, - title: 'ストリームオーバーレイ', - progress: '進捗', - printerIdle: 'プリンター待機中', - printerOffline: 'プリンターオフライン', }, + + // Profiles profiles: { title: 'フィラメントプロファイル', - connectedAs: '接続中:', - logout: 'ログアウト', - failedToLoad: 'ファイルの読み込みに失敗しました', - time: { - justNow: 'たった今', - hoursAgo: '{{count}}時間前', - daysAgo: '{{count}}日前', - minsAgo: '{{count}}分前', - }, - toast: { - loggedOut: 'ログアウトしました', - }, - login: { - title: 'Bambuddy ログイン', - subtitle: 'アカウントにサインイン', - email: 'メールアドレス', - password: 'パスワード', - region: 'リージョン', - regionGlobal: 'グローバル', - regionChina: '中国', - verificationCode: '認証コード', - totpCode: '認証アプリコード', - checkEmail: 'メール ({{email}}) に届いた6桁のコードを入力してください', - enterTotpHint: '認証アプリの6桁のコードを入力してください', - accessToken: 'アクセストークン', - accessTokenHint: 'Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)', - back: '戻る', - toast: { - loggedIn: 'ログインしました', - enterTotp: '認証アプリのコードを入力してください', - tokenSet: 'トークンを設定しました', - codeSent: 'メールに認証コードを送信しました', - }, - loginButton: 'ログイン', - verifyButton: '認証', - setTokenButton: 'トークンを設定', - useToken: 'アクセストークンを使用', - useEmail: 'メールでログイン', - }, - presets: { - duplicate: '複製', - editable: '編集可能', - failedToLoadDetails: 'プリセットの詳細を読み込めませんでした', - deleteConfirm: 'このプロファイルを削除しますか?', - noDeletePermission: 'プロジェクトを削除する権限がありません', - types: { - filament: 'フィラメント', - printer: 'プリンター', - process: 'プロセス', - }, - toast: { - deleted: 'アーカイブを削除しました', - fieldAdded: 'フィールド "{{key}}" を追加しました', - created: 'プリセットを作成しました', - updated: 'プリセットを更新しました', - duplicated: 'プリセットを複製しました', - exported: 'プリセットをエクスポートしました', - }, - newPreset: '新規プリセット', - editPreset: 'プリセットを編集', - duplicatePreset: 'プリセットを複製', - createNewPreset: '新しいプリセットを作成', - customizeSettings: '新しいプリセットの設定をカスタマイズ', - compareWithBase: 'ベースプリセットと比較', - compare: '比較', - basePreset: 'ベースプリセット', - selectBasePreset: 'ベースプリセットを選択...', - presetName: 'プリセット名', - inheritsFrom: '継承元:', - dropJsonToImport: 'JSONファイルをドロップしてインポート', - availableFields: '利用可能なフィールド', - noMatchingFields: '一致するフィールドがありません', - allFieldsAdded: 'すべてのフィールドが追加済みです', - addCustomField: 'カスタムフィールドを追加', - yourOverrides: 'オーバーライド一覧', - noOverridesYet: 'オーバーライドはまだありません', - clickFieldsToAdd: '左のフィールドをクリックして追加', - saveAsTemplate: 'テンプレートとして保存', - myPreset: 'マイプリセット(編集可能)', - deleteWarning: '「{{name}}」をBambu Cloudから完全に削除します。元に戻せません。', - noDuplicatePermission: 'プリセットを複製する権限がありません', - noEditPermission: 'プリセットを編集する権限がありません', - baseLabel: 'ベース: {{name}}', - currentLabel: '現在: {{name}}', - myCustomPreset: 'カスタムプリセット', - tabs: { - common: '一般', - allFields: 'すべてのフィールド', - }, - searchFieldsPlaceholder: 'フィールドを検索...', - jsonTip: 'ヒント: .jsonファイルをこのモーダルにドラッグ&ドロップして設定をインポート', - }, - cloudView: { - templates: 'テンプレート', - refresh: '更新', - newPreset: '新規プリセット', - clearFilters: 'フィルターをクリア', - compareMode: '比較モード', - selectAnotherPreset: '同じタイプ({{type}})の別のプリセットを選択', - clickTwoPresets: '同じタイプのプリセットを2つクリックして比較', - selectFirst: '1. 最初を選択', - selectSecond: '2. 2番目を選択', - compareNow: '比較を実行', - lastSynced: '最終同期:', - showingCount: '{{total}}件中{{shown}}件を表示', - noPresetsFound: 'プリセットが見つかりません', - columns: { - filament: 'フィラメント', - process: 'プロセス', - printer: 'プリンター', - }, - noFilamentPresets: 'フィラメントプリセットなし', - noProcessPresets: 'プロセスプリセットなし', - noPrinterPresets: 'プリンタープリセットなし', - filters: { - type: '種類', - owner: '所有者', - printer: 'プリンター', - nozzle: 'ノズル', - filament: 'フィラメント', - layer: 'レイヤー', - myPresets: 'マイプリセット', - builtIn: 'ビルトイン', - process: 'プロセス', - all: 'すべて', - }, - noCreatePermission: 'プロジェクトを作成する権限がありません', - searchPlaceholder: 'プリセットを検索...', - noTemplatesPermission: 'テンプレートを管理する権限がありません', - noRefreshPermission: 'プロファイルを更新する権限がありません', - }, - templates: { - title: 'フィラメントプロファイル', - noTemplates: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。', - typeFilter: 'タイプ:', - deleteConfirm: 'このプロファイルを削除しますか?', - settingsJson: '設定 (JSON)', - fieldsCount: '{{count}}フィールド', - shownInModals: 'モーダルに表示', - hiddenInModals: 'モーダルで非表示', - apply: '適用', - toast: { - deleted: 'アーカイブを削除しました', - updated: 'テンプレートを更新しました', - created: 'テンプレートを作成しました', - applied: 'テンプレートを適用しました', - }, - createFirst: 'プリセットエディタからテンプレートを作成', - deleteTitle: 'テンプレートを削除', - deleteWarning: 'この操作は元に戻せません', - namePlaceholder: 'テンプレート名', - descriptionPlaceholder: '説明', - }, subtitle: 'スライサープリセットと圧力キャリブレーションの管理', tabs: { cloud: 'クラウドプロファイル', @@ -2176,28 +2056,218 @@ export default { updated: 'プリセットを更新しました', }, }, + connectedAs: '接続中:', + logout: 'ログアウト', noLogoutPermission: 'ログアウトする権限がありません', + failedToLoad: 'ファイルの読み込みに失敗しました', retry: 'リトライ', + time: { + justNow: 'たった今', + minsAgo: '{{count}}分前', + hoursAgo: '{{count}}時間前', + daysAgo: '{{count}}日前', + }, + toast: { + loggedOut: 'ログアウトしました', + }, + login: { + title: 'Bambuddy ログイン', + subtitle: 'アカウントにサインイン', + email: 'メールアドレス', + password: 'パスワード', + region: 'リージョン', + regionGlobal: 'グローバル', + regionChina: '中国', + verificationCode: '認証コード', + totpCode: '認証アプリコード', + checkEmail: 'メール ({{email}}) に届いた6桁のコードを入力してください', + enterTotpHint: '認証アプリの6桁のコードを入力してください', + accessToken: 'アクセストークン', + accessTokenHint: 'Bambu Labのアクセストークンを貼り付け(Bambu Studioから取得)', + back: '戻る', + loginButton: 'ログイン', + verifyButton: '認証', + setTokenButton: 'トークンを設定', + useToken: 'アクセストークンを使用', + useEmail: 'メールでログイン', + toast: { + loggedIn: 'ログインしました', + codeSent: 'メールに認証コードを送信しました', + enterTotp: '認証アプリのコードを入力してください', + tokenSet: 'トークンを設定しました', + }, + }, + presets: { + myPreset: 'マイプリセット(編集可能)', + duplicate: '複製', + editable: '編集可能', + failedToLoadDetails: 'プリセットの詳細を読み込めませんでした', + deleteConfirm: 'このプロファイルを削除しますか?', + deleteWarning: '「{{name}}」をBambu Cloudから完全に削除します。元に戻せません。', + noDuplicatePermission: 'プリセットを複製する権限がありません', + noEditPermission: 'プリセットを編集する権限がありません', + noDeletePermission: 'プロジェクトを削除する権限がありません', + types: { + filament: 'フィラメント', + printer: 'プリンター', + process: 'プロセス', + }, + toast: { + deleted: 'アーカイブを削除しました', + created: 'プリセットを作成しました', + updated: 'プリセットを更新しました', + duplicated: 'プリセットを複製しました', + fieldAdded: 'フィールド "{{key}}" を追加しました', + exported: 'プリセットをエクスポートしました', + }, + baseLabel: 'ベース: {{name}}', + currentLabel: '現在: {{name}}', + newPreset: '新規プリセット', + editPreset: 'プリセットを編集', + duplicatePreset: 'プリセットを複製', + createNewPreset: '新しいプリセットを作成', + customizeSettings: '新しいプリセットの設定をカスタマイズ', + compareWithBase: 'ベースプリセットと比較', + compare: '比較', + // CreatePresetModal - Basic Info + basePreset: 'ベースプリセット', + selectBasePreset: 'ベースプリセットを選択...', + presetName: 'プリセット名', + myCustomPreset: 'カスタムプリセット', + inheritsFrom: '継承元:', + dropJsonToImport: 'JSONファイルをドロップしてインポート', + // CreatePresetModal - Tabs + tabs: { + common: '一般', + allFields: 'すべてのフィールド', + }, + // CreatePresetModal - All Fields Tab + availableFields: '利用可能なフィールド', + searchFieldsPlaceholder: 'フィールドを検索...', + noMatchingFields: '一致するフィールドがありません', + allFieldsAdded: 'すべてのフィールドが追加済みです', + addCustomField: 'カスタムフィールドを追加', + yourOverrides: 'オーバーライド一覧', + noOverridesYet: 'オーバーライドはまだありません', + clickFieldsToAdd: '左のフィールドをクリックして追加', + saveAsTemplate: 'テンプレートとして保存', + jsonTip: 'ヒント: .jsonファイルをこのモーダルにドラッグ&ドロップして設定をインポート', + }, + cloudView: { + searchPlaceholder: 'プリセットを検索...', + templates: 'テンプレート', + refresh: '更新', + newPreset: '新規プリセット', + clearFilters: 'フィルターをクリア', + // Compare mode + compareMode: '比較モード', + selectAnotherPreset: '同じタイプ({{type}})の別のプリセットを選択', + clickTwoPresets: '同じタイプのプリセットを2つクリックして比較', + selectFirst: '1. 最初を選択', + selectSecond: '2. 2番目を選択', + compareNow: '比較を実行', + // Status row + lastSynced: '最終同期:', + showingCount: '{{total}}件中{{shown}}件を表示', + noPresetsFound: 'プリセットが見つかりません', + // Column headers + columns: { + filament: 'フィラメント', + process: 'プロセス', + printer: 'プリンター', + }, + noFilamentPresets: 'フィラメントプリセットなし', + noProcessPresets: 'プロセスプリセットなし', + noPrinterPresets: 'プリンタープリセットなし', + // Filters + filters: { + type: '種類', + owner: '所有者', + printer: 'プリンター', + nozzle: 'ノズル', + filament: 'フィラメント', + layer: 'レイヤー', + all: 'すべて', + myPresets: 'マイプリセット', + builtIn: 'ビルトイン', + process: 'プロセス', + }, + // Permissions + noTemplatesPermission: 'テンプレートを管理する権限がありません', + noRefreshPermission: 'プロファイルを更新する権限がありません', + noCreatePermission: 'プロジェクトを作成する権限がありません', + }, + templates: { + title: 'フィラメントプロファイル', + noTemplates: 'テンプレートがありません。バックエンドを再起動してデフォルトテンプレートを作成してください。', + createFirst: 'プリセットエディタからテンプレートを作成', + typeFilter: 'タイプ:', + deleteTitle: 'テンプレートを削除', + deleteWarning: 'この操作は元に戻せません', + deleteConfirm: 'このプロファイルを削除しますか?', + namePlaceholder: 'テンプレート名', + descriptionPlaceholder: '説明', + settingsJson: '設定 (JSON)', + fieldsCount: '{{count}}フィールド', + shownInModals: 'モーダルに表示', + hiddenInModals: 'モーダルで非表示', + apply: '適用', + toast: { + deleted: 'アーカイブを削除しました', + updated: 'テンプレートを更新しました', + created: 'テンプレートを作成しました', + applied: 'テンプレートを適用しました', + }, + }, }, + + // Support/Debug + support: { + debugLoggingActive: 'デバッグログが有効です', + manageLogs: '管理', + collectItem7: 'プリンター接続状態とファームウェアバージョン', + collectItem8: '連携状態(Spoolman、MQTT、HA)', + collectItem9: 'ネットワークインターフェース(サブネットのみ)', + collectItem10: 'Pythonパッケージバージョン', + collectItem11: 'データベース健全性チェック', + collectItem12: 'Docker環境の詳細', + }, + + // File manager fileManager: { + title: 'ファイル管理', + subtitle: '印刷ファイルの整理と管理', uploadFiles: 'ファイルをアップロード', newFolder: '新しいフォルダ', folderName: 'フォルダ名', folderNamePlaceholder: '例: 機能パーツ', renameFile: 'ファイル名を変更', renameFolder: 'フォルダ名を変更', + moveFiles: '{{count}}件のファイルを移動', rootNoFolder: 'ルート(フォルダなし)', current: '(現在)', linkFolder: 'フォルダをリンク', linkFolderDescription: '「{{name}}」をプロジェクトまたはアーカイブにリンクしてすばやくアクセス。', + project: 'プロジェクト', + archive: 'アーカイブ', noProjectsFound: 'プロジェクトが見つかりません', noArchivesFound: 'アーカイブが見つかりません', unlink: 'リンク解除', link: 'リンク', + dragDropFiles: 'ファイルをここにドラッグ&ドロップ', dropFilesHere: 'ここにファイルをドロップ', orClickToBrowse: 'またはクリックして選択', + allFileTypesSupported: 'すべてのファイルタイプに対応。ZIPファイルは展開されます。', zipFilesDetected: 'ZIPファイルを検出', + zipExtractOptions: 'ZIPファイルは展開されます。フォルダー構造の処理方法を選択:', preserveZipStructure: 'ZIPのフォルダ構造を保持', + createFolderFromZip: 'ZIPファイル名からフォルダーを作成', + stlThumbnailGeneration: 'STLサムネイル生成', + zipMayContainStl: 'ZIPファイルにSTLファイルが含まれている場合があります。展開時にサムネイルを生成できます。', + thumbnailsCanBeGenerated: 'STLファイルのサムネイルを生成できます。大きなモデルは処理に時間がかかる場合があります。', + generateThumbnailsForStl: 'STLファイルのサムネイルを生成', + threemfDetected: '3MFファイルを検出', + threemfExtractionInfo: 'プリンターモデル、素材、色、印刷設定は3MFファイルから自動的に抽出されます。', willBeExtracted: '• 展開予定', filesExtracted: '• {{count}}個のファイルを展開済み', uploadComplete: 'アップロード完了: {{count}}個成功', @@ -2209,84 +2279,49 @@ export default { linkToProjectOrArchive: 'プロジェクトまたはアーカイブにリンク', addToQueue: 'キューに追加', schedulePrint: '印刷をスケジュール', + generateThumbnail: 'サムネイルを生成', + generateThumbnails: 'サムネイルを生成', + generateThumbnailsForMissing: 'サムネイルのないSTLファイルのサムネイルを生成', gridView: 'グリッド表示', listView: 'リスト表示', lowDiskSpaceWarning: 'ディスク容量不足の警告', + lowDiskSpaceDetails: '{{total}}中{{free}}の空き容量のみ。しきい値は設定で{{threshold}}GBに設定されています。', + files: 'ファイル', folders: 'フォルダ', size: 'サイズ', free: '空き:', allFiles: 'すべてのファイル', + wrap: '折り返し', + enableTextWrapping: 'テキスト折り返しを有効化', + disableTextWrapping: 'テキスト折り返しを無効化', + dragToResizeTooltip: 'ドラッグしてリサイズ、ダブルクリックでリセット', searchFiles: 'ファイルを検索...', allTypes: 'すべての種類', prints: '印刷回数', ascending: '昇順', descending: '降順', + resultsCount: '{{total}}件中{{showing}}件', selectAll: 'すべて選択', deselectAll: 'すべて選択解除', selected: '{{count}}件選択中', adding: '追加中...', loadingFiles: 'ファイルを読み込み中...', + folderIsEmpty: 'フォルダーは空です', noFilesYet: 'ファイルはまだありません', + folderEmptyDescription: 'ファイルをアップロードするか、このフォルダーにファイルを移動して開始しましょう。', + noFilesDescription: '印刷関連ファイルの整理を始めるにはファイルをアップロードしてください。', noMatchingFiles: '一致するファイルがありません', noMatchingFilesDescription: '現在の検索またはフィルター条件に一致するファイルがありません。', clearFilters: 'フィルターをクリア', printedCount: '{{count}}回印刷済み', + uploadedBy: 'アップロード者', deleteFolder: 'フォルダを削除', deleteFile: 'ファイルを削除', + deleteFilesCount: '{{count}}件のファイルを削除', deleteFolderConfirm: 'このフォルダを削除しますか?中のファイルもすべて削除されます。', deleteFileConfirm: 'このファイルを削除しますか?', - deleting: '削除中...', - toast: { - folderCreated: 'フォルダを作成しました', - folderDeleted: 'フォルダを削除しました', - fileDeleted: 'ファイルを削除しました', - filesMoved: 'ファイルを移動しました', - folderLinked: 'フォルダをリンクしました', - folderUnlinked: 'フォルダのリンクを解除しました', - addedToQueue: '{{count}}個のファイルをキューに追加しました', - fileRenamed: 'ファイル名を変更しました', - folderRenamed: 'フォルダ名を変更しました', - filesDeleted: '{{count}}件のファイルを削除しました', - addedToQueuePartial: '{{added}}件追加、{{failed}}件失敗', - failedToAddToQueue: 'ファイルの追加に失敗: {{error}}', - thumbnailsGenerated: '{{count}}件のサムネイルを生成しました', - thumbnailsGeneratedPartial: '{{succeeded}}件生成、{{failed}}件失敗', - noStlMissingThumbnails: 'サムネイルのないSTLファイルはありません', - failedToGenerateThumbnails: 'サムネイルの生成に失敗: {{error}}', - thumbnailGenerated: 'サムネイルを生成しました', - failedToGenerateThumbnail: 'サムネイルの生成に失敗: {{error}}', - }, - title: 'ファイル管理', - subtitle: '印刷ファイルの整理と管理', - moveFiles: '{{count}}件のファイルを移動', - project: 'プロジェクト', - archive: 'アーカイブ', - dragDropFiles: 'ファイルをここにドラッグ&ドロップ', - allFileTypesSupported: 'すべてのファイルタイプに対応。ZIPファイルは展開されます。', - zipExtractOptions: 'ZIPファイルは展開されます。フォルダー構造の処理方法を選択:', - createFolderFromZip: 'ZIPファイル名からフォルダーを作成', - stlThumbnailGeneration: 'STLサムネイル生成', - zipMayContainStl: 'ZIPファイルにSTLファイルが含まれている場合があります。展開時にサムネイルを生成できます。', - thumbnailsCanBeGenerated: 'STLファイルのサムネイルを生成できます。大きなモデルは処理に時間がかかる場合があります。', - generateThumbnailsForStl: 'STLファイルのサムネイルを生成', - threemfDetected: '3MFファイルを検出', - threemfExtractionInfo: 'プリンターモデル、素材、色、印刷設定は3MFファイルから自動的に抽出されます。', - generateThumbnail: 'サムネイルを生成', - generateThumbnails: 'サムネイルを生成', - generateThumbnailsForMissing: 'サムネイルのないSTLファイルのサムネイルを生成', - lowDiskSpaceDetails: '{{total}}中{{free}}の空き容量のみ。しきい値は設定で{{threshold}}GBに設定されています。', - files: 'ファイル', - wrap: '折り返し', - enableTextWrapping: 'テキスト折り返しを有効化', - disableTextWrapping: 'テキスト折り返しを無効化', - dragToResizeTooltip: 'ドラッグしてリサイズ、ダブルクリックでリセット', - resultsCount: '{{total}}件中{{showing}}件', - folderIsEmpty: 'フォルダーは空です', - folderEmptyDescription: 'ファイルをアップロードするか、このフォルダーにファイルを移動して開始しましょう。', - noFilesDescription: '印刷関連ファイルの整理を始めるにはファイルをアップロードしてください。', - uploadedBy: 'アップロード者', - deleteFilesCount: '{{count}}件のファイルを削除', deleteFilesConfirm: '選択した{{count}}件のファイルを削除しますか?この操作は元に戻せません。', + deleting: '削除中...', noPermissionRenameFolder: 'フォルダー名を変更する権限がありません', noPermissionLinkFolder: 'フォルダーをリンクする権限がありません', noPermissionDeleteFolder: 'フォルダーを削除する権限がありません', @@ -2300,7 +2335,29 @@ export default { noPermissionUpload: 'ファイルをアップロードする権限がありません', noPermissionMoveFiles: 'ファイルを移動する権限がありません', noPermissionDeleteFiles: 'ファイルを削除する権限がありません', + toast: { + folderCreated: 'フォルダを作成しました', + folderDeleted: 'フォルダを削除しました', + fileDeleted: 'ファイルを削除しました', + filesDeleted: '{{count}}件のファイルを削除しました', + filesMoved: 'ファイルを移動しました', + folderLinked: 'フォルダをリンクしました', + folderUnlinked: 'フォルダのリンクを解除しました', + addedToQueue: '{{count}}個のファイルをキューに追加しました', + addedToQueuePartial: '{{added}}件追加、{{failed}}件失敗', + failedToAddToQueue: 'ファイルの追加に失敗: {{error}}', + fileRenamed: 'ファイル名を変更しました', + folderRenamed: 'フォルダ名を変更しました', + thumbnailsGenerated: '{{count}}件のサムネイルを生成しました', + thumbnailsGeneratedPartial: '{{succeeded}}件生成、{{failed}}件失敗', + noStlMissingThumbnails: 'サムネイルのないSTLファイルはありません', + failedToGenerateThumbnails: 'サムネイルの生成に失敗: {{error}}', + thumbnailGenerated: 'サムネイルを生成しました', + failedToGenerateThumbnail: 'サムネイルの生成に失敗: {{error}}', + }, }, + + // Projects projects: { title: 'プロジェクト', subtitle: '印刷プロジェクトを管理', @@ -2308,78 +2365,88 @@ export default { editProject: 'プロジェクトを編集', deleteProject: 'プロジェクトを削除', projectName: 'プロジェクト: {{name}}', - create: '作成', - plates: 'プレート', - parts: 'パーツ', - viewDetails: '詳細を表示', - namePlaceholder: 'プロジェクト名', - descriptionPlaceholder: 'プロジェクトの説明(任意)', - color: '色', - targetPlates: '目標プレート数', - targetPlatesPlaceholder: '例: 10', - targetParts: '目標パーツ数', - targetPartsPlaceholder: '例: 50', - tagsPlaceholder: 'カンマ区切りのタグ', - dueDate: '期限', - priorityLow: '低', - priorityNormal: '通常', - priorityHigh: '高', - priorityUrgent: '緊急', - statusArchived: 'アーカイブ済み', - done: '完了', - completed: '完了', - failed: '失敗', - inQueue: 'キュー内', - noPrintsYet: '印刷履歴なし', - printJobs: '印刷ジョブ', - partsPrinted: '印刷済みパーツ', - failedParts: '失敗パーツ', - import: 'インポート', - importProject: 'プロジェクトをインポート', - loading: 'プロジェクトを読み込み中...', - noEditPermission: 'プロジェクトを編集する権限がありません', - noDeletePermission: 'プロジェクトを削除する権限がありません', - noCreatePermission: 'プロジェクトを作成する権限がありません', - noImportPermission: 'プロジェクトをインポートする権限がありません', - noExportPermission: 'プロジェクトをエクスポートする権限がありません', - toast: { - deleted: 'アーカイブを削除しました', - importFailed: 'インポートに失敗しました', - created: 'プロジェクトを作成しました', - updated: 'プロジェクトを更新しました', - imported: 'プロジェクトをインポートしました', - multipleImported: '{{count}}件のプロジェクトをインポートしました', - exported: 'プロジェクトをエクスポートしました(メタデータのみ)', - }, description: '説明', noProjects: 'プロジェクトはまだありません', noProjectsFiltered: '{{status}}のプロジェクトはありません', noProjectsFilteredHelp: '{{status}}のプロジェクトがありません。ステータスが変更されるとここに表示されます。', createFirst: '最初のプロジェクトを作成して、関連する印刷の整理、進捗管理、ビルドの管理を始めましょう。', createFirstButton: '最初のプロジェクトを作成', + create: '作成', files: 'ファイル', prints: '印刷', + plates: 'プレート', + parts: 'パーツ', lastModified: '最終更新日', deleteConfirm: 'このプロジェクトを削除しますか?アーカイブとキューアイテムはリンク解除されますが、削除されません。', addFiles: 'ファイルを追加', removeFile: 'ファイルを削除', + viewDetails: '詳細を表示', + // Modal fields + namePlaceholder: 'プロジェクト名', + descriptionPlaceholder: 'プロジェクトの説明(任意)', + color: '色', + targetPlates: '目標プレート数', + targetPlatesPlaceholder: '例: 10', targetPlatesHelp: '印刷ジョブの数', + targetParts: '目標パーツ数', + targetPartsPlaceholder: '例: 50', targetPartsHelp: '必要なオブジェクトの総数', tagsLabel: 'タグ(カンマ区切り)', + tagsPlaceholder: 'カンマ区切りのタグ', + dueDate: '期限', priority: '優先度', + priorityLow: '低', + priorityNormal: '通常', + priorityHigh: '高', + priorityUrgent: '緊急', + // Status statusActive: '進行中', statusCompleted: '完了', + statusArchived: 'アーカイブ済み', + done: '完了', + completed: '完了', + failed: '失敗', + inQueue: 'キュー内', + noPrintsYet: '印刷履歴なし', + // Footer stats + printJobs: '印刷ジョブ', + partsPrinted: '印刷済みパーツ', + failedParts: '失敗パーツ', + // Actions + import: 'インポート', export: 'エクスポート', + importProject: 'プロジェクトをインポート', exportAll: 'すべてのプロジェクトをエクスポート', + loading: 'プロジェクトを読み込み中...', + // Permissions + noEditPermission: 'プロジェクトを編集する権限がありません', + noDeletePermission: 'プロジェクトを削除する権限がありません', + noCreatePermission: 'プロジェクトを作成する権限がありません', + noImportPermission: 'プロジェクトをインポートする権限がありません', + noExportPermission: 'プロジェクトをエクスポートする権限がありません', + // Toast + toast: { + created: 'プロジェクトを作成しました', + updated: 'プロジェクトを更新しました', + deleted: 'アーカイブを削除しました', + imported: 'プロジェクトをインポートしました', + multipleImported: '{{count}}件のプロジェクトをインポートしました', + importFailed: 'インポートに失敗しました', + exported: 'プロジェクトをエクスポートしました(メタデータのみ)', + }, }, + + // Project detail page projectDetail: { notFound: '見つかりません', backToProjects: 'プロジェクト一覧に戻る', + export: 'エクスポート', exportProject: 'プロジェクトをエクスポート', noExportPermission: 'プロジェクトをエクスポートする権限がありません', noEditPermission: 'このプロジェクトを編集する権限がありません', partOf: '所属先', priorityLabel: '優先度', + noPrints: 'このプロジェクトにはまだ印刷がありません', status: { active: '進行中', completed: '完了', @@ -2393,8 +2460,8 @@ export default { }, dueDate: { overdue: '期限超過', - daysLeft: '残り{{count}}日', today: '今日が期限', + daysLeft: '残り{{count}}日', }, progress: { platesProgress: 'プレート進捗', @@ -2413,49 +2480,52 @@ export default { filamentUsed: 'フィラメント使用量', }, cost: { + title: 'コスト追跡', filamentCost: 'フィラメント', energy: 'エネルギー', budget: '予算', remaining: '残り', - title: 'コスト追跡', + }, + subProjects: { + title: 'サブプロジェクト ({{count}})', }, notes: { - noEditPermission: 'このプロジェクトを編集する権限がありません', - empty: '<空>', title: 'メモ', + noEditPermission: 'このプロジェクトを編集する権限がありません', placeholder: 'このプロジェクトについてメモを追加...', + empty: '<空>', }, files: { - fileCount: '{{count}}ファイル', - empty: '<空>', title: 'ファイル', linkFolders: 'ファイルマネージャーからフォルダーをリンク', forQuickAccess: 'してクイックアクセスできるようにします。', + fileCount: '{{count}}ファイル', + empty: '<空>', }, bom: { + title: '部品表', + acquired: '{{completed}}/{{total}} 取得済み', showAll: 'すべて表示', hideDone: '完了を非表示', addPart: 'パーツを追加', + noAddPermission: 'パーツを追加する権限がありません', partNamePlaceholder: 'パーツ名', + partName: 'パーツ名', qty: '数量', + price: '価格 ({{currency}})', sourcingUrlPlaceholder: 'URL(任意)', remarksPlaceholder: '備考', deletePart: 'パーツを削除', + deleteConfirm: '「{{name}}」を削除しますか?', + noUpdatePermission: 'パーツを更新する権限がありません', noEditPermission: 'このプロジェクトを編集する権限がありません', noDeletePermission: 'プロジェクトを削除する権限がありません', totalCost: '合計コスト', empty: '<空>', - title: '部品表', - acquired: '{{completed}}/{{total}} 取得済み', - noAddPermission: 'パーツを追加する権限がありません', - partName: 'パーツ名', - price: '価格 ({{currency}})', - deleteConfirm: '「{{name}}」を削除しますか?', - noUpdatePermission: 'パーツを更新する権限がありません', }, timeline: { - empty: '<空>', title: 'アクティビティタイムライン', + empty: '<空>', }, template: { saveAsTemplate: 'テンプレートとして保存', @@ -2467,6 +2537,9 @@ export default { printing: '印刷中', queued: 'キューに追加', }, + prints: { + title: '印刷 ({{count}})', + }, toast: { projectUpdated: 'プロジェクトを更新しました', partAdded: 'パーツを追加しました', @@ -2475,17 +2548,10 @@ export default { projectExported: 'プロジェクトがエクスポートされました', templateCreated: 'プロジェクトからテンプレートを作成しました', }, - export: 'エクスポート', - noPrints: 'このプロジェクトにはまだ印刷がありません', - subProjects: { - title: 'サブプロジェクト ({{count}})', - }, - prints: { - title: '印刷 ({{count}})', - }, }, + + // System info system: { - clearLogs: '通知ログを削除', title: 'システム情報', version: 'バージョン', uptime: '稼働時間', @@ -2498,53 +2564,60 @@ export default { enableDebug: 'デバッグログを有効化', disableDebug: 'デバッグログを無効化', downloadLogs: 'ログをダウンロード', + clearLogs: '通知ログを削除', dockerInfo: 'Docker情報', containerName: 'コンテナ名', imageName: 'イメージ名', platform: 'プラットフォーム', architecture: 'アーキテクチャ', }, + + // Library (K Profiles) library: { - material: '素材', - temperature: '温度', title: 'フィラメントライブラリ', addFilament: 'フィラメントを追加', editFilament: 'フィラメントを編集', deleteFilament: 'フィラメントを削除', vendor: 'メーカー', + material: '素材', color: '色', kFactor: 'K値', + temperature: '温度', noFilaments: 'ライブラリにフィラメントがありません', deleteConfirm: 'このフィラメントを削除しますか?', importFromPrinter: 'プリンターからインポート', exportToFile: 'ファイルにエクスポート', }, + + // Spoolman spoolman: { title: 'Spoolman連携', + enabled: 'Spoolman有効', url: 'Spoolman URL', connected: '接続中', disconnected: '未接続', + testConnection: '接続テスト', sync: '同期', + syncing: '同期中...', + lastSync: '最終同期', linkToSpoolman: 'Spoolmanに連携', + openInSpoolman: 'Spoolmanで開く', + unlinkSpool: 'スプールのリンクを解除', + selectSpool: 'スプールを選択', noUnlinkedSpools: 'Spoolmanに未連携のスプールが見つかりません。', + linkSuccess: 'スプールをSpoolmanにリンクしました', + linkFailed: 'スプールのリンクに失敗しました', + spoolId: 'スプールID', fillSourceLabel: '(Spoolman)', + weight: '重量', remaining: '残り', disableWeightSync: 'AMS推定重量同期を無効化', disableWeightSyncDesc: 'AMS推定値から残量を更新しません。AMSの割合ベースの推定よりもSpoolmanの使用量追跡を優先する場合に使用してください。新しいスプールは引き続きAMS推定値を初期重量として使用します。', reportPartialUsage: '失敗した印刷の部分使用量を報告', reportPartialUsageDesc: '印刷が失敗またはキャンセルされた場合、レイヤー進捗に基づいてその時点までの推定フィラメント使用量を報告します。', - testConnection: '接続テスト', - syncing: '同期中...', - lastSync: '最終同期', - unlinkSpool: 'スプールのリンクを解除', - weight: '重量', - enabled: 'Spoolman有効', - openInSpoolman: 'Spoolmanで開く', - selectSpool: 'スプールを選択', - linkSuccess: 'スプールをSpoolmanにリンクしました', - linkFailed: 'スプールのリンクに失敗しました', - spoolId: 'スプールID', }, + + // Inventory inventory: { title: 'スプール在庫管理', addSpool: 'スプールを追加', @@ -2608,13 +2681,16 @@ export default { deleteConfirm: 'このスプールを削除しますか?この操作は元に戻せません。', archiveConfirm: 'このスプールをアーカイブしますか?', advancedSettings: '詳細設定', + // Tabs filamentInfoTab: 'フィラメント情報', paProfileTab: 'PAプロファイル', filamentInfo: 'フィラメント', additional: '追加情報', + // Cloud loadingPresets: 'クラウドプリセットを読み込み中...', cloudConnected: 'クラウド接続済み', cloudNotConnected: 'クラウド未接続(デフォルト使用)', + // Colors recentColors: '最近', searchColors: '色を検索...', searchResults: '検索結果', @@ -2624,6 +2700,7 @@ export default { showAll: 'すべて表示', noColorsFound: '一致する色がありません', noResults: '結果なし', + // PA Profiles selectMaterialFirst: 'フィラメント情報タブで素材を選択してください。', noPrintersConfigured: 'プリンターが設定されていません。プリンターを追加してください。', matchingFilter: 'フィルター', @@ -2640,6 +2717,7 @@ export default { leftNozzle: '左ノズル', rightNozzle: '右ノズル', profilesSelected: 'キャリブレーションプロファイル選択済み', + // Stats & enhanced table totalInventory: '在庫合計', totalConsumed: '総消費量', byMaterial: '素材別', @@ -2670,9 +2748,11 @@ export default { table: 'テーブル', cards: 'カード', net: '正味', + // Grouping groupSimilar: 'グループ化', groupedSpools: '{{count}}本の同一スプール', groupedRows: '行', + // Column config columns: '列', configureColumns: '列の設定', configureColumnsDesc: 'ドラッグして並べ替えるか、矢印を使用してください。目のアイコンで表示/非表示を切り替えます。', @@ -2684,13 +2764,13 @@ export default { moveDown: '下へ移動', hideColumn: '列を非表示', showColumn: '列を表示', - // タグリンク + // Tag linking linkToSpool: 'スプールにリンク', tagLinked: 'タグがスプールにリンクされました', tagLinkFailed: 'タグのリンクに失敗しました', tagAlreadyLinked: 'タグは既に別のスプールにリンクされています', unknownTag: '不明なRFIDタグが検出されました', - // 使用履歴 + // Usage history usageHistory: '使用履歴', noUsageHistory: 'まだ使用記録がありません', printName: 'プリント名', @@ -2700,32 +2780,36 @@ export default { fillSourceLabel: '(Inv)', lowStockThresholdError: 'しきい値は0.1から99.9の間でなければなりません', }, + + // Timelapse timelapse: { - download: 'ダウンロード', - preview: 'プレビュー', - processing: 'バックアップファイルを処理中...', title: 'タイムラプス', create: 'タイムラプスを作成', + download: 'ダウンロード', delete: '削除', + preview: 'プレビュー', frameRate: 'フレームレート', quality: '品質', + processing: 'バックアップファイルを処理中...', noTimelapses: '利用可能なタイムラプスがありません', }, + + // AMS ams: { + title: 'AMS', + slot: 'スロット', empty: '<空>', + emptySlot: '空のスロット', + unknown: '不明', humidity: '湿度', temperature: '温度', + filamentType: 'フィラメントタイプ', + filamentColor: '色', remaining: '残り', + history: 'AMS履歴', noHistory: 'メンテナンス履歴がありません', configureSlot: 'フィラメントプロファイルとK値でスロットを設定', externalSpool: '外部スプール', - title: 'AMS', - slot: 'スロット', - emptySlot: '空のスロット', - unknown: '不明', - filamentType: 'フィラメントタイプ', - filamentColor: '色', - history: 'AMS履歴', profile: 'プロファイル', kFactor: 'K値', fill: '充填率', @@ -2733,11 +2817,9 @@ export default { used: '使用済み', remainingUnit: '残り', }, + + // Print modal printModal: { - flowCalibration: 'フローキャリブレーション', - vibrationCalibration: '振動キャリブレーション', - startPrint: '印刷を開始', - noPrintersAvailable: '利用可能なプリンターがありません', title: '印刷を開始', selectPrinter: 'プリンターを選択', selectPlate: 'プレートを選択', @@ -2746,12 +2828,19 @@ export default { slotRemainingShort: ' - 残{{grams}}g', printSettings: '印刷設定', bedLeveling: 'ベッドレベリング', + flowCalibration: 'フローキャリブレーション', + vibrationCalibration: '振動キャリブレーション', layerInspection: '第一層検査', timelapse: 'タイムラプス', + startPrint: '印刷を開始', addToQueue: 'キューに追加', + cancel: 'キャンセル', + noPrintersAvailable: '利用可能なプリンターがありません', printerBusy: 'プリンターは使用中です', printerOffline: 'プリンターはオフラインです', - cancel: 'キャンセル', + sameTypeDifferentColor: '同じ種類、異なる色', + filamentTypeNotLoaded: 'フィラメントタイプが未読み込み', + openCalendar: 'カレンダーを開く', leftNozzle: 'L', rightNozzle: 'R', leftNozzleTooltip: '左ノズル', @@ -2762,58 +2851,87 @@ export default { overrideWith: '変更先', resetToOriginal: 'オリジナルに戻す', }, + + // Backup backup: { + title: 'バックアップと復元', + createBackup: 'バックアップを作成', restoreBackup: 'バックアップの復元', restoreDescription: 'バックアップファイルからすべてのデータを置き換える', + downloadBackup: 'バックアップをダウンロード', + uploadBackup: 'バックアップをアップロード', lastBackup: '最終バックアップ', autoBackup: '自動バックアップ', backupNow: '今すぐバックアップ', - backupFailed: 'バックアップに失敗しました: {{error}}', - restoreNote: '復元中、仮想プリンターは停止されます', - downloadBackup: 'バックアップをダウンロード', - uploadBackup: 'バックアップをアップロード', restoreWarning: '警告: バックアップの復元は現在のすべてのデータを上書きします。', includeArchives: 'アーカイブを含む', includeSettings: '設定を含む', includeProfiles: 'プロファイルを含む', backupSuccess: 'バックアップを作成しました', restoreSuccess: 'バックアップを復元しました', + backupFailed: 'バックアップに失敗しました: {{error}}', restoreFailed: '復元に失敗しました', - title: 'バックアップと復元', - createBackup: 'バックアップを作成', + restoreNote: '復元中、仮想プリンターは停止されます', }, + + // Tags + tags: { + title: 'タグ', + addTag: 'タグを追加', + editTag: 'タグを編集', + deleteTag: 'タグを削除', + tagName: 'タグ名', + tagColor: 'タグの色', + noTags: 'タグがありません', + deleteConfirm: 'このタグを削除しますか?', + manageTags: 'タグを管理', + }, + + // Upload modal (archives) uploadModal: { title: '3MFファイルのアップロード', dragDrop: '.3mfファイルをここにドラッグ&ドロップ', or: 'または', browseFiles: 'ファイルを参照', + extractionInfo: 'プリンターモデルは3MFファイルのメタデータから自動的に抽出されます。', uploaded: 'アップロード済み', failed: 'アップロードに失敗しました', uploading: 'アップロード中...', upload: 'アップロード', uploadFailed: 'アップロード失敗', - extractionInfo: 'プリンターモデルは3MFファイルのメタデータから自動的に抽出されます。', }, + + // Edit archive modal + // Edit Archive Modal editArchive: { title: 'アーカイブを編集', name: '名前', + namePlaceholder: '印刷名', printer: 'プリンター', noPrinter: 'プリンターなし', project: 'プロジェクト', noProject: 'プロジェクトなし', itemsPrinted: '印刷数', + itemsPrintedHelp: 'この印刷ジョブで製造したアイテム数', notes: 'メモ', notesPlaceholder: 'この印刷についてメモを追加...', externalLink: '外部リンク', externalLinkPlaceholder: 'https://...', + externalLinkHelp: 'Printables、Thingiverse、その他のソースへのリンク', tags: 'タグ', + tagsPlaceholder: 'タグを追加...', addMoreTags: 'タグをさらに追加...', + matchingTags: '"{{query}}" に一致', + existingTags: '既存のタグ', + clickToAdd: '(クリックして追加)', status: 'ステータス', failureReason: '失敗理由', selectReason: '理由を選択...', photos: '印刷結果の写真', + photosHelp: '+ をクリックして印刷結果の写真を追加', printResult: '印刷結果', saving: '保存中...', + // Failure reasons failureReasons: { adhesionFailure: '定着不良', spaghettiDetached: 'スパゲッティ / 剥離', @@ -2827,14 +2945,7 @@ export default { userCancelled: 'ユーザーによるキャンセル', other: 'その他', }, - itemsPrintedHelp: 'この印刷ジョブで製造したアイテム数', - externalLinkHelp: 'Printables、Thingiverse、その他のソースへのリンク', - matchingTags: '"{{query}}" に一致', - existingTags: '既存のタグ', - clickToAdd: '(クリックして追加)', - photosHelp: '+ をクリックして印刷結果の写真を追加', - namePlaceholder: '印刷名', - tagsPlaceholder: 'タグを追加...', + // Archive statuses statuses: { completed: '完了', failed: '失敗', @@ -2842,20 +2953,33 @@ export default { printing: '印刷中', }, }, + + // K-Profiles kProfiles: { + title: 'Kプロファイル', noPrintersConfigured: 'プリンターが設定されていません', + addPrinterInSettings: 'Kプロファイルを管理するには設定でプリンターを追加してください', noActivePrinters: 'アクティブなプリンターがありません', + enablePrinterConnection: 'Kプロファイルを表示するにはプリンター接続を有効にしてください', loadingProfiles: 'Kプロファイルを読み込み中...', printerOffline: 'プリンターオフライン', + printerOfflineDesc: '選択したプリンターは接続されていません。電源を入れてKプロファイルを表示してください。', noMatchingProfiles: '一致するプロファイルなし', + noMatchingProfilesDesc: '検索条件に一致するプロファイルがありません', noKProfiles: 'Kプロファイルなし', + noKProfilesDesc: '{{diameter}}mmノズル用の圧力キャリブレーションプロファイルが見つかりません', createFirstProfile: '最初のプロファイルを作成', + // Controls + printer: 'プリンター', nozzle: 'ノズル', refresh: '更新', addProfile: 'K-プロファイルを追加', + export: 'エクスポート', import: 'インポート', select: '選択', selectAll: 'すべて選択', + delete: '削除', + // Filters searchPlaceholder: '名前またはフィラメントで検索...', allExtruders: 'すべてのエクストルーダー', leftOnly: '左のみ', @@ -2866,14 +2990,21 @@ export default { sortName: 'ソート: 名前', sortKValue: 'ソート: K値', sortFilament: 'ソート: フィラメント', + // Dual extruder labels leftExtruder: '左エクストルーダー', rightExtruder: '右エクストルーダー', + // Modal modal: { + addTitle: 'Kプロファイルを追加', + editTitle: 'Kプロファイルを編集', profileName: 'プロファイル名', profileNamePlaceholder: 'マイPLAプロファイル', kValue: 'K値', + kValuePlaceholder: '0.020', + kValueHelp: '一般的な範囲: PLA 0.01〜0.06、PETG 0.02〜0.10', filament: 'フィラメント', selectFilament: 'フィラメントを選択...', + noFilamentsHelp: 'フィラメントが見つかりません。Bambu Studioでまずプロファイルを作成してください。', flowType: 'フロータイプ', highFlow: 'ハイフロー', standard: 'スタンダード', @@ -2882,52 +3013,42 @@ export default { extruders: 'エクストルーダー', left: '左', right: '右', - notesPlaceholder: 'このプロファイルのメモを追加...', - pleaseWait: 'お待ちください', - addTitle: 'Kプロファイルを追加', - editTitle: 'Kプロファイルを編集', - kValuePlaceholder: '0.020', - kValueHelp: '一般的な範囲: PLA 0.01〜0.06、PETG 0.02〜0.10', - noFilamentsHelp: 'フィラメントが見つかりません。Bambu Studioでまずプロファイルを作成してください。', notes: 'メモ(ローカル保存)', + notesPlaceholder: 'このプロファイルのメモを追加...', notesHelp: 'メモはBambuddyに保存され、プリンターには保存されません', syncing: 'プリンターと同期中...', savingExtruder: 'エクストルーダーに保存中 {{current}}/{{total}}...', + pleaseWait: 'お待ちください', }, - toast: { - profileSaved: 'Kプロファイルを保存しました', - profileDeleted: 'Kプロファイルを削除しました', - exportedProfiles: '{{count}}件のプロファイルをエクスポートしました', - importedProfiles: '{{total}}件中{{imported}}件のプロファイルをインポートしました', - noProfilesToExport: 'エクスポートするプロファイルがありません', - invalidFileFormat: '無効なファイル形式', - failedToParseImport: 'インポートファイルの解析に失敗しました', - failedToSaveNote: 'メモの保存に失敗しました', - profilesSaved: 'Kプロファイルを{{count}}台のエクストルーダーに保存しました', - selectAtLeastOneExtruder: 'エクストルーダーを1つ以上選択してください', - profilesDeleted: '{{count}}件のプロファイルを削除しました', - failedToSaveBatch: 'Kプロファイルの保存に失敗しました', - noteSaved: 'メモを保存しました', - }, - title: 'Kプロファイル', - addPrinterInSettings: 'Kプロファイルを管理するには設定でプリンターを追加してください', - enablePrinterConnection: 'Kプロファイルを表示するにはプリンター接続を有効にしてください', - printerOfflineDesc: '選択したプリンターは接続されていません。電源を入れてKプロファイルを表示してください。', - noMatchingProfilesDesc: '検索条件に一致するプロファイルがありません', - noKProfilesDesc: '{{diameter}}mmノズル用の圧力キャリブレーションプロファイルが見つかりません', - printer: 'プリンター', - export: 'エクスポート', - delete: '削除', + // Delete confirmation deleteConfirm: { title: 'プロファイルを削除', cannotUndo: '元に戻せません', message: '「{{name}}」をプリンターから削除しますか?', }, + // Bulk delete bulkDelete: { title: 'プロファイルを削除', cannotUndo: '元に戻せません', message: '選択した{{count}}件のプロファイルをプリンターから削除しますか?', }, + // Toast + toast: { + profileSaved: 'Kプロファイルを保存しました', + profilesSaved: 'Kプロファイルを{{count}}台のエクストルーダーに保存しました', + selectAtLeastOneExtruder: 'エクストルーダーを1つ以上選択してください', + profileDeleted: 'Kプロファイルを削除しました', + profilesDeleted: '{{count}}件のプロファイルを削除しました', + exportedProfiles: '{{count}}件のプロファイルをエクスポートしました', + importedProfiles: '{{total}}件中{{imported}}件のプロファイルをインポートしました', + noProfilesToExport: 'エクスポートするプロファイルがありません', + invalidFileFormat: '無効なファイル形式', + failedToParseImport: 'インポートファイルの解析に失敗しました', + failedToSaveBatch: 'Kプロファイルの保存に失敗しました', + noteSaved: 'メモを保存しました', + failedToSaveNote: 'メモの保存に失敗しました', + }, + // Permissions permission: { noRead: 'プロファイルを更新する権限がありません', noCreate: 'プロファイルを追加する権限がありません', @@ -2937,21 +3058,67 @@ export default { noImport: 'プロファイルをインポートする権限がありません', }, }, + + // Virtual Printer virtualPrinter: { + title: '仮想プリンター', running: '稼働中', + stopped: '停止', + description: { + default: 'Bambu StudioとOrcaSlicerに表示される仮想プリンターを有効化。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。', + proxy: 'スライサーのトラフィックを実際のプリンターに転送するプロキシを有効化。任意のネットワーク経由でリモート印刷が可能です。', + }, enable: { + title: '仮想プリンターを有効化', visibleInSlicer: 'スライサーの検出リストに「Bambuddy」として表示', proxyingTo: '{{name}}にプロキシ中', notActive: '非アクティブ', - title: '仮想プリンターを有効化', + }, + model: { + title: 'プリンターモデル', + description: 'エミュレートするプリンターモデルを選択。', + restartWarning: 'モデルを変更すると仮想プリンターが再起動されます', + }, + accessCode: { + title: 'アクセスコード', + isSet: 'アクセスコードが設定されています', + notSet: 'アクセスコード未設定 - 有効化に必要です', + placeholder: '8文字のコードを入力', + placeholderChange: '新しいコードを入力して変更', + hint: '正確に8文字必要です。スライサーの認証に使用されます。', + charCount: '({{count}}/8)', + }, + targetPrinter: { + title: 'ターゲットプリンター', + configured: 'プロキシターゲット設定済み', + notConfigured: 'ターゲットプリンター未選択 - プロキシモードに必要です', + placeholder: 'プリンターを選択...', + hint: 'スライサートラフィックの転送先プリンターを選択。プリンターはLANモードである必要があります。', + noPrinters: 'プリンターが設定されていません。プロキシモードを使用するにはまずプリンターを追加してください。', }, remoteInterface: { - optional: 'オプション — 自動検出IPが間違っている場合に使用(複数NIC、Docker、VPNなど)', title: 'ネットワークインターフェース上書き', configured: 'インターフェース上書き有効', + optional: 'オプション — 自動検出IPが間違っている場合に使用(複数NIC、Docker、VPNなど)', placeholder: '自動検出(デフォルト)...', hint: 'SSDPで広告され、TLS証明書に使用されるIPアドレスを上書きします。Bambuddyに複数のネットワークインターフェースがある場合に便利です。', }, + mode: { + title: 'モード', + archive: 'アーカイブ', + archiveDesc: 'ファイルを即座にアーカイブ', + review: 'レビュー', + reviewDesc: 'アーカイブ前にレビュー', + queue: 'キュー', + queueDesc: 'アーカイブしてキューに追加', + proxy: 'プロキシ', + proxyDesc: '実際のプリンターに転送', + }, + setupRequired: { + title: 'セットアップが必要です', + description: '仮想プリンター機能を使用するには追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。', + readGuide: '有効にする前にセットアップガイドをお読みください', + }, howItWorks: { title: '仕組み', step1: '同じLAN上では、仮想プリンターはスライサー(Bambu Studio / OrcaSlicer)に自動的に表示されます。他のネットワークからは、IPアドレスとアクセスコードで手動で追加してください。', @@ -2959,26 +3126,26 @@ export default { step3: 'プロキシモードでは、仮想プリンターはすべてのトラフィックを実際のプリンターに転送します。直接接続されているかのように印刷がすぐに開始されます。', }, status: { - mode: 'モード', - pendingFiles: '保留中のファイル', - ftpPort: 'FTPポート', - mqttPort: 'MQTTポート', - ftpConnections: 'FTP接続数', - mqttConnections: 'MQTT接続数', title: 'ステータス詳細', printerName: 'プリンター名', model: 'モデル', serialNumber: 'シリアル番号', + mode: 'モード', + pendingFiles: '保留中のファイル', targetPrinter: 'ターゲットプリンター', + ftpPort: 'FTPポート', + mqttPort: 'MQTTポート', + ftpConnections: 'FTP接続数', + mqttConnections: 'MQTT接続数', }, toast: { + updated: '仮想プリンター設定を更新しました', + failedToUpdate: '設定の更新に失敗しました', accessCodeRequired: '先にアクセスコードを設定してください', targetPrinterRequired: '先にターゲットプリンターを選択してください', bindIpRequired: '先にバインドIPを設定してください', accessCodeEmpty: 'アクセスコードは空にできません', accessCodeLength: 'アクセスコードは8文字である必要があります', - updated: '仮想プリンター設定を更新しました', - failedToUpdate: '設定の更新に失敗しました', created: '仮想プリンターを作成しました', failedToCreate: '仮想プリンターの作成に失敗しました', deleted: '仮想プリンターを削除しました', @@ -3008,51 +3175,9 @@ export default { title: '仮想プリンターを削除', message: '「{{name}}」を削除してもよろしいですか?このプリンターのすべてのサービスが停止されます。', }, - title: '仮想プリンター', - stopped: '停止', - description: { - default: 'Bambu StudioとOrcaSlicerに表示される仮想プリンターを有効化。このプリンターに送信されたファイルは印刷せずに直接アーカイブされます。', - proxy: 'スライサーのトラフィックを実際のプリンターに転送するプロキシを有効化。任意のネットワーク経由でリモート印刷が可能です。', - }, - model: { - title: 'プリンターモデル', - description: 'エミュレートするプリンターモデルを選択。', - restartWarning: 'モデルを変更すると仮想プリンターが再起動されます', - }, - accessCode: { - title: 'アクセスコード', - isSet: 'アクセスコードが設定されています', - notSet: 'アクセスコード未設定 - 有効化に必要です', - placeholder: '8文字のコードを入力', - placeholderChange: '新しいコードを入力して変更', - hint: '正確に8文字必要です。スライサーの認証に使用されます。', - charCount: '({{count}}/8)', - }, - targetPrinter: { - title: 'ターゲットプリンター', - configured: 'プロキシターゲット設定済み', - notConfigured: 'ターゲットプリンター未選択 - プロキシモードに必要です', - placeholder: 'プリンターを選択...', - hint: 'スライサートラフィックの転送先プリンターを選択。プリンターはLANモードである必要があります。', - noPrinters: 'プリンターが設定されていません。プロキシモードを使用するにはまずプリンターを追加してください。', - }, - mode: { - title: 'モード', - archive: 'アーカイブ', - archiveDesc: 'ファイルを即座にアーカイブ', - review: 'レビュー', - reviewDesc: 'アーカイブ前にレビュー', - queue: 'キュー', - queueDesc: 'アーカイブしてキューに追加', - proxy: 'プロキシ', - proxyDesc: '実際のプリンターに転送', - }, - setupRequired: { - title: 'セットアップが必要です', - description: '仮想プリンター機能を使用するには追加のシステム設定が必要です。ポートフォワーディング、ファイアウォールルール、プラットフォーム固有の設定が含まれます。', - readGuide: '有効にする前にセットアップガイドをお読みください', - }, }, + + // Model Viewer modelViewer: { openInSlicer: 'スライサーで開く', tabs: { @@ -3083,6 +3208,8 @@ export default { unsupportedFormat: 'サポートされていないファイル形式です', }, }, + + // Maintenance type descriptions (built-in) maintenanceDescriptions: { lubricateCarbonRods: 'カーボンロッドに潤滑剤を塗布してスムーズな動きを確保', lubricateRails: 'リニアレールの潤滑', @@ -3099,85 +3226,8 @@ export default { replaceCarbonFilter: 'カーボンフィルター交換', lubricateLeftNozzleRail: '左ノズルレールの潤滑', }, - hmsErrors: { - title: 'エラー - {{name}}', - noErrors: 'エラーなし', - viewOnWiki: 'Bambu Lab Wikiで表示', - clearInstructions: 'プリンターでエラーをクリアするとここからも消えます。', - clearErrors: 'エラーをクリア', - clearSuccess: 'HMSエラーをクリアしました', - clearFailed: 'HMSエラーのクリアに失敗しました', - }, - plateAlert: { - title: '印刷が一時停止されました!', - message: 'ビルドプレート上にオブジェクトが検出されました。印刷が自動的に一時停止されました。プレートをクリアして印刷を再開してください。', - understand: '了解', - }, - tags: { - title: 'タグ', - addTag: 'タグを追加', - editTag: 'タグを編集', - deleteTag: 'タグを削除', - tagName: 'タグ名', - tagColor: 'タグの色', - noTags: 'タグがありません', - deleteConfirm: 'このタグを削除しますか?', - manageTags: 'タグを管理', - }, - support: { - debugLoggingActive: 'デバッグログが有効です', - manageLogs: '管理', - collectItem7: 'プリンター接続状態とファームウェアバージョン', - collectItem8: '連携状態(Spoolman、MQTT、HA)', - collectItem9: 'ネットワークインターフェース(サブネットのみ)', - collectItem10: 'Pythonパッケージバージョン', - collectItem11: 'データベース健全性チェック', - collectItem12: 'Docker環境の詳細', - }, - // Configure AMS Slot Modal - configureAmsSlot: { - title: 'AMSスロットの設定', - slotConfigured: 'スロットを設定しました!', - configuringSlot: 'スロットを設定中:', - slotLabel: '{{ams}} スロット {{slot}}', - searchPresets: 'プリセットを検索...', - colorPlaceholder: '色名またはHex(例: 茶色、FF8800)', - clearCustomColor: 'カスタム色をクリア', - noCloudPresets: 'クラウドプリセットがありません。Bambu Cloudにログインして同期してください。', - noPresetsAvailable: 'プリセットがありません。Bambu Cloudにログインするか、ローカルプロファイルをインポートしてください。', - noMatchingPresets: '一致するプリセットが見つかりません。', - custom: 'カスタム', - builtin: '内蔵', - settingsSentToPrinter: '設定をプリンターに送信しました', - filamentProfile: 'フィラメントプロファイル', - kProfileLabel: 'Kプロファイル(Pressure Advance)', - filteringFor: 'フィルター中: {{material}}', - noKProfile: 'Kプロファイルなし(デフォルト0.020を使用)', - noMatchingKProfiles: '一致するKプロファイルが見つかりません。デフォルトK=0.020が使用されます。', - selectFilamentFirst: 'まずフィラメントプロファイルを選択してください', - kFromCalibration: 'K={{value}}(プリンターキャリブレーションから)', - customColorLabel: 'カスタム色(オプション)', - presetColors: '{{name}}の色:', - showLessColors: '色を減らす', - showMoreColors: '色をもっと表示', - clear: 'クリア', - hexLabel: 'Hex: #{{hex}}', - resetting: 'リセット中...', - resetSlot: 'スロットをリセット', - cancel: 'キャンセル', - configuring: '設定中...', - configureSlot: 'スロットを設定', - }, - - // Email Settings - emailSettings: { - placeholders: { - fromName: 'BamBuddy', - }, - }, - - // Smart Plugs (accessibility) + // Smart Plugs smartPlugs: { offline: 'オフライン', admin: '管理', @@ -3202,6 +3252,20 @@ export default { }, }, + // Rich Text Editor + richTextEditor: { + bold: '太字', + italic: '斜体', + underline: '下線', + bulletList: '箇条書きリスト', + numberedList: '番号付きリスト', + alignLeft: '左揃え', + alignCenter: '中央揃え', + alignRight: '右揃え', + addLink: 'リンクを追加', + removeLink: 'リンクを削除', + }, + // External Links externalLinks: { noLinksConfigured: '外部リンクが設定されていません', @@ -3239,7 +3303,29 @@ export default { footer: 'Escキーを押すか外側をクリックして閉じます', }, - // Restore Backup Modal + // Notification Log + notificationLog: { + title: '通知ログ', + events: { + printStarted: '印刷開始', + printComplete: '印刷完了', + printFailed: '印刷失敗', + printStopped: '印刷停止', + progress: '進捗', + printerOffline: 'プリンターオフライン', + printerError: 'プリンターエラー', + lowFilament: 'フィラメント残量低下', + maintenanceDue: 'メンテナンス期限', + test: 'テスト', + }, + timeAgo: { + justNow: 'たった今', + minutesAgo: '{{minutes}}分前', + hoursAgo: '{{hours}}時間前', + }, + }, + + // Restore/Backup Modal restoreBackup: { title: 'バックアップを復元', restoring: '復元中...', @@ -3315,6 +3401,82 @@ export default { categoriesSelected: '{{selectedCount}}カテゴリー選択済み', }, + // Pending Uploads Panel + pendingUploads: { + placeholders: { + notes: 'この印刷に関するメモを追加...', + }, + discardUpload: 'アップロードを破棄', + archiveAllUploads: 'すべてのアップロードをアーカイブ', + discardAllUploads: 'すべてのアップロードを破棄', + archive: 'アーカイブ', + timeAgo: { + justNow: 'たった今', + minutesAgo: '{{minutes}}分前', + hoursAgo: '{{hours}}時間前', + daysAgo: '{{days}}日前', + }, + }, + + // API Browser + apiBrowser: { + placeholders: { + requestBody: 'JSONリクエストボディ...', + searchEndpoints: 'エンドポイントを検索...', + }, + }, + + // Configure AMS Slot Modal + configureAmsSlot: { + title: 'AMSスロットの設定', + slotConfigured: 'スロットを設定しました!', + configuringSlot: 'スロットを設定中:', + slotLabel: '{{ams}} スロット {{slot}}', + searchPresets: 'プリセットを検索...', + colorPlaceholder: '色名またはHex(例: 茶色、FF8800)', + clearCustomColor: 'カスタム色をクリア', + noCloudPresets: 'クラウドプリセットがありません。Bambu Cloudにログインして同期してください。', + noPresetsAvailable: 'プリセットがありません。Bambu Cloudにログインするか、ローカルプロファイルをインポートしてください。', + noMatchingPresets: '一致するプリセットが見つかりません。', + custom: 'カスタム', + builtin: '内蔵', + settingsSentToPrinter: '設定をプリンターに送信しました', + filamentProfile: 'フィラメントプロファイル', + kProfileLabel: 'Kプロファイル(Pressure Advance)', + filteringFor: 'フィルター中: {{material}}', + noKProfile: 'Kプロファイルなし(デフォルト0.020を使用)', + noMatchingKProfiles: '一致するKプロファイルが見つかりません。デフォルトK=0.020が使用されます。', + selectFilamentFirst: 'まずフィラメントプロファイルを選択してください', + kFromCalibration: 'K={{value}}(プリンターキャリブレーションから)', + customColorLabel: 'カスタム色(オプション)', + presetColors: '{{name}}の色:', + showLessColors: '色を減らす', + showMoreColors: '色をもっと表示', + clear: 'クリア', + hexLabel: 'Hex: #{{hex}}', + resetting: 'リセット中...', + resetSlot: 'スロットをリセット', + cancel: 'キャンセル', + configuring: '設定中...', + configureSlot: 'スロットを設定', + }, + + // GitHub Backup Settings + githubBackup: { + title: 'GitHubバックアップ', + history: '履歴', + downloadBackup: 'バックアップをダウンロード', + restoreBackup: 'バックアップを復元', + noBackupsYet: 'バックアップはまだありません', + }, + + // Email Settings + emailSettings: { + placeholders: { + fromName: 'BamBuddy', + }, + }, + // Tag Management Modal tagManagement: { searchTags: 'タグを検索...', @@ -3359,6 +3521,12 @@ export default { noPermissionSystemInfo: 'システム情報を表示する権限がありません', }, + // Dashboard + dashboard: { + dragToReorder: 'ドラッグして並べ替え', + hideWidget: 'ウィジェットを非表示', + }, + // Notification Provider Card notificationProviderCard: { deleteNotificationProvider: '通知プロバイダーを削除', @@ -3388,7 +3556,7 @@ export default { skipForward5s: '5秒進む', }, - // Notification Providers (descriptions) + // Notification Providers notificationProviders: { descriptions: { email: 'SMTP電子メール通知', @@ -3401,6 +3569,12 @@ export default { }, }, + // Log Viewer + logViewer: { + searchPlaceholder: 'メッセージまたはロガー名を検索...', + noLogEntries: 'ログエントリが見つかりません', + }, + // Switchbar Popover switchbarPopover: { noSwitchesInSwitchbar: 'スイッチバーにスイッチがありません', @@ -3418,9 +3592,6 @@ export default { }, }, - // GitHub Backup Settings - githubBackupSettings: {}, - // Spoolman Settings spoolmanSettings: {}, @@ -3537,12 +3708,12 @@ export default { addSpool: 'スプール追加', }, settings: { - // タブ + // Tabs tabDevice: 'デバイス', tabDisplay: 'ディスプレイ', tabScale: '計量', tabUpdates: 'アップデート', - // デバイスタブ + // Device tab nfcReader: 'NFCリーダー', type: 'タイプ', connection: '接続', @@ -3550,14 +3721,14 @@ export default { deviceInfo: 'デバイス情報', hostname: 'ホスト', uptime: '稼働時間', - // ディスプレイタブ + // Display tab brightness: '明るさ', saved: '保存済み', noBacklight: 'DSIバックライトが検出されませんでした。明るさ制御にはDSIディスプレイが必要です。', screenBlank: '画面オフタイムアウト', screenBlankDesc: '操作がないと画面がオフになります。タッチで復帰。', displayNote: '明るさはソフトウェアフィルターとして適用されます。', - // 計量タブ + // Scale tab scaleCalibration: '計量キャリブレーション', currentWeight: '現在の重量', tareOffset: '風袋', @@ -3579,7 +3750,7 @@ export default { firmware: 'ファームウェア', scale: '計量', noDevice: 'SpoolBuddyデバイスが見つかりません', - // アップデートタブ + // Updates tab daemonVersion: 'デーモンバージョン', currentVersion: '現在', versionPending: 'デーモンを待っています...', diff --git a/frontend/src/i18n/locales/pt-BR.ts b/frontend/src/i18n/locales/pt-BR.ts index 5621e2820..5f9966cf6 100644 --- a/frontend/src/i18n/locales/pt-BR.ts +++ b/frontend/src/i18n/locales/pt-BR.ts @@ -1043,7 +1043,7 @@ export default { avgTime: 'Méd. tempo', filamentByPrints: 'Impressões', timeframe: { - 'today': 'Hoje', + today: 'Hoje', 'this-week': 'Esta semana', 'this-month': 'Este mês', 'last-7': 'Últimos 7 dias', @@ -1051,7 +1051,7 @@ export default { 'last-90': 'Últimos 90 dias', 'this-year': 'Este ano', 'all-time': 'Todo o período', - 'custom': 'Personalizado', + custom: 'Personalizado', from: 'De', to: 'Até', }, @@ -1420,7 +1420,7 @@ export default { apiKeysDescription: 'Crie chaves API para integrações externas e webhooks.', createKey: 'Criar Chave', apiKeyCreated: 'Chave API criada com sucesso', - apiKeyCopyWarning: "Copie esta chave agora - ela não será exibida novamente!", + apiKeyCopyWarning: 'Copie esta chave agora - ela não será exibida novamente!', useInApiBrowser: 'Usar no Navegador API', createNewApiKey: 'Criar Nova Chave API', keyName: 'Nome da Chave', @@ -1785,8 +1785,8 @@ export default { loginFailed: 'Falha no login', enterCredentials: 'Por favor, insira nome de usuário e senha', forgotPasswordTitle: 'Esqueceu a Senha', - forgotPasswordMessage: "Se você esqueceu sua senha, entre em contato com o administrador do sistema para redefini-la.", - forgotPasswordEmailMessage: "Digite seu endereço de email e enviaremos uma nova senha.", + forgotPasswordMessage: 'Se você esqueceu sua senha, entre em contato com o administrador do sistema para redefini-la.', + forgotPasswordEmailMessage: 'Digite seu endereço de email e enviaremos uma nova senha.', emailAddress: 'Endereço de Email', emailPlaceholder: 'seu.email@exemplo.com', cancel: 'Cancelar', @@ -2368,7 +2368,7 @@ export default { description: 'Descrição', noProjects: 'Nenhum projeto ainda', noProjectsFiltered: 'Nenhum projeto {{status}}', - noProjectsFilteredHelp: "Você não tem nenhum projeto {{status}}. Os projetos aparecerão aqui quando seu status mudar.", + noProjectsFilteredHelp: 'Você não tem nenhum projeto {{status}}. Os projetos aparecerão aqui quando seu status mudar.', createFirst: 'Crie seu primeiro projeto para começar a organizar impressões relacionadas, acompanhar o progresso e gerenciar suas construções.', createFirstButton: 'Crie Seu Primeiro Projeto', create: 'Criar', @@ -2612,7 +2612,7 @@ export default { weight: 'Peso', remaining: 'Restante', disableWeightSync: 'Desativar Sincronização de Peso Estimado do AMS', - disableWeightSyncDesc: "Não atualize a capacidade restante a partir das estimativas do AMS. Use isso se preferir o rastreamento de uso do Spoolman em vez das estimativas baseadas em porcentagem do AMS. Novos carretéis ainda usarão a estimativa do AMS como seu peso inicial.", + disableWeightSyncDesc: 'Não atualize a capacidade restante a partir das estimativas do AMS. Use isso se preferir o rastreamento de uso do Spoolman em vez das estimativas baseadas em porcentagem do AMS. Novos carretéis ainda usarão a estimativa do AMS como seu peso inicial.', reportPartialUsage: 'Relatar Uso Parcial para Impressões Falhadas', reportPartialUsageDesc: 'Quando uma impressão falha ou é cancelada, relate o filamento estimado usado até aquele ponto com base no progresso das camadas.', }, @@ -2748,6 +2748,10 @@ export default { table: 'Tabela', cards: 'Cartões', net: 'Líquido', + // Grouping + groupSimilar: 'Agrupar', + groupedSpools: '{{count}} carretéis idênticos', + groupedRows: 'linhas', // Column config columns: 'Colunas', configureColumns: 'Configurar Colunas', @@ -2810,6 +2814,8 @@ export default { kFactor: 'Fator K', fill: 'Preencher', configure: 'Configurar', + used: 'usado', + remainingUnit: 'restante', }, // Print modal @@ -3115,19 +3121,9 @@ export default { }, howItWorks: { title: 'Como funciona', - titleProxy: 'Como funciona (Modo Proxy)', step1: 'Complete o guia de configuração para sua plataforma', step2: 'Ative a impressora virtual e defina um código de acesso', step3: 'No Bambu Studio ou OrcaSlicer, vá para "Adicionar Impressora"', - step4: 'A impressora "Bambuddy" deve aparecer na lista de descoberta', - step5: 'Conecte-se usando o código de acesso que você definiu', - step6: 'Quando você "imprimir" para o Bambuddy, o arquivo 3MF será arquivado em vez disso', - proxyStep1: 'Selecione a impressora alvo (deve estar no modo LAN)', - proxyStep2: 'Para rede cruzada: selecione a interface de rede do slicer', - proxyStep3: 'Ative o proxy - a impressora aparece na descoberta do slicer via SSDP', - proxyStep4: 'Conecte-se usando o código de acesso da impressora', - proxyStep5: 'Imprima normalmente - o tráfego é retransmitido pelo Bambuddy', - proxyStep6: 'O streaming da câmera requer NAT/encaminhamento de IP (veja a documentação)', }, status: { title: 'Detalhes do Status', @@ -3147,8 +3143,37 @@ export default { failedToUpdate: 'Falha ao atualizar as configurações', accessCodeRequired: 'Defina um código de acesso primeiro', targetPrinterRequired: 'Selecione uma impressora alvo primeiro', + bindIpRequired: 'Defina um IP de ligação primeiro', accessCodeEmpty: 'O código de acesso não pode estar vazio', accessCodeLength: 'O código de acesso deve ter exatamente 8 caracteres', + created: 'Impressora virtual criada', + failedToCreate: 'Falha ao criar impressora virtual', + deleted: 'Impressora virtual excluída', + failedToDelete: 'Falha ao excluir impressora virtual', + }, + list: { + title: 'Impressoras Virtuais', + add: 'Adicionar', + addFirst: 'Adicionar Impressora Virtual', + empty: 'Nenhuma impressora virtual configurada. Adicione uma para começar.', + }, + bindIp: { + title: 'Interface de Rede', + placeholder: 'Selecionar interface...', + hint: 'Interface de rede para esta impressora virtual. Deve ser única por impressora.', + }, + proxy: { + accessCodeHint: 'No modo proxy, use o código de acesso da impressora alvo no slicer. A conexão é encaminhada de forma transparente para a impressora real.', + }, + addDialog: { + title: 'Adicionar Impressora Virtual', + name: 'Nome', + hint: 'Você pode configurar o código de acesso, impressora alvo e outras configurações após a criação.', + create: 'Criar', + }, + deleteConfirm: { + title: 'Excluir Impressora Virtual', + message: 'Tem certeza que deseja excluir "{{name}}"? Isso irá parar todos os serviços desta impressora.', }, }, @@ -3570,6 +3595,20 @@ export default { // Spoolman Settings spoolmanSettings: {}, + // Time + time: { + unknown: '-', + waiting: 'Aguardando', + justNow: 'Agora mesmo', + now: 'Agora', + minsAgo: '{{count}}min atrás', + inMins: 'em {{count}}min', + hoursAgo: '{{count}}h atrás', + inHours: 'em {{count}}h', + daysAgo: '{{count}}d atrás', + inDays: 'em {{count}}d', + }, + // SpoolBuddy Kiosk spoolbuddy: { nav: { @@ -3611,6 +3650,25 @@ export default { grossWeight: 'Peso bruto', spoolSize: 'Tamanho do carretel', close: 'Fechar', + currentSpool: 'Carretel Atual', + }, + modal: { + spoolDetected: 'Carretel Detectado', + assignToAms: 'Atribuir ao AMS', + syncWeight: 'Sincronizar Peso', + weightSynced: 'Sincronizado!', + syncing: 'Sincronizando...', + newTagDetected: 'Nova Tag Detectada', + addToInventory: 'Adicionar ao Inventário', + assignToAmsTitle: 'Atribuir ao AMS', + selectSlot: 'Selecionar um slot', + assign: 'Atribuir', + assigning: 'Atribuindo...', + assignSuccess: 'Atribuído!', + assignError: 'Falha ao atribuir carretel. Tente novamente.', + noPrinterSelected: 'Selecionar uma impressora...', + noAmsDetected: 'Nenhum AMS detectado nesta impressora', + slot: 'Slot', }, weight: { noReading: 'Sem leitura', @@ -3650,12 +3708,12 @@ export default { addSpool: 'Adicionar carretel', }, settings: { - // Abas + // Tabs tabDevice: 'Dispositivo', tabDisplay: 'Tela', tabScale: 'Balança', tabUpdates: 'Atualizações', - // Aba dispositivo + // Device tab nfcReader: 'Leitor NFC', type: 'Tipo', connection: 'Conexão', @@ -3663,14 +3721,14 @@ export default { deviceInfo: 'Info do dispositivo', hostname: 'Host', uptime: 'Tempo de atividade', - // Aba tela + // Display tab brightness: 'Brilho', saved: 'Salvo', noBacklight: 'Nenhuma retroiluminação DSI detectada. O controle de brilho requer uma tela DSI.', screenBlank: 'Tempo para desligar tela', screenBlankDesc: 'A tela desliga após inatividade. Toque para despertar.', displayNote: 'O brilho é aplicado como filtro de software.', - // Aba balança + // Scale tab scaleCalibration: 'Calibração da balança', currentWeight: 'Peso atual', tareOffset: 'Tara', @@ -3692,7 +3750,7 @@ export default { firmware: 'Firmware', scale: 'Balança', noDevice: 'Nenhum dispositivo SpoolBuddy encontrado', - // Aba atualizações + // Updates tab daemonVersion: 'Versão do daemon', currentVersion: 'Atual', versionPending: 'Aguardando daemon...', diff --git a/frontend/src/i18n/locales/zh-CN.ts b/frontend/src/i18n/locales/zh-CN.ts index fc059fb69..90b5e10c0 100644 --- a/frontend/src/i18n/locales/zh-CN.ts +++ b/frontend/src/i18n/locales/zh-CN.ts @@ -201,6 +201,7 @@ export default { chamberLightOn: '打开腔室灯', chamberLightOff: '关闭腔室灯', // Files + files: '文件', browseFiles: '浏览打印机文件', // Smart plug autoOffAfterPrint: '打印后自动关机', @@ -216,6 +217,19 @@ export default { skipObject: '跳过对象', reconnect: '重新连接', mqttDebug: 'MQTT 调试', + printerInformation: '打印机信息', + copyToClipboard: '复制', + copied: '已复制!', + state: '状态', + wifiSignalLabel: 'WiFi 信号', + developerMode: '开发者模式', + enabled: '已启用', + disabled: '已禁用', + addedOn: '添加日期', + sdCard: 'SD 卡', + inserted: '已插入', + notInserted: '未插入', + totalPrintHours: '打印时长', activeNozzle: '当前:{{nozzle}} 喷嘴', nozzleRack: '喷嘴架', nozzleDocked: '已停靠', @@ -431,6 +445,16 @@ export default { clickToViewHmsErrors: '点击查看 HMS 错误', estimatedCompletion: '预计完成时间', slotOptions: '槽位选项', + // AMS hover popup + amsPopup: { + friendlyName: 'AMS 名称', + friendlyNamePlaceholder: '例如 AMS 友好名称', + serialNumber: '序列号', + firmwareVersion: '固件', + save: '保存', + clear: '清除', + noEditPermission: '您没有重命名 AMS 单元的权限', + }, // Firmware modal firmwareModal: { title: '固件更新', @@ -464,6 +488,8 @@ export default { }, developerModeWarning: '以下打印机未启用开发者局域网模式:{{names}}。某些功能可能无法使用。', howToEnable: '如何启用', + incompatibleFile: '此文件是为 {{slicedFor}} 切片的,但该打印机是 {{printerModel}}', + dropNotPrintable: '只能打印 .gcode 和 .gcode.3mf 文件', dropToPrint: '拖放以打印', cannotPrint: '打印机忙碌', }, @@ -724,6 +750,7 @@ export default { title: '打印队列', subtitle: '排程和管理您的打印任务', addToQueue: '添加到队列', + // Print modal print: '打印', reprint: '重新打印', schedulePrint: '排程打印', @@ -756,11 +783,13 @@ export default { clearPlateSuccess: '打印板已清理 — 准备进行下一个打印', plateReady: '打印板已清理 — 准备进行下一个打印', plateNumber: '板 {{index}}', + // Sections sections: { currentlyPrinting: '正在打印', queued: '排队中', history: '历史', }, + // Status status: { pending: '等待中', waiting: '等待中', @@ -771,6 +800,7 @@ export default { skipped: '已跳过', cancelled: '已取消', }, + // Summary cards summary: { printing: '打印中', queued: '排队中', @@ -778,6 +808,7 @@ export default { totalWeight: '总队列重量', history: '历史', }, + // Filters filter: { allPrinters: '所有打印机', unassigned: '未分配', @@ -785,6 +816,7 @@ export default { allLocations: '所有位置', any: '任意', }, + // Sort sort: { byPosition: '按位置排序', byName: '按名称排序', @@ -794,15 +826,18 @@ export default { ascendingOldest: '升序(最旧优先)', descendingNewest: '降序(最新优先)', }, + // Badges badges: { staged: '已暂存', requiresPrevious: '需要前一个成功', autoPowerOff: '自动关机', }, + // Empty state empty: { title: '没有排程的打印', description: '从归档页面使用右键菜单中的"排程"选项来排程打印,或拖放文件开始。', }, + // Time time: { asap: '尽快', overdue: '已逾期', @@ -811,11 +846,13 @@ export default { inMinutes: '{{count}} 分钟后', inHours: '{{count}} 小时后', }, + // Actions actions: { stopPrint: '停止打印', startPrint: '开始打印', requeue: '重新排队', }, + // Bulk edit bulkEdit: { title: '编辑 {{count}} 个项目', title_plural: '编辑 {{count}} 个项目', @@ -840,6 +877,7 @@ export default { editSelected: '编辑所选', cancelSelected: '取消所选', }, + // Confirmations confirm: { cancelTitle: '取消排程打印', cancelMessage: '确定要取消"{{name}}"吗?', @@ -854,6 +892,7 @@ export default { thisPrint: '此打印', thisItem: '此项目', }, + // Toast messages toast: { cancelled: '队列项目已取消', cancelFailed: '取消项目失败', @@ -870,6 +909,7 @@ export default { bulkCancelled: '已取消 {{count}} 个项目', bulkCancelFailed: '批量取消项目失败', }, + // Permissions permissions: { noStopPrint: '您没有停止打印的权限', noStartPrint: '您没有开始打印的权限', @@ -935,6 +975,7 @@ export default { last30Days: '最近 30 天', last90Days: '最近 90 天', allTime: '全部时间', + // Widgets quickStats: '快速统计', printActivity: '打印活动', filamentTypes: '耗材类型', @@ -953,6 +994,7 @@ export default { topFailureReasons: '主要失败原因', failedPrintsCount: '{{failed}} / {{total}} 次打印失败', lastWeekRate: '上周:{{rate}}%', + // Actions resetLayout: '重置布局', recalculateCosts: '重新计算成本', recalculateCostsHint: '使用当前耗材价格重新计算所有归档成本', @@ -960,12 +1002,15 @@ export default { exportAsCsv: '导出为 CSV', exportAsExcel: '导出为 Excel', hiddenCount: '{{count}} 个已隐藏', + // Toast exportDownloaded: '导出已下载', exportFailed: '导出失败', layoutReset: '布局已重置', recalculatedCosts: '已为 {{count}} 个归档重新计算成本', recalculateFailed: '重新计算成本失败', + // Loading loadingStats: '加载统计数据中...', + // Permissions noPermissionResetLayout: '您没有重置布局的权限', noPermissionRecalculate: '您没有重新计算成本的权限', noPrintDataInRange: '所选范围内无打印数据', @@ -998,7 +1043,7 @@ export default { avgTime: '平均时间', filamentByPrints: '打印次数', timeframe: { - 'today': '今天', + today: '今天', 'this-week': '本周', 'this-month': '本月', 'last-7': '最近 7 天', @@ -1006,7 +1051,7 @@ export default { 'last-90': '最近 90 天', 'this-year': '今年', 'all-time': '全部时间', - 'custom': '自定义范围', + custom: '自定义范围', from: '从', to: '到', }, @@ -1035,8 +1080,10 @@ export default { noHistory: '无维护历史', editPrintHours: '编辑打印时间', currentHours: '当前小时数', + // Tabs statusTab: '状态', settingsTab: '设置', + // Status overdueCount: '{{count}} 个逾期', dueSoonCount: '{{count}} 个即将到期', dueSoon: '即将到期', @@ -1044,6 +1091,7 @@ export default { overdueBy: '逾期 {{duration}}', dueIn: '{{duration}} 后到期', timeLeft: '剩余 {{duration}}', + // Duration formats day: '1 天', days: '{{count}} 天', week: '1 周', @@ -1051,6 +1099,7 @@ export default { month: '1 个月', months: '{{count}} 个月', year: '1 年', + // Settings maintenanceTypes: '维护类型', maintenanceTypesDescription: '系统类型和您的自定义维护任务', addCustomType: '添加自定义类型', @@ -1068,13 +1117,16 @@ export default { exampleName: '例如:更换 HEPA 过滤器', viewDocumentation: '查看文档', timeBasedInterval: '基于时间的间隔', + // Interval overrides intervalOverrides: '间隔覆盖', intervalOverridesDescription: '为特定打印机自定义间隔', + // Printer assignment assignedToPrinters: '已分配给打印机:', noPrintersAssigned: '未分配打印机', addPrinterShort: '添加:', printersAssignedClick: '已分配 {{count}} 台打印机 - 点击管理', removeFromPrinter: '从此打印机移除', + // Types types: { lubricateCarbonRods: '润滑碳纤维杆', lubricateRails: '润滑线性导轨', @@ -1091,6 +1143,7 @@ export default { replaceCarbonFilter: '更换活性炭过滤器', lubricateLeftNozzleRail: '润滑左喷嘴导轨', }, + // Toast maintenanceComplete: '维护已标记为完成', typeUpdated: '维护类型已更新', typeDeleted: '维护类型已删除', @@ -1098,9 +1151,11 @@ export default { printHoursUpdated: '打印小时数已更新', printerAssigned: '打印机已分配', printerRemoved: '打印机已移除', + // Confirmation deleteTypeConfirm: '删除"{{name}}"?', deleteSystemTypeTitle: '删除默认维护任务?', deleteSystemTypeMessage: '确定要删除默认维护任务"{{name}}"吗?', + // Permissions noPermissionUpdate: '您没有更新维护项目的权限', noPermissionPerform: '您没有执行维护的权限', noPermissionEditTypes: '您没有编辑维护类型的权限', @@ -1109,6 +1164,7 @@ export default { noPermissionRemovePrinter: '您没有移除打印机分配的权限', noPermissionAssignPrinter: '您没有分配打印机的权限', noPermissionEditIntervals: '您没有编辑间隔的权限', + // Configure link configureSettings: '配置维护类型和间隔', }, @@ -1116,6 +1172,7 @@ export default { settings: { title: '设置', general: '通用', + // Tab names tabs: { general: '通用', smartPlugs: '智能插座', @@ -1128,6 +1185,7 @@ export default { backup: '备份', emailAuth: '邮箱认证', }, + // Email settings email: { smtpSettings: 'SMTP 配置', smtpHost: 'SMTP 服务器', @@ -1155,6 +1213,7 @@ export default { feature2: '用户可以使用用户名或邮箱登录', feature3: '忘记密码功能可用', feature4: '管理员可以通过邮件重置用户密码', + // Error messages errors: { requiredFields: '请填写所有必填字段', usernameRequired: '启用认证时需要用户名', @@ -1163,14 +1222,17 @@ export default { usernamePasswordRequired: '启用认证时需要用户名和密码', configureSmtpFirst: '请先配置并测试 SMTP 设置', }, + // Success messages success: { settingsSaved: 'SMTP 设置保存成功', }, + // Security options securityOptions: { starttls: 'STARTTLS(端口 587)', ssl: 'SSL/TLS(端口 465)', none: '无(端口 25)', }, + // Authentication options authOptions: { enabled: '已启用', disabled: '已禁用', @@ -1195,6 +1257,7 @@ export default { latestVersion: '最新版本', upToDate: '已是最新版本', updateAvailable: '有可用更新', + // Notifications notificationLanguage: '通知语言', notificationLanguageDescription: '推送通知的语言', bedCooledThreshold: '热床冷却阈值', @@ -1224,6 +1287,7 @@ export default { maintenanceDue: '维护到期', maintenanceDueDescription: '需要维护时通知', }, + // Smart Plugs smartPlug: { title: '智能插座', add: '添加智能插座', @@ -1242,6 +1306,7 @@ export default { turnOn: '开启', turnOff: '关闭', }, + // Filament Tracking Mode filamentTracking: '耗材追踪', filamentTrackingDesc: '选择如何追踪您的耗材。您可以使用内置库存或连接外部 Spoolman 服务器。', trackingModeBuiltIn: '内置库存', @@ -1257,6 +1322,7 @@ export default { amsSyncing: '同步中...', amsSyncSuccess: '已同步 {{synced}} 个耗材,跳过 {{skipped}} 个', amsSyncError: '从 AMS 同步重量失败', + // Spoolman settings spoolmanUrl: 'Spoolman URL', spoolmanUrlHint: 'Spoolman 服务器的 URL(例如 http://localhost:7912)', spoolmanConnected: '已连接', @@ -1278,51 +1344,69 @@ export default { syncAmsData: '同步 AMS 数据', syncAmsDataDesc: '手动将打印机 AMS 数据同步到 Spoolman', allPrinters: '所有打印机', + // Default printer noDefaultPrinter: '无默认(每次询问)', + // Sidebar sidebarOrder: '侧边栏顺序', + // Camera saveThumbnails: '保存缩略图', captureFinishPhoto: '拍摄完成照片', noPrintersConfigured: '未配置打印机', + // Archive settings archiveMode: { always: '始终创建归档条目', never: '从不创建归档条目', ask: '每次询问', }, + // Updates checkForUpdatesLabel: '检查更新', checkPrinterFirmware: '检查打印机固件', includeBetaUpdates: '包含测试版本', includeBetaUpdatesDesc: '检查更新时通知测试版和预发布版本', + // Queue enableRetry: '启用重试', + // Home Assistant homeAssistantDescription: '通过 Home Assistant 控制智能插座', environmentManagedLabel: '(环境变量管理)', autoEnabledViaEnv: '通过环境变量自动启用', urlFromEnvReadOnly: '值由 HA_URL 环境变量设置(只读)', tokenFromEnvReadOnly: '值由 HA_TOKEN 环境变量设置(只读)', + // MQTT mqttConnectedTo: '已连接到', + // Prometheus prometheusDescription: '以 Prometheus 格式暴露打印机数据', + // Smart plugs empty state noSmartPlugsTitle: '未配置智能插座', noSmartPlugsDescription: '添加基于 Tasmota 的智能插座以追踪能耗并自动化电源控制。', + // Notifications empty state noProvidersTitle: '未配置提供商', noProvidersDescription: '添加提供商以接收警报。', noTemplatesAvailable: '无可用模板。重启后端以加载默认模板。', + // API permissions apiPermissionView: '查看打印机状态和队列', apiPermissionEdit: '添加和移除打印队列中的项目', + // API keys apiKeysEmptyTitle: '无 API 密钥', apiKeysEmptyDescription: '创建 API 密钥以与外部服务集成。', + // Users noUsersFound: '未找到用户', noGroupsFound: '未找到组', noGroupsAvailable: '无可用组', passwordsDoNotMatch: '密码不匹配', systemGroupWarning: '系统组名称不可更改', + // Auth disabled authDisabledTitle: '身份验证已禁用', authDisabledFeature1: '需要登录才能访问系统', authDisabledFeature2: '创建多个用户并基于组的权限管理', authDisabledFeature3: '使用 50+ 个细粒度权限控制访问', + // User deletion userHasCreated: '此用户已创建:', userItemsQuestion: '您想如何处理这些项目?', deleteUserConfirm: '确定要删除此用户吗?', actionCannotBeUndone: '此操作无法撤销。', + // Smart plugs addFirstSmartPlug: '添加您的第一个智能插座', + // Notifications providers: '提供商', log: '日志', testAll: '全部测试', @@ -1331,6 +1415,7 @@ export default { testFailedCount: '{{count}} 个失败', messageTemplates: '消息模板', messageTemplatesDescription: '自定义每个事件的通知消息。', + // API Keys section apiKeys: 'API 密钥', apiKeysDescription: '创建 API 密钥用于外部集成和 Webhook。', createKey: '创建密钥', @@ -1369,6 +1454,7 @@ export default { deleteApiKeyTitle: '删除 API 密钥', deleteApiKeyMessage: '确定要删除此 API 密钥吗?使用此密钥的所有集成将停止工作。', deleteKey: '删除密钥', + // Filament tab amsDisplayThresholds: 'AMS 显示阈值', amsThresholdsDescription: '配置 AMS 湿度和温度指示器的颜色阈值。', humidity: '湿度', @@ -1384,6 +1470,7 @@ export default { printModal: '打印对话框', expandCustomMapping: '默认展开自定义映射', expandCustomMappingDescription: '打印到多台打印机时,默认展开显示每台打印机的 AMS 映射', + // User management authentication: '身份验证', authEnabledDescription: '您的实例已通过用户身份验证保护', authDisabledDescription: '启用以要求登录并管理用户访问', @@ -1407,21 +1494,27 @@ export default { enterPassword: '输入密码(至少 6 个字符)', confirmPassword: '确认密码', confirmPasswordPlaceholder: '确认密码', + // Title tooltips viewReleaseOnGitHub: '在 GitHub 上查看发布', turnAllPlugsOn: '开启所有插座', turnAllPlugsOff: '关闭所有插座', + // Modal: Clear logs clearNotificationLogs: '清除通知日志', clearLogsMessage: '这将永久删除所有 30 天前的通知日志。此操作无法撤销。', clearLogs: '清除日志', + // Modal: Reset UI resetUiPreferences: '重置 UI 偏好', resetUiPreferencesMessage: '这将重置所有 UI 偏好为默认值:侧边栏顺序、主题、仪表板布局、视图模式和排序偏好。您的打印机、归档和服务器设置不会受到影响。清除后页面将重新加载。', resetPreferences: '重置偏好', + // Modal: Delete group deleteGroupTitle: '删除组', deleteGroupMessage: '确定要删除此组吗?此组中的用户将失去这些权限。', deleteGroup: '删除组', + // Modal: Disable auth disableAuthenticationTitle: '禁用身份验证', disableAuthenticationMessage: '确定要禁用身份验证吗?这将使您的 Bambuddy 实例无需登录即可访问。所有用户将保留在数据库中但身份验证将被禁用。', disableAuthentication: '禁用身份验证', + // Additional settings configureBambuddy: '配置 Bambuddy', systemDefault: '系统默认', archiveSettings: '归档设置', @@ -1452,6 +1545,7 @@ export default { editUser: '编辑用户', deleteUserTitle: '删除用户', groupName: '组名称', + // Placeholders leaveEmptyForAnonymous: '留空为匿名', leaveEmptyForNoAuth: '留空为无认证', enterNewPassword: '输入新密码', @@ -1648,7 +1742,7 @@ export default { all: '全部', }, - // Printer File Manager modal + // Printer File Manager modal (printer internal storage) printerFiles: { title: '文件管理器', storageUsed: '已用:', @@ -2035,16 +2129,19 @@ export default { customizeSettings: '自定义新预设的设置', compareWithBase: '与基础预设比较', compare: '比较', + // CreatePresetModal - Basic Info basePreset: '基础预设', selectBasePreset: '选择基础预设...', presetName: '预设名称', myCustomPreset: '我的自定义预设', inheritsFrom: '继承自', dropJsonToImport: '拖放 JSON 以导入', + // CreatePresetModal - Tabs tabs: { common: '常用', allFields: '所有字段', }, + // CreatePresetModal - All Fields Tab availableFields: '可用字段', searchFieldsPlaceholder: '搜索字段...', noMatchingFields: '没有匹配的字段', @@ -2062,15 +2159,18 @@ export default { refresh: '刷新', newPreset: '新建预设', clearFilters: '清除筛选', + // Compare mode compareMode: '比较模式', selectAnotherPreset: '选择另一个 {{type}} 预设', clickTwoPresets: '点击两个相同类型的预设进行比较', selectFirst: '1. 选择第一个', selectSecond: '2. 选择第二个', compareNow: '立即比较', + // Status row lastSynced: '上次同步:', showingCount: '显示 {{showing}} / {{total}} 个预设', noPresetsFound: '未找到预设', + // Column headers columns: { filament: '耗材', process: '工艺', @@ -2079,6 +2179,7 @@ export default { noFilamentPresets: '无耗材预设', noProcessPresets: '无工艺预设', noPrinterPresets: '无打印机预设', + // Filters filters: { type: '类型', owner: '所有者', @@ -2091,6 +2192,7 @@ export default { builtIn: '内置', process: '工艺', }, + // Permissions noTemplatesPermission: '您没有管理模板的权限', noRefreshPermission: '您没有刷新配置文件的权限', noCreatePermission: '您没有创建预设的权限', @@ -2170,6 +2272,7 @@ export default { filesExtracted: '已解压 {{count}} 个文件', uploadComplete: '上传完成:{{succeeded}} 个成功', uploadFailed: '{{count}} 个失败', + zipFilesFailed: '{{count}} 个文件失败', uploading: '上传中...', changeLink: '更改链接...', linkTo: '链接到...', @@ -2278,6 +2381,7 @@ export default { addFiles: '添加文件', removeFile: '移除文件', viewDetails: '查看详情', + // Modal fields namePlaceholder: '例如:Voron 2.4 构建', descriptionPlaceholder: '可选描述...', color: '颜色', @@ -2295,6 +2399,7 @@ export default { priorityNormal: '普通', priorityHigh: '高', priorityUrgent: '紧急', + // Status statusActive: '进行中', statusCompleted: '已完成', statusArchived: '已归档', @@ -2303,19 +2408,23 @@ export default { failed: '失败', inQueue: '队列中', noPrintsYet: '暂无打印', + // Footer stats printJobs: '打印任务(板)', partsPrinted: '已打印零件', failedParts: '失败零件', + // Actions import: '导入', export: '导出', importProject: '导入项目', exportAll: '导出所有项目', loading: '加载项目中...', + // Permissions noEditPermission: '您没有编辑项目的权限', noDeletePermission: '您没有删除项目的权限', noCreatePermission: '您没有创建项目的权限', noImportPermission: '您没有导入项目的权限', noExportPermission: '您没有导出项目的权限', + // Toast toast: { created: '项目已创建', updated: '项目已更新', @@ -2572,13 +2681,16 @@ export default { deleteConfirm: '确定要删除此耗材吗?此操作无法撤销。', archiveConfirm: '确定要归档此耗材吗?', advancedSettings: '高级设置', + // Tabs filamentInfoTab: '耗材信息', paProfileTab: 'PA 配置', filamentInfo: '耗材', additional: '附加', + // Cloud loadingPresets: '加载云端预设中...', cloudConnected: '云端已连接', cloudNotConnected: '云端未连接(使用默认值)', + // Colors recentColors: '最近', searchColors: '搜索颜色...', searchResults: '搜索结果', @@ -2588,6 +2700,7 @@ export default { showAll: '显示全部', noColorsFound: '没有颜色匹配您的搜索', noResults: '未找到匹配项', + // PA Profiles selectMaterialFirst: '请先在耗材信息选项卡中选择材料。', noPrintersConfigured: '未配置打印机。添加打印机以使用 PA 配置。', matchingFilter: '匹配', @@ -2604,6 +2717,7 @@ export default { leftNozzle: '左喷嘴', rightNozzle: '右喷嘴', profilesSelected: '个校准配置已选择', + // Stats & enhanced table totalInventory: '总库存', totalConsumed: '总消耗', byMaterial: '按材料', @@ -2612,7 +2726,6 @@ export default { sinceTracking: '自开始追踪', loadedInAms: '已装载到 AMS/外置', remaining: '剩余', - lowStockThreshold: '剩余 <20%', weightCheck: '重量检查', lastWeighed: '上次称量', neverWeighed: '从未称量', @@ -2635,9 +2748,11 @@ export default { table: '表格', cards: '卡片', net: '净重', + // Grouping groupSimilar: '分组', groupedSpools: '{{count}} 个相同耗材', groupedRows: '行', + // Column config columns: '列', configureColumns: '配置列', configureColumnsDesc: '拖动以重新排序列或使用箭头。使用眼睛图标切换可见性。', @@ -2649,11 +2764,13 @@ export default { moveDown: '下移', hideColumn: '隐藏列', showColumn: '显示列', + // Tag linking linkToSpool: '链接到耗材', tagLinked: '标签已链接到耗材', tagLinkFailed: '链接标签失败', tagAlreadyLinked: '标签已链接到其他耗材', unknownTag: '检测到未知 RFID 标签', + // Usage history usageHistory: '使用历史', noUsageHistory: '暂无使用记录', printName: '打印名称', @@ -2661,6 +2778,7 @@ export default { clearHistory: '清除', historyCleared: '使用历史已清除', fillSourceLabel: '(库存)', + lowStockThresholdError: '阈值必须在 0.1 到 99.9 之间', }, // Timelapse @@ -2783,6 +2901,7 @@ export default { uploadFailed: '上传失败', }, + // Edit archive modal // Edit Archive Modal editArchive: { title: '编辑归档', @@ -2812,6 +2931,7 @@ export default { photosHelp: '点击 + 添加打印成品照片', printResult: '打印成品', saving: '保存中...', + // Failure reasons failureReasons: { adhesionFailure: '附着力失败', spaghettiDetached: '拉丝 / 脱落', @@ -2825,6 +2945,7 @@ export default { userCancelled: '用户取消', other: '其他', }, + // Archive statuses statuses: { completed: '已完成', failed: '失败', @@ -2848,6 +2969,7 @@ export default { noKProfiles: '无 K 值配置', noKProfilesDesc: '未找到 {{diameter}}mm 喷嘴的压力推进配置', createFirstProfile: '创建第一个配置', + // Controls printer: '打印机', nozzle: '喷嘴', refresh: '刷新', @@ -2857,6 +2979,7 @@ export default { select: '选择', selectAll: '全选', delete: '删除', + // Filters searchPlaceholder: '按名称或耗材搜索...', allExtruders: '所有挤出机', leftOnly: '仅左侧', @@ -2867,8 +2990,10 @@ export default { sortName: '排序:名称', sortKValue: '排序:K 值', sortFilament: '排序:耗材', + // Dual extruder labels leftExtruder: '左挤出机', rightExtruder: '右挤出机', + // Modal modal: { addTitle: '添加 K 值配置', editTitle: '编辑 K 值配置', @@ -2895,16 +3020,19 @@ export default { savingExtruder: '保存到挤出机 {{current}}/{{total}}...', pleaseWait: '请稍候', }, + // Delete confirmation deleteConfirm: { title: '删除配置', cannotUndo: '此操作无法撤销', message: '确定要从打印机删除"{{name}}"吗?', }, + // Bulk delete bulkDelete: { title: '删除配置', cannotUndo: '此操作无法撤销', message: '确定要从打印机删除 {{count}} 个选中的配置吗?', }, + // Toast toast: { profileSaved: 'K 值配置已保存', profilesSaved: 'K 值配置已保存到 {{count}} 个挤出机', @@ -2920,6 +3048,7 @@ export default { noteSaved: '备注已保存', failedToSaveNote: '保存备注失败', }, + // Permissions permission: { noRead: '您没有刷新配置的权限', noCreate: '您没有添加配置的权限', @@ -3080,7 +3209,7 @@ export default { }, }, - // Maintenance type descriptions + // Maintenance type descriptions (built-in) maintenanceDescriptions: { lubricateCarbonRods: '在碳纤维杆上涂抹润滑剂以确保顺畅运动', lubricateRails: '在线性导轨上涂抹润滑剂以确保顺畅运动', @@ -3579,10 +3708,12 @@ export default { addSpool: '添加耗材', }, settings: { + // Tabs tabDevice: '设备', tabDisplay: '显示', tabScale: '秤', tabUpdates: '更新', + // Device tab nfcReader: 'NFC 读卡器', type: '类型', connection: '连接', @@ -3590,12 +3721,14 @@ export default { deviceInfo: '设备信息', hostname: '主机', uptime: '运行时间', + // Display tab brightness: '亮度', saved: '已保存', noBacklight: '未检测到 DSI 背光。亮度控制需要 DSI 显示屏。', screenBlank: '屏幕熄灭超时', screenBlankDesc: '不活动后屏幕关闭。触摸唤醒。', displayNote: '亮度作为软件滤镜应用。', + // Scale tab scaleCalibration: '秤校准', currentWeight: '当前重量', tareOffset: '去皮', @@ -3617,6 +3750,7 @@ export default { firmware: '固件', scale: '秤', noDevice: '未找到 SpoolBuddy 设备', + // Updates tab daemonVersion: '守护进程版本', currentVersion: '当前', versionPending: '等待守护进程...',