From db65db62321b8cee28625d217ec70c14e95be427 Mon Sep 17 00:00:00 2001 From: Trey T Date: Thu, 4 Jun 2026 20:52:28 -0500 Subject: [PATCH] i18n: complete app-wide localization (10 languages) + audit tooling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Localize all user-facing strings across iOS (SwiftUI), shared Kotlin, and Android Compose into en/es/fr/de/pt/it/ja/ko/nl/zh: - iOS String Catalogs: main + widget Localizable.xcstrings, InfoPlist.xcstrings (permissions), plural variations, ~200 new keys translated - Shared Kotlin ClientStrings table + Android composeResources/values-* (884 keys ×10), routed Api/ViewModel/util error & UI strings through localization - Backend-localized lookups/suggestions consumed via display names - Widget extension catalog; theme names, home-profile fallbacks, validation, network errors, accessibility labels all localized Add re-runnable verification gates: - scripts/i18n_audit.py — enumerate every literal, partition to GAP=0 - scripts/i18n_coverage.py — all 10 locales translated, format-specifier parity Co-Authored-By: Claude Opus 4.8 (1M context) --- .../composeResources/values-de/strings.xml | 581 + .../composeResources/values-es/strings.xml | 581 + .../composeResources/values-fr/strings.xml | 581 + .../composeResources/values-it/strings.xml | 581 + .../composeResources/values-ja/strings.xml | 581 + .../composeResources/values-ko/strings.xml | 581 + .../composeResources/values-nl/strings.xml | 581 + .../composeResources/values-pt/strings.xml | 581 + .../composeResources/values-zh/strings.xml | 581 + .../composeResources/values/strings.xml | 298 + .../com/tt/honeyDue/data/DataManager.kt | 24 + .../com/tt/honeyDue/i18n/ClientStrings.kt | 41 + .../com/tt/honeyDue/i18n/ClientStringsData.kt | 232 + .../kotlin/com/tt/honeyDue/models/Document.kt | 47 +- .../com/tt/honeyDue/models/HomeProfile.kt | 81 +- .../kotlin/com/tt/honeyDue/models/Lookups.kt | 47 +- .../com/tt/honeyDue/models/TaskTemplate.kt | 5 +- .../com/tt/honeyDue/network/APILayer.kt | 174 +- .../com/tt/honeyDue/network/ApiClient.kt | 4 +- .../com/tt/honeyDue/network/ApiConfig.kt | 6 +- .../kotlin/com/tt/honeyDue/network/AuthApi.kt | 76 +- .../com/tt/honeyDue/network/ContractorApi.kt | 34 +- .../com/tt/honeyDue/network/DocumentApi.kt | 48 +- .../com/tt/honeyDue/network/ErrorParser.kt | 13 +- .../com/tt/honeyDue/network/LookupsApi.kt | 32 +- .../tt/honeyDue/network/NotificationApi.kt | 36 +- .../com/tt/honeyDue/network/ResidenceApi.kt | 48 +- .../tt/honeyDue/network/SubscriptionApi.kt | 30 +- .../kotlin/com/tt/honeyDue/network/TaskApi.kt | 28 +- .../tt/honeyDue/network/TaskCompletionApi.kt | 22 +- .../tt/honeyDue/network/TaskTemplateApi.kt | 26 +- .../com/tt/honeyDue/network/UploadApi.kt | 19 +- .../honeyDue/ui/animation/TaskAnimations.kt | 10 +- .../honeyDue/ui/components/AddTaskDialog.kt | 6 +- .../ui/components/ApiResultHandler.kt | 13 +- .../ui/components/AuthenticatedImage.kt | 6 +- .../ui/components/CompleteTaskDialog.kt | 10 +- .../ui/components/ContractorImportDialog.kt | 4 +- .../tt/honeyDue/ui/components/ErrorDialog.kt | 11 +- .../ui/components/ManageUsersDialog.kt | 38 +- .../ui/components/PhotoViewerScreen.kt | 10 +- .../ui/components/ResidenceImportDialog.kt | 4 +- .../ui/components/TaskSuggestionDropdown.kt | 2 +- .../honeyDue/ui/components/auth/AuthHeader.kt | 2 +- .../ui/components/auth/RequirementItem.kt | 6 +- .../ui/components/common/ErrorCard.kt | 2 +- .../honeyDue/ui/components/common/InfoCard.kt | 8 +- .../components/common/StandardErrorState.kt | 12 +- .../honeyDue/ui/components/common/StatItem.kt | 2 +- .../components/dialogs/DeleteAccountDialog.kt | 2 +- .../ui/components/documents/DocumentCard.kt | 20 +- .../ui/components/documents/DocumentStates.kt | 6 +- .../documents/DocumentsTabContent.kt | 6 +- .../ui/components/residence/DetailRow.kt | 4 +- .../residence/PropertyDetailItem.kt | 2 +- .../ui/components/residence/TaskStatChip.kt | 2 +- .../components/task/CompletionHistorySheet.kt | 24 +- .../ui/components/task/PhotoViewerDialog.kt | 10 +- .../honeyDue/ui/components/task/TaskCard.kt | 8 +- .../ui/components/task/TaskKanbanView.kt | 16 +- .../tt/honeyDue/ui/design/OrganicDesign.kt | 6 +- .../tt/honeyDue/ui/screens/AllTasksScreen.kt | 20 +- .../ui/screens/BiometricLockScreen.kt | 9 +- .../honeyDue/ui/screens/CompleteTaskScreen.kt | 18 +- .../ui/screens/ContractorDetailScreen.kt | 17 +- .../ui/screens/DocumentDetailScreen.kt | 16 +- .../tt/honeyDue/ui/screens/EditTaskScreen.kt | 6 +- .../ui/screens/ForgotPasswordScreen.kt | 10 +- .../com/tt/honeyDue/ui/screens/LoginScreen.kt | 2 +- .../honeyDue/ui/screens/ManageUsersScreen.kt | 11 +- .../screens/NotificationPreferencesScreen.kt | 8 +- .../tt/honeyDue/ui/screens/ProfileScreen.kt | 11 +- .../ui/screens/ResetPasswordScreen.kt | 22 +- .../ui/screens/ResidenceDetailScreen.kt | 10 +- .../ui/screens/ResidenceFormScreen.kt | 16 +- .../honeyDue/ui/screens/ResidencesScreen.kt | 6 +- .../com/tt/honeyDue/ui/screens/TasksScreen.kt | 4 +- .../honeyDue/ui/screens/VerifyEmailScreen.kt | 12 +- .../ui/screens/VerifyResetCodeScreen.kt | 18 +- .../OnboardingCreateAccountContent.kt | 5 +- .../onboarding/OnboardingFirstTaskContent.kt | 41 +- .../OnboardingHomeProfileContent.kt | 37 +- .../OnboardingJoinResidenceContent.kt | 4 +- .../ui/screens/onboarding/OnboardingScreen.kt | 6 +- .../OnboardingSubscriptionContent.kt | 6 +- .../OnboardingVerifyEmailContent.kt | 4 +- .../screens/residence/JoinResidenceScreen.kt | 22 +- .../residence/JoinResidenceViewModel.kt | 4 +- .../residence/ResidenceFormValidation.kt | 19 +- .../subscription/FeatureComparisonScreen.kt | 75 +- .../task/AddTaskWithResidenceScreen.kt | 30 +- .../task/AddTaskWithResidenceViewModel.kt | 3 +- .../ui/screens/task/TaskFormValidation.kt | 14 +- .../ui/screens/task/TaskSuggestionsScreen.kt | 22 +- .../task/TaskTemplatesBrowserScreen.kt | 9 +- .../ui/screens/theme/ThemeSelectionScreen.kt | 64 +- .../ui/subscription/UpgradeFeatureScreen.kt | 40 +- .../ui/subscription/UpgradePromptDialog.kt | 20 +- .../honeyDue/ui/subscription/UpgradeScreen.kt | 58 +- .../com/tt/honeyDue/ui/theme/OrganicDesign.kt | 4 +- .../com/tt/honeyDue/ui/theme/ThemeColors.kt | 44 +- .../kotlin/com/tt/honeyDue/util/DateUtils.kt | 39 +- .../tt/honeyDue/util/ErrorMessageParser.kt | 85 +- .../tt/honeyDue/utils/SubscriptionHelper.kt | 4 +- .../tt/honeyDue/viewmodel/AuthViewModel.kt | 26 +- .../honeyDue/viewmodel/DocumentViewModel.kt | 21 +- .../honeyDue/viewmodel/OnboardingViewModel.kt | 14 +- .../viewmodel/PasswordResetViewModel.kt | 10 +- .../viewmodel/TaskCompletionViewModel.kt | 9 +- iosApp/HoneyDue/HoneyDue.swift | 28 +- iosApp/HoneyDue/Localizable.xcstrings | 1696 + .../iosApp/Analytics/AnalyticsManager.swift | 6 +- .../Background/BackgroundTaskManager.swift | 2 +- .../Components/AuthenticatedImage.swift | 10 +- iosApp/iosApp/Contractor/ContractorCard.swift | 2 +- .../Contractor/ContractorDetailView.swift | 6 +- .../Contractor/ContractorFormSheet.swift | 2 +- .../Contractor/ContractorSharingManager.swift | 8 +- .../Contractor/ContractorViewModel.swift | 18 +- .../Contractor/ContractorsListView.swift | 6 +- .../Core/FormStates/DocumentFormState.swift | 2 +- .../Core/FormStates/ResidenceFormState.swift | 2 +- .../Core/FormStates/TaskFormStates.swift | 4 +- iosApp/iosApp/Core/ValidationRules.swift | 30 +- .../iosApp/Data/DataManagerObservable.swift | 39 + .../Documents/Components/DocumentCard.swift | 2 +- .../Documents/Components/WarrantyCard.swift | 2 +- .../iosApp/Documents/DocumentDetailView.swift | 14 +- .../iosApp/Documents/DocumentViewModel.swift | 14 +- .../Documents/DocumentViewModelWrapper.swift | 10 +- .../Documents/DocumentsWarrantiesView.swift | 29 +- .../Documents/Helpers/DocumentHelpers.swift | 58 +- .../iosApp/Helpers/AccessibilityLabels.swift | 119 +- iosApp/iosApp/Helpers/DateUtils.swift | 32 +- .../iosApp/Helpers/ErrorAlertModifier.swift | 4 +- .../iosApp/Helpers/ErrorMessageParser.swift | 234 +- iosApp/iosApp/Helpers/PresignedUploader.swift | 22 +- iosApp/iosApp/Helpers/ThemeManager.swift | 59 +- iosApp/iosApp/Helpers/UITestRuntime.swift | 2 + .../Helpers/WidgetActionProcessor.swift | 2 +- iosApp/iosApp/InfoPlist.xcstrings | 201 + iosApp/iosApp/Localizable.xcstrings | 92263 ++++++++++++---- iosApp/iosApp/Login/AppleSignInManager.swift | 12 +- .../iosApp/Login/AppleSignInViewModel.swift | 8 +- iosApp/iosApp/Login/GoogleSignInManager.swift | 32 +- iosApp/iosApp/Login/LoginView.swift | 2 +- iosApp/iosApp/Login/LoginViewModel.swift | 18 +- .../OnboardingCreateAccountView.swift | 32 +- .../Onboarding/OnboardingFirstTaskView.swift | 50 +- .../OnboardingHomeProfileView.swift | 164 +- .../OnboardingJoinResidenceView.swift | 4 +- .../OnboardingNameResidenceView.swift | 10 +- .../iosApp/Onboarding/OnboardingState.swift | 8 +- .../OnboardingSubscriptionView.swift | 64 +- .../Onboarding/OnboardingTasksViewModel.swift | 6 +- .../Onboarding/OnboardingValuePropsView.swift | 48 +- .../OnboardingVerifyEmailView.swift | 2 +- .../PasswordReset/ForgotPasswordView.swift | 2 +- .../PasswordResetViewModel.swift | 28 +- .../PasswordReset/ResetPasswordView.swift | 16 +- .../PasswordReset/VerifyResetCodeView.swift | 2 +- .../AnimationTestingCard.swift | 2 +- .../AnimationTesting/TaskAnimations.swift | 50 +- .../Profile/NotificationPreferencesView.swift | 22 +- iosApp/iosApp/Profile/ProfileTabView.swift | 10 +- iosApp/iosApp/Profile/ProfileViewModel.swift | 12 +- .../iosApp/Profile/ThemeSelectionView.swift | 2 +- .../NotificationCategories.swift | 12 +- .../PushNotificationManager.swift | 12 +- iosApp/iosApp/Register/RegisterView.swift | 12 +- .../iosApp/Register/RegisterViewModel.swift | 6 +- .../iosApp/Residence/JoinResidenceView.swift | 2 +- iosApp/iosApp/Residence/ManageUsersView.swift | 10 +- .../Residence/ResidenceDetailView.swift | 4 +- .../Residence/ResidenceSharingManager.swift | 14 +- .../iosApp/Residence/ResidenceViewModel.swift | 20 +- .../iosApp/Residence/ResidencesListView.swift | 2 +- .../Shared/Components/ButtonStyles.swift | 4 +- .../Shared/Extensions/ColorExtensions.swift | 2 +- .../Shared/Extensions/DateExtensions.swift | 45 +- .../Shared/Extensions/DoubleExtensions.swift | 10 +- .../Utilities/AnimationPreference.swift | 2 +- .../Utilities/SharedErrorMessageParser.swift | 2 + .../Shared/Utilities/ValidationHelpers.swift | 2 + .../Subscription/FeatureComparisonView.swift | 10 +- .../iosApp/Subscription/StoreKitManager.swift | 14 +- .../SubscriptionPurchaseHelper.swift | 4 +- .../Subscription/UpgradeFeatureView.swift | 16 +- .../Subscription/UpgradePromptView.swift | 20 +- .../iosApp/Subviews/Common/OverviewCard.swift | 6 +- iosApp/iosApp/Subviews/Common/StatView.swift | 2 +- .../Residence/PropertyHeaderCard.swift | 12 +- .../Subviews/Residence/ResidenceCard.swift | 18 +- .../Subviews/Residence/ShareCodeCard.swift | 2 +- .../Subviews/Residence/SummaryCard.swift | 14 +- .../Subviews/Task/PhotoViewerSheet.swift | 4 +- .../iosApp/Subviews/Task/PriorityBadge.swift | 2 +- iosApp/iosApp/Subviews/Task/StatusBadge.swift | 7 +- .../Subviews/Task/TaskActionButtons.swift | 10 +- iosApp/iosApp/Subviews/Task/TaskCard.swift | 8 +- .../iosApp/Subviews/Task/TasksSection.swift | 12 +- iosApp/iosApp/Task/AllTasksView.swift | 6 +- iosApp/iosApp/Task/CompleteTaskView.swift | 10 +- iosApp/iosApp/Task/TaskFormView.swift | 14 +- .../Task/TaskTemplatesBrowserView.swift | 4 +- iosApp/iosApp/Task/TaskViewModel.swift | 2 +- .../iosApp/VerifyEmail/VerifyEmailView.swift | 2 +- .../VerifyEmail/VerifyEmailViewModel.swift | 8 +- iosApp/iosApp/iOSApp.swift | 26 +- scripts/i18n_audit.py | 297 + scripts/i18n_coverage.py | 191 + 211 files changed, 81756 insertions(+), 22467 deletions(-) create mode 100644 composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStrings.kt create mode 100644 composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStringsData.kt create mode 100644 iosApp/HoneyDue/Localizable.xcstrings create mode 100644 iosApp/iosApp/InfoPlist.xcstrings create mode 100644 scripts/i18n_audit.py create mode 100644 scripts/i18n_coverage.py diff --git a/composeApp/src/commonMain/composeResources/values-de/strings.xml b/composeApp/src/commonMain/composeResources/values-de/strings.xml index 40d073b..14eaadf 100644 --- a/composeApp/src/commonMain/composeResources/values-de/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-de/strings.xml @@ -472,4 +472,585 @@ Premium-Funktionen Sie haben das Immobilienlimit Ihres Plans erreicht Sie haben das Aufgabenlimit Ihres Plans erreicht + Heizung + Kühlung + Warmwasserbereiter + Pool + Bewässerungsanlage + Kamin + Garage + Keller + Dachboden + Klärgrube + Dachtyp + Außenbereich + Bodenbelag + Garten + %1$d Aufgaben ausgewählt + %1$d Aufgaben hinzufügen & weiter + Aufgaben für dein Zuhause werden gesucht... + Noch keine persönlichen Vorschläge — durchsuche den vollständigen Katalog oder überspringe diesen Schritt. + Alle ansehen + Überspringen + Deine Vorschläge konnten nicht geladen werden + Prüfe deine Verbindung und versuche es erneut. + Aufgabenkatalog wird geladen... + Aufgabenkatalog konnte nicht geladen werden + Derzeit keine Vorlagen verfügbar. + Ausgewählt + Offline + Vorerst überspringen + Auf Pro upgraden + Hol das Beste aus honeyDue heraus + Wähle deinen Tarif + Jährlich + Monatlich + Spare 50 % + BESTER WERT + Was enthalten ist + Unbegrenzte Objekte + Verwalte die Wartung all deiner Häuser + Unbegrenzte Aufgaben + Vergiss nie wieder eine Wartungsaufgabe + Handwerkerverwaltung + Speichere und bewerte deine vertrauten Handwerker + Dokumententresor + Bewahre Garantien, Belege und Anleitungen auf + Familienfreigabe + Lade Familienmitglieder zur Zusammenarbeit ein + Smarte Erinnerungen + Werde benachrichtigt, wenn Aufgaben fällig sind + Dokument- & Garantie-Speicher + Jetzt abonnieren + Käufe wiederherstellen + Das Abo verlängert sich automatisch, sofern es nicht mindestens 24 Stunden vor Ende des aktuellen Zeitraums gekündigt wird. Verwalte Abos in deinen Geräteeinstellungen. + Nutzungsbedingungen + Enthalten + Free vs. Pro vergleichen + Vielleicht später + Warnung + Abo aktiv + Du hast jetzt vollen Zugriff auf alle Pro-Funktionen! + Upgrade erforderlich + Diese Funktion ist mit einem Pro-Abo verfügbar. + Schalte unbegrenzten Zugriff auf alle Funktionen frei + honeyDue Pro Monatlich + honeyDue Pro Jährlich + Monatliche Abrechnung + Jährliche Abrechnung + Spare 22 % + Erledigt + Archiviert + Keine Aufgaben + Neue Aufgabe + Titel + z. B. Warmwasserbereiter spülen + Optionale Details + Fälligkeitsdatum (optional) + yyyy-MM-dd + Leer lassen für kein Fälligkeitsdatum + Geschätzte Kosten (optional) + Vorgeschlagene Aufgaben + Überspringen + Übernehmen + Vorschläge konnten nicht geladen werden + Noch keine Vorschläge + Vervollständige dein Zuhause-Profil, um persönliche Empfehlungen zu sehen. + Erledigungsverlauf + %1$d Erledigung + %1$d Erledigungen + Erledigungen werden geladen... + Erledigungen konnten nicht geladen werden + Noch keine Erledigungen + Diese Aufgabe wurde noch nicht erledigt. + Erledigt von %1$s + Foto ansehen + Benutzer entfernen + Code kopieren + Code in die Zwischenablage kopiert + Benutzer konnten nicht geladen werden + %1$s aus diesem Objekt entfernen? + Freigegebene Benutzer (%1$d) + Keine freigegebenen Benutzer + Benutzer mit Zugriff auf dieses Objekt. Nutze die Teilen-Schaltfläche, um andere einzuladen. + Möchtest du %1$s wirklich aus diesem Objekt entfernen? + Entfernen + Läuft ab + Mindestens 8 Zeichen + Enthält einen Großbuchstaben + Enthält einen Kleinbuchstaben + Enthält eine Zahl + Passwörter stimmen überein + Passwortanforderungen + Das Passwort muss mindestens 8 Zeichen lang sein und mindestens einen Groß-, einen Kleinbuchstaben und eine Zahl enthalten + Wohnsitz beitreten + Möchtest du diesem geteilten Wohnsitz beitreten? + Beigetreten + Du hast jetzt Zugriff auf %1$s. + Beitritt fehlgeschlagen + Beitreten... + Geteilt von: %1$s + Läuft ab: %1$s + Pro-Funktion + Das Teilen von Wohnsitzen ist eine Pro-Funktion. Upgrade, um Familienmitglieder zur gemeinsamen Hauspflege einzuladen. + Aufgabe konnte nicht abgebrochen werden + Aufgabe konnte nicht wiederhergestellt werden + Aufgabe konnte nicht als in Bearbeitung markiert werden + Aufgabe konnte nicht archiviert werden + Archivierung konnte nicht aufgehoben werden + IN BEARBEITUNG + Aktionen + Als in Bearbeitung markieren + Aufgabe abschließen + Aufgabe bearbeiten + Aufgabe abbrechen + Aufgabe wiederherstellen + Aufgabe archivieren + Archivierung aufheben + + Von: %1$s + Kosten: %1$s $ + Fotos ansehen (%1$d) + Neue Aufgabe + Objekt * + Objekt ist erforderlich + Aufgabenvorlagen durchsuchen + %1$d gängige Aufgaben + Kategorie ist erforderlich + Intervalltage + Standardintervall überschreiben + Anzahl der Tage zwischen den Durchgängen + Fälligkeitsdatum ist erforderlich (Format: JJJJ-MM-TT) + Format: JJJJ-MM-TT + Aufgabe erstellen + In Bearbeitung + Aufgabenvorlagen + Fertig + Vorlagen suchen... + Löschen + Ergebnis + Ergebnisse + Keine Vorlagen gefunden + Versuche einen anderen Suchbegriff + Keine Vorlagen verfügbar + Vorlagen erscheinen hier, sobald sie geladen sind + Aufklappen + Zuklappen + Hinzufügen + Alle + Anwenden + Anwenden (%1$d) + %1$d ausgewählt + Erneut versuchen + Vorlagen konnten nicht geladen werden + Aufgaben konnten nicht erstellt werden + Aufgabe abschließen: %1$s + Dienstleister wählen (optional) + Dienstleister wählen oder leer lassen + Aufklappen + Keiner (manuelle Eingabe) + Dienstleister werden geladen... + Fehler beim Laden der Dienstleister + Erledigt von (optional) + Name eingeben, falls kein Dienstleister oben + Tatsächliche Kosten (optional) + Notizen (optional) + Bewertung: %1$d von 5 + Bilder hinzufügen + Foto aufnehmen + Aus Galerie wählen + %1$d Bild(er) ausgewählt + Bild entfernen + Abschließen + Qualitätsbewertung + Fotos (%1$d/%2$d) + Kamera + Galerie + Fotos der erledigten Arbeit hinzufügen (optional) + Diesen Abschluss mit einem Dienstleister verknüpfen + Abschlussdetails + Alle Felder sind optional + Notizen zur erledigten Arbeit hinzufügen + Beschreibe die Arbeit, gefundene Probleme usw. + Bewerte die Qualität der Arbeit + Name unten manuell eingeben + Nutzer verwalten + Andere einladen + Einfach teilen + Einladungslink senden + Sende eine .honeydue-Datei per Nachricht, E-Mail oder teilen. Ein Tippen genügt zum Beitreten. + Code teilen + Kein aktiver Code + Code erstellen + Neuen Code erstellen + Teile diesen 6-stelligen Code. Er kann in der App eingegeben werden, um beizutreten. + Nutzer (%1$d) + Eigentümer + Entfernen + oder + Dienstleister teilen + Pro-Funktion + Das Teilen von Dienstleistern ist eine Pro-Funktion. Upgrade, um deine vertrauten Dienstleister mit Freunden und Familie zu teilen. + Dienstleister importieren + Möchtest du diesen Dienstleister importieren? + Dienstleister importiert + %1$s wurde zu deinen Kontakten hinzugefügt. + Import fehlgeschlagen + Geteilt von: %1$s + Dienstleister hinzufügen + Dienstleister bearbeiten + Grundinformationen + Name * + Firma + Wohnsitz (optional) + Persönlich (kein Wohnsitz) + Nur du siehst diesen Dienstleister + Alle Nutzer von %1$s sehen diesen Dienstleister + Kontaktinformationen + Telefon + E-Mail + Webseite + Fachgebiete + Adresse + Straße + Stadt + Bundesland + Postleitzahl + Notizen + Private Notizen + Als Favorit markieren + Hinzufügen + Speichern + Garantie bearbeiten + Dokument bearbeiten + Garantie hinzufügen + Dokument hinzufügen + Wohnsitz wählen + Wohnsitz * + Dokumenttyp * + Titel * + Artikelname * + Modellnummer + Seriennummer + Anbieter/Firma * + Anbieterkontakt + Telefon für Ansprüche + E-Mail für Ansprüche + Webseite für Ansprüche + Kaufdatum (JJJJ-MM-TT) + Garantiebeginn (JJJJ-MM-TT) + Garantieende (JJJJ-MM-TT) * + Beschreibung + Kategorie + Kategorie wählen + Keine + Tags + tag1, tag2, tag3 + Notizen + Aktiv + Vorhandene Fotos (%1$d) + Neue Fotos (%1$d/%2$d) + Fotos (%1$d/%2$d) + Kamera + Galerie + Bild %1$d + Bild entfernen + Garantie aktualisieren + Dokument aktualisieren + Bitte wähle einen Wohnsitz + Titel ist erforderlich + Artikelname ist für Garantien erforderlich + Anbieter ist für Garantien erforderlich + 2024-01-15 + 2025-01-15 + Wohnsitze konnten nicht geladen werden: %1$s + Support + Support kontaktieren + Hilfe zu deinem Konto erhalten + Premium-Funktionen freischalten + Upgrade auf Pro für das volle Erlebnis + Unbegrenzte Objekte + Dokument- & Garantiespeicher + Wohnsitz teilen + Dienstleister teilen + Aktive Benachrichtigungen + Startbildschirm-Widgets + Datenschutzrichtlinie + Unsere Datenschutzrichtlinie ansehen + Version %1$s + honeyDue + Profil bearbeiten + Konto löschen + Dein Konto dauerhaft löschen + Diese Aktion ist endgültig und kann nicht rückgängig gemacht werden. Alle deine Daten werden gelöscht. + Alle Wohnsitze, die dir gehören und mit anderen geteilt sind, werden ebenfalls gelöscht. + Gib dein Passwort zur Bestätigung ein + Tippe DELETE zur Bestätigung + Mein Konto löschen + Abbrechen + Konto erfolgreich gelöscht + Konto konnte nicht gelöscht werden + Tägliche Übersicht + Tägliche Übersicht über fällige und überfällige Aufgaben + E-Mail-Benachrichtigungen + E-Mail bei Abschluss + E-Mail erhalten, wenn eine Aufgabe abgeschlossen wird + Eigene Zeit festlegen + Ändern + Benachrichtigungszeit wählen + Alle Benachrichtigungen + Alle Kategorien mit einem Tippen ein- oder ausschalten + Kategorien + Aufgabenerinnerungen + Erinnerungen an anstehende und bald fällige Aufgaben + Überfällige Aufgaben + Hinweise, wenn eine Aufgabe überfällig ist + Wohnsitz-Einladungen + Einladungen zu einem geteilten Wohnsitz + Abo-Updates + Änderungen bei Abrechnung und Tarifstatus + Systemeinstellungen öffnen + Töne, Badges und „Nicht stören“ in den Android-Einstellungen feinabstimmen + Teilen + Importieren + Importieren... + Erneut versuchen + Überfällig + Diese Woche fällig + Nächste 30 Tage + Deine Objekte + Willkommen bei honeyDue + Dein Begleiter für die Hauspflege + Neu starten + Bestehendem Zuhause beitreten + Hast du schon ein Konto? Anmelden + Überspringen + Weiter + Loslegen + Vergiss nie eine Aufgabe + Verwalte alle Aufgaben zur Hauspflege an einem Ort mit smarten Erinnerungen + Dokumente immer griffbereit + Garantien, Anleitungen und Belege sicher speichern und jederzeit abrufen + Deine vertrauten Dienstleister + Halte alle Dienstleisterkontakte organisiert und schnell griffbereit + Mit der Familie teilen + Lade Familienmitglieder ein, um gemeinsam an der Hauspflege zu arbeiten + Smarte Benachrichtigungen + Erhalte aktive Erinnerungen, mit denen du Aufgaben direkt aus der Benachrichtigung abschließt + Startbildschirm-Widgets + Schneller Zugriff auf Aufgaben und Erinnerungen direkt vom Startbildschirm + Wo ist dein Zuhause? + Wir schlagen Pflegeaufgaben passend zum Klima deiner Region vor + Meinen Standort verwenden + Wird ermittelt... + Stattdessen Postleitzahl eingeben + Gib deine Postleitzahl ein + Postleitzahl + Benenne dein Zuhause + Gib deinem Objekt einen Namen zur leichteren Erkennung + z. B. Mein Zuhause, Strandhaus, Wohnung + Du kannst später weitere Details hinzufügen + Dein Zuhause sichern + Erstelle ein Konto, um geräteübergreifend zu synchronisieren + Konto mit E-Mail erstellen + E-Mail bestätigen + Wir haben einen 6-stelligen Code an deine E-Mail gesendet. Gib ihn unten ein, um dein Konto zu bestätigen. + Keinen Code erhalten? Prüfe deinen Spam-Ordner + Einem Wohnsitz beitreten + Gib den 6-stelligen Code ein, der mit dir geteilt wurde, um einem bestehenden Zuhause beizutreten + Teilcode eingeben + Wohnsitz beitreten + Alles bereit! + Lass uns mit ein paar Aufgaben starten. Je mehr du auswählst, desto besser helfen wir dir beim Erinnern! + %1$d/%2$d Aufgaben ausgewählt + Beliebteste hinzufügen + %1$d Aufgaben hinzufügen & weiter + Vorerst überspringen + Klima & Heizung + Sicherheit + Sanitär + Außenbereich & Garten + Geräte + Allgemein + Auf Pro upgraden + Bring dein Hausmanagement auf die nächste Stufe + HONEYDUE PRO + 4,9 • 10.000+ Hausbesitzer + Unbegrenzte Objekte + Verwalte jedes Haus, das dir gehört + Smarte Erinnerungen + Verpasse nie eine Pflegefrist + Dokumententresor + Alle deine Dokumente an einem Ort + Familienfreigabe + Bring alle auf den gleichen Stand + Ausgaben-Einblicke + Sieh, wofür dein Geld draufgeht + Dienstleister teilen + Teile deine vertrauten Dienstleister mit Familie und Freunden + Startbildschirm-Widgets + Schnellaktionen direkt vom Startbildschirm + Aktive Benachrichtigungen + Aufgaben direkt aus Benachrichtigungen abschließen + Wähle deinen Tarif + Monatlich + Jährlich + 30 % sparen + 2,99 $/Monat + 23,99 $/Jahr + Nur 1,99 $/Monat + 7 Tage kostenlos testen + Mit Gratisversion fortfahren + 7 Tage kostenlos, danach %1$s. Jederzeit kündbar. + Erzähl uns von deinem Zuhause + Alles optional — hilft uns, deinen Pflegeplan zu personalisieren + Systeme + Ausstattung + Außen + Innen + Für dich + Durchsuchen + App gesperrt + Authentifiziere dich, um honeyDue zu entsperren + Biometrische Sperre + Authentifizierung beim Öffnen der App verlangen + honeyDue entsperren + Bestätige deine Identität, um fortzufahren + Mit Biometrie entsperren + Authentifizierung fehlgeschlagen + Biometrische Authentifizierung ist auf diesem Gerät nicht verfügbar + Aufgabenerinnerungen + Erinnerungen an anstehende und bald fällige Aufgaben + Überfällige Aufgaben + Hinweise, wenn eine Aufgabe überfällig ist + Wohnsitz-Einladungen + Einladungen zu einem geteilten Wohnsitz + Abo-Updates + Status- und Abrechnungsupdates zum Abo + Ausgewählt + Öffnen + Überspringen + oder + Info + Verifiziert + Warnung + Foto + Enthalten + Wird überprüft… + AM + PM + ABEND + Netzwerkfehler + Laden fehlgeschlagen + Darstellung + Systemfarben verwenden + Material You von Android 12+ folgen (Hintergrundfarben) + Wähle deinen Tarif + Wechsle zu Pro für unbegrenzten Zugriff + Auf Pro upgraden + Funktion + Kostenlos + Pro + Immobilien + Aufgaben + Auftragnehmer + Dokumente + 1 Immobilie + 10 Aufgaben + Unbegrenzt + Nicht verfügbar + Prüfe deine E-Mails + Wir haben einen 6-stelligen Code gesendet an + Der Code läuft in 15 Minuten ab + Gib den 6-stelligen Code aus deiner E-Mail ein + Code verifiziert! Lege jetzt dein neues Passwort fest + Code nicht erhalten? + Prüfe deinen Spam-Ordner, falls du ihn nicht siehst + Code-Verifizierung fehlgeschlagen + E-Mail-Verifizierung ist erforderlich. Prüfe deinen Posteingang auf einen 6-stelligen Code. + Bitte gib einen gültigen 6-stelligen Code ein + Code nicht erhalten? Prüfe deinen Spam-Ordner oder kontaktiere den Support. + Verifizierung fehlgeschlagen + Dein Passwort wurde erfolgreich zurückgesetzt + Du kannst dich jetzt mit deinem neuen Passwort anmelden + Zurück zur Anmeldung + Neues Passwort festlegen + Erstelle ein sicheres Passwort, um dein Konto zu schützen + Passwortanforderungen + Zurücksetzen des Passworts fehlgeschlagen + Wir senden einen 6-stelligen Verifizierungscode an diese Adresse + Prüfe deine E-Mails auf einen 6-stelligen Verifizierungscode + Passwort wieder eingefallen? Zurück zur Anmeldung + Senden des Reset-Codes fehlgeschlagen + Immobilie beitreten + Einer geteilten Immobilie beitreten + Gib den 6-stelligen Freigabecode des Eigentümers ein. + Freigabecode + ABC123 + Codes bestehen aus 6 Großbuchstaben + Beitreten… + PIN zum Entsperren eingeben + 4-stellige PIN + Falsche PIN + Entsperren + Aufgabe konnte nicht erstellt werden + Alle Aufgaben + Aufgabe hinzufügen + Aufgaben konnten nicht geladen werden + Erstelle deine erste Aufgabe, um loszulegen + Füge zuerst eine Immobilie über den Tab Residenzen hinzu + Zum Hinzufügen upgraden + Hauptwohnsitz + Einheit: %1$s + Fehler beim Laden der Aufgaben: %1$s + Fehler beim Laden der Auftragnehmer: %1$s + Abonnement + Jederzeit in den Einstellungen kündbar • Keine Verpflichtung + Residenz wird beigetreten… + 7 Tage kostenlos testen, danach %1$s + Einklappen + Ausklappen + Nicht ausgewählt + Anmeldung läuft… + Anforderung erfüllt + Anforderung nicht erfüllt + Etwas ist schiefgelaufen + Nicht enthalten + Auftragnehmer: + Abgeschlossen von: + Foto entfernen + %1$d Sterne + Abschlussfotos + Foto vom Aufgabenabschluss + Residenz Nr. %1$d + Aufgabe Nr. %1$d + Bild %1$d von %2$d + Dokumentbilder + Keine Garantien gefunden + Keine Dokumente gefunden + Noch %1$d Tage + Immobilie Nr. + Teilen der Residenz fehlgeschlagen + Standard + Lebendige iOS-Systemfarben + Blaugrün + Blaugrün mit warmen Akzenten + Ozean + Tiefe Blautöne und Korallennuancen + Wald + Erdige Grüntöne und goldene Schattierungen + Sonnenuntergang + Warme Orange- und Rottöne + Monochrom + Elegante Graustufen + Lavendel + Sanftes Violett mit rosa Akzenten + Karmesinrot + Kräftiges Rot mit warmen Glanzlichtern + Mitternacht + Tiefes Marineblau mit Himmelblau + Wüste + Warme Terrakotta- und Sandtöne + Minze + Frisches Grün mit Türkis diff --git a/composeApp/src/commonMain/composeResources/values-es/strings.xml b/composeApp/src/commonMain/composeResources/values-es/strings.xml index ff999db..4c6bddb 100644 --- a/composeApp/src/commonMain/composeResources/values-es/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-es/strings.xml @@ -472,4 +472,585 @@ Funciones Premium Has alcanzado el limite de propiedades de tu plan Has alcanzado el limite de tareas de tu plan + Calefacción + Refrigeración + Calentador de agua + Piscina + Sistema de riego + Chimenea + Garaje + Sótano + Ático + Fosa séptica + Tipo de techo + Exterior + Suelo + Jardinería + %1$d tareas seleccionadas + Añadir %1$d tareas y continuar + Buscando tareas para tu hogar... + Aún no hay sugerencias personalizadas: explora el catálogo completo u omite este paso. + Ver todo + Omitir + No se pudieron cargar tus sugerencias + Revisa tu conexión e inténtalo de nuevo. + Cargando el catálogo de tareas... + No se pudo cargar el catálogo de tareas + No hay plantillas disponibles ahora mismo. + Seleccionado + Sin conexión + Omitir por ahora + Mejora a Pro + Aprovecha todo el potencial de honeyDue + Elige tu plan + Anual + Mensual + Ahorra 50% + MEJOR VALOR + Qué incluye + Propiedades ilimitadas + Gestiona el mantenimiento de todos tus hogares + Tareas ilimitadas + No vuelvas a olvidar una tarea de mantenimiento + Gestión de contratistas + Guarda y califica a tus contratistas de confianza + Bóveda de documentos + Guarda garantías, recibos y manuales + Uso compartido en familia + Invita a familiares a colaborar + Recordatorios inteligentes + Recibe avisos cuando venzan las tareas + Almacenamiento de documentos y garantías + Suscríbete ahora + Restaurar compras + La suscripción se renueva automáticamente a menos que se cancele al menos 24 horas antes del final del período actual. Gestiona las suscripciones en los ajustes de tu dispositivo. + Términos de uso + Incluido + Compara Gratis vs Pro + Quizás más tarde + Advertencia + Suscripción activa + ¡Ya tienes acceso completo a todas las funciones Pro! + Mejora requerida + Esta función está disponible con una suscripción Pro. + Desbloquea acceso ilimitado a todas las funciones + honeyDue Pro Mensual + honeyDue Pro Anual + Facturación mensual + Facturación anual + Ahorra 22% + Hechas + Archivadas + Sin tareas + Nueva tarea + Título + p. ej. Vaciar el calentador de agua + Detalles opcionales + Fecha de vencimiento (opcional) + aaaa-MM-dd + Déjalo en blanco si no hay fecha de vencimiento + Costo estimado (opcional) + Tareas sugeridas + Omitir + Aceptar + No se pudieron cargar las sugerencias + Aún no hay sugerencias + Completa el perfil de tu hogar para ver recomendaciones personalizadas. + Historial de finalizaciones + %1$d finalización + %1$d finalizaciones + Cargando finalizaciones... + No se pudieron cargar las finalizaciones + Aún no hay finalizaciones + Esta tarea no se ha completado. + Completada por %1$s + Ver foto + Eliminar usuario + Copiar código + Código copiado al portapapeles + No se pudieron cargar los usuarios + ¿Eliminar a %1$s de esta propiedad? + Usuarios compartidos (%1$d) + Sin usuarios compartidos + Usuarios con acceso a esta residencia. Usa el botón de compartir para invitar a otros. + ¿Seguro que quieres eliminar a %1$s de esta residencia? + Eliminar + Vence + Al menos 8 caracteres + Contiene una letra mayúscula + Contiene una letra minúscula + Contiene un número + Las contraseñas coinciden + Requisitos de la contraseña + La contraseña debe tener al menos 8 caracteres con al menos una mayúscula, una minúscula y un número + Unirse a la residencia + ¿Quieres unirte a esta residencia compartida? + Te uniste a la residencia + Ahora tienes acceso a %1$s. + Error al unirse + Uniéndose... + Compartido por: %1$s + Expira: %1$s + Función Pro + Compartir residencias es una función Pro. Mejora a Pro para invitar a tu familia a colaborar en el mantenimiento del hogar. + No se pudo cancelar la tarea + No se pudo restaurar la tarea + No se pudo marcar la tarea en curso + No se pudo archivar la tarea + No se pudo desarchivar la tarea + EN CURSO + Acciones + Marcar en curso + Completar tarea + Editar tarea + Cancelar tarea + Restaurar tarea + Archivar tarea + Desarchivar tarea + N/D + Por: %1$s + Costo: $%1$s + Ver fotos (%1$d) + Agregar tarea + Propiedad * + La propiedad es obligatoria + Explorar plantillas de tareas + %1$d tareas comunes + La categoría es obligatoria + Días de intervalo + Sustituir el intervalo de frecuencia predeterminado + Número de días entre cada repetición + La fecha de vencimiento es obligatoria (formato: AAAA-MM-DD) + Formato: AAAA-MM-DD + Crear tarea + En curso + Plantillas de tareas + Listo + Buscar plantillas... + Borrar + resultado + resultados + No se encontraron plantillas + Prueba con otro término de búsqueda + No hay plantillas disponibles + Las plantillas aparecerán aquí una vez cargadas + Expandir + Contraer + Agregar + Todas + Aplicar + Aplicar (%1$d) + %1$d seleccionadas + Reintentar + No se pudieron cargar las plantillas + No se pudieron crear las tareas + Completar tarea: %1$s + Seleccionar contratista (opcional) + Elige un contratista o déjalo en blanco + Expandir + Ninguno (entrada manual) + Cargando contratistas... + Error al cargar contratistas + Completado por (opcional) + Ingresa un nombre si no usas el contratista de arriba + Costo real (opcional) + Notas (opcional) + Calificación: %1$d de 5 + Agregar imágenes + Tomar foto + Elegir de la galería + %1$d imagen(es) seleccionada(s) + Quitar imagen + Completar + Calificación de calidad + Fotos (%1$d/%2$d) + Cámara + Galería + Agrega fotos del trabajo terminado (opcional) + Vincula esta tarea completada a un contratista + Detalles de finalización + Todos los campos son opcionales + Agrega notas sobre el trabajo terminado + Describe el trabajo hecho, problemas encontrados, etc. + Califica la calidad del trabajo realizado + Ingresa el nombre manualmente abajo + Gestionar usuarios + Invitar a otros + Compartir fácil + Enviar enlace de invitación + Envía un archivo .honeydue por Mensajes, correo o compartir. Solo tienen que tocar para unirse. + Compartir código + No hay código activo + Generar código + Generar nuevo código + Comparte este código de 6 caracteres. Pueden ingresarlo en la app para unirse. + Usuarios (%1$d) + Propietario + Quitar + o + Compartir contratista + Función Pro + Compartir contratistas es una función Pro. Mejora a Pro para compartir tus contratistas de confianza con amigos y familia. + Importar contratista + ¿Quieres importar este contratista? + Contratista importado + %1$s se agregó a tus contactos. + Error al importar + Compartido por: %1$s + Agregar contratista + Editar contratista + Información básica + Nombre * + Empresa + Residencia (opcional) + Personal (sin residencia) + Solo tú verás este contratista + Todos los usuarios de %1$s verán este contratista + Información de contacto + Teléfono + Correo + Sitio web + Especialidades + Dirección + Calle + Ciudad + Estado + Código postal + Notas + Notas privadas + Marcar como favorito + Agregar + Guardar + Editar garantía + Editar documento + Agregar garantía + Agregar documento + Seleccionar residencia + Residencia * + Tipo de documento * + Título * + Nombre del artículo * + Número de modelo + Número de serie + Proveedor/empresa * + Contacto del proveedor + Teléfono de reclamos + Correo de reclamos + Sitio web de reclamos + Fecha de compra (AAAA-MM-DD) + Fecha de inicio de la garantía (AAAA-MM-DD) + Fecha de fin de la garantía (AAAA-MM-DD) * + Descripción + Categoría + Seleccionar categoría + Ninguna + Etiquetas + etiqueta1, etiqueta2, etiqueta3 + Notas + Activo + Fotos existentes (%1$d) + Fotos nuevas (%1$d/%2$d) + Fotos (%1$d/%2$d) + Cámara + Galería + Imagen %1$d + Quitar imagen + Actualizar garantía + Actualizar documento + Selecciona una residencia + El título es obligatorio + El nombre del artículo es obligatorio para las garantías + El proveedor es obligatorio para las garantías + 2024-01-15 + 2025-01-15 + No se pudieron cargar las residencias: %1$s + Soporte + Contactar soporte + Obtén ayuda con tu cuenta + Desbloquea funciones premium + Mejora a Pro para la experiencia completa + Propiedades ilimitadas + Almacenamiento de documentos y garantías + Compartir residencias + Compartir contratistas + Notificaciones con acciones + Widgets de pantalla de inicio + Política de privacidad + Ver nuestra política de privacidad + Versión %1$s + honeyDue + Editar perfil + Eliminar cuenta + Elimina tu cuenta de forma permanente + Esta acción es permanente y no se puede deshacer. Todos tus datos se eliminarán. + Cualquier residencia que poseas y esté compartida con otros usuarios también se eliminará. + Ingresa tu contraseña para confirmar + Escribe DELETE para confirmar + Eliminar mi cuenta + Cancelar + Cuenta eliminada correctamente + No se pudo eliminar la cuenta + Resumen diario + Resumen diario de tareas pendientes y vencidas + Notificaciones por correo + Correo de tarea completada + Recibe un correo cuando se completa una tarea + Definir hora personalizada + Cambiar + Seleccionar hora de notificación + Todas las notificaciones + Activa o desactiva todas las categorías con un toque + Categorías + Recordatorios de tareas + Recordatorios próximos y de vencimiento cercano + Tareas vencidas + Alertas cuando una tarea pasa su fecha de vencimiento + Invitaciones a residencias + Invitaciones para unirse a una residencia compartida + Actualizaciones de suscripción + Cambios de facturación y estado del plan + Abrir ajustes del sistema + Ajusta sonidos, insignias y el comportamiento de No molestar en los ajustes de Android + Compartir + Importar + Importando... + Reintentar + Vencidas + Vencen esta semana + Próximos 30 días + Tus propiedades + Te damos la bienvenida a honeyDue + Tu compañero de mantenimiento del hogar + Empezar de cero + Unirte a un hogar existente + ¿Ya tienes una cuenta? Inicia sesión + Omitir + Continuar + Comenzar + Nunca olvides una tarea + Lleva el control de todas tus tareas de mantenimiento del hogar en un solo lugar con recordatorios inteligentes + Documentos al alcance de tu mano + Guarda garantías, manuales y recibos de forma segura y accede a ellos cuando quieras + Tus contratistas de confianza + Mantén todos tus contactos de contratistas organizados y a la mano + Comparte con tu familia + Invita a tu familia a colaborar juntos en el mantenimiento del hogar + Notificaciones inteligentes + Recibe recordatorios con acciones que te permiten completar tareas desde la notificación + Widgets de pantalla de inicio + Acceso rápido a tareas y recordatorios directamente desde tu pantalla de inicio + ¿Dónde está tu hogar? + Te sugeriremos tareas de mantenimiento según el clima de tu zona + Usar mi ubicación + Detectando... + Ingresar código postal + Ingresa tu código postal + Código postal + Nombra tu hogar + Dale un nombre a tu propiedad para identificarla fácilmente + ej., Mi casa, Casa de playa, Departamento + Puedes agregar más detalles después + Guarda tu hogar + Crea una cuenta para sincronizar entre dispositivos + Crear cuenta con correo + Verifica tu correo + Enviamos un código de 6 dígitos a tu correo. Ingrésalo abajo para verificar tu cuenta. + ¿No recibiste el código? Revisa tu carpeta de spam + Unirse a una residencia + Ingresa el código de 6 caracteres que compartieron contigo para unirte a un hogar existente + Ingresa el código para compartir + Unirse a la residencia + ¡Todo listo! + Empecemos con algunas tareas. Cuantas más elijas, más te ayudaremos a recordar. + %1$d/%2$d tareas seleccionadas + Agregar las más populares + Agregar %1$d tareas y continuar + Omitir por ahora + Climatización + Seguridad + Plomería + Exterior y jardín + Electrodomésticos + Hogar general + Hazte Pro + Lleva la gestión de tu hogar al siguiente nivel + HONEYDUE PRO + 4.9 • 10 mil+ propietarios + Propiedades ilimitadas + Lleva el control de cada hogar que tengas + Recordatorios inteligentes + No te pierdas ninguna fecha de mantenimiento + Bóveda de documentos + Todos tus documentos en un solo lugar + Compartir en familia + Mantén a todos en la misma página + Análisis de gastos + Mira en qué se va tu dinero + Compartir contratistas + Comparte tus contratistas de confianza con familia y amigos + Widgets de pantalla de inicio + Acciones rápidas desde tu pantalla de inicio + Notificaciones con acciones + Completa tareas directamente desde las notificaciones + Elige tu plan + Mensual + Anual + Ahorra 30% + $2.99/mes + $23.99/año + Solo $1.99/mes + Comenzar prueba gratis de 7 días + Continuar con la versión gratuita + Prueba gratis de 7 días, luego %1$s. Cancela cuando quieras. + Cuéntanos sobre tu hogar + Todo opcional: nos ayuda a personalizar tu plan de mantenimiento + Sistemas + Características + Exterior + Interior + Para ti + Explorar + App bloqueada + Autentícate para desbloquear honeyDue + Bloqueo biométrico + Requerir autenticación al abrir la app + Desbloquear honeyDue + Verifica tu identidad para continuar + Desbloquear con biometría + Error de autenticación + La autenticación biométrica no está disponible en este dispositivo + Recordatorios de tareas + Recordatorios de tareas próximas y de vencimiento cercano + Tareas vencidas + Alertas cuando una tarea pasa su fecha de vencimiento + Invitaciones a residencias + Invitaciones para unirse a una residencia compartida + Actualizaciones de suscripción + Estado de la suscripción y actualizaciones de facturación + Seleccionado + Abrir + Omitir + o + Información + Verificado + Advertencia + Foto + Incluido + Verificando… + AM + PM + NOCHE + Error de red + Error al cargar + Apariencia + Usar colores del sistema + Seguir Material You de Android 12+ (colores del fondo de pantalla) + Elige tu plan + Mejora a Pro para acceso ilimitado + Mejorar a Pro + Función + Gratis + Pro + Propiedades + Tareas + Contratistas + Documentos + 1 propiedad + 10 tareas + Ilimitado + No disponible + Revisa tu correo + Enviamos un código de 6 dígitos a + El código caduca en 15 minutos + Introduce el código de 6 dígitos de tu correo + ¡Código verificado! Ahora establece tu nueva contraseña + ¿No recibiste el código? + Revisa tu carpeta de spam si no lo ves + Verificación del código fallida + Se requiere verificación de correo. Revisa tu bandeja de entrada para ver un código de 6 dígitos. + Introduce un código válido de 6 dígitos + ¿No recibiste el código? Revisa tu carpeta de spam o contacta con soporte. + Verificación fallida + Tu contraseña se ha restablecido correctamente + Ya puedes iniciar sesión con tu nueva contraseña + Volver al inicio de sesión + Establecer nueva contraseña + Crea una contraseña segura para proteger tu cuenta + Requisitos de la contraseña + Restablecimiento de contraseña fallido + Enviaremos un código de verificación de 6 dígitos a esta dirección + Revisa tu correo para ver un código de verificación de 6 dígitos + ¿Recuerdas tu contraseña? Volver al inicio de sesión + Error al enviar el código de restablecimiento + Unirse a propiedad + Unirse a una propiedad compartida + Introduce el código de 6 caracteres proporcionado por el propietario. + Código para compartir + ABC123 + Los códigos tienen 6 caracteres en mayúscula + Uniéndose… + Introduce el PIN para desbloquear + PIN de 4 dígitos + PIN incorrecto + Desbloquear + Error al crear la tarea + Todas las tareas + Añadir tarea + Error al cargar las tareas + Crea tu primera tarea para empezar + Primero añade una propiedad desde la pestaña Residencias + Mejorar para añadir + Residencia principal + Unidad: %1$s + Error al cargar las tareas: %1$s + Error al cargar los contratistas: %1$s + Suscripción + Cancela cuando quieras en Ajustes • Sin compromiso + Uniéndose a la residencia… + Prueba gratuita de 7 días, luego %1$s + Contraer + Expandir + No seleccionado + Iniciando sesión… + Requisito cumplido + Requisito no cumplido + Algo salió mal + No incluido + Contratista: + Completado por: + Quitar foto + %1$d estrellas + Fotos de finalización + Foto de finalización de la tarea + Residencia n.º %1$d + Tarea n.º %1$d + Imagen %1$d de %2$d + Imágenes del documento + No se encontraron garantías + No se encontraron documentos + %1$d días restantes + Propiedad n.º + Error al compartir la residencia + Predeterminado + Colores vibrantes del sistema iOS + Verde azulado + Azul verdoso con acentos cálidos + Océano + Azules profundos y tonos coral + Bosque + Verdes tierra y matices dorados + Atardecer + Naranjas y rojos cálidos + Monocromo + Elegante escala de grises + Lavanda + Púrpura suave con acentos rosados + Carmesí + Rojo intenso con destellos cálidos + Medianoche + Azul marino profundo con azul cielo + Desierto + Tonos cálidos de terracota y arena + Menta + Verde fresco con turquesa diff --git a/composeApp/src/commonMain/composeResources/values-fr/strings.xml b/composeApp/src/commonMain/composeResources/values-fr/strings.xml index fbb1555..7008fac 100644 --- a/composeApp/src/commonMain/composeResources/values-fr/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-fr/strings.xml @@ -472,4 +472,585 @@ Fonctionnalites Premium Vous avez atteint la limite de proprietes de votre forfait Vous avez atteint la limite de taches de votre forfait + Chauffage + Climatisation + Chauffe-eau + Piscine + Système d\'arrosage + Cheminée + Garage + Sous-sol + Grenier + Fosse septique + Type de toiture + Extérieur + Revêtement de sol + Aménagement paysager + %1$d tâches sélectionnées + Ajouter %1$d tâches et continuer + Recherche de tâches pour votre logement... + Pas encore de suggestions personnalisées — parcourez le catalogue complet ou ignorez cette étape. + Tout parcourir + Ignorer + Impossible de charger vos suggestions + Vérifiez votre connexion et réessayez. + Chargement du catalogue de tâches... + Impossible de charger le catalogue de tâches + Aucun modèle disponible pour le moment. + Sélectionné + Hors ligne + Ignorer pour l\'instant + Passer à Pro + Exploitez tout le potentiel de honeyDue + Choisissez votre formule + Annuel + Mensuel + Économisez 50 % + MEILLEURE OFFRE + Ce qui est inclus + Propriétés illimitées + Suivez l\'entretien de tous vos logements + Tâches illimitées + N\'oubliez plus jamais une tâche d\'entretien + Gestion des prestataires + Enregistrez et notez vos prestataires de confiance + Coffre-fort de documents + Conservez garanties, reçus et manuels + Partage familial + Invitez des membres de la famille à collaborer + Rappels intelligents + Soyez averti à l\'échéance des tâches + Stockage de documents et garanties + S\'abonner maintenant + Restaurer les achats + L\'abonnement se renouvelle automatiquement sauf annulation au moins 24 heures avant la fin de la période en cours. Gérez les abonnements dans les réglages de votre appareil. + Conditions d\'utilisation + Inclus + Comparer Gratuit et Pro + Plus tard + Avertissement + Abonnement actif + Vous avez désormais un accès complet à toutes les fonctionnalités Pro ! + Mise à niveau requise + Cette fonctionnalité est disponible avec un abonnement Pro. + Débloquez un accès illimité à toutes les fonctionnalités + honeyDue Pro Mensuel + honeyDue Pro Annuel + Facturé mensuellement + Facturé annuellement + Économisez 22 % + Terminé + Archivé + Aucune tâche + Nouvelle tâche + Titre + ex. Vidanger le chauffe-eau + Détails facultatifs + Date d\'échéance (facultatif) + aaaa-MM-jj + Laissez vide pour aucune date d\'échéance + Coût estimé (facultatif) + Tâches suggérées + Ignorer + Accepter + Impossible de charger les suggestions + Pas encore de suggestions + Complétez le profil de votre logement pour voir des recommandations personnalisées. + Historique des achèvements + %1$d achèvement + %1$d achèvements + Chargement des achèvements... + Échec du chargement des achèvements + Pas encore d\'achèvements + Cette tâche n\'a pas été terminée. + Terminé par %1$s + Voir la photo + Retirer l\'utilisateur + Copier le code + Code copié dans le presse-papiers + Impossible de charger les utilisateurs + Retirer %1$s de cette propriété ? + Utilisateurs partagés (%1$d) + Aucun utilisateur partagé + Utilisateurs ayant accès à cette résidence. Utilisez le bouton de partage pour inviter d\'autres personnes. + Êtes-vous sûr de vouloir retirer %1$s de cette résidence ? + Retirer + Expire le + Au moins 8 caractères + Contient une majuscule + Contient une minuscule + Contient un chiffre + Les mots de passe correspondent + Exigences du mot de passe + Le mot de passe doit comporter au moins 8 caractères, avec au moins une majuscule, une minuscule et un chiffre + Rejoindre la résidence + Voulez-vous rejoindre cette résidence partagée ? + Résidence rejointe + Vous avez maintenant accès à %1$s. + Échec de l\'ajout + Connexion… + Partagé par : %1$s + Expire le : %1$s + Fonction Pro + Le partage de résidences est une fonction Pro. Passez à Pro pour inviter votre famille à collaborer à l\'entretien de la maison. + Échec de l\'annulation de la tâche + Échec de la restauration de la tâche + Impossible de marquer la tâche en cours + Échec de l\'archivage de la tâche + Échec du désarchivage de la tâche + EN COURS + Actions + Marquer en cours + Terminer la tâche + Modifier la tâche + Annuler la tâche + Restaurer la tâche + Archiver la tâche + Désarchiver la tâche + N/D + Par : %1$s + Coût : %1$s $ + Voir les photos (%1$d) + Nouvelle tâche + Propriété * + La propriété est requise + Parcourir les modèles de tâches + %1$d tâches courantes + La catégorie est requise + Intervalle (jours) + Remplacer l\'intervalle par défaut + Nombre de jours entre chaque occurrence + L\'échéance est requise (format : AAAA-MM-JJ) + Format : AAAA-MM-JJ + Créer la tâche + En cours + Modèles de tâches + Terminé + Rechercher des modèles… + Effacer + résultat + résultats + Aucun modèle trouvé + Essayez un autre terme de recherche + Aucun modèle disponible + Les modèles apparaîtront ici une fois chargés + Développer + Réduire + Ajouter + Tous + Appliquer + Appliquer (%1$d) + %1$d sélectionnés + Réessayer + Échec du chargement des modèles + Échec de la création des tâches + Terminer la tâche : %1$s + Sélectionner un prestataire (facultatif) + Choisissez un prestataire ou laissez vide + Développer + Aucun (saisie manuelle) + Chargement des prestataires… + Erreur de chargement des prestataires + Réalisé par (facultatif) + Saisissez un nom si vous n\'utilisez pas le prestataire ci-dessus + Coût réel (facultatif) + Notes (facultatif) + Note : %1$d sur 5 + Ajouter des images + Prendre une photo + Choisir dans la bibliothèque + %1$d image(s) sélectionnée(s) + Supprimer l\'image + Terminer + Note de qualité + Photos (%1$d/%2$d) + Appareil photo + Bibliothèque + Ajoutez des photos du travail terminé (facultatif) + Associer cette réalisation à un prestataire + Détails de la réalisation + Tous les champs sont facultatifs + Ajoutez des notes sur le travail terminé + Décrivez le travail effectué, les problèmes rencontrés, etc. + Évaluez la qualité du travail effectué + Saisissez un nom manuellement ci-dessous + Gérer les utilisateurs + Inviter d\'autres personnes + Partage facile + Envoyer un lien d\'invitation + Envoyez un fichier .honeydue par messages, e-mail ou partage. Il suffit d\'appuyer pour rejoindre. + Code de partage + Aucun code actif + Générer un code + Générer un nouveau code + Partagez ce code à 6 caractères. Ils peuvent le saisir dans l\'app pour rejoindre. + Utilisateurs (%1$d) + Propriétaire + Retirer + ou + Partager le prestataire + Fonction Pro + Le partage de prestataires est une fonction Pro. Passez à Pro pour partager vos prestataires de confiance avec vos proches. + Importer le prestataire + Voulez-vous importer ce prestataire ? + Prestataire importé + %1$s a été ajouté à vos contacts. + Échec de l\'importation + Partagé par : %1$s + Ajouter un prestataire + Modifier le prestataire + Informations de base + Nom * + Entreprise + Résidence (facultatif) + Personnel (aucune résidence) + Vous seul verrez ce prestataire + Tous les utilisateurs de %1$s verront ce prestataire + Coordonnées + Téléphone + E-mail + Site web + Spécialités + Adresse + Adresse + Ville + État + Code postal + Notes + Notes privées + Marquer comme favori + Ajouter + Enregistrer + Modifier la garantie + Modifier le document + Ajouter une garantie + Ajouter un document + Sélectionner une résidence + Résidence * + Type de document * + Titre * + Nom de l\'article * + Numéro de modèle + Numéro de série + Fournisseur/Entreprise * + Contact du fournisseur + Téléphone de réclamation + E-mail de réclamation + Site web de réclamation + Date d\'achat (AAAA-MM-JJ) + Début de la garantie (AAAA-MM-JJ) + Fin de la garantie (AAAA-MM-JJ) * + Description + Catégorie + Sélectionner une catégorie + Aucune + Étiquettes + étiquette1, étiquette2, étiquette3 + Notes + Active + Photos existantes (%1$d) + Nouvelles photos (%1$d/%2$d) + Photos (%1$d/%2$d) + Appareil photo + Galerie + Image %1$d + Supprimer l\'image + Mettre à jour la garantie + Mettre à jour le document + Veuillez sélectionner une résidence + Le titre est requis + Le nom de l\'article est requis pour les garanties + Le fournisseur est requis pour les garanties + 2024-01-15 + 2025-01-15 + Échec du chargement des résidences : %1$s + Assistance + Contacter l\'assistance + Obtenez de l\'aide pour votre compte + Débloquez les fonctions Premium + Passez à Pro pour l\'expérience complète + Propriétés illimitées + Stockage des documents et garanties + Partage de résidence + Partage de prestataires + Notifications interactives + Widgets d\'écran d\'accueil + Politique de confidentialité + Consulter notre politique de confidentialité + Version %1$s + honeyDue + Modifier le profil + Supprimer le compte + Supprimer définitivement votre compte + Cette action est définitive et irréversible. Toutes vos données seront supprimées. + Toute résidence que vous possédez et partagez avec d\'autres utilisateurs sera également supprimée. + Saisissez votre mot de passe pour confirmer + Saisissez SUPPRIMER pour confirmer + Supprimer mon compte + Annuler + Compte supprimé avec succès + Échec de la suppression du compte + Récapitulatif quotidien + Aperçu quotidien des tâches à échéance et en retard + Notifications par e-mail + E-mail de tâche terminée + Recevez un e-mail lorsqu\'une tâche est terminée + Définir une heure personnalisée + Modifier + Sélectionner l\'heure de notification + Toutes les notifications + Activez ou désactivez toutes les catégories en un seul geste + Catégories + Rappels de tâches + Rappels à venir et bientôt dus + Tâches en retard + Alertes lorsqu\'une tâche dépasse son échéance + Invitations de résidence + Invitations à rejoindre une résidence partagée + Mises à jour d\'abonnement + Changements de facturation et de statut du forfait + Ouvrir les paramètres système + Ajustez les sons, les badges et le mode Ne pas déranger dans les paramètres Android + Partager + Importer + Importation… + Réessayer + En retard + À faire cette semaine + 30 prochains jours + Vos propriétés + Bienvenue dans honeyDue + Votre compagnon d\'entretien de la maison + Commencer à zéro + Rejoindre une maison existante + Vous avez déjà un compte ? Connectez-vous + Passer + Continuer + Commencer + N\'oubliez jamais une tâche + Suivez toutes vos tâches d\'entretien au même endroit avec des rappels intelligents + Vos documents à portée de main + Conservez garanties, manuels et reçus en toute sécurité et accédez-y à tout moment + Vos prestataires de confiance + Gardez tous vos contacts de prestataires organisés et facilement accessibles + Partagez avec votre famille + Invitez votre famille à collaborer ensemble à l\'entretien de la maison + Notifications intelligentes + Recevez des rappels interactifs qui vous permettent de terminer les tâches directement depuis la notification + Widgets d\'écran d\'accueil + Accès rapide aux tâches et rappels directement depuis votre écran d\'accueil + Où se trouve votre maison ? + Nous suggérerons des tâches d\'entretien adaptées au climat de votre région + Utiliser ma position + Détection… + Saisir un code postal à la place + Saisissez votre code postal + Code postal + Nommez votre maison + Donnez un nom à votre propriété pour l\'identifier facilement + ex. : Ma maison, Maison de plage, Appartement + Vous pourrez ajouter plus de détails plus tard + Sauvegardez votre maison + Créez un compte pour synchroniser sur tous vos appareils + Créer un compte avec un e-mail + Vérifiez votre e-mail + Nous avons envoyé un code à 6 chiffres à votre adresse e-mail. Saisissez-le ci-dessous pour vérifier votre compte. + Vous n\'avez pas reçu de code ? Vérifiez vos courriers indésirables + Rejoindre une résidence + Saisissez le code à 6 caractères qui vous a été partagé pour rejoindre une maison existante + Saisir le code de partage + Rejoindre la résidence + Tout est prêt ! + Commençons par quelques tâches. Plus vous en choisissez, plus nous vous aiderons à vous en souvenir ! + %1$d/%2$d tâches sélectionnées + Ajouter les plus populaires + Ajouter %1$d tâches et continuer + Passer pour l\'instant + CVC et climat + Sécurité et sûreté + Plomberie + Extérieur et pelouse + Électroménager + Maison générale + Passez à Pro + Faites passer la gestion de votre maison au niveau supérieur + HONEYDUE PRO + 4,9 • plus de 10 000 propriétaires + Propriétés illimitées + Suivez chaque maison que vous possédez + Rappels intelligents + Ne manquez jamais une échéance d\'entretien + Coffre à documents + Tous vos documents au même endroit + Partage familial + Mettez tout le monde sur la même longueur d\'onde + Analyse des dépenses + Voyez où va votre argent + Partage de prestataires + Partagez vos prestataires de confiance avec vos proches et amis + Widgets d\'écran d\'accueil + Actions rapides directement depuis votre écran d\'accueil + Notifications interactives + Terminez les tâches directement depuis les notifications + Choisissez votre forfait + Mensuel + Annuel + Économisez 30 % + 2,99 $/mois + 23,99 $/an + Seulement 1,99 $/mois + Commencer l\'essai gratuit de 7 jours + Continuer avec la version gratuite + Essai gratuit de 7 jours, puis %1$s. Annulable à tout moment. + Parlez-nous de votre maison + Tout est facultatif — cela nous aide à personnaliser votre plan d\'entretien + Systèmes + Caractéristiques + Extérieur + Intérieur + Pour vous + Parcourir + Application verrouillée + Authentifiez-vous pour déverrouiller honeyDue + Verrouillage biométrique + Exiger une authentification à l\'ouverture de l\'app + Déverrouiller honeyDue + Vérifiez votre identité pour continuer + Déverrouiller avec la biométrie + Échec de l\'authentification + L\'authentification biométrique n\'est pas disponible sur cet appareil + Rappels de tâches + Rappels de tâches à venir et bientôt dues + Tâches en retard + Alertes lorsqu\'une tâche dépasse son échéance + Invitations de résidence + Invitations à rejoindre une résidence partagée + Mises à jour d\'abonnement + Mises à jour du statut d\'abonnement et de la facturation + Sélectionné + Ouvrir + Ignorer + ou + Infos + Vérifié + Avertissement + Photo + Inclus + Vérification… + AM + PM + SOIR + Erreur réseau + Échec du chargement + Apparence + Utiliser les couleurs du système + Suivre Material You d\'Android 12+ (couleurs du fond d\'écran) + Choisissez votre forfait + Passez à Pro pour un accès illimité + Passer à Pro + Fonctionnalité + Gratuit + Pro + Propriétés + Tâches + Prestataires + Documents + 1 propriété + 10 tâches + Illimité + Non disponible + Vérifiez vos e-mails + Nous avons envoyé un code à 6 chiffres à + Le code expire dans 15 minutes + Saisissez le code à 6 chiffres reçu par e-mail + Code vérifié ! Définissez maintenant votre nouveau mot de passe + Vous n\'avez pas reçu le code ? + Vérifiez votre dossier spam si vous ne le voyez pas + Échec de la vérification du code + La vérification de l\'e-mail est requise. Vérifiez votre boîte de réception pour un code à 6 chiffres. + Veuillez saisir un code valide à 6 chiffres + Vous n\'avez pas reçu le code ? Vérifiez votre dossier spam ou contactez le support. + Échec de la vérification + Votre mot de passe a été réinitialisé avec succès + Vous pouvez maintenant vous connecter avec votre nouveau mot de passe + Retour à la connexion + Définir un nouveau mot de passe + Créez un mot de passe fort pour sécuriser votre compte + Exigences du mot de passe + Échec de la réinitialisation du mot de passe + Nous enverrons un code de vérification à 6 chiffres à cette adresse + Vérifiez vos e-mails pour un code de vérification à 6 chiffres + Vous vous souvenez de votre mot de passe ? Retour à la connexion + Échec de l\'envoi du code de réinitialisation + Rejoindre une propriété + Rejoindre une propriété partagée + Saisissez le code à 6 caractères fourni par le propriétaire. + Code de partage + ABC123 + Les codes comportent 6 caractères en majuscules + Connexion… + Saisissez le code PIN pour déverrouiller + Code PIN à 4 chiffres + Code PIN incorrect + Déverrouiller + Échec de la création de la tâche + Toutes les tâches + Ajouter une tâche + Échec du chargement des tâches + Créez votre première tâche pour commencer + Ajoutez d\'abord une propriété depuis l\'onglet Résidences + Passez à la version supérieure pour ajouter + Résidence principale + Unité : %1$s + Erreur lors du chargement des tâches : %1$s + Erreur lors du chargement des prestataires : %1$s + Abonnement + Annulez à tout moment dans les Paramètres • Sans engagement + Connexion à la résidence… + Essai gratuit de 7 jours, puis %1$s + Réduire + Développer + Non sélectionné + Connexion… + Exigence satisfaite + Exigence non satisfaite + Une erreur s\'est produite + Non inclus + Prestataire : + Terminé par : + Supprimer la photo + %1$d étoiles + Photos de finalisation + Photo de finalisation de la tâche + Résidence n° %1$d + Tâche n° %1$d + Image %1$d sur %2$d + Images du document + Aucune garantie trouvée + Aucun document trouvé + %1$d jours restants + Propriété n° + Échec du partage de la résidence + Par défaut + Couleurs vives du système iOS + Sarcelle + Bleu-vert avec des accents chauds + Océan + Bleus profonds et tons corail + Forêt + Verts terre et nuances dorées + Coucher de soleil + Oranges et rouges chauds + Monochrome + Nuances de gris élégantes + Lavande + Violet doux avec des accents rosés + Cramoisi + Rouge intense avec des reflets chauds + Minuit + Bleu marine profond avec bleu ciel + Désert + Tons chauds de terre cuite et de sable + Menthe + Vert frais avec turquoise diff --git a/composeApp/src/commonMain/composeResources/values-it/strings.xml b/composeApp/src/commonMain/composeResources/values-it/strings.xml index ba88e21..742fb8e 100644 --- a/composeApp/src/commonMain/composeResources/values-it/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-it/strings.xml @@ -472,4 +472,585 @@ Funzionalità Premium Hai raggiunto il limite di proprietà per il tuo piano Hai raggiunto il limite di attività per il tuo piano + Riscaldamento + Raffrescamento + Scaldabagno + Piscina + Impianto di irrigazione + Camino + Garage + Seminterrato + Soffitta + Fossa settica + Tipo di tetto + Esterno + Pavimentazione + Giardinaggio + %1$d attività selezionate + Aggiungi %1$d attività e continua + Ricerca di attività per la tua casa... + Ancora nessun suggerimento personalizzato — sfoglia il catalogo completo o salta questo passaggio. + Sfoglia tutto + Salta + Impossibile caricare i suggerimenti + Controlla la connessione e riprova. + Caricamento del catalogo attività... + Impossibile caricare il catalogo attività + Nessun modello disponibile al momento. + Selezionata + Offline + Salta per ora + Passa a Pro + Sblocca tutto il potenziale di honeyDue + Scegli il tuo piano + Annuale + Mensile + Risparmia 50% + MIGLIOR VALORE + Cosa è incluso + Proprietà illimitate + Gestisci la manutenzione di tutte le tue case + Attività illimitate + Non dimenticare mai più un\'attività di manutenzione + Gestione dei tecnici + Salva e valuta i tuoi tecnici di fiducia + Archivio documenti + Conserva garanzie, ricevute e manuali + Condivisione in famiglia + Invita i familiari a collaborare + Promemoria intelligenti + Ricevi una notifica quando le attività sono in scadenza + Archiviazione di documenti e garanzie + Abbonati ora + Ripristina acquisti + L\'abbonamento si rinnova automaticamente se non viene annullato almeno 24 ore prima della fine del periodo in corso. Gestisci gli abbonamenti nelle impostazioni del dispositivo. + Condizioni d\'uso + Incluso + Confronta Free e Pro + Forse più tardi + Avviso + Abbonamento attivo + Ora hai accesso completo a tutte le funzioni Pro! + Upgrade necessario + Questa funzione è disponibile con un abbonamento Pro. + Sblocca l\'accesso illimitato a tutte le funzioni + honeyDue Pro Mensile + honeyDue Pro Annuale + Addebito mensile + Addebito annuale + Risparmia 22% + Fatte + Archiviate + Nessuna attività + Nuova attività + Titolo + es. Spurga lo scaldabagno + Dettagli facoltativi + Data di scadenza (facoltativa) + aaaa-MM-gg + Lascia vuoto per nessuna scadenza + Costo stimato (facoltativo) + Attività suggerite + Salta + Accetta + Impossibile caricare i suggerimenti + Ancora nessun suggerimento + Completa il profilo della tua casa per vedere consigli personalizzati. + Cronologia completamenti + %1$d completamento + %1$d completamenti + Caricamento dei completamenti... + Impossibile caricare i completamenti + Ancora nessun completamento + Questa attività non è stata completata. + Completata da %1$s + Visualizza foto + Rimuovi utente + Copia codice + Codice copiato negli appunti + Impossibile caricare gli utenti + Rimuovere %1$s da questa proprietà? + Utenti condivisi (%1$d) + Nessun utente condiviso + Utenti con accesso a questa residenza. Usa il pulsante di condivisione per invitare altri. + Vuoi davvero rimuovere %1$s da questa residenza? + Rimuovi + Scade + Almeno 8 caratteri + Contiene una lettera maiuscola + Contiene una lettera minuscola + Contiene un numero + Le password corrispondono + Requisiti password + La password deve contenere almeno 8 caratteri, con almeno una lettera maiuscola, una minuscola e un numero + Unisciti alla residenza + Vuoi unirti a questa residenza condivisa? + Ti sei unito alla residenza + Ora hai accesso a %1$s. + Adesione non riuscita + Adesione in corso... + Condiviso da: %1$s + Scade: %1$s + Funzione Pro + La condivisione delle residenze è una funzione Pro. Passa a Pro per invitare i familiari a collaborare alla manutenzione della casa. + Annullamento dell\'attività non riuscito + Ripristino dell\'attività non riuscito + Impossibile contrassegnare l\'attività come in corso + Archiviazione dell\'attività non riuscita + Disarchiviazione dell\'attività non riuscita + IN CORSO + Azioni + Segna come in corso + Completa attività + Modifica attività + Annulla attività + Ripristina attività + Archivia attività + Disarchivia attività + N/D + Da: %1$s + Costo: %1$s $ + Vedi foto (%1$d) + Aggiungi attività + Proprietà * + La proprietà è obbligatoria + Sfoglia modelli di attività + %1$d attività comuni + La categoria è obbligatoria + Giorni di intervallo + Sostituisci l\'intervallo di frequenza predefinito + Numero di giorni tra una ricorrenza e l\'altra + La data di scadenza è obbligatoria (formato: AAAA-MM-GG) + Formato: AAAA-MM-GG + Crea attività + In corso + Modelli di attività + Fatto + Cerca modelli... + Cancella + risultato + risultati + Nessun modello trovato + Prova un altro termine di ricerca + Nessun modello disponibile + I modelli appariranno qui una volta caricati + Espandi + Comprimi + Aggiungi + Tutte + Applica + Applica (%1$d) + %1$d selezionati + Riprova + Caricamento dei modelli non riuscito + Creazione delle attività non riuscita + Completa attività: %1$s + Seleziona fornitore (facoltativo) + Scegli un fornitore o lascia vuoto + Espandi + Nessuno (inserimento manuale) + Caricamento fornitori... + Errore nel caricamento dei fornitori + Completato da (nome) (facoltativo) + Inserisci il nome se non usi il fornitore sopra + Costo effettivo (facoltativo) + Note (facoltativo) + Valutazione: %1$d su 5 + Aggiungi immagini + Scatta foto + Scegli dalla libreria + %1$d immagine/i selezionata/e + Rimuovi immagine + Completa + Valutazione qualità + Foto (%1$d/%2$d) + Fotocamera + Libreria + Aggiungi foto del lavoro completato (facoltativo) + Collega il completamento di questa attività a un fornitore + Dettagli completamento + Tutti i campi sono facoltativi + Aggiungi note sul lavoro completato + Descrivi il lavoro svolto, i problemi riscontrati, ecc. + Valuta la qualità del lavoro svolto + Inserisci il nome manualmente qui sotto + Gestisci utenti + Invita altri + Condivisione facile + Invia link di invito + Invia un file .honeydue tramite Messaggi, email o condivisione. Basta toccare per unirsi. + Codice di condivisione + Nessun codice attivo + Genera codice + Genera nuovo codice + Condividi questo codice di 6 caratteri. Possono inserirlo nell\'app per unirsi. + Utenti (%1$d) + Proprietario + Rimuovi + oppure + Condividi fornitore + Funzione Pro + La condivisione dei fornitori è una funzione Pro. Passa a Pro per condividere i tuoi fornitori di fiducia con amici e familiari. + Importa fornitore + Vuoi importare questo fornitore? + Fornitore importato + %1$s è stato aggiunto ai tuoi contatti. + Importazione non riuscita + Condiviso da: %1$s + Aggiungi fornitore + Modifica fornitore + Informazioni di base + Nome * + Azienda + Residenza (facoltativo) + Personale (nessuna residenza) + Solo tu vedrai questo fornitore + Tutti gli utenti di %1$s vedranno questo fornitore + Informazioni di contatto + Telefono + Email + Sito web + Specializzazioni + Indirizzo + Via e numero civico + Città + Provincia + CAP + Note + Note private + Segna come preferito + Aggiungi + Salva + Modifica garanzia + Modifica documento + Aggiungi garanzia + Aggiungi documento + Seleziona residenza + Residenza * + Tipo di documento * + Titolo * + Nome articolo * + Numero di modello + Numero di serie + Fornitore/Azienda * + Contatto del fornitore + Telefono per reclami + Email per reclami + Sito web per reclami + Data di acquisto (AAAA-MM-GG) + Data di inizio garanzia (AAAA-MM-GG) + Data di fine garanzia (AAAA-MM-GG) * + Descrizione + Categoria + Seleziona categoria + Nessuna + Tag + tag1, tag2, tag3 + Note + Attivo + Foto esistenti (%1$d) + Nuove foto (%1$d/%2$d) + Foto (%1$d/%2$d) + Fotocamera + Galleria + Immagine %1$d + Rimuovi immagine + Aggiorna garanzia + Aggiorna documento + Seleziona una residenza + Il titolo è obbligatorio + Il nome dell\'articolo è obbligatorio per le garanzie + Il fornitore è obbligatorio per le garanzie + 2024-01-15 + 2025-01-15 + Caricamento delle residenze non riuscito: %1$s + Assistenza + Contatta l\'assistenza + Ricevi aiuto per il tuo account + Sblocca le funzioni Premium + Passa a Pro per l\'esperienza completa + Proprietà illimitate + Archiviazione documenti e garanzie + Condivisione residenze + Condivisione fornitori + Notifiche interattive + Widget per la schermata Home + Informativa sulla privacy + Visualizza la nostra informativa sulla privacy + Versione %1$s + honeyDue + Modifica profilo + Elimina account + Elimina definitivamente il tuo account + Questa azione è permanente e non può essere annullata. Tutti i tuoi dati verranno eliminati. + Anche le residenze di tua proprietà condivise con altri utenti verranno eliminate. + Inserisci la password per confermare + Digita ELIMINA per confermare + Elimina il mio account + Annulla + Account eliminato correttamente + Eliminazione dell\'account non riuscita + Riepilogo giornaliero + Panoramica giornaliera delle attività in scadenza e scadute + Notifiche email + Email attività completata + Ricevi un\'email quando un\'attività viene completata + Imposta orario personalizzato + Modifica + Seleziona orario notifica + Tutte le notifiche + Attiva o disattiva ogni categoria con un tocco + Categorie + Promemoria attività + Promemoria per attività imminenti e in scadenza + Attività scadute + Avvisi quando un\'attività supera la data di scadenza + Inviti alle residenze + Inviti a unirsi a una residenza condivisa + Aggiornamenti abbonamento + Modifiche alla fatturazione e allo stato del piano + Apri le impostazioni di sistema + Regola suoni, badge e Non disturbare nelle impostazioni di Android + Condividi + Importa + Importazione in corso... + Riprova + Scadute + In scadenza questa settimana + Prossimi 30 giorni + Le tue proprietà + Benvenuto in honeyDue + Il tuo compagno per la manutenzione della casa + Inizia da zero + Unisciti a una casa esistente + Hai già un account? Accedi + Salta + Continua + Inizia + Non dimenticare mai un\'attività + Tieni traccia di tutte le attività di manutenzione della casa in un unico posto con promemoria intelligenti + Documenti a portata di mano + Conserva garanzie, manuali e ricevute in modo sicuro e accedi quando vuoi + I tuoi fornitori di fiducia + Tieni tutti i contatti dei fornitori organizzati e facilmente accessibili + Condividi con la famiglia + Invita i familiari a collaborare insieme alla manutenzione della casa + Notifiche intelligenti + Ricevi promemoria interattivi che ti permettono di completare le attività direttamente dalla notifica + Widget per la schermata Home + Accesso rapido ad attività e promemoria direttamente dalla schermata Home + Dove si trova la tua casa? + Ti suggeriremo attività di manutenzione specifiche per il clima della tua zona + Usa la mia posizione + Rilevamento in corso... + Inserisci invece il CAP + Inserisci il tuo CAP + CAP + Dai un nome alla tua casa + Dai un nome alla tua proprietà per identificarla più facilmente + es. Casa mia, Casa al mare, Appartamento + Puoi aggiungere altri dettagli in seguito + Salva la tua casa + Crea un account per sincronizzare su più dispositivi + Crea account con email + Verifica la tua email + Abbiamo inviato un codice di 6 cifre alla tua email. Inseriscilo qui sotto per verificare il tuo account. + Non hai ricevuto il codice? Controlla la cartella spam + Unisciti a una residenza + Inserisci il codice di 6 caratteri condiviso con te per unirti a una casa esistente + Inserisci il codice di condivisione + Unisciti alla residenza + Tutto pronto! + Iniziamo con qualche attività. Più ne scegli, più ti aiuteremo a ricordare! + %1$d/%2$d attività selezionate + Aggiungi le più popolari + Aggiungi %1$d attività e continua + Salta per ora + Climatizzazione e riscaldamento + Sicurezza e protezione + Impianto idraulico + Esterni e giardino + Elettrodomestici + Casa in generale + Passa a Pro + Porta la gestione della tua casa a un livello superiore + HONEYDUE PRO + 4,9 • oltre 10.000 proprietari di casa + Proprietà illimitate + Tieni traccia di ogni casa che possiedi + Promemoria intelligenti + Non perdere mai una scadenza di manutenzione + Archivio documenti + Tutti i tuoi documenti in un unico posto + Condivisione familiare + Tieni tutti aggiornati allo stesso modo + Analisi delle spese + Scopri dove vanno a finire i tuoi soldi + Condivisione fornitori + Condividi i tuoi fornitori di fiducia con amici e familiari + Widget per la schermata Home + Azioni rapide direttamente dalla schermata Home + Notifiche interattive + Completa le attività direttamente dalle notifiche + Scegli il tuo piano + Mensile + Annuale + Risparmia il 30% + 2,99 $/mese + 23,99 $/anno + Solo 1,99 $/mese + Inizia la prova gratuita di 7 giorni + Continua con la versione gratuita + Prova gratuita di 7 giorni, poi %1$s. Annulla quando vuoi. + Parlaci della tua casa + Tutto facoltativo: ci aiuta a personalizzare il tuo piano di manutenzione + Impianti + Caratteristiche + Esterni + Interni + Per te + Sfoglia + App bloccata + Autenticati per sbloccare honeyDue + Blocco biometrico + Richiedi l\'autenticazione all\'apertura dell\'app + Sblocca honeyDue + Verifica la tua identità per continuare + Sblocca con dati biometrici + Autenticazione non riuscita + L\'autenticazione biometrica non è disponibile su questo dispositivo + Promemoria attività + Promemoria per attività imminenti e in scadenza + Attività scadute + Avvisi quando un\'attività supera la data di scadenza + Inviti alle residenze + Inviti a unirsi a una residenza condivisa + Aggiornamenti abbonamento + Aggiornamenti sullo stato dell\'abbonamento e sulla fatturazione + Selezionato + Apri + Salta + o + Info + Verificato + Avviso + Foto + Incluso + Verifica in corso… + AM + PM + SERA + Errore di rete + Caricamento non riuscito + Aspetto + Usa i colori di sistema + Segui Material You di Android 12+ (colori dello sfondo) + Scegli il tuo piano + Passa a Pro per un accesso illimitato + Passa a Pro + Funzione + Gratis + Pro + Proprietà + Attività + Appaltatori + Documenti + 1 proprietà + 10 attività + Illimitato + Non disponibile + Controlla la tua email + Abbiamo inviato un codice di 6 cifre a + Il codice scade tra 15 minuti + Inserisci il codice di 6 cifre ricevuto via email + Codice verificato! Ora imposta la tua nuova password + Non hai ricevuto il codice? + Controlla la cartella spam se non lo vedi + Verifica del codice non riuscita + È richiesta la verifica dell\'email. Controlla la posta in arrivo per un codice di 6 cifre. + Inserisci un codice valido di 6 cifre + Non hai ricevuto il codice? Controlla la cartella spam o contatta l\'assistenza. + Verifica non riuscita + La tua password è stata reimpostata correttamente + Ora puoi accedere con la tua nuova password + Torna all\'accesso + Imposta nuova password + Crea una password sicura per proteggere il tuo account + Requisiti della password + Reimpostazione della password non riuscita + Invieremo un codice di verifica di 6 cifre a questo indirizzo + Controlla la tua email per un codice di verifica di 6 cifre + Ricordi la password? Torna all\'accesso + Invio del codice di reimpostazione non riuscito + Unisciti a una proprietà + Unisciti a una proprietà condivisa + Inserisci il codice di 6 caratteri fornito dal proprietario. + Codice di condivisione + ABC123 + I codici sono di 6 caratteri maiuscoli + Accesso in corso… + Inserisci il PIN per sbloccare + PIN a 4 cifre + PIN errato + Sblocca + Creazione dell\'attività non riuscita + Tutte le attività + Aggiungi attività + Caricamento delle attività non riuscito + Crea la tua prima attività per iniziare + Aggiungi prima una proprietà dalla scheda Residenze + Esegui l\'upgrade per aggiungere + Residenza principale + Unità: %1$s + Errore durante il caricamento delle attività: %1$s + Errore durante il caricamento degli appaltatori: %1$s + Abbonamento + Annulla quando vuoi nelle Impostazioni • Nessun vincolo + Accesso alla residenza… + Prova gratuita di 7 giorni, poi %1$s + Comprimi + Espandi + Non selezionato + Accesso in corso… + Requisito soddisfatto + Requisito non soddisfatto + Si è verificato un errore + Non incluso + Appaltatore: + Completato da: + Rimuovi foto + %1$d stelle + Foto di completamento + Foto di completamento dell\'attività + Residenza n. %1$d + Attività n. %1$d + Immagine %1$d di %2$d + Immagini del documento + Nessuna garanzia trovata + Nessun documento trovato + %1$d giorni rimanenti + Proprietà n. + Condivisione della residenza non riuscita + Predefinito + Vivaci colori di sistema iOS + Foglia di tè + Blu-verde con accenti caldi + Oceano + Blu profondi e tonalità corallo + Foresta + Verdi terra e sfumature dorate + Tramonto + Caldi aranci e rossi + Monocromatico + Elegante scala di grigi + Lavanda + Viola tenue con accenti rosa + Cremisi + Rosso intenso con riflessi caldi + Mezzanotte + Blu navy profondo con azzurro cielo + Deserto + Calde tonalità di terracotta e sabbia + Menta + Verde fresco con turchese diff --git a/composeApp/src/commonMain/composeResources/values-ja/strings.xml b/composeApp/src/commonMain/composeResources/values-ja/strings.xml index 7b47f9f..f68c0dc 100644 --- a/composeApp/src/commonMain/composeResources/values-ja/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-ja/strings.xml @@ -472,4 +472,585 @@ プレミアム機能 プランの物件数上限に達しました プランのタスク数上限に達しました + 暖房 + 冷房 + 給湯器 + プール + スプリンクラー + 暖炉 + ガレージ + 地下室 + 屋根裏 + 浄化槽 + 屋根の種類 + 外装 + 床材 + 造園 + %1$d件のタスクを選択中 + %1$d件のタスクを追加して続行 + ご自宅に合うタスクを検索中... + おすすめはまだありません。カタログを見るか、このステップをスキップしてください。 + すべて見る + スキップ + おすすめを読み込めませんでした + 接続を確認してもう一度お試しください。 + タスクカタログを読み込み中... + タスクカタログを読み込めませんでした + 現在利用できるテンプレートはありません。 + 選択済み + オフライン + 後でスキップ + Proにアップグレード + honeyDueをフル活用しましょう + プランを選択 + 年額 + 月額 + 50%お得 + 一番お得 + 含まれる内容 + 物件数無制限 + すべての住まいのメンテナンスを管理 + タスク数無制限 + メンテナンスタスクを忘れません + 業者管理 + 信頼できる業者を保存・評価 + ドキュメント保管庫 + 保証書、領収書、説明書を保管 + 家族共有 + 家族を招待して共同管理 + スマートリマインダー + タスクの期限を通知 + ドキュメント・保証書の保管 + 今すぐ登録 + 購入を復元 + サブスクリプションは、現在の期間終了の24時間前までに解約しない限り自動更新されます。サブスクリプションはデバイスの設定で管理できます。 + 利用規約 + 含まれます + 無料版とProを比較 + 後で + 警告 + サブスクリプション有効 + すべてのPro機能をご利用いただけるようになりました! + アップグレードが必要 + この機能はProプランでご利用いただけます。 + すべての機能を無制限に利用 + honeyDue Pro 月額 + honeyDue Pro 年額 + 月額請求 + 年額請求 + 22%お得 + 完了 + アーカイブ済み + タスクなし + 新規タスク + タイトル + 例:給湯器の水抜き + 詳細(任意) + 期限(任意) + yyyy-MM-dd + 期限なしの場合は空欄のまま + 概算費用(任意) + おすすめのタスク + スキップ + 追加 + おすすめを読み込めませんでした + おすすめはまだありません + ホームプロフィールを完成させると、おすすめが表示されます。 + 完了履歴 + 完了%1$d件 + 完了%1$d件 + 完了履歴を読み込み中... + 完了履歴の読み込みに失敗しました + 完了履歴はまだありません + このタスクはまだ完了していません。 + %1$sが完了 + 写真を表示 + ユーザーを削除 + コードをコピー + コードをクリップボードにコピーしました + ユーザーを読み込めませんでした + %1$sをこの物件から削除しますか? + 共有ユーザー(%1$d) + 共有ユーザーなし + この住居にアクセスできるユーザーです。共有ボタンから他の人を招待できます。 + %1$sをこの住居から削除してもよろしいですか? + 削除 + 有効期限 + 8文字以上 + 大文字を含む + 小文字を含む + 数字を含む + パスワードが一致 + パスワードの要件 + パスワードは8文字以上で、大文字・小文字・数字をそれぞれ1文字以上含める必要があります + 住居に参加 + この共有住居に参加しますか? + 住居に参加しました + %1$s にアクセスできるようになりました。 + 参加に失敗しました + 参加中... + 共有者: %1$s + 有効期限: %1$s + Pro機能 + 住居の共有はPro機能です。アップグレードして家族を招待し、住まいのメンテナンスを一緒に管理しましょう。 + タスクのキャンセルに失敗しました + タスクの復元に失敗しました + タスクを進行中にできませんでした + タスクのアーカイブに失敗しました + タスクのアーカイブ解除に失敗しました + 進行中 + 操作 + 進行中にする + タスクを完了 + タスクを編集 + タスクをキャンセル + タスクを復元 + タスクをアーカイブ + アーカイブを解除 + なし + 担当: %1$s + 費用: $%1$s + 写真を見る (%1$d) + 新しいタスクを追加 + 物件 * + 物件は必須です + タスクテンプレートを見る + よく使うタスク %1$d 件 + カテゴリは必須です + 間隔(日数) + デフォルトの頻度間隔を上書き + 各回の間隔の日数 + 期日は必須です(形式: YYYY-MM-DD) + 形式: YYYY-MM-DD + タスクを作成 + 進行中 + タスクテンプレート + 完了 + テンプレートを検索... + クリア + + + テンプレートが見つかりません + 別の検索語をお試しください + テンプレートがありません + 読み込まれるとここに表示されます + 展開 + 折りたたむ + 追加 + すべて + 適用 + 適用 (%1$d) + %1$d 件選択中 + 再試行 + テンプレートの読み込みに失敗しました + タスクの作成に失敗しました + タスクを完了: %1$s + 業者を選択(任意) + 業者を選択するか空欄のままに + 展開 + なし(手動入力) + 業者を読み込み中... + 業者の読み込みエラー + 担当者名(任意) + 上記の業者を使わない場合は名前を入力 + 実費(任意) + メモ(任意) + 評価: 5段階中 %1$d + 画像を追加 + 写真を撮る + ライブラリから選択 + %1$d 枚選択中 + 画像を削除 + 完了 + 品質評価 + 写真 (%1$d/%2$d) + カメラ + ライブラリ + 完了した作業の写真を追加(任意) + このタスク完了を業者に紐付け + 完了の詳細 + すべての項目は任意です + 完了した作業についてのメモを追加 + 行った作業や見つかった問題などを記入 + 実施した作業の品質を評価 + 下に名前を手動で入力 + ユーザー管理 + 他のユーザーを招待 + かんたん共有 + 招待リンクを送信 + メッセージ・メールなどで .honeydue ファイルを送信。タップするだけで参加できます。 + 共有コード + 有効なコードなし + コードを生成 + 新しいコードを生成 + この6文字のコードを共有してください。アプリで入力すると参加できます。 + ユーザー (%1$d) + オーナー + 削除 + または + 業者を共有 + Pro機能 + 業者の共有はPro機能です。アップグレードして信頼できる業者を友人や家族と共有しましょう。 + 業者をインポート + この業者をインポートしますか? + 業者をインポートしました + %1$s を連絡先に追加しました。 + インポートに失敗しました + 共有者: %1$s + 業者を追加 + 業者を編集 + 基本情報 + 名前 * + 会社 + 住居(任意) + 個人(住居なし) + この業者はあなただけが見られます + %1$s のすべてのユーザーがこの業者を見られます + 連絡先情報 + 電話 + メール + ウェブサイト + 専門分野 + 住所 + 番地 + 市区町村 + 都道府県 + 郵便番号 + メモ + 非公開メモ + お気に入りに登録 + 追加 + 保存 + 保証を編集 + 書類を編集 + 保証を追加 + 書類を追加 + 住居を選択 + 住居 * + 書類の種類 * + タイトル * + 品目名 * + 型番 + シリアル番号 + 提供元/会社 * + 提供元の連絡先 + 請求用電話 + 請求用メール + 請求用ウェブサイト + 購入日 (YYYY-MM-DD) + 保証開始日 (YYYY-MM-DD) + 保証終了日 (YYYY-MM-DD) * + 説明 + カテゴリ + カテゴリを選択 + なし + タグ + タグ1, タグ2, タグ3 + メモ + 有効 + 既存の写真 (%1$d) + 新しい写真 (%1$d/%2$d) + 写真 (%1$d/%2$d) + カメラ + ギャラリー + 画像 %1$d + 画像を削除 + 保証を更新 + 書類を更新 + 住居を選択してください + タイトルは必須です + 保証には品目名が必要です + 保証には提供元が必要です + 2024-01-15 + 2025-01-15 + 住居の読み込みに失敗しました: %1$s + サポート + サポートに問い合わせ + アカウントに関するヘルプ + プレミアム機能を解放 + Proにアップグレードして全機能を体験 + 物件数無制限 + 書類・保証の保管 + 住居の共有 + 業者の共有 + 操作可能な通知 + ホーム画面ウィジェット + プライバシーポリシー + プライバシーポリシーを表示 + バージョン %1$s + honeyDue + プロフィールを編集 + アカウントを削除 + アカウントを完全に削除 + この操作は取り消せません。すべてのデータが削除されます。 + 他のユーザーと共有しているあなた所有の住居もすべて削除されます。 + 確認のためパスワードを入力 + 確認のため DELETE と入力 + アカウントを削除 + キャンセル + アカウントを削除しました + アカウントの削除に失敗しました + デイリーサマリー + 本日の期限・期限切れタスクの概要 + メール通知 + タスク完了メール + タスク完了時にメールを受信 + 時刻を指定 + 変更 + 通知時刻を選択 + すべての通知 + すべてのカテゴリをワンタップでオン/オフ + カテゴリ + タスクのリマインダー + 近日中・まもなく期限のリマインダー + 期限切れタスク + タスクが期限を過ぎた際の通知 + 住居への招待 + 共有住居への参加招待 + サブスクの更新 + 請求やプラン状況の変更 + システム設定を開く + Androidの設定でサウンド・バッジ・サイレントの動作を細かく調整 + 共有 + インポート + インポート中... + 再試行 + 期限切れ + 今週が期限 + 今後30日間 + あなたの物件 + honeyDue へようこそ + 住まいのメンテナンスのパートナー + 新しく始める + 既存の住まいに参加 + アカウントをお持ちですか? サインイン + スキップ + 続ける + 始める + タスクを忘れない + 住まいのメンテナンスタスクをスマートなリマインダーで一元管理 + 書類をすぐに手元に + 保証書・取扱説明書・領収書を安全に保管し、いつでもアクセス + 信頼できる業者 + 業者の連絡先を整理して簡単にアクセス + 家族と共有 + 家族を招待して住まいのメンテナンスを一緒に管理 + スマート通知 + 通知から直接タスクを完了できる操作可能なリマインダー + ホーム画面ウィジェット + ホーム画面からタスクとリマインダーに素早くアクセス + お住まいの場所は? + お住まいの地域の気候に合ったメンテナンスタスクをご提案します + 現在地を使用 + 検出中... + 代わりに郵便番号を入力 + 郵便番号を入力 + 郵便番号 + 住まいに名前を付ける + 物件を識別しやすいように名前を付けましょう + 例: 自宅、別荘、アパート + 詳細は後から追加できます + 住まいを保存 + アカウントを作成してデバイス間で同期 + メールでアカウント作成 + メールを確認 + 6桁のコードをメールで送信しました。下に入力してアカウントを確認してください。 + コードが届かない場合は迷惑メールフォルダをご確認ください + 住居に参加 + 共有された6文字のコードを入力して既存の住まいに参加 + 共有コードを入力 + 住居に参加 + 準備完了! + まずはいくつかのタスクから始めましょう。選ぶほど、リマインドをお手伝いします! + %1$d/%2$d 件のタスクを選択中 + 人気のものを追加 + %1$d 件のタスクを追加して続ける + 今はスキップ + 空調・気候 + 安全・防犯 + 配管 + 屋外・芝生 + 家電 + 住まい全般 + Proにアップグレード + 住まいの管理をさらに次のレベルへ + HONEYDUE PRO + 4.9 • 1万人以上の住宅オーナー + 物件数無制限 + 所有するすべての住まいを管理 + スマートリマインダー + メンテナンスの期限を逃さない + 書類保管庫 + すべての書類を一か所に + ファミリー共有 + 全員で情報を共有 + 支出インサイト + お金の使い道を把握 + 業者の共有 + 信頼できる業者を家族や友人と共有 + ホーム画面ウィジェット + ホーム画面から素早く操作 + 操作可能な通知 + 通知から直接タスクを完了 + プランを選択 + 月額 + 年額 + 30%お得 + $2.99/月 + $23.99/年 + 月額わずか $1.99 + 7日間の無料トライアルを開始 + 無料のまま続ける + 7日間の無料トライアル、その後 %1$s。いつでも解約可能。 + あなたの住まいについて教えてください + すべて任意 — メンテナンスプランのパーソナライズに役立ちます + 設備 + 特徴 + 外装 + 内装 + おすすめ + 見る + アプリがロックされています + honeyDue のロックを解除するには認証してください + 生体認証ロック + アプリを開く際に認証を必須にする + honeyDue のロックを解除 + 続けるには本人確認をしてください + 生体認証で解除 + 認証に失敗しました + このデバイスでは生体認証を利用できません + タスクのリマインダー + 近日中・まもなく期限のタスクのリマインダー + 期限切れタスク + タスクが期限を過ぎた際の通知 + 住居への招待 + 共有住居への参加招待 + サブスクの更新 + サブスクの状況と請求の更新 + 選択済み + 開く + スキップ + または + 情報 + 確認済み + 警告 + 写真 + 含む + 確認中… + 午前 + 午後 + + ネットワークエラー + 読み込みに失敗しました + 外観 + システムカラーを使用 + Android 12以降のMaterial Youに従う(壁紙の色) + プランを選択 + Proにアップグレードして無制限にアクセス + Proにアップグレード + 機能 + 無料 + Pro + 物件 + タスク + 業者 + ドキュメント + 1件の物件 + 10件のタスク + 無制限 + 利用不可 + メールを確認してください + 6桁のコードを次の宛先に送信しました + コードは15分で期限切れになります + メールに記載された6桁のコードを入力してください + コードを確認しました。新しいパスワードを設定してください + コードが届きませんでしたか? + 見つからない場合は迷惑メールフォルダを確認してください + コードの確認に失敗しました + メール認証が必要です。受信トレイで6桁のコードを確認してください。 + 有効な6桁のコードを入力してください + コードが届きませんでしたか?迷惑メールフォルダを確認するか、サポートにお問い合わせください。 + 認証に失敗しました + パスワードが正常にリセットされました + 新しいパスワードでログインできるようになりました + ログインに戻る + 新しいパスワードを設定 + アカウントを保護するために強力なパスワードを作成してください + パスワードの要件 + パスワードのリセットに失敗しました + 6桁の確認コードをこのアドレスに送信します + 6桁の確認コードがメールに届いているか確認してください + パスワードを思い出しましたか?ログインに戻る + リセットコードの送信に失敗しました + 物件に参加 + 共有物件に参加 + オーナーから提供された6文字の共有コードを入力してください。 + 共有コード + ABC123 + コードは6文字の大文字です + 参加中… + PINを入力してロックを解除 + 4桁のPIN + PINが正しくありません + ロック解除 + タスクの作成に失敗しました + すべてのタスク + タスクを追加 + タスクの読み込みに失敗しました + 最初のタスクを作成して始めましょう + まず「住居」タブから物件を追加してください + アップグレードして追加 + 主な住居 + ユニット: %1$s + タスクの読み込みエラー: %1$s + 業者の読み込みエラー: %1$s + サブスクリプション + 設定からいつでもキャンセル可能 • 契約の縛りなし + 住居に参加中… + 7日間の無料トライアル、その後 %1$s + 折りたたむ + 展開 + 未選択 + ログイン中… + 要件を満たしています + 要件を満たしていません + 問題が発生しました + 含まれていません + 業者: + 完了者: + 写真を削除 + 星%1$d個 + 完了写真 + タスク完了の写真 + 住居 #%1$d + タスク #%1$d + 画像 %1$d / %2$d + ドキュメント画像 + 保証が見つかりません + ドキュメントが見つかりません + 残り%1$d日 + 物件 # + 住居の共有に失敗しました + デフォルト + 鮮やかなiOSシステムカラー + ティール + 温かみのあるアクセントの青緑 + オーシャン + 深い青とコーラルの色合い + フォレスト + アースグリーンと黄金色の色合い + サンセット + 温かいオレンジと赤 + モノクロ + 上品なグレースケール + ラベンダー + ピンクのアクセントが効いた柔らかな紫 + クリムゾン + 温かいハイライトのある鮮やかな赤 + ミッドナイト + スカイブルーを伴う深いネイビー + デザート + 温かいテラコッタと砂の色合い + ミント + ターコイズを伴う爽やかなグリーン diff --git a/composeApp/src/commonMain/composeResources/values-ko/strings.xml b/composeApp/src/commonMain/composeResources/values-ko/strings.xml index 13f4c0f..8ba985c 100644 --- a/composeApp/src/commonMain/composeResources/values-ko/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-ko/strings.xml @@ -472,4 +472,585 @@ 프리미엄 기능 플랜의 부동산 제한에 도달했습니다 플랜의 작업 제한에 도달했습니다 + 난방 + 냉방 + 온수기 + 수영장 + 스프링클러 시스템 + 벽난로 + 차고 + 지하실 + 다락방 + 정화조 + 지붕 유형 + 외장 + 바닥재 + 조경 + 작업 %1$d개 선택됨 + 작업 %1$d개 추가 후 계속 + 집에 맞는 작업을 찾는 중... + 아직 맞춤 추천이 없습니다 — 전체 카탈로그를 둘러보거나 이 단계를 건너뛰세요. + 전체 보기 + 건너뛰기 + 추천을 불러올 수 없습니다 + 연결을 확인하고 다시 시도하세요. + 작업 카탈로그를 불러오는 중... + 작업 카탈로그를 불러올 수 없습니다 + 지금 사용할 수 있는 템플릿이 없습니다. + 선택됨 + 오프라인 + 나중에 + Pro로 업그레이드 + honeyDue의 모든 기능을 활용하세요 + 플랜 선택 + 연간 + 월간 + 50% 절약 + 최고의 혜택 + 포함 사항 + 무제한 자산 + 모든 집의 유지보수를 관리하세요 + 무제한 작업 + 유지보수 작업을 다시는 잊지 마세요 + 업체 관리 + 신뢰하는 업체를 저장하고 평가하세요 + 문서 보관함 + 보증서, 영수증, 설명서를 보관하세요 + 가족 공유 + 가족을 초대해 함께 관리하세요 + 스마트 알림 + 작업 기한이 되면 알림을 받으세요 + 문서 및 보증서 보관 + 지금 구독하기 + 구매 복원 + 구독은 현재 기간 종료 최소 24시간 전에 취소하지 않으면 자동으로 갱신됩니다. 기기 설정에서 구독을 관리하세요. + 이용약관 + 포함됨 + 무료 vs Pro 비교 + 나중에 + 경고 + 구독 활성화됨 + 이제 모든 Pro 기능을 이용할 수 있습니다! + 업그레이드 필요 + 이 기능은 Pro 구독에서 사용할 수 있습니다. + 모든 기능을 무제한으로 이용하세요 + honeyDue Pro 월간 + honeyDue Pro 연간 + 월간 청구 + 연간 청구 + 22% 절약 + 완료 + 보관됨 + 작업 없음 + 새 작업 + 제목 + 예: 온수기 청소 + 선택 사항 세부 정보 + 기한 (선택) + yyyy-MM-dd + 기한이 없으면 비워 두세요 + 예상 비용 (선택) + 추천 작업 + 건너뛰기 + 수락 + 추천을 불러올 수 없습니다 + 아직 추천이 없습니다 + 홈 프로필을 완성하면 맞춤 추천을 볼 수 있습니다. + 완료 내역 + 완료 %1$d건 + 완료 %1$d건 + 완료 내역을 불러오는 중... + 완료 내역을 불러오지 못했습니다 + 아직 완료 내역이 없습니다 + 이 작업은 아직 완료되지 않았습니다. + %1$s님이 완료함 + 사진 보기 + 사용자 삭제 + 코드 복사 + 코드가 클립보드에 복사되었습니다 + 사용자를 불러올 수 없습니다 + 이 자산에서 %1$s님을 삭제하시겠습니까? + 공유 사용자 (%1$d) + 공유 사용자 없음 + 이 주거지에 접근 권한이 있는 사용자입니다. 공유 버튼으로 다른 사람을 초대하세요. + 이 주거지에서 %1$s님을 삭제하시겠습니까? + 삭제 + 만료일 + 8자 이상 + 대문자 포함 + 소문자 포함 + 숫자 포함 + 비밀번호 일치 + 비밀번호 요구 사항 + 비밀번호는 8자 이상이며 대문자, 소문자, 숫자를 각각 하나 이상 포함해야 합니다 + 거주지 참여 + 이 공유 거주지에 참여하시겠어요? + 거주지 참여 완료 + 이제 %1$s에 접근할 수 있습니다. + 참여 실패 + 참여 중... + 공유자: %1$s + 만료: %1$s + Pro 기능 + 거주지 공유는 Pro 기능입니다. 업그레이드하여 가족을 초대하고 집 관리를 함께하세요. + 작업 취소에 실패했습니다 + 작업 복원에 실패했습니다 + 작업을 진행 중으로 표시하지 못했습니다 + 작업 보관에 실패했습니다 + 작업 보관 해제에 실패했습니다 + 진행 중 + 작업 + 진행 중으로 표시 + 작업 완료 + 작업 편집 + 작업 취소 + 작업 복원 + 작업 보관 + 작업 보관 해제 + 해당 없음 + 담당: %1$s + 비용: $%1$s + 사진 보기 (%1$d) + 새 작업 추가 + 자산 * + 자산을 입력하세요 + 작업 템플릿 둘러보기 + 공통 작업 %1$d개 + 카테고리를 선택하세요 + 간격(일) + 기본 반복 간격 재정의 + 각 반복 사이의 일수 + 마감일을 입력하세요 (형식: YYYY-MM-DD) + 형식: YYYY-MM-DD + 작업 만들기 + 진행 중 + 작업 템플릿 + 완료 + 템플릿 검색... + 지우기 + 개 결과 + 개 결과 + 템플릿 없음 + 다른 검색어를 시도해 보세요 + 사용 가능한 템플릿 없음 + 템플릿이 로드되면 여기에 표시됩니다 + 펼치기 + 접기 + 추가 + 전체 + 적용 + 적용 (%1$d) + %1$d개 선택됨 + 다시 시도 + 템플릿을 불러오지 못했습니다 + 작업을 만들지 못했습니다 + 작업 완료: %1$s + 시공업체 선택 (선택 사항) + 시공업체를 선택하거나 비워 두세요 + 펼치기 + 없음 (직접 입력) + 시공업체 불러오는 중... + 시공업체를 불러오는 중 오류 발생 + 완료자 이름 (선택 사항) + 위 시공업체를 사용하지 않는 경우 이름 입력 + 실제 비용 (선택 사항) + 메모 (선택 사항) + 평점: 5점 중 %1$d점 + 이미지 추가 + 사진 촬영 + 라이브러리에서 선택 + 이미지 %1$d개 선택됨 + 이미지 삭제 + 완료 + 품질 평점 + 사진 (%1$d/%2$d) + 카메라 + 라이브러리 + 완료된 작업 사진 추가 (선택 사항) + 이 작업 완료를 시공업체와 연결 + 완료 세부 정보 + 모든 항목은 선택 사항입니다 + 완료된 작업에 대한 메모를 추가하세요 + 수행한 작업, 발견된 문제 등을 적어 주세요. + 수행된 작업의 품질을 평가하세요 + 아래에 이름을 직접 입력하세요 + 사용자 관리 + 다른 사용자 초대 + 간편 공유 + 초대 링크 보내기 + 메시지, 이메일 또는 공유로 .honeydue 파일을 보내세요. 받는 사람은 탭만 하면 참여됩니다. + 공유 코드 + 활성 코드 없음 + 코드 생성 + 새 코드 생성 + 이 6자리 코드를 공유하세요. 앱에서 입력하면 참여할 수 있습니다. + 사용자 (%1$d) + 소유자 + 삭제 + 또는 + 시공업체 공유 + Pro 기능 + 시공업체 공유는 Pro 기능입니다. 업그레이드하여 신뢰하는 시공업체를 친구와 가족과 공유하세요. + 시공업체 가져오기 + 이 시공업체를 가져오시겠어요? + 시공업체 가져오기 완료 + %1$s이(가) 연락처에 추가되었습니다. + 가져오기 실패 + 공유자: %1$s + 시공업체 추가 + 시공업체 편집 + 기본 정보 + 이름 * + 회사 + 거주지 (선택 사항) + 개인 (거주지 없음) + 나만 이 시공업체를 볼 수 있습니다 + %1$s의 모든 사용자가 이 시공업체를 볼 수 있습니다 + 연락처 정보 + 전화번호 + 이메일 + 웹사이트 + 전문 분야 + 주소 + 도로명 주소 + 도시 + 주/도 + 우편번호 + 메모 + 비공개 메모 + 즐겨찾기로 표시 + 추가 + 저장 + 보증서 편집 + 문서 편집 + 보증서 추가 + 문서 추가 + 거주지 선택 + 거주지 * + 문서 유형 * + 제목 * + 품목명 * + 모델 번호 + 일련번호 + 제공자/회사 * + 제공자 연락처 + 청구 전화번호 + 청구 이메일 + 청구 웹사이트 + 구매일 (YYYY-MM-DD) + 보증 시작일 (YYYY-MM-DD) + 보증 종료일 (YYYY-MM-DD) * + 설명 + 카테고리 + 카테고리 선택 + 없음 + 태그 + 태그1, 태그2, 태그3 + 메모 + 활성 + 기존 사진 (%1$d) + 새 사진 (%1$d/%2$d) + 사진 (%1$d/%2$d) + 카메라 + 갤러리 + 이미지 %1$d + 이미지 삭제 + 보증서 업데이트 + 문서 업데이트 + 거주지를 선택하세요 + 제목을 입력하세요 + 보증서에는 품목명이 필요합니다 + 보증서에는 제공자가 필요합니다 + 2024-01-15 + 2025-01-15 + 거주지를 불러오지 못했습니다: %1$s + 지원 + 고객 지원 문의 + 계정 관련 도움 받기 + 프리미엄 기능 잠금 해제 + Pro로 업그레이드하여 모든 기능을 경험하세요 + 무제한 자산 + 문서 및 보증서 보관 + 거주지 공유 + 시공업체 공유 + 실행 가능한 알림 + 홈 화면 위젯 + 개인정보 처리방침 + 개인정보 처리방침 보기 + 버전 %1$s + honeyDue + 프로필 편집 + 계정 삭제 + 계정을 영구적으로 삭제합니다 + 이 작업은 영구적이며 되돌릴 수 없습니다. 모든 데이터가 삭제됩니다. + 다른 사용자와 공유 중인 소유 거주지도 함께 삭제됩니다. + 확인을 위해 비밀번호를 입력하세요 + 확인하려면 DELETE를 입력하세요 + 내 계정 삭제 + 취소 + 계정이 삭제되었습니다 + 계정 삭제에 실패했습니다 + 일일 요약 + 오늘 마감 및 연체된 작업 요약 + 이메일 알림 + 작업 완료 이메일 + 작업이 완료되면 이메일 받기 + 사용자 지정 시간 설정 + 변경 + 알림 시간 선택 + 모든 알림 + 모든 카테고리를 한 번에 켜거나 끄기 + 카테고리 + 작업 알림 + 예정 및 임박한 작업 알림 + 연체된 작업 + 작업 마감일이 지나면 알림 + 거주지 초대 + 공유 거주지 참여 초대 + 구독 업데이트 + 결제 및 요금제 상태 변경 + 시스템 설정 열기 + Android 설정에서 소리, 배지, 방해 금지 모드를 세부 조정하세요 + 공유 + 가져오기 + 가져오는 중... + 다시 시도 + 연체 + 이번 주 마감 + 다음 30일 + 내 자산 + honeyDue에 오신 것을 환영합니다 + 집 관리 도우미 + 새로 시작 + 기존 집 참여 + 이미 계정이 있으신가요? 로그인 + 건너뛰기 + 계속 + 시작하기 + 작업을 절대 잊지 마세요 + 스마트 알림과 함께 모든 집 관리 작업을 한곳에서 관리하세요 + 손끝에서 보는 문서 + 보증서, 설명서, 영수증을 안전하게 보관하고 언제든 확인하세요 + 믿을 수 있는 시공업체 + 모든 시공업체 연락처를 정리하고 쉽게 이용하세요 + 가족과 공유 + 가족을 초대하여 집 관리를 함께하세요 + 스마트 알림 + 알림에서 바로 작업을 완료할 수 있는 실행 가능한 알림을 받으세요 + 홈 화면 위젯 + 홈 화면에서 바로 작업과 알림에 빠르게 접근하세요 + 집이 어디에 있나요? + 지역 기후에 맞는 관리 작업을 추천해 드립니다 + 내 위치 사용 + 감지 중... + 대신 우편번호 입력 + 우편번호를 입력하세요 + 우편번호 + 집 이름 짓기 + 자산을 구분할 수 있도록 이름을 지어 주세요 + 예: 우리 집, 바닷가 별장, 아파트 + 자세한 내용은 나중에 추가할 수 있습니다 + 내 집 저장하기 + 여러 기기에서 동기화하려면 계정을 만드세요 + 이메일로 계정 만들기 + 이메일 인증 + 이메일로 6자리 코드를 보냈습니다. 아래에 입력하여 계정을 인증하세요. + 코드를 받지 못하셨나요? 스팸함을 확인하세요 + 거주지 참여 + 공유받은 6자리 코드를 입력하여 기존 집에 참여하세요 + 공유 코드 입력 + 거주지 참여 + 모든 준비가 끝났어요! + 몇 가지 작업으로 시작해 볼까요. 많이 선택할수록 더 잘 기억하도록 도와드릴게요! + %1$d/%2$d개 작업 선택됨 + 인기 작업 추가 + 작업 %1$d개 추가하고 계속 + 나중에 하기 + 냉난방 및 공조 + 안전 및 보안 + 배관 + 야외 및 잔디 + 가전제품 + 일반 가정 + Pro로 전환 + 집 관리를 한 단계 업그레이드하세요 + HONEYDUE PRO + 4.9 • 주택 소유자 1만 명 이상 + 무제한 자산 + 소유한 모든 집을 관리하세요 + 스마트 알림 + 관리 마감일을 놓치지 마세요 + 문서 보관함 + 모든 문서를 한곳에 보관하세요 + 가족 공유 + 모두가 같은 정보를 공유하세요 + 지출 분석 + 돈이 어디에 쓰이는지 확인하세요 + 시공업체 공유 + 신뢰하는 시공업체를 가족과 친구와 공유하세요 + 홈 화면 위젯 + 홈 화면에서 바로 빠른 작업을 실행하세요 + 실행 가능한 알림 + 알림에서 바로 작업을 완료하세요 + 요금제 선택 + 월간 + 연간 + 30% 절약 + 월 $2.99 + 연 $23.99 + 월 $1.99 + 7일 무료 체험 시작 + 무료로 계속 + 7일 무료 체험 후 %1$s. 언제든 취소 가능. + 집에 대해 알려 주세요 + 모두 선택 사항이며 맞춤 관리 계획에 도움이 됩니다 + 시스템 + 특징 + 외부 + 내부 + 추천 + 둘러보기 + 앱 잠김 + honeyDue 잠금을 해제하려면 인증하세요 + 생체 인식 잠금 + 앱을 열 때 인증 요구 + honeyDue 잠금 해제 + 계속하려면 본인 인증을 하세요 + 생체 인식으로 잠금 해제 + 인증에 실패했습니다 + 이 기기에서는 생체 인증을 사용할 수 없습니다 + 작업 알림 + 예정 및 임박한 작업 알림 + 연체된 작업 + 작업 마감일이 지나면 알림 + 거주지 초대 + 공유 거주지 참여 초대 + 구독 업데이트 + 구독 상태 및 결제 업데이트 + 선택됨 + 열기 + 건너뛰기 + 또는 + 정보 + 확인됨 + 경고 + 사진 + 포함됨 + 확인 중… + 오전 + 오후 + 저녁 + 네트워크 오류 + 불러오기 실패 + 모양 + 시스템 색상 사용 + Android 12 이상의 Material You 따르기(배경화면 색상) + 플랜 선택 + Pro로 업그레이드하여 무제한 이용 + Pro로 업그레이드 + 기능 + 무료 + Pro + 부동산 + 작업 + 시공업체 + 문서 + 부동산 1개 + 작업 10개 + 무제한 + 사용 불가 + 이메일을 확인하세요 + 6자리 코드를 다음 주소로 보냈습니다 + 코드는 15분 후에 만료됩니다 + 이메일로 받은 6자리 코드를 입력하세요 + 코드가 확인되었습니다! 이제 새 비밀번호를 설정하세요 + 코드를 받지 못하셨나요? + 보이지 않으면 스팸 폴더를 확인하세요 + 코드 확인 실패 + 이메일 인증이 필요합니다. 받은 편지함에서 6자리 코드를 확인하세요. + 유효한 6자리 코드를 입력하세요 + 코드를 받지 못하셨나요? 스팸 폴더를 확인하거나 고객지원에 문의하세요. + 인증 실패 + 비밀번호가 성공적으로 재설정되었습니다 + 이제 새 비밀번호로 로그인할 수 있습니다 + 로그인으로 돌아가기 + 새 비밀번호 설정 + 계정을 보호하기 위해 강력한 비밀번호를 만드세요 + 비밀번호 요건 + 비밀번호 재설정 실패 + 이 주소로 6자리 인증 코드를 보내드립니다 + 6자리 인증 코드가 있는지 이메일을 확인하세요 + 비밀번호가 기억나셨나요? 로그인으로 돌아가기 + 재설정 코드 전송 실패 + 부동산 참여 + 공유된 부동산 참여 + 소유자가 제공한 6자리 공유 코드를 입력하세요. + 공유 코드 + ABC123 + 코드는 대문자 6자리입니다 + 참여 중… + 잠금 해제하려면 PIN을 입력하세요 + 4자리 PIN + 잘못된 PIN + 잠금 해제 + 작업 생성 실패 + 모든 작업 + 작업 추가 + 작업 불러오기 실패 + 첫 작업을 만들어 시작하세요 + 먼저 거주지 탭에서 부동산을 추가하세요 + 업그레이드하여 추가 + 주 거주지 + 세대: %1$s + 작업 불러오기 오류: %1$s + 시공업체 불러오기 오류: %1$s + 구독 + 설정에서 언제든지 취소 가능 • 약정 없음 + 거주지 참여 중… + 7일 무료 체험 후 %1$s + 접기 + 펼치기 + 선택 안 됨 + 로그인 중… + 요건 충족 + 요건 미충족 + 문제가 발생했습니다 + 포함되지 않음 + 시공업체: + 완료한 사람: + 사진 제거 + 별 %1$d개 + 완료 사진 + 작업 완료 사진 + 거주지 #%1$d + 작업 #%1$d + 이미지 %1$d / %2$d + 문서 이미지 + 보증을 찾을 수 없습니다 + 문서를 찾을 수 없습니다 + %1$d일 남음 + 부동산 # + 거주지 공유 실패 + 기본 + 선명한 iOS 시스템 색상 + 청록 + 따뜻한 강조색의 청록색 + 오션 + 깊은 블루와 코랄 톤 + 포레스트 + 어스 그린과 황금빛 색조 + 선셋 + 따뜻한 오렌지와 레드 + 모노크롬 + 우아한 그레이스케일 + 라벤더 + 핑크 강조색의 부드러운 퍼플 + 크림슨 + 따뜻한 하이라이트의 강렬한 레드 + 미드나이트 + 스카이 블루가 어우러진 짙은 네이비 + 데저트 + 따뜻한 테라코타와 모래 톤 + 민트 + 터쿠아즈가 어우러진 상쾌한 그린 diff --git a/composeApp/src/commonMain/composeResources/values-nl/strings.xml b/composeApp/src/commonMain/composeResources/values-nl/strings.xml index 3b32fac..182ae6f 100644 --- a/composeApp/src/commonMain/composeResources/values-nl/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-nl/strings.xml @@ -472,4 +472,585 @@ Premium-functies U hebt de eigendomslimiet voor uw abonnement bereikt U hebt de taakl imiet voor uw abonnement bereikt + Verwarming + Koeling + Boiler + Zwembad + Sproei-installatie + Open haard + Garage + Kelder + Zolder + Septische tank + Daktype + Buitenkant + Vloer + Tuinaanleg + %1$d taken geselecteerd + %1$d taken toevoegen & doorgaan + Taken zoeken voor je woning... + Nog geen persoonlijke suggesties — bekijk de volledige catalogus of sla deze stap over. + Alles bekijken + Overslaan + Je suggesties konden niet worden geladen + Controleer je verbinding en probeer het opnieuw. + De taakcatalogus laden... + De taakcatalogus kon niet worden geladen + Op dit moment geen sjablonen beschikbaar. + Geselecteerd + Offline + Nu overslaan + Upgraden naar Pro + Benut het volledige potentieel van honeyDue + Kies je abonnement + Jaarlijks + Maandelijks + Bespaar 50% + BESTE KEUZE + Wat is inbegrepen + Onbeperkt aantal woningen + Houd onderhoud bij voor al je woningen + Onbeperkt aantal taken + Vergeet nooit meer een onderhoudstaak + Vakmensbeheer + Bewaar en beoordeel je vertrouwde vakmensen + Documentkluis + Bewaar garanties, bonnen en handleidingen + Delen met gezin + Nodig gezinsleden uit om samen te werken + Slimme herinneringen + Ontvang een melding wanneer taken aflopen + Opslag voor documenten & garanties + Nu abonneren + Aankopen herstellen + Het abonnement wordt automatisch verlengd, tenzij het minstens 24 uur voor het einde van de huidige periode wordt opgezegd. Beheer abonnementen in de instellingen van je apparaat. + Gebruiksvoorwaarden + Inbegrepen + Vergelijk Gratis met Pro + Misschien later + Waarschuwing + Abonnement actief + Je hebt nu volledige toegang tot alle Pro-functies! + Upgrade vereist + Deze functie is beschikbaar met een Pro-abonnement. + Ontgrendel onbeperkte toegang tot alle functies + honeyDue Pro Maandelijks + honeyDue Pro Jaarlijks + Maandelijks gefactureerd + Jaarlijks gefactureerd + Bespaar 22% + Klaar + Gearchiveerd + Geen taken + Nieuwe taak + Titel + bijv. Boiler doorspoelen + Optionele details + Vervaldatum (optioneel) + jjjj-MM-dd + Laat leeg voor geen vervaldatum + Geschatte kosten (optioneel) + Voorgestelde taken + Overslaan + Accepteren + Suggesties konden niet worden geladen + Nog geen suggesties + Vul je woningprofiel in om persoonlijke aanbevelingen te zien. + Voltooiingsgeschiedenis + %1$d voltooiing + %1$d voltooiingen + Voltooiingen laden... + Voltooiingen laden mislukt + Nog geen voltooiingen + Deze taak is nog niet voltooid. + Voltooid door %1$s + Foto bekijken + Gebruiker verwijderen + Code kopiëren + Code gekopieerd naar klembord + Gebruikers konden niet worden geladen + %1$s uit deze woning verwijderen? + Gedeelde gebruikers (%1$d) + Geen gedeelde gebruikers + Gebruikers met toegang tot deze woning. Gebruik de deelknop om anderen uit te nodigen. + Weet je zeker dat je %1$s uit deze woning wilt verwijderen? + Verwijderen + Verloopt + Minstens 8 tekens + Bevat een hoofdletter + Bevat een kleine letter + Bevat een cijfer + Wachtwoorden komen overeen + Wachtwoordvereisten + Wachtwoord moet minstens 8 tekens bevatten, met ten minste één hoofdletter, één kleine letter en één cijfer + Woning toetreden + Wil je deze gedeelde woning toetreden? + Toegetreden tot woning + Je hebt nu toegang tot %1$s. + Toetreden mislukt + Toetreden... + Gedeeld door: %1$s + Verloopt: %1$s + Pro-functie + Woningen delen is een Pro-functie. Upgrade om gezinsleden uit te nodigen voor samenwerking aan woningonderhoud. + Taak annuleren mislukt + Taak herstellen mislukt + Taak markeren als bezig mislukt + Taak archiveren mislukt + Taak dearchiveren mislukt + BEZIG + Acties + Markeren als bezig + Taak voltooien + Taak bewerken + Taak annuleren + Taak herstellen + Taak archiveren + Taak dearchiveren + N.v.t. + Door: %1$s + Kosten: $%1$s + Foto\'s bekijken (%1$d) + Nieuwe taak toevoegen + Woning * + Woning is verplicht + Taaksjablonen bekijken + %1$d veelvoorkomende taken + Categorie is verplicht + Interval in dagen + Standaardfrequentie overschrijven + Aantal dagen tussen elke herhaling + Vervaldatum is verplicht (formaat: JJJJ-MM-DD) + Formaat: JJJJ-MM-DD + Taak aanmaken + Bezig + Taaksjablonen + Klaar + Sjablonen zoeken... + Wissen + resultaat + resultaten + Geen sjablonen gevonden + Probeer een andere zoekterm + Geen sjablonen beschikbaar + Sjablonen verschijnen hier zodra ze geladen zijn + Uitvouwen + Invouwen + Toevoegen + Alle + Toepassen + Toepassen (%1$d) + %1$d geselecteerd + Opnieuw + Sjablonen laden mislukt + Taken aanmaken mislukt + Taak voltooien: %1$s + Aannemer selecteren (optioneel) + Kies een aannemer of laat leeg + Uitvouwen + Geen (handmatige invoer) + Aannemers laden... + Fout bij laden van aannemers + Voltooid door naam (optioneel) + Voer naam in als je geen aannemer hierboven gebruikt + Werkelijke kosten (optioneel) + Notities (optioneel) + Beoordeling: %1$d van 5 + Afbeeldingen toevoegen + Foto maken + Kiezen uit bibliotheek + %1$d afbeelding(en) geselecteerd + Afbeelding verwijderen + Voltooien + Kwaliteitsbeoordeling + Foto\'s (%1$d/%2$d) + Camera + Bibliotheek + Voeg foto\'s van voltooid werk toe (optioneel) + Koppel deze taakvoltooiing aan een aannemer + Voltooiingsdetails + Alle velden zijn optioneel + Voeg notities over het voltooide werk toe + Beschrijf het uitgevoerde werk, gevonden problemen, enz. + Beoordeel de kwaliteit van het uitgevoerde werk + Voer hieronder de naam handmatig in + Gebruikers beheren + Anderen uitnodigen + Eenvoudig delen + Uitnodigingslink versturen + Stuur een .honeydue-bestand via Berichten, E-mail of delen. Ze tikken er gewoon op om toe te treden. + Deelcode + Geen actieve code + Code genereren + Nieuwe code genereren + Deel deze code van 6 tekens. Ze kunnen die in de app invoeren om toe te treden. + Gebruikers (%1$d) + Eigenaar + Verwijderen + of + Aannemer delen + Pro-functie + Aannemers delen is een Pro-functie. Upgrade om je vertrouwde aannemers met vrienden en familie te delen. + Aannemer importeren + Wil je deze aannemer importeren? + Aannemer geïmporteerd + %1$s is toegevoegd aan je contacten. + Importeren mislukt + Gedeeld door: %1$s + Aannemer toevoegen + Aannemer bewerken + Basisgegevens + Naam * + Bedrijf + Woning (optioneel) + Persoonlijk (geen woning) + Alleen jij ziet deze aannemer + Alle gebruikers van %1$s zien deze aannemer + Contactgegevens + Telefoon + E-mail + Website + Specialiteiten + Adres + Straat en huisnummer + Plaats + Provincie + Postcode + Notities + Privénotities + Markeren als favoriet + Toevoegen + Opslaan + Garantie bewerken + Document bewerken + Garantie toevoegen + Document toevoegen + Woning selecteren + Woning * + Documenttype * + Titel * + Itemnaam * + Modelnummer + Serienummer + Leverancier/bedrijf * + Contact leverancier + Telefoon voor claims + E-mail voor claims + Website voor claims + Aankoopdatum (JJJJ-MM-DD) + Startdatum garantie (JJJJ-MM-DD) + Einddatum garantie (JJJJ-MM-DD) * + Beschrijving + Categorie + Categorie selecteren + Geen + Labels + label1, label2, label3 + Notities + Actief + Bestaande foto\'s (%1$d) + Nieuwe foto\'s (%1$d/%2$d) + Foto\'s (%1$d/%2$d) + Camera + Galerij + Afbeelding %1$d + Afbeelding verwijderen + Garantie bijwerken + Document bijwerken + Selecteer een woning + Titel is verplicht + Itemnaam is verplicht voor garanties + Leverancier is verplicht voor garanties + 2024-01-15 + 2025-01-15 + Woningen laden mislukt: %1$s + Ondersteuning + Contact opnemen met ondersteuning + Hulp bij je account + Ontgrendel premiumfuncties + Upgrade naar Pro voor de volledige ervaring + Onbeperkt aantal woningen + Document- en garantieopslag + Woningen delen + Aannemers delen + Actiegerichte meldingen + Widgets op het startscherm + Privacybeleid + Bekijk ons privacybeleid + Versie %1$s + honeyDue + Profiel bewerken + Account verwijderen + Verwijder je account definitief + Deze actie is definitief en kan niet ongedaan worden gemaakt. Al je gegevens worden verwijderd. + Woningen die je bezit en die met andere gebruikers worden gedeeld, worden ook verwijderd. + Voer je wachtwoord in ter bevestiging + Typ DELETE ter bevestiging + Mijn account verwijderen + Annuleren + Account succesvol verwijderd + Account verwijderen mislukt + Dagelijkse samenvatting + Dagelijks overzicht van openstaande en achterstallige taken + E-mailmeldingen + E-mail bij voltooide taak + Ontvang een e-mail wanneer een taak is voltooid + Aangepaste tijd instellen + Wijzigen + Meldingstijd selecteren + Alle meldingen + Schakel elke categorie met één tik in of uit + Categorieën + Taakherinneringen + Herinneringen voor aankomende en bijna vervallende taken + Achterstallige taken + Waarschuwingen wanneer een taak over de vervaldatum is + Woninguitnodigingen + Uitnodigingen om een gedeelde woning toe te treden + Abonnementsupdates + Wijzigingen in facturering en abonnementsstatus + Systeeminstellingen openen + Stel geluiden, badges en Niet storen-gedrag nauwkeurig af in de Android-instellingen + Delen + Importeren + Importeren... + Opnieuw proberen + Achterstallig + Deze week vervallen + Komende 30 dagen + Jouw woningen + Welkom bij honeyDue + Jouw partner voor woningonderhoud + Opnieuw beginnen + Bestaande woning toetreden + Heb je al een account? Inloggen + Overslaan + Doorgaan + Aan de slag + Vergeet nooit meer een taak + Houd al je woningonderhoudstaken op één plek bij met slimme herinneringen + Documenten binnen handbereik + Bewaar garanties, handleidingen en bonnen veilig en raadpleeg ze altijd + Jouw vertrouwde aannemers + Houd al je aannemerscontacten georganiseerd en eenvoudig toegankelijk + Delen met familie + Nodig gezinsleden uit om samen aan woningonderhoud te werken + Slimme meldingen + Ontvang actiegerichte herinneringen waarmee je taken direct vanuit de melding kunt voltooien + Widgets op het startscherm + Snelle toegang tot taken en herinneringen direct vanaf je startscherm + Waar bevindt je woning zich? + We stellen onderhoudstaken voor die passen bij het klimaat in jouw regio + Mijn locatie gebruiken + Detecteren... + Voer in plaats daarvan postcode in + Voer je postcode in + Postcode + Geef je woning een naam + Geef je woning een naam om die makkelijk te herkennen + bijv. Mijn huis, Strandhuis, Appartement + Je kunt later meer details toevoegen + Bewaar je woning + Maak een account aan om te synchroniseren tussen apparaten + Account aanmaken met e-mail + Verifieer je e-mail + We hebben een 6-cijferige code naar je e-mail gestuurd. Voer die hieronder in om je account te verifiëren. + Geen code ontvangen? Controleer je spammap + Een woning toetreden + Voer de code van 6 tekens in die met je is gedeeld om een bestaande woning toe te treden + Voer deelcode in + Woning toetreden + Je bent helemaal klaar! + Laten we beginnen met een paar taken. Hoe meer je kiest, hoe meer we je helpen onthouden! + %1$d/%2$d taken geselecteerd + Populairste toevoegen + %1$d taken toevoegen en doorgaan + Voorlopig overslaan + Verwarming en klimaat + Veiligheid en beveiliging + Loodgieterswerk + Buiten en tuin + Apparaten + Algemeen onderhoud + Word Pro + Til je woningbeheer naar een hoger niveau + HONEYDUE PRO + 4,9 • 10K+ huiseigenaren + Onbeperkt aantal woningen + Houd elke woning die je bezit bij + Slimme herinneringen + Mis nooit meer een onderhoudsdeadline + Documentenkluis + Al je documenten op één plek + Delen met familie + Krijg iedereen op één lijn + Uitgaveninzichten + Zie waar je geld naartoe gaat + Aannemers delen + Deel je vertrouwde aannemers met familie en vrienden + Widgets op het startscherm + Snelle acties direct vanaf je startscherm + Actiegerichte meldingen + Voltooi taken rechtstreeks vanuit meldingen + Kies je abonnement + Maandelijks + Jaarlijks + Bespaar 30% + $2,99/maand + $23,99/jaar + Slechts $1,99/maand + Start 7-daagse gratis proefperiode + Doorgaan met gratis versie + 7 dagen gratis proberen, daarna %1$s. Altijd opzegbaar. + Vertel ons over je woning + Alles optioneel — helpt ons je onderhoudsplan te personaliseren + Systemen + Kenmerken + Buitenkant + Binnenkant + Voor jou + Bladeren + App vergrendeld + Verifieer om honeyDue te ontgrendelen + Biometrische vergrendeling + Vereis verificatie bij het openen van de app + honeyDue ontgrendelen + Bevestig je identiteit om door te gaan + Ontgrendelen met biometrie + Verificatie mislukt + Biometrische verificatie is niet beschikbaar op dit apparaat + Taakherinneringen + Herinneringen voor aankomende en bijna vervallende taken + Achterstallige taken + Waarschuwingen wanneer een taak over de vervaldatum is + Woninguitnodigingen + Uitnodigingen om een gedeelde woning toe te treden + Abonnementsupdates + Updates over abonnementsstatus en facturering + Geselecteerd + Openen + Overslaan + of + Info + Geverifieerd + Waarschuwing + Foto + Inbegrepen + Verifiëren… + AM + PM + AVOND + Netwerkfout + Laden mislukt + Weergave + Systeemkleuren gebruiken + Material You van Android 12+ volgen (achtergrondkleuren) + Kies je abonnement + Upgrade naar Pro voor onbeperkte toegang + Upgraden naar Pro + Functie + Gratis + Pro + Panden + Taken + Aannemers + Documenten + 1 pand + 10 taken + Onbeperkt + Niet beschikbaar + Controleer je e-mail + We hebben een 6-cijferige code gestuurd naar + De code verloopt over 15 minuten + Voer de 6-cijferige code uit je e-mail in + Code geverifieerd! Stel nu je nieuwe wachtwoord in + Code niet ontvangen? + Controleer je spammap als je hem niet ziet + Codeverificatie mislukt + E-mailverificatie is vereist. Controleer je inbox op een 6-cijferige code. + Voer een geldige 6-cijferige code in + Code niet ontvangen? Controleer je spammap of neem contact op met support. + Verificatie mislukt + Je wachtwoord is succesvol opnieuw ingesteld + Je kunt nu inloggen met je nieuwe wachtwoord + Terug naar inloggen + Nieuw wachtwoord instellen + Maak een sterk wachtwoord om je account te beveiligen + Wachtwoordvereisten + Opnieuw instellen van wachtwoord mislukt + We sturen een 6-cijferige verificatiecode naar dit adres + Controleer je e-mail op een 6-cijferige verificatiecode + Wachtwoord weer te binnen? Terug naar inloggen + Verzenden van resetcode mislukt + Deelnemen aan pand + Deelnemen aan een gedeeld pand + Voer de 6-tekens deelcode in die door de eigenaar is verstrekt. + Deelcode + ABC123 + Codes bestaan uit 6 hoofdletters + Deelnemen… + Voer pincode in om te ontgrendelen + 4-cijferige pincode + Onjuiste pincode + Ontgrendelen + Taak aanmaken mislukt + Alle taken + Taak toevoegen + Taken laden mislukt + Maak je eerste taak om te beginnen + Voeg eerst een pand toe via het tabblad Woningen + Upgraden om toe te voegen + Hoofdwoning + Eenheid: %1$s + Fout bij het laden van taken: %1$s + Fout bij het laden van aannemers: %1$s + Abonnement + Op elk moment opzegbaar in Instellingen • Geen verplichting + Deelnemen aan woning… + 7 dagen gratis proberen, daarna %1$s + Inklappen + Uitklappen + Niet geselecteerd + Inloggen… + Aan vereiste voldaan + Niet aan vereiste voldaan + Er is iets misgegaan + Niet inbegrepen + Aannemer: + Voltooid door: + Foto verwijderen + %1$d sterren + Voltooiingsfoto\'s + Foto van taakvoltooiing + Woning #%1$d + Taak #%1$d + Afbeelding %1$d van %2$d + Documentafbeeldingen + Geen garanties gevonden + Geen documenten gevonden + Nog %1$d dagen + Pand # + Delen van woning mislukt + Standaard + Levendige iOS-systeemkleuren + Blauwgroen + Blauwgroen met warme accenten + Oceaan + Diepe blauwtinten en koraaltinten + Bos + Aardse groentinten en gouden tinten + Zonsondergang + Warme oranje- en roodtinten + Monochroom + Elegante grijstinten + Lavendel + Zacht paars met roze accenten + Karmozijn + Fel rood met warme accenten + Middernacht + Diep marineblauw met hemelsblauw + Woestijn + Warme terracotta- en zandtinten + Mint + Fris groen met turquoise diff --git a/composeApp/src/commonMain/composeResources/values-pt/strings.xml b/composeApp/src/commonMain/composeResources/values-pt/strings.xml index 672b240..15412f9 100644 --- a/composeApp/src/commonMain/composeResources/values-pt/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-pt/strings.xml @@ -472,4 +472,585 @@ Recursos Premium Voce atingiu o limite de propriedades do seu plano Voce atingiu o limite de tarefas do seu plano + Aquecimento + Refrigeração + Aquecedor de água + Piscina + Sistema de irrigação + Lareira + Garagem + Porão + Sótão + Fossa séptica + Tipo de telhado + Fachada + Piso + Paisagismo + %1$d tarefas selecionadas + Adicionar %1$d tarefas e continuar + Buscando tarefas para sua casa... + Nenhuma sugestão personalizada ainda — explore o catálogo completo ou pule esta etapa. + Ver tudo + Pular + Não foi possível carregar suas sugestões + Verifique sua conexão e tente novamente. + Carregando o catálogo de tarefas... + Não foi possível carregar o catálogo de tarefas + Nenhum modelo disponível no momento. + Selecionada + Offline + Pular por enquanto + Fazer upgrade para o Pro + Desbloqueie todo o potencial do honeyDue + Escolha seu plano + Anual + Mensal + Economize 50% + MELHOR OFERTA + O que está incluído + Imóveis ilimitados + Acompanhe a manutenção de todas as suas casas + Tarefas ilimitadas + Nunca mais esqueça uma tarefa de manutenção + Gestão de prestadores + Salve e avalie seus prestadores de confiança + Cofre de documentos + Guarde garantias, recibos e manuais + Compartilhamento familiar + Convide familiares para colaborar + Lembretes inteligentes + Seja avisado quando as tarefas vencerem + Armazenamento de documentos e garantias + Assinar agora + Restaurar compras + A assinatura é renovada automaticamente, a menos que seja cancelada pelo menos 24 horas antes do fim do período atual. Gerencie as assinaturas nas configurações do seu dispositivo. + Termos de uso + Incluído + Comparar Grátis vs Pro + Talvez depois + Aviso + Assinatura ativa + Agora você tem acesso total a todos os recursos Pro! + Upgrade necessário + Este recurso está disponível com a assinatura Pro. + Desbloqueie acesso ilimitado a todos os recursos + honeyDue Pro Mensal + honeyDue Pro Anual + Cobrado mensalmente + Cobrado anualmente + Economize 22% + Concluídas + Arquivadas + Nenhuma tarefa + Nova tarefa + Título + ex.: Limpar o aquecedor de água + Detalhes opcionais + Data de vencimento (opcional) + aaaa-MM-dd + Deixe em branco para sem data de vencimento + Custo estimado (opcional) + Tarefas sugeridas + Pular + Aceitar + Não foi possível carregar as sugestões + Nenhuma sugestão ainda + Complete o perfil da sua casa para ver recomendações personalizadas. + Histórico de conclusões + %1$d conclusão + %1$d conclusões + Carregando conclusões... + Falha ao carregar as conclusões + Nenhuma conclusão ainda + Esta tarefa não foi concluída. + Concluída por %1$s + Ver foto + Remover usuário + Copiar código + Código copiado para a área de transferência + Não foi possível carregar os usuários + Remover %1$s deste imóvel? + Usuários compartilhados (%1$d) + Nenhum usuário compartilhado + Usuários com acesso a este imóvel. Use o botão de compartilhar para convidar outras pessoas. + Tem certeza de que deseja remover %1$s deste imóvel? + Remover + Vence em + Pelo menos 8 caracteres + Contém uma letra maiúscula + Contém uma letra minúscula + Contém um número + As senhas coincidem + Requisitos da senha + A senha deve ter pelo menos 8 caracteres, com no mínimo uma letra maiúscula, uma minúscula e um número + Entrar na residência + Deseja entrar nesta residência compartilhada? + Você entrou na residência + Agora você tem acesso a %1$s. + Falha ao entrar + Entrando... + Compartilhado por: %1$s + Expira em: %1$s + Recurso Pro + Compartilhar residências é um recurso Pro. Faça upgrade para convidar familiares a colaborar na manutenção da casa. + Falha ao cancelar a tarefa + Falha ao restaurar a tarefa + Falha ao marcar tarefa em andamento + Falha ao arquivar a tarefa + Falha ao desarquivar a tarefa + EM ANDAMENTO + Ações + Marcar em andamento + Concluir tarefa + Editar tarefa + Cancelar tarefa + Restaurar tarefa + Arquivar tarefa + Desarquivar tarefa + N/D + Por: %1$s + Custo: R$%1$s + Ver fotos (%1$d) + Adicionar nova tarefa + Propriedade * + A propriedade é obrigatória + Explorar modelos de tarefas + %1$d tarefas comuns + A categoria é obrigatória + Intervalo em dias + Substituir o intervalo de frequência padrão + Número de dias entre cada ocorrência + A data de vencimento é obrigatória (formato: AAAA-MM-DD) + Formato: AAAA-MM-DD + Criar tarefa + Em andamento + Modelos de tarefas + Concluído + Buscar modelos... + Limpar + resultado + resultados + Nenhum modelo encontrado + Tente outro termo de busca + Nenhum modelo disponível + Os modelos aparecerão aqui após o carregamento + Expandir + Recolher + Adicionar + Todas + Aplicar + Aplicar (%1$d) + %1$d selecionado(s) + Tentar novamente + Falha ao carregar os modelos + Falha ao criar as tarefas + Concluir tarefa: %1$s + Selecionar prestador (opcional) + Escolha um prestador ou deixe em branco + Expandir + Nenhum (entrada manual) + Carregando prestadores... + Erro ao carregar prestadores + Concluído por (opcional) + Informe o nome se não usar o prestador acima + Custo real (opcional) + Observações (opcional) + Avaliação: %1$d de 5 + Adicionar imagens + Tirar foto + Escolher da biblioteca + %1$d imagem(ns) selecionada(s) + Remover imagem + Concluir + Avaliação de qualidade + Fotos (%1$d/%2$d) + Câmera + Biblioteca + Adicione fotos do trabalho concluído (opcional) + Vincule esta conclusão de tarefa a um prestador + Detalhes da conclusão + Todos os campos são opcionais + Adicione observações sobre o trabalho concluído + Descreva o trabalho feito, problemas encontrados, etc. + Avalie a qualidade do trabalho realizado + Informe o nome manualmente abaixo + Gerenciar usuários + Convidar outras pessoas + Compartilhamento fácil + Enviar link de convite + Envie um arquivo .honeydue por mensagem, e-mail ou compartilhamento. Basta tocar para entrar. + Código de compartilhamento + Nenhum código ativo + Gerar código + Gerar novo código + Compartilhe este código de 6 caracteres. A pessoa pode inseri-lo no app para entrar. + Usuários (%1$d) + Proprietário + Remover + ou + Compartilhar prestador + Recurso Pro + Compartilhar prestadores é um recurso Pro. Faça upgrade para compartilhar seus prestadores de confiança com amigos e familiares. + Importar prestador + Deseja importar este prestador? + Prestador importado + %1$s foi adicionado aos seus contatos. + Falha na importação + Compartilhado por: %1$s + Adicionar prestador + Editar prestador + Informações básicas + Nome * + Empresa + Residência (opcional) + Pessoal (sem residência) + Somente você verá este prestador + Todos os usuários de %1$s verão este prestador + Informações de contato + Telefone + E-mail + Site + Especialidades + Endereço + Logradouro + Cidade + Estado + CEP + Observações + Observações privadas + Marcar como favorito + Adicionar + Salvar + Editar garantia + Editar documento + Adicionar garantia + Adicionar documento + Selecionar residência + Residência * + Tipo de documento * + Título * + Nome do item * + Número do modelo + Número de série + Fornecedor/Empresa * + Contato do fornecedor + Telefone para acionamento + E-mail para acionamento + Site para acionamento + Data da compra (AAAA-MM-DD) + Início da garantia (AAAA-MM-DD) + Fim da garantia (AAAA-MM-DD) * + Descrição + Categoria + Selecionar categoria + Nenhuma + Etiquetas + etiqueta1, etiqueta2, etiqueta3 + Observações + Ativo + Fotos existentes (%1$d) + Novas fotos (%1$d/%2$d) + Fotos (%1$d/%2$d) + Câmera + Galeria + Imagem %1$d + Remover imagem + Atualizar garantia + Atualizar documento + Selecione uma residência + O título é obrigatório + O nome do item é obrigatório para garantias + O fornecedor é obrigatório para garantias + 2024-01-15 + 2025-01-15 + Falha ao carregar residências: %1$s + Suporte + Falar com o suporte + Obtenha ajuda com sua conta + Desbloqueie recursos premium + Faça upgrade para o Pro e tenha a experiência completa + Propriedades ilimitadas + Armazenamento de documentos e garantias + Compartilhamento de residência + Compartilhamento de prestadores + Notificações com ações + Widgets na tela inicial + Política de privacidade + Ver nossa política de privacidade + Versão %1$s + honeyDue + Editar perfil + Excluir conta + Excluir sua conta permanentemente + Esta ação é permanente e não pode ser desfeita. Todos os seus dados serão excluídos. + Quaisquer residências de sua propriedade que estejam compartilhadas com outros usuários também serão excluídas. + Digite sua senha para confirmar + Digite EXCLUIR para confirmar + Excluir minha conta + Cancelar + Conta excluída com sucesso + Falha ao excluir a conta + Resumo diário + Visão geral diária das tarefas a vencer e vencidas + Notificações por e-mail + E-mail de tarefa concluída + Receba um e-mail quando uma tarefa for concluída + Definir horário personalizado + Alterar + Selecionar horário da notificação + Todas as notificações + Ative ou desative todas as categorias com um toque + Categorias + Lembretes de tarefas + Lembretes de tarefas próximas e a vencer + Tarefas vencidas + Alertas quando uma tarefa passa do prazo + Convites para residência + Convites para entrar em uma residência compartilhada + Atualizações de assinatura + Mudanças de cobrança e status do plano + Abrir configurações do sistema + Ajuste sons, selos e o comportamento do Não Perturbe nas configurações do Android + Compartilhar + Importar + Importando... + Tentar novamente + Vencidas + A vencer esta semana + Próximos 30 dias + Suas propriedades + Bem-vindo ao honeyDue + Seu companheiro na manutenção da casa + Começar do zero + Entrar em uma casa existente + Já tem uma conta? Entrar + Pular + Continuar + Começar + Nunca esqueça uma tarefa + Acompanhe todas as tarefas de manutenção da casa em um só lugar, com lembretes inteligentes + Documentos ao seu alcance + Guarde garantias, manuais e recibos com segurança e acesse a qualquer momento + Seus prestadores de confiança + Mantenha todos os contatos de prestadores organizados e de fácil acesso + Compartilhe com a família + Convide familiares para colaborar juntos na manutenção da casa + Notificações inteligentes + Receba lembretes com ações que permitem concluir tarefas direto pela notificação + Widgets na tela inicial + Acesso rápido a tarefas e lembretes direto da sua tela inicial + Onde fica a sua casa? + Vamos sugerir tarefas de manutenção específicas para o clima da sua região + Usar minha localização + Detectando... + Inserir o CEP + Digite seu CEP + CEP + Dê um nome à sua casa + Dê um nome à sua propriedade para ajudar a identificá-la + ex.: Minha casa, Casa de praia, Apartamento + Você pode adicionar mais detalhes depois + Salve sua casa + Crie uma conta para sincronizar entre dispositivos + Criar conta com e-mail + Verifique seu e-mail + Enviamos um código de 6 dígitos para seu e-mail. Digite-o abaixo para verificar sua conta. + Não recebeu o código? Verifique sua caixa de spam + Entrar em uma residência + Digite o código de 6 caracteres compartilhado com você para entrar em uma casa existente + Digite o código de compartilhamento + Entrar na residência + Tudo pronto! + Vamos começar com algumas tarefas. Quanto mais você escolher, mais ajudaremos você a lembrar! + %1$d/%2$d tarefas selecionadas + Adicionar as mais populares + Adicionar %1$d tarefas e continuar + Pular por enquanto + Climatização e HVAC + Segurança e proteção + Encanamento + Área externa e jardim + Eletrodomésticos + Casa em geral + Seja Pro + Leve a gestão da sua casa ao próximo nível + HONEYDUE PRO + 4.9 • Mais de 10 mil donos de casa + Propriedades ilimitadas + Acompanhe todas as casas que você possui + Lembretes inteligentes + Nunca perca um prazo de manutenção + Cofre de documentos + Todos os seus documentos em um só lugar + Compartilhamento familiar + Deixe todos na mesma página + Análise de gastos + Veja para onde vai o seu dinheiro + Compartilhamento de prestadores + Compartilhe seus prestadores de confiança com a família e amigos + Widgets na tela inicial + Ações rápidas direto da sua tela inicial + Notificações com ações + Conclua tarefas direto pelas notificações + Escolha seu plano + Mensal + Anual + Economize 30% + R$2,99/mês + R$23,99/ano + Apenas R$1,99/mês + Iniciar teste grátis de 7 dias + Continuar com o plano gratuito + Teste grátis de 7 dias, depois %1$s. Cancele quando quiser. + Conte-nos sobre sua casa + Tudo opcional — ajuda a personalizar seu plano de manutenção + Sistemas + Recursos + Exterior + Interior + Para você + Explorar + App bloqueado + Autentique-se para desbloquear o honeyDue + Bloqueio biométrico + Exigir autenticação ao abrir o app + Desbloquear honeyDue + Verifique sua identidade para continuar + Desbloquear com biometria + Falha na autenticação + A autenticação biométrica não está disponível neste dispositivo + Lembretes de tarefas + Lembretes de tarefas próximas e a vencer + Tarefas vencidas + Alertas quando uma tarefa passa do prazo + Convites para residência + Convites para entrar em uma residência compartilhada + Atualizações de assinatura + Atualizações de status e cobrança da assinatura + Selecionado + Abrir + Pular + ou + Informações + Verificado + Aviso + Foto + Incluído + Verificando… + AM + PM + NOITE + Erro de rede + Falha ao carregar + Aparência + Usar cores do sistema + Seguir o Material You do Android 12+ (cores do papel de parede) + Escolha seu plano + Faça upgrade para o Pro e tenha acesso ilimitado + Fazer upgrade para o Pro + Recurso + Grátis + Pro + Propriedades + Tarefas + Prestadores + Documentos + 1 propriedade + 10 tarefas + Ilimitado + Indisponível + Verifique seu e-mail + Enviamos um código de 6 dígitos para + O código expira em 15 minutos + Digite o código de 6 dígitos do seu e-mail + Código verificado! Agora defina sua nova senha + Não recebeu o código? + Verifique sua pasta de spam se não o encontrar + Falha na verificação do código + A verificação de e-mail é necessária. Verifique sua caixa de entrada para um código de 6 dígitos. + Digite um código válido de 6 dígitos + Não recebeu o código? Verifique sua pasta de spam ou entre em contato com o suporte. + Falha na verificação + Sua senha foi redefinida com sucesso + Agora você pode entrar com sua nova senha + Voltar ao login + Definir nova senha + Crie uma senha forte para proteger sua conta + Requisitos da senha + Falha na redefinição da senha + Enviaremos um código de verificação de 6 dígitos para este endereço + Verifique seu e-mail para um código de verificação de 6 dígitos + Lembrou sua senha? Voltar ao login + Falha ao enviar o código de redefinição + Entrar em propriedade + Entrar em uma propriedade compartilhada + Digite o código de 6 caracteres fornecido pelo proprietário. + Código de compartilhamento + ABC123 + Os códigos têm 6 caracteres maiúsculos + Entrando… + Digite o PIN para desbloquear + PIN de 4 dígitos + PIN incorreto + Desbloquear + Falha ao criar a tarefa + Todas as tarefas + Adicionar tarefa + Falha ao carregar as tarefas + Crie sua primeira tarefa para começar + Adicione primeiro uma propriedade na aba Residências + Fazer upgrade para adicionar + Residência principal + Unidade: %1$s + Erro ao carregar tarefas: %1$s + Erro ao carregar prestadores: %1$s + Assinatura + Cancele quando quiser nas Configurações • Sem compromisso + Entrando na residência… + Teste gratuito de 7 dias, depois %1$s + Recolher + Expandir + Não selecionado + Entrando… + Requisito atendido + Requisito não atendido + Algo deu errado + Não incluído + Prestador: + Concluído por: + Remover foto + %1$d estrelas + Fotos de conclusão + Foto de conclusão da tarefa + Residência nº %1$d + Tarefa nº %1$d + Imagem %1$d de %2$d + Imagens do documento + Nenhuma garantia encontrada + Nenhum documento encontrado + %1$d dias restantes + Propriedade nº + Falha ao compartilhar a residência + Padrão + Cores vibrantes do sistema iOS + Azul-petróleo + Azul-esverdeado com toques quentes + Oceano + Azuis profundos e tons de coral + Floresta + Verdes terrosos e tons dourados + Pôr do sol + Laranjas e vermelhos quentes + Monocromático + Escala de cinza elegante + Lavanda + Roxo suave com toques de rosa + Carmesim + Vermelho intenso com destaques quentes + Meia-noite + Azul-marinho profundo com azul-céu + Deserto + Tons quentes de terracota e areia + Menta + Verde fresco com turquesa diff --git a/composeApp/src/commonMain/composeResources/values-zh/strings.xml b/composeApp/src/commonMain/composeResources/values-zh/strings.xml index bb95d8a..1d30219 100644 --- a/composeApp/src/commonMain/composeResources/values-zh/strings.xml +++ b/composeApp/src/commonMain/composeResources/values-zh/strings.xml @@ -472,4 +472,585 @@ 高级功能 您已达到当前套餐的房产数量上限 您已达到当前套餐的任务数量上限 + 供暖 + 制冷 + 热水器 + 泳池 + 喷灌系统 + 壁炉 + 车库 + 地下室 + 阁楼 + 化粪池 + 屋顶类型 + 外墙 + 地板 + 园艺绿化 + 已选择 %1$d 个任务 + 添加 %1$d 个任务并继续 + 正在为您的家寻找任务… + 暂无个性化建议 — 浏览完整目录或跳过此步骤。 + 浏览全部 + 跳过 + 无法加载您的建议 + 请检查网络连接后重试。 + 正在加载任务目录… + 无法加载任务目录 + 当前暂无可用模板。 + 已选择 + 离线 + 暂时跳过 + 升级到 Pro + 释放 honeyDue 的全部潜能 + 选择您的方案 + 按年 + 按月 + 省 50% + 最超值 + 包含内容 + 无限房产 + 跟踪所有房屋的维护 + 无限任务 + 再也不会忘记维护任务 + 承包商管理 + 保存并评价您信赖的承包商 + 文档保险库 + 存储保修单、收据和手册 + 家庭共享 + 邀请家人共同协作 + 智能提醒 + 任务到期时收到通知 + 文档与保修单存储 + 立即订阅 + 恢复购买 + 除非在当前订阅期结束前至少 24 小时取消,否则订阅将自动续订。可在设备设置中管理订阅。 + 使用条款 + 已包含 + 对比免费版与 Pro 版 + 以后再说 + 警告 + 订阅已生效 + 您现已拥有所有 Pro 功能的完整使用权! + 需要升级 + 此功能需订阅 Pro 才能使用。 + 解锁所有功能的无限使用权 + honeyDue Pro 月度 + honeyDue Pro 年度 + 按月计费 + 按年计费 + 省 22% + 已完成 + 已归档 + 暂无任务 + 新建任务 + 标题 + 例如:冲洗热水器 + 可选详情 + 截止日期(可选) + yyyy-MM-dd + 留空表示无截止日期 + 预估费用(可选) + 推荐任务 + 跳过 + 接受 + 无法加载建议 + 暂无建议 + 完善您的家庭资料以查看个性化推荐。 + 完成历史 + %1$d 次完成 + %1$d 次完成 + 正在加载完成记录… + 加载完成记录失败 + 暂无完成记录 + 此任务尚未完成。 + 由 %1$s 完成 + 查看照片 + 移除用户 + 复制代码 + 代码已复制到剪贴板 + 无法加载用户 + 将 %1$s 从此房产中移除? + 共享用户(%1$d) + 暂无共享用户 + 有权访问此住宅的用户。使用分享按钮邀请他人。 + 确定要将 %1$s 从此住宅中移除吗? + 移除 + 到期 + 至少 8 个字符 + 包含一个大写字母 + 包含一个小写字母 + 包含一个数字 + 密码一致 + 密码要求 + 密码至少需 8 个字符,并包含至少一个大写字母、一个小写字母和一个数字 + 加入住所 + 您想加入这个共享住所吗? + 已加入住所 + 您现在可以访问 %1$s。 + 加入失败 + 正在加入… + 共享者:%1$s + 到期:%1$s + Pro 功能 + 共享住所是 Pro 功能。升级后可邀请家人共同管理家居维护。 + 取消任务失败 + 恢复任务失败 + 标记任务为进行中失败 + 归档任务失败 + 取消归档任务失败 + 进行中 + 操作 + 标记为进行中 + 完成任务 + 编辑任务 + 取消任务 + 恢复任务 + 归档任务 + 取消归档任务 + + 完成者:%1$s + 费用:$%1$s + 查看照片(%1$d) + 添加新任务 + 房产 * + 房产为必填项 + 浏览任务模板 + %1$d 个常见任务 + 类别为必填项 + 间隔天数 + 覆盖默认频率间隔 + 每次重复之间的天数 + 截止日期为必填项(格式:YYYY-MM-DD) + 格式:YYYY-MM-DD + 创建任务 + 进行中 + 任务模板 + 完成 + 搜索模板… + 清除 + 个结果 + 个结果 + 未找到模板 + 请尝试其他搜索词 + 暂无可用模板 + 模板加载后将显示在这里 + 展开 + 收起 + 添加 + 全部 + 应用 + 应用(%1$d) + 已选 %1$d 个 + 重试 + 加载模板失败 + 创建任务失败 + 完成任务:%1$s + 选择承包商(可选) + 选择承包商或留空 + 展开 + 无(手动输入) + 正在加载承包商… + 加载承包商出错 + 完成人姓名(可选) + 若不使用上方承包商,请输入姓名 + 实际费用(可选) + 备注(可选) + 评分:5 分中的 %1$d 分 + 添加图片 + 拍照 + 从图库选择 + 已选择 %1$d 张图片 + 移除图片 + 完成 + 质量评分 + 照片(%1$d/%2$d) + 相机 + 图库 + 添加已完成工作的照片(可选) + 将此任务完成记录关联到承包商 + 完成详情 + 所有字段均为可选 + 添加有关已完成工作的备注 + 描述已完成的工作、发现的问题等。 + 为完成的工作质量评分 + 在下方手动输入姓名 + 管理用户 + 邀请他人 + 便捷共享 + 发送邀请链接 + 通过信息、邮件或共享发送 .honeydue 文件。对方只需轻点即可加入。 + 共享代码 + 无有效代码 + 生成代码 + 生成新代码 + 分享这个 6 位字符代码。对方可在应用中输入以加入。 + 用户(%1$d) + 所有者 + 移除 + + 共享承包商 + Pro 功能 + 共享承包商是 Pro 功能。升级后可将您信赖的承包商分享给亲友。 + 导入承包商 + 您想导入这位承包商吗? + 承包商已导入 + %1$s 已添加到您的联系人。 + 导入失败 + 共享者:%1$s + 添加承包商 + 编辑承包商 + 基本信息 + 姓名 * + 公司 + 住所(可选) + 个人(无住所) + 仅您本人可见此承包商 + %1$s 的所有用户都可见此承包商 + 联系信息 + 电话 + 邮箱 + 网站 + 专长 + 地址 + 街道地址 + 城市 + 州/省 + 邮政编码 + 备注 + 私密备注 + 标为收藏 + 添加 + 保存 + 编辑保修 + 编辑文档 + 添加保修 + 添加文档 + 选择住所 + 住所 * + 文档类型 * + 标题 * + 物品名称 * + 型号 + 序列号 + 提供商/公司 * + 提供商联系方式 + 理赔电话 + 理赔邮箱 + 理赔网站 + 购买日期(YYYY-MM-DD) + 保修开始日期(YYYY-MM-DD) + 保修结束日期(YYYY-MM-DD) * + 描述 + 类别 + 选择类别 + + 标签 + 标签1, 标签2, 标签3 + 备注 + 有效 + 现有照片(%1$d) + 新照片(%1$d/%2$d) + 照片(%1$d/%2$d) + 相机 + 图库 + 图片 %1$d + 移除图片 + 更新保修 + 更新文档 + 请选择一个住所 + 标题为必填项 + 保修需填写物品名称 + 保修需填写提供商 + 2024-01-15 + 2025-01-15 + 加载住所失败:%1$s + 支持 + 联系支持 + 获取账户帮助 + 解锁高级功能 + 升级到 Pro 享受完整体验 + 无限房产 + 文档与保修存储 + 住所共享 + 承包商共享 + 可操作通知 + 主屏幕小组件 + 隐私政策 + 查看我们的隐私政策 + 版本 %1$s + honeyDue + 编辑个人资料 + 删除账户 + 永久删除您的账户 + 此操作不可逆转。您的所有数据都将被删除。 + 您拥有的、与其他用户共享的所有住所也将被删除。 + 输入您的密码以确认 + 输入 DELETE 以确认 + 删除我的账户 + 取消 + 账户已成功删除 + 删除账户失败 + 每日摘要 + 每日到期与逾期任务概览 + 邮件通知 + 任务完成邮件 + 任务完成时接收邮件 + 设置自定义时间 + 更改 + 选择通知时间 + 所有通知 + 一键开启或关闭所有类别 + 类别 + 任务提醒 + 即将到期与快到期的提醒 + 逾期任务 + 任务超过截止日期时提醒 + 住所邀请 + 加入共享住所的邀请 + 订阅更新 + 账单和套餐状态变更 + 打开系统设置 + 在 Android 设置中精细调整声音、角标和勿扰行为 + 共享 + 导入 + 正在导入… + 重试 + 逾期 + 本周到期 + 未来 30 天 + 您的房产 + 欢迎使用 honeyDue + 您的家居维护好帮手 + 全新开始 + 加入现有住所 + 已有账户?登录 + 跳过 + 继续 + 开始使用 + 再不会忘记任务 + 通过智能提醒,在一处追踪所有家居维护任务 + 文档触手可及 + 安全存储保修单、说明书和收据,随时查阅 + 您信赖的承包商 + 整理所有承包商联系方式,轻松查找 + 与家人共享 + 邀请家人共同协作管理家居维护 + 智能通知 + 获取可操作的提醒,直接从通知完成任务 + 主屏幕小组件 + 直接从主屏幕快速访问任务和提醒 + 您的住所在哪里? + 我们将根据您所在地区的气候推荐相应的维护任务 + 使用我的位置 + 正在检测… + 改为输入邮政编码 + 输入您的邮政编码 + 邮政编码 + 为您的住所命名 + 为您的房产取个名字以便识别 + 例如:我的家、海边别墅、公寓 + 稍后可添加更多详情 + 保存您的住所 + 创建账户以跨设备同步 + 用邮箱创建账户 + 验证您的邮箱 + 我们已向您的邮箱发送 6 位验证码。请在下方输入以验证账户。 + 未收到验证码?请检查垃圾邮件文件夹 + 加入住所 + 输入分享给您的 6 位字符代码以加入现有住所 + 输入共享代码 + 加入住所 + 一切就绪! + 让我们从一些任务开始。选得越多,我们越能帮您记牢! + 已选 %1$d/%2$d 个任务 + 添加最热门 + 添加 %1$d 个任务并继续 + 暂时跳过 + 暖通空调与气候 + 安全与防护 + 管道 + 户外与草坪 + 家用电器 + 家居通用 + 升级 Pro + 让您的家居管理更上一层楼 + HONEYDUE PRO + 4.9 • 1 万多名房主 + 无限房产 + 追踪您拥有的每一处住所 + 智能提醒 + 绝不错过任何维护期限 + 文档保险库 + 所有文档集中存放 + 家庭共享 + 让全家人保持同步 + 支出洞察 + 了解您的钱花在哪里 + 承包商共享 + 将您信赖的承包商分享给亲友 + 主屏幕小组件 + 直接从主屏幕快速操作 + 可操作通知 + 直接从通知完成任务 + 选择您的套餐 + 按月 + 按年 + 省 30% + $2.99/月 + $23.99/年 + 仅 $1.99/月 + 开始 7 天免费试用 + 继续使用免费版 + 7 天免费试用,之后 %1$s。可随时取消。 + 介绍一下您的住所 + 全部可选——有助于我们为您定制维护计划 + 系统 + 功能配置 + 外部 + 内部 + 为您推荐 + 浏览 + 应用已锁定 + 验证身份以解锁 honeyDue + 生物识别锁定 + 打开应用时需要验证身份 + 解锁 honeyDue + 验证您的身份以继续 + 用生物识别解锁 + 验证失败 + 此设备不支持生物识别验证 + 任务提醒 + 即将到期与快到期的任务提醒 + 逾期任务 + 任务超过截止日期时提醒 + 住所邀请 + 加入共享住所的邀请 + 订阅更新 + 订阅状态和账单更新 + 已选择 + 打开 + 跳过 + + 信息 + 已验证 + 警告 + 照片 + 已包含 + 正在验证… + 上午 + 下午 + 晚上 + 网络错误 + 加载失败 + 外观 + 使用系统颜色 + 跟随 Android 12+ Material You(壁纸颜色) + 选择您的方案 + 升级到 Pro 以获得无限访问权限 + 升级到 Pro + 功能 + 免费 + Pro + 房产 + 任务 + 承包商 + 文档 + 1 处房产 + 10 个任务 + 无限 + 不可用 + 查看您的邮箱 + 我们已将 6 位验证码发送至 + 验证码将在 15 分钟后过期 + 请输入邮件中的 6 位验证码 + 验证码已验证!现在设置您的新密码 + 没有收到验证码? + 如果没看到,请检查您的垃圾邮件文件夹 + 验证码验证失败 + 需要进行邮箱验证。请在收件箱中查看 6 位验证码。 + 请输入有效的 6 位验证码 + 没有收到验证码?请检查您的垃圾邮件文件夹或联系支持人员。 + 验证失败 + 您的密码已成功重置 + 您现在可以使用新密码登录 + 返回登录 + 设置新密码 + 创建一个强密码以保护您的账户 + 密码要求 + 密码重置失败 + 我们将向此地址发送 6 位验证码 + 请查看您的邮箱获取 6 位验证码 + 想起密码了?返回登录 + 发送重置验证码失败 + 加入房产 + 加入共享房产 + 请输入业主提供的 6 位字符共享码。 + 共享码 + ABC123 + 共享码为 6 位大写字符 + 正在加入… + 输入 PIN 以解锁 + 4 位 PIN + PIN 错误 + 解锁 + 创建任务失败 + 所有任务 + 添加任务 + 加载任务失败 + 创建您的第一个任务以开始使用 + 请先在“住所”标签页中添加房产 + 升级以添加 + 主要住所 + 单元:%1$s + 加载任务出错:%1$s + 加载承包商出错:%1$s + 订阅 + 可随时在设置中取消 • 无需承诺 + 正在加入住所… + 7 天免费试用,之后 %1$s + 收起 + 展开 + 未选择 + 正在登录… + 已满足要求 + 未满足要求 + 出了点问题 + 不包含 + 承包商: + 完成人: + 移除照片 + %1$d 星 + 完成照片 + 任务完成照片 + 住所 #%1$d + 任务 #%1$d + 第 %1$d 张,共 %2$d 张 + 文档图片 + 未找到保修 + 未找到文档 + 剩余 %1$d 天 + 房产 # + 共享住所失败 + 默认 + 鲜艳的 iOS 系统配色 + 青色 + 带暖色调的蓝绿色 + 海洋 + 深蓝与珊瑚色调 + 森林 + 大地绿与金色调 + 日落 + 温暖的橙色与红色 + 单色 + 优雅的灰阶 + 薰衣草 + 带粉色调的柔和紫色 + 绯红 + 带暖色高光的亮红色 + 午夜 + 深藏青配天蓝色 + 沙漠 + 温暖的赤陶与沙色调 + 薄荷 + 带绿松石色的清新绿色 diff --git a/composeApp/src/commonMain/composeResources/values/strings.xml b/composeApp/src/commonMain/composeResources/values/strings.xml index e43a1f1..9e34b7e 100644 --- a/composeApp/src/commonMain/composeResources/values/strings.xml +++ b/composeApp/src/commonMain/composeResources/values/strings.xml @@ -147,6 +147,11 @@ Archive Task Are you sure you want to archive \"%1$s\"? You can unarchive it later from archived tasks. Dismiss + Shared Users (%1$d) + No shared users + Users with access to this residence. Use the share button to invite others. + Are you sure you want to remove %1$s from this residence? + Remove Tasks @@ -216,6 +221,27 @@ In Progress Completed Cancelled + Done + Archived + No tasks + + + New Task + Title + e.g. Flush water heater + Optional details + Due date (optional) + yyyy-MM-dd + Leave blank for no due date + Estimated cost (optional) + + + Suggested Tasks + Skip + Accept + Couldn\'t load suggestions + No suggestions yet + Complete your home profile to see personalized recommendations. Complete @@ -291,6 +317,17 @@ Rate the quality of work performed Enter name manually below + + Completion History + %1$d completion + %1$d completions + Loading completions... + Failed to load completions + No Completions Yet + This task has not been completed. + Completed by %1$s + View Photo + Manage Users Invite Others @@ -306,6 +343,11 @@ Owner Remove or + Remove user + Copy code + Code copied to clipboard + Couldn\'t load users + Remove %1$s from this property? Contractors @@ -476,6 +518,7 @@ Failed to load image Previous Next + Expires Edit Warranty @@ -732,6 +775,47 @@ You\'ve reached the property limit for your plan You\'ve reached the task limit for your plan + + Upgrade to Pro + Unlock the full potential of honeyDue + Choose Your Plan + Yearly + Monthly + Save 50% + BEST VALUE + What\'s Included + Unlimited Properties + Track maintenance for all your homes + Unlimited Tasks + Never forget a maintenance task again + Contractor Management + Save and rate your trusted contractors + Document Vault + Store warranties, receipts, and manuals + Family Sharing + Invite family members to collaborate + Smart Reminders + Get notified when tasks are due + Document & warranty storage + Subscribe Now + Restore Purchases + Subscription automatically renews unless cancelled at least 24 hours before the end of the current period. Manage subscriptions in your device settings. + Terms of Use + Included + Compare Free vs Pro + Maybe Later + Warning + Subscription Active + You now have full access to all Pro features! + Upgrade Required + This feature is available with a Pro subscription. + Unlock unlimited access to all features + honeyDue Pro Monthly + honeyDue Pro Annual + Billed monthly + Billed annually + Save 22% + Welcome to honeyDue Your home maintenance companion @@ -843,6 +927,38 @@ Exterior Interior + + Heating + Cooling + Water Heater + Pool + Sprinkler System + Fireplace + Garage + Basement + Attic + Septic + Roof Type + Exterior + Flooring + Landscaping + + + %1$d tasks selected + Add %1$d Tasks & Continue + Finding tasks for your home... + No personalised suggestions yet — browse the full catalog or skip this step. + Browse All + Skip + Couldn\'t load your suggestions + Check your connection and try again. + Loading the task catalog... + Couldn\'t load the task catalog + No templates available right now. + Selected + Offline + Skip for now + For You Browse @@ -870,4 +986,186 @@ Invitations to join a shared residence Subscription Updates Subscription status and billing updates + + + + + Selected + Open + Skip + or + Info + Verified + Warning + Photo + Included + Verifying… + + + AM + PM + EVE + + + Network Error + + + Failed to load + + + Appearance + Use system colors + Follow Android 12+ Material You (wallpaper colors) + + + Choose Your Plan + Upgrade to Pro for unlimited access + Upgrade to Pro + Feature + Free + Pro + Properties + Tasks + Contractors + Documents + 1 property + 10 tasks + Unlimited + Not available + + + Check Your Email + We sent a 6-digit code to + Code expires in 15 minutes + Enter the 6-digit code from your email + Code verified! Now set your new password + Didn\'t receive the code? + Check your spam folder if you don\'t see it + Code Verification Failed + + + Email verification is required. Check your inbox for a 6-digit code. + Please enter a valid 6-digit code + Didn\'t receive the code? Check your spam folder or contact support. + Verification Failed + + + Your password has been reset successfully + You can now log in with your new password + Return to Login + Set New Password + Create a strong password to secure your account + Password Requirements + Password Reset Failed + + + We\'ll send a 6-digit verification code to this address + Check your email for a 6-digit verification code + Remember your password? Back to Login + Failed to Send Reset Code + + + Join Property + Join a Shared Property + Enter the 6-character share code provided by the owner. + Share Code + ABC123 + Codes are 6 uppercase characters + Joining… + + + Enter PIN to unlock + 4-digit PIN + Incorrect PIN + Unlock + + + Failed to Create Task + All Tasks + Add Task + Failed to Load Tasks + Create your first task to get started + Add a property first from the Residences tab + + + Upgrade to Add + Primary residence + + + Unit: %1$s + Error loading tasks: %1$s + Error loading contractors: %1$s + + + Subscription + + + Cancel anytime in Settings • No commitment + Joining residence… + 7-day free trial, then %1$s + + + Collapse + Expand + Not selected + + + Logging in… + Requirement met + Requirement not met + + + Something went wrong + + + Not included + + + Contractor: + Completed by: + Remove photo + %1$d stars + + + Completion Photos + Task completion photo + + + Residence #%1$d + Task #%1$d + Image %1$d of %2$d + Document Images + No warranties found + No documents found + %1$d days remaining + + + Property # + + + Failed to share residence + + + Default + Vibrant iOS system colors + Teal + Blue-green with warm accents + Ocean + Deep blues and coral tones + Forest + Earth greens and golden hues + Sunset + Warm oranges and reds + Monochrome + Elegant grayscale + Lavender + Soft purple with pink accents + Crimson + Bold red with warm highlights + Midnight + Deep navy with sky blue + Desert + Warm terracotta and sand tones + Mint + Fresh green with turquoise diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/data/DataManager.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/data/DataManager.kt index 3f78d0a..21e9e02 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/data/DataManager.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/data/DataManager.kt @@ -248,6 +248,18 @@ object DataManager : IDataManager { private val _contractorSpecialtiesMap = MutableStateFlow>(emptyMap()) val contractorSpecialtiesMap: StateFlow> = _contractorSpecialtiesMap.asStateFlow() + // Home-profile field options (heating_type -> [options], etc.), served + // localized by the backend. Replaces the previously hardcoded client lists. + private val _homeProfileOptions = MutableStateFlow>>(emptyMap()) + val homeProfileOptions: StateFlow>> = _homeProfileOptions.asStateFlow() + + // Document type / category options ({value, display_name}), served localized. + private val _documentTypes = MutableStateFlow>(emptyList()) + val documentTypes: StateFlow> = _documentTypes.asStateFlow() + + private val _documentCategories = MutableStateFlow>(emptyList()) + val documentCategories: StateFlow> = _documentCategories.asStateFlow() + // ==================== STATE METADATA ==================== private val _isInitialized = MutableStateFlow(false) @@ -824,6 +836,15 @@ object DataManager : IDataManager { setTaskCategories(seededData.taskCategories) setContractorSpecialties(seededData.contractorSpecialties) setTaskTemplatesGrouped(seededData.taskTemplates) + if (seededData.homeProfileOptions.isNotEmpty()) { + _homeProfileOptions.value = seededData.homeProfileOptions + } + if (seededData.documentTypes.isNotEmpty()) { + _documentTypes.value = seededData.documentTypes + } + if (seededData.documentCategories.isNotEmpty()) { + _documentCategories.value = seededData.documentCategories + } setSeededDataETag(etag) _lookupsInitialized.value = true // Persist lookups to disk for faster startup @@ -890,6 +911,9 @@ object DataManager : IDataManager { _taskCategoriesMap.value = emptyMap() _contractorSpecialties.value = emptyList() _contractorSpecialtiesMap.value = emptyMap() + _homeProfileOptions.value = emptyMap() + _documentTypes.value = emptyList() + _documentCategories.value = emptyList() _taskTemplates.value = emptyList() _taskTemplatesGrouped.value = null _lookupsInitialized.value = false diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStrings.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStrings.kt new file mode 100644 index 0000000..6d55abf --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStrings.kt @@ -0,0 +1,41 @@ +package com.tt.honeyDue.i18n + +import com.tt.honeyDue.network.getDeviceLanguage + +/** + * Lightweight, dependency-free client-side localization for the SHARED Kotlin + * layer (errors, date words, fallback labels) that the iOS String Catalog and + * Android resources can't reach because they originate in commonMain. + * + * Real API error messages are localized by the backend (Accept-Language); this + * covers client-generated / offline / fallback copy only. + * + * Resolution: the device language (2-letter) from [getDeviceLanguage], falling + * back to English. Use [t] for plain lookups and [t] with args for `{0}`-style + * placeholder substitution. + */ +object ClientStrings { + private val supported = setOf("en", "es", "fr", "de", "pt", "it", "ja", "ko", "nl", "zh") + + private fun lang(): String { + val l = getDeviceLanguage().lowercase().take(2) + return if (l in supported) l else "en" + } + + /** Localized string for [key]; falls back to English, then to the key itself. */ + fun t(key: String): String { + val byLang = strings[key] ?: return key + return byLang[lang()] ?: byLang["en"] ?: key + } + + /** Localized string with `{0}`, `{1}`, … placeholder substitution. */ + fun t(key: String, vararg args: Any?): String { + var s = t(key) + args.forEachIndexed { i, a -> s = s.replace("{$i}", a.toString()) } + return s + } + + // key -> (lang -> value). English is authoritative; other languages are + // populated by the translation pipeline. GENERATED-BLOCK:strings + private val strings: Map> = STRINGS +} diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStringsData.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStringsData.kt new file mode 100644 index 0000000..bf9e5d8 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStringsData.kt @@ -0,0 +1,232 @@ +package com.tt.honeyDue.i18n + +// GENERATED string table for [ClientStrings]. English authoritative; other +// languages machine-translated (pending native QA). Keep keys stable. +internal val STRINGS: Map> = mapOf( + "date.today" to mapOf("en" to "Today", "es" to "Hoy", "fr" to "Aujourd'hui", "de" to "Heute", "pt" to "Hoje", "it" to "Oggi", "ja" to "今日", "ko" to "오늘", "nl" to "Vandaag", "zh" to "今天"), + "date.tomorrow" to mapOf("en" to "Tomorrow", "es" to "Mañana", "fr" to "Demain", "de" to "Morgen", "pt" to "Amanhã", "it" to "Domani", "ja" to "明日", "ko" to "내일", "nl" to "Morgen", "zh" to "明天"), + "date.yesterday" to mapOf("en" to "Yesterday", "es" to "Ayer", "fr" to "Hier", "de" to "Gestern", "pt" to "Ontem", "it" to "Ieri", "ja" to "昨日", "ko" to "어제", "nl" to "Gisteren", "zh" to "昨天"), + "date.in_days" to mapOf("en" to "in {0} days", "es" to "en {0} días", "fr" to "dans {0} jours", "de" to "in {0} Tagen", "pt" to "em {0} dias", "it" to "tra {0} giorni", "ja" to "{0}日後", "ko" to "{0}일 후", "nl" to "over {0} dagen", "zh" to "{0}天后"), + "date.days_ago" to mapOf("en" to "{0} days ago", "es" to "hace {0} días", "fr" to "il y a {0} jours", "de" to "vor {0} Tagen", "pt" to "há {0} dias", "it" to "{0} giorni fa", "ja" to "{0}日前", "ko" to "{0}일 전", "nl" to "{0} dagen geleden", "zh" to "{0}天前"), + "date.at" to mapOf("en" to "at", "es" to "a las", "fr" to "à", "de" to "um", "pt" to "às", "it" to "alle", "ja" to "", "ko" to "", "nl" to "om", "zh" to ""), + "time.am" to mapOf("en" to "AM", "es" to "AM", "fr" to "AM", "de" to "AM", "pt" to "AM", "it" to "AM", "ja" to "午前", "ko" to "오전", "nl" to "AM", "zh" to "上午"), + "time.pm" to mapOf("en" to "PM", "es" to "PM", "fr" to "PM", "de" to "PM", "pt" to "PM", "it" to "PM", "ja" to "午後", "ko" to "오후", "nl" to "PM", "zh" to "下午"), + "month.1" to mapOf("en" to "Jan", "es" to "ene", "fr" to "janv.", "de" to "Jan", "pt" to "jan", "it" to "gen", "ja" to "1月", "ko" to "1월", "nl" to "jan", "zh" to "1月"), + "month.2" to mapOf("en" to "Feb", "es" to "feb", "fr" to "févr.", "de" to "Feb", "pt" to "fev", "it" to "feb", "ja" to "2月", "ko" to "2월", "nl" to "feb", "zh" to "2月"), + "month.3" to mapOf("en" to "Mar", "es" to "mar", "fr" to "mars", "de" to "Mär", "pt" to "mar", "it" to "mar", "ja" to "3月", "ko" to "3월", "nl" to "mrt", "zh" to "3月"), + "month.4" to mapOf("en" to "Apr", "es" to "abr", "fr" to "avr.", "de" to "Apr", "pt" to "abr", "it" to "apr", "ja" to "4月", "ko" to "4월", "nl" to "apr", "zh" to "4月"), + "month.5" to mapOf("en" to "May", "es" to "may", "fr" to "mai", "de" to "Mai", "pt" to "mai", "it" to "mag", "ja" to "5月", "ko" to "5월", "nl" to "mei", "zh" to "5月"), + "month.6" to mapOf("en" to "Jun", "es" to "jun", "fr" to "juin", "de" to "Jun", "pt" to "jun", "it" to "giu", "ja" to "6月", "ko" to "6월", "nl" to "jun", "zh" to "6月"), + "month.7" to mapOf("en" to "Jul", "es" to "jul", "fr" to "juil.", "de" to "Jul", "pt" to "jul", "it" to "lug", "ja" to "7月", "ko" to "7월", "nl" to "jul", "zh" to "7月"), + "month.8" to mapOf("en" to "Aug", "es" to "ago", "fr" to "août", "de" to "Aug", "pt" to "ago", "it" to "ago", "ja" to "8月", "ko" to "8월", "nl" to "aug", "zh" to "8月"), + "month.9" to mapOf("en" to "Sep", "es" to "sep", "fr" to "sept.", "de" to "Sep", "pt" to "set", "it" to "set", "ja" to "9月", "ko" to "9월", "nl" to "sep", "zh" to "9月"), + "month.10" to mapOf("en" to "Oct", "es" to "oct", "fr" to "oct.", "de" to "Okt", "pt" to "out", "it" to "ott", "ja" to "10月", "ko" to "10월", "nl" to "okt", "zh" to "10月"), + "month.11" to mapOf("en" to "Nov", "es" to "nov", "fr" to "nov.", "de" to "Nov", "pt" to "nov", "it" to "nov", "ja" to "11月", "ko" to "11월", "nl" to "nov", "zh" to "11月"), + "month.12" to mapOf("en" to "Dec", "es" to "dic", "fr" to "déc.", "de" to "Dez", "pt" to "dez", "it" to "dic", "ja" to "12月", "ko" to "12월", "nl" to "dec", "zh" to "12月"), + "err.unknown" to mapOf("en" to "Unknown error", "es" to "Error desconocido", "fr" to "Erreur inconnue", "de" to "Unbekannter Fehler", "pt" to "Erro desconhecido", "it" to "Errore sconosciuto", "ja" to "不明なエラー", "ko" to "알 수 없는 오류", "nl" to "Onbekende fout", "zh" to "未知错误"), + "err.unknown_occurred" to mapOf("en" to "Unknown error occurred", "es" to "Ocurrió un error desconocido", "fr" to "Une erreur inconnue est survenue", "de" to "Ein unbekannter Fehler ist aufgetreten", "pt" to "Ocorreu um erro desconhecido", "it" to "Si è verificato un errore sconosciuto", "ja" to "不明なエラーが発生しました", "ko" to "알 수 없는 오류가 발생했습니다", "nl" to "Er is een onbekende fout opgetreden", "zh" to "发生未知错误"), + "err.not_authenticated" to mapOf("en" to "Not authenticated", "es" to "No autenticado", "fr" to "Non authentifié", "de" to "Nicht angemeldet", "pt" to "Não autenticado", "it" to "Non autenticato", "ja" to "認証されていません", "ko" to "인증되지 않았습니다", "nl" to "Niet ingelogd", "zh" to "未通过身份验证"), + "err.generic" to mapOf("en" to "Something went wrong. Please try again.", "es" to "Algo salió mal. Inténtalo de nuevo.", "fr" to "Une erreur s'est produite. Veuillez réessayer.", "de" to "Etwas ist schiefgelaufen. Bitte versuche es erneut.", "pt" to "Algo deu errado. Tente novamente.", "it" to "Qualcosa è andato storto. Riprova.", "ja" to "問題が発生しました。もう一度お試しください。", "ko" to "문제가 발생했습니다. 다시 시도해 주세요.", "nl" to "Er is iets misgegaan. Probeer het opnieuw.", "zh" to "出错了,请重试。"), + "err.generic_retry" to mapOf("en" to "An error occurred. Please try again.", "es" to "Ocurrió un error. Inténtalo de nuevo.", "fr" to "Une erreur est survenue. Veuillez réessayer.", "de" to "Ein Fehler ist aufgetreten. Bitte versuche es erneut.", "pt" to "Ocorreu um erro. Tente novamente.", "it" to "Si è verificato un errore. Riprova.", "ja" to "エラーが発生しました。もう一度お試しください。", "ko" to "오류가 발생했습니다. 다시 시도해 주세요.", "nl" to "Er is een fout opgetreden. Probeer het opnieuw.", "zh" to "发生错误,请重试。"), + "err.request_failed" to mapOf("en" to "Request failed. Please check your input and try again.", "es" to "La solicitud falló. Revisa los datos e inténtalo de nuevo.", "fr" to "Échec de la requête. Vérifiez votre saisie et réessayez.", "de" to "Anfrage fehlgeschlagen. Bitte überprüfe deine Eingabe und versuche es erneut.", "pt" to "Falha na solicitação. Verifique os dados e tente novamente.", "it" to "Richiesta non riuscita. Controlla i dati inseriti e riprova.", "ja" to "リクエストに失敗しました。入力内容を確認してもう一度お試しください。", "ko" to "요청에 실패했습니다. 입력 내용을 확인하고 다시 시도해 주세요.", "nl" to "Verzoek mislukt. Controleer je invoer en probeer het opnieuw.", "zh" to "请求失败,请检查输入后重试。"), + "err.net.no_connection" to mapOf("en" to "Unable to connect to the server. Please check your internet connection.", "es" to "No se pudo conectar con el servidor. Revisa tu conexión a internet.", "fr" to "Impossible de se connecter au serveur. Vérifiez votre connexion Internet.", "de" to "Verbindung zum Server nicht möglich. Bitte überprüfe deine Internetverbindung.", "pt" to "Não foi possível conectar ao servidor. Verifique sua conexão com a internet.", "it" to "Impossibile connettersi al server. Controlla la connessione a Internet.", "ja" to "サーバーに接続できません。インターネット接続を確認してください。", "ko" to "서버에 연결할 수 없습니다. 인터넷 연결을 확인해 주세요.", "nl" to "Kan geen verbinding maken met de server. Controleer je internetverbinding.", "zh" to "无法连接到服务器,请检查网络连接。"), + "err.net.timeout" to mapOf("en" to "Request timed out. Please try again.", "es" to "Se agotó el tiempo de espera. Inténtalo de nuevo.", "fr" to "Délai d'attente dépassé. Veuillez réessayer.", "de" to "Zeitüberschreitung der Anfrage. Bitte versuche es erneut.", "pt" to "A solicitação expirou. Tente novamente.", "it" to "Richiesta scaduta. Riprova.", "ja" to "リクエストがタイムアウトしました。もう一度お試しください。", "ko" to "요청 시간이 초과되었습니다. 다시 시도해 주세요.", "nl" to "Verzoek verlopen. Probeer het opnieuw.", "zh" to "请求超时,请重试。"), + "err.net.no_internet" to mapOf("en" to "No internet connection. Please check your network settings.", "es" to "Sin conexión a internet. Revisa la configuración de tu red.", "fr" to "Pas de connexion Internet. Vérifiez vos paramètres réseau.", "de" to "Keine Internetverbindung. Bitte überprüfe deine Netzwerkeinstellungen.", "pt" to "Sem conexão com a internet. Verifique as configurações de rede.", "it" to "Nessuna connessione a Internet. Controlla le impostazioni di rete.", "ja" to "インターネットに接続されていません。ネットワーク設定を確認してください。", "ko" to "인터넷 연결이 없습니다. 네트워크 설정을 확인해 주세요.", "nl" to "Geen internetverbinding. Controleer je netwerkinstellingen.", "zh" to "无网络连接,请检查网络设置。"), + "err.net.server_down" to mapOf("en" to "Unable to connect to the server. The server may be down.", "es" to "No se pudo conectar con el servidor. Es posible que esté caído.", "fr" to "Impossible de se connecter au serveur. Le serveur est peut-être indisponible.", "de" to "Verbindung zum Server nicht möglich. Der Server ist möglicherweise nicht erreichbar.", "pt" to "Não foi possível conectar ao servidor. O servidor pode estar fora do ar.", "it" to "Impossibile connettersi al server. Il server potrebbe non essere disponibile.", "ja" to "サーバーに接続できません。サーバーがダウンしている可能性があります。", "ko" to "서버에 연결할 수 없습니다. 서버가 다운되었을 수 있습니다.", "nl" to "Kan geen verbinding maken met de server. De server is mogelijk offline.", "zh" to "无法连接到服务器,服务器可能已停止运行。"), + "err.net.interrupted" to mapOf("en" to "Connection was interrupted. Please try again.", "es" to "Se interrumpió la conexión. Inténtalo de nuevo.", "fr" to "La connexion a été interrompue. Veuillez réessayer.", "de" to "Die Verbindung wurde unterbrochen. Bitte versuche es erneut.", "pt" to "A conexão foi interrompida. Tente novamente.", "it" to "La connessione è stata interrotta. Riprova.", "ja" to "接続が中断されました。もう一度お試しください。", "ko" to "연결이 중단되었습니다. 다시 시도해 주세요.", "nl" to "Verbinding werd onderbroken. Probeer het opnieuw.", "zh" to "连接已中断,请重试。"), + "err.net.ssl" to mapOf("en" to "Secure connection failed. Please try again.", "es" to "Falló la conexión segura. Inténtalo de nuevo.", "fr" to "Échec de la connexion sécurisée. Veuillez réessayer.", "de" to "Sichere Verbindung fehlgeschlagen. Bitte versuche es erneut.", "pt" to "Falha na conexão segura. Tente novamente.", "it" to "Connessione sicura non riuscita. Riprova.", "ja" to "セキュア接続に失敗しました。もう一度お試しください。", "ko" to "보안 연결에 실패했습니다. 다시 시도해 주세요.", "nl" to "Beveiligde verbinding mislukt. Probeer het opnieuw.", "zh" to "安全连接失败,请重试。"), + "err.net.generic" to mapOf("en" to "Connection error. Please try again.", "es" to "Error de conexión. Inténtalo de nuevo.", "fr" to "Erreur de connexion. Veuillez réessayer.", "de" to "Verbindungsfehler. Bitte versuche es erneut.", "pt" to "Erro de conexão. Tente novamente.", "it" to "Errore di connessione. Riprova.", "ja" to "接続エラーです。もう一度お試しください。", "ko" to "연결 오류입니다. 다시 시도해 주세요.", "nl" to "Verbindingsfout. Probeer het opnieuw.", "zh" to "连接出错,请重试。"), + "err.too_many_requests" to mapOf("en" to "Too many requests. Please try again later.", "es" to "Demasiadas solicitudes. Inténtalo más tarde.", "fr" to "Trop de requêtes. Réessayez plus tard.", "de" to "Zu viele Anfragen. Bitte versuche es später erneut.", "pt" to "Muitas solicitações. Tente novamente mais tarde.", "it" to "Troppe richieste. Riprova più tardi.", "ja" to "リクエストが多すぎます。しばらくしてからもう一度お試しください。", "ko" to "요청이 너무 많습니다. 잠시 후 다시 시도해 주세요.", "nl" to "Te veel verzoeken. Probeer het later opnieuw.", "zh" to "请求过于频繁,请稍后重试。"), + "err.too_many_requests_retry" to mapOf("en" to "Too many requests. Please try again in {0} seconds.", "es" to "Demasiadas solicitudes. Inténtalo de nuevo en {0} segundos.", "fr" to "Trop de requêtes. Réessayez dans {0} secondes.", "de" to "Zu viele Anfragen. Bitte versuche es in {0} Sekunden erneut.", "pt" to "Muitas solicitações. Tente novamente em {0} segundos.", "it" to "Troppe richieste. Riprova tra {0} secondi.", "ja" to "リクエストが多すぎます。{0}秒後にもう一度お試しください。", "ko" to "요청이 너무 많습니다. {0}초 후 다시 시도해 주세요.", "nl" to "Te veel verzoeken. Probeer het over {0} seconden opnieuw.", "zh" to "请求过于频繁,请在{0}秒后重试。"), + "err.details" to mapOf("en" to "Details:", "es" to "Detalles:", "fr" to "Détails :", "de" to "Details:", "pt" to "Detalhes:", "it" to "Dettagli:", "ja" to "詳細:", "ko" to "세부 정보:", "nl" to "Details:", "zh" to "详情:"), + "err.with_status" to mapOf("en" to "An error occurred ({0})", "es" to "Ocurrió un error ({0})", "fr" to "Une erreur s'est produite ({0})", "de" to "Ein Fehler ist aufgetreten ({0})", "pt" to "Ocorreu um erro ({0})", "it" to "Si è verificato un errore ({0})", "ja" to "エラーが発生しました({0})", "ko" to "오류가 발생했습니다 ({0})", "nl" to "Er is een fout opgetreden ({0})", "zh" to "发生错误({0})"), + "upload.too_large" to mapOf("en" to "That photo is too large after resizing.", "es" to "Esa foto es demasiado grande después de redimensionarla.", "fr" to "Cette photo est trop volumineuse après redimensionnement.", "de" to "Dieses Foto ist auch nach dem Verkleinern zu groß.", "pt" to "Essa foto está muito grande após o redimensionamento.", "it" to "La foto è troppo grande dopo il ridimensionamento.", "ja" to "リサイズ後もこの写真は大きすぎます。", "ko" to "크기 조정 후에도 사진이 너무 큽니다.", "nl" to "Die foto is te groot na het verkleinen.", "zh" to "该照片压缩后仍过大。"), + "upload.unsupported" to mapOf("en" to "That image format isn't supported.", "es" to "Ese formato de imagen no es compatible.", "fr" to "Ce format d'image n'est pas pris en charge.", "de" to "Dieses Bildformat wird nicht unterstützt.", "pt" to "Esse formato de imagem não é compatível.", "it" to "Questo formato immagine non è supportato.", "ja" to "この画像形式はサポートされていません。", "ko" to "지원되지 않는 이미지 형식입니다.", "nl" to "Dat afbeeldingsformaat wordt niet ondersteund.", "zh" to "不支持该图片格式。"), + "upload.too_many" to mapOf("en" to "Too many uploads in flight; try again shortly.", "es" to "Demasiadas subidas en curso; inténtalo de nuevo en un momento.", "fr" to "Trop d'envois en cours ; réessayez sous peu.", "de" to "Zu viele Uploads gleichzeitig. Bitte versuche es gleich erneut.", "pt" to "Muitos envios em andamento; tente novamente em instantes.", "it" to "Troppi caricamenti in corso; riprova tra poco.", "ja" to "アップロード中のファイルが多すぎます。しばらくしてからお試しください。", "ko" to "업로드가 너무 많습니다. 잠시 후 다시 시도해 주세요.", "nl" to "Te veel uploads tegelijk; probeer het zo opnieuw.", "zh" to "上传任务过多,请稍后再试。"), + "upload.start_failed" to mapOf("en" to "Couldn't start upload.", "es" to "No se pudo iniciar la subida.", "fr" to "Impossible de démarrer l'envoi.", "de" to "Upload konnte nicht gestartet werden.", "pt" to "Não foi possível iniciar o envio.", "it" to "Impossibile avviare il caricamento.", "ja" to "アップロードを開始できませんでした。", "ko" to "업로드를 시작할 수 없습니다.", "nl" to "Kon upload niet starten.", "zh" to "无法开始上传。"), + "upload.storage_failed" to mapOf("en" to "Upload to storage failed.", "es" to "Falló la subida al almacenamiento.", "fr" to "Échec de l'envoi vers le stockage.", "de" to "Upload zum Speicher fehlgeschlagen.", "pt" to "Falha no envio para o armazenamento.", "it" to "Caricamento nello spazio di archiviazione non riuscito.", "ja" to "ストレージへのアップロードに失敗しました。", "ko" to "저장소 업로드에 실패했습니다.", "nl" to "Uploaden naar opslag mislukt.", "zh" to "上传至存储失败。"), + "upload.net_presign" to mapOf("en" to "Network error during presign.", "es" to "Error de red durante la autorización.", "fr" to "Erreur réseau lors de la pré-signature.", "de" to "Netzwerkfehler bei der Vorbereitung.", "pt" to "Erro de rede durante a pré-assinatura.", "it" to "Errore di rete durante la pre-autorizzazione.", "ja" to "署名取得中にネットワークエラーが発生しました。", "ko" to "사전 서명 중 네트워크 오류가 발생했습니다.", "nl" to "Netwerkfout tijdens presign.", "zh" to "预签名时网络出错。"), + "upload.net_upload" to mapOf("en" to "Network error during upload.", "es" to "Error de red durante la subida.", "fr" to "Erreur réseau lors de l'envoi.", "de" to "Netzwerkfehler beim Upload.", "pt" to "Erro de rede durante o envio.", "it" to "Errore di rete durante il caricamento.", "ja" to "アップロード中にネットワークエラーが発生しました。", "ko" to "업로드 중 네트워크 오류가 발생했습니다.", "nl" to "Netwerkfout tijdens uploaden.", "zh" to "上传时网络出错。"), + "upload.failed" to mapOf("en" to "Upload failed.", "es" to "La subida falló.", "fr" to "Échec de l'envoi.", "de" to "Upload fehlgeschlagen.", "pt" to "Falha no envio.", "it" to "Caricamento non riuscito.", "ja" to "アップロードに失敗しました。", "ko" to "업로드에 실패했습니다.", "nl" to "Uploaden mislukt.", "zh" to "上传失败。"), + "task.frequency.one_time" to mapOf("en" to "One time", "es" to "Una vez", "fr" to "Une fois", "de" to "Einmalig", "pt" to "Uma vez", "it" to "Una volta", "ja" to "1回のみ", "ko" to "한 번", "nl" to "Eenmalig", "zh" to "一次性"), + "task.category.uncategorized" to mapOf("en" to "Uncategorized", "es" to "Sin categoría", "fr" to "Non classé", "de" to "Ohne Kategorie", "pt" to "Sem categoria", "it" to "Senza categoria", "ja" to "未分類", "ko" to "분류 없음", "nl" to "Niet ingedeeld", "zh" to "未分类"), + "err.api.failed_fetch_completions" to mapOf("en" to "Failed to fetch completions", "es" to "No se pudieron obtener las finalizaciones", "fr" to "Échec de la récupération des achèvements", "de" to "Erledigungen konnten nicht abgerufen werden", "pt" to "Falha ao buscar as conclusões", "it" to "Impossibile recuperare i completamenti", "ja" to "完了履歴の取得に失敗しました", "ko" to "완료 내역을 가져오지 못했습니다", "nl" to "Voltooiingen ophalen mislukt", "zh" to "获取完成记录失败"), + "err.api.failed_fetch_completion" to mapOf("en" to "Failed to fetch completion", "es" to "No se pudo obtener la finalización", "fr" to "Échec de la récupération de l'achèvement", "de" to "Erledigung konnte nicht abgerufen werden", "pt" to "Falha ao buscar a conclusão", "it" to "Impossibile recuperare il completamento", "ja" to "完了履歴の取得に失敗しました", "ko" to "완료 내역을 가져오지 못했습니다", "nl" to "Voltooiing ophalen mislukt", "zh" to "获取完成记录失败"), + "err.api.failed_create_completion" to mapOf("en" to "Failed to create completion", "es" to "No se pudo crear la finalización", "fr" to "Échec de la création de l'achèvement", "de" to "Erledigung konnte nicht erstellt werden", "pt" to "Falha ao criar a conclusão", "it" to "Impossibile creare il completamento", "ja" to "完了の作成に失敗しました", "ko" to "완료 내역을 생성하지 못했습니다", "nl" to "Voltooiing aanmaken mislukt", "zh" to "创建完成记录失败"), + "err.api.failed_update_completion" to mapOf("en" to "Failed to update completion", "es" to "No se pudo actualizar la finalización", "fr" to "Échec de la mise à jour de l'achèvement", "de" to "Erledigung konnte nicht aktualisiert werden", "pt" to "Falha ao atualizar a conclusão", "it" to "Impossibile aggiornare il completamento", "ja" to "完了の更新に失敗しました", "ko" to "완료 내역을 업데이트하지 못했습니다", "nl" to "Voltooiing bijwerken mislukt", "zh" to "更新完成记录失败"), + "err.api.failed_delete_completion" to mapOf("en" to "Failed to delete completion", "es" to "No se pudo eliminar la finalización", "fr" to "Échec de la suppression de l'achèvement", "de" to "Erledigung konnte nicht gelöscht werden", "pt" to "Falha ao excluir a conclusão", "it" to "Impossibile eliminare il completamento", "ja" to "完了の削除に失敗しました", "ko" to "완료 내역을 삭제하지 못했습니다", "nl" to "Voltooiing verwijderen mislukt", "zh" to "删除完成记录失败"), + "err.api.failed_fetch_residence_types" to mapOf("en" to "Failed to fetch residence types", "es" to "No se pudieron obtener los tipos de residencia", "fr" to "Échec de la récupération des types de résidence", "de" to "Objekttypen konnten nicht abgerufen werden", "pt" to "Falha ao buscar os tipos de imóvel", "it" to "Impossibile recuperare i tipi di residenza", "ja" to "住居タイプの取得に失敗しました", "ko" to "주거 유형을 가져오지 못했습니다", "nl" to "Woningtypen ophalen mislukt", "zh" to "获取住宅类型失败"), + "err.api.failed_fetch_task_frequencies" to mapOf("en" to "Failed to fetch task frequencies", "es" to "No se pudieron obtener las frecuencias de tareas", "fr" to "Échec de la récupération des fréquences de t—ches", "de" to "Aufgabenhäufigkeiten konnten nicht abgerufen werden", "pt" to "Falha ao buscar as frequências de tarefa", "it" to "Impossibile recuperare le frequenze delle attività", "ja" to "タスク頻度の取得に失敗しました", "ko" to "작업 주기를 가져오지 못했습니다", "nl" to "Taakfrequenties ophalen mislukt", "zh" to "获取任务频率失败"), + "err.api.failed_fetch_task_priorities" to mapOf("en" to "Failed to fetch task priorities", "es" to "No se pudieron obtener las prioridades de tareas", "fr" to "Échec de la récupération des priorités de t—ches", "de" to "Aufgabenprioritäten konnten nicht abgerufen werden", "pt" to "Falha ao buscar as prioridades de tarefa", "it" to "Impossibile recuperare le priorità delle attività", "ja" to "タスク優先度の取得に失敗しました", "ko" to "작업 우선순위를 가져오지 못했습니다", "nl" to "Taakprioriteiten ophalen mislukt", "zh" to "获取任务优先级失败"), + "err.api.failed_fetch_task_categories" to mapOf("en" to "Failed to fetch task categories", "es" to "No se pudieron obtener las categorías de tareas", "fr" to "Échec de la récupération des catégories de t—ches", "de" to "Aufgabenkategorien konnten nicht abgerufen werden", "pt" to "Falha ao buscar as categorias de tarefa", "it" to "Impossibile recuperare le categorie delle attività", "ja" to "タスクカテゴリの取得に失敗しました", "ko" to "작업 카테고리를 가져오지 못했습니다", "nl" to "Taakcategorieën ophalen mislukt", "zh" to "获取任务分类失败"), + "err.api.failed_fetch_contractor_specialties" to mapOf("en" to "Failed to fetch contractor specialties", "es" to "No se pudieron obtener las especialidades de contratistas", "fr" to "Échec de la récupération des spécialités des prestataires", "de" to "Handwerker-Fachgebiete konnten nicht abgerufen werden", "pt" to "Falha ao buscar as especialidades dos prestadores", "it" to "Impossibile recuperare le specializzazioni dei tecnici", "ja" to "業者の専門分野の取得に失敗しました", "ko" to "업체 전문 분야를 가져오지 못했습니다", "nl" to "Specialismen van vakmensen ophalen mislukt", "zh" to "获取承包商专长失败"), + "err.api.failed_fetch_static_data" to mapOf("en" to "Failed to fetch static data", "es" to "No se pudieron obtener los datos estáticos", "fr" to "Échec de la récupération des données statiques", "de" to "Statische Daten konnten nicht abgerufen werden", "pt" to "Falha ao buscar os dados estáticos", "it" to "Impossibile recuperare i dati statici", "ja" to "静的データの取得に失敗しました", "ko" to "정적 데이터를 가져오지 못했습니다", "nl" to "Statische gegevens ophalen mislukt", "zh" to "获取静态数据失败"), + "err.api.failed_fetch_seeded_data" to mapOf("en" to "Failed to fetch seeded data", "es" to "No se pudieron obtener los datos iniciales", "fr" to "Échec de la récupération des données initiales", "de" to "Vorinitialisierte Daten konnten nicht abgerufen werden", "pt" to "Falha ao buscar os dados iniciais", "it" to "Impossibile recuperare i dati iniziali", "ja" to "初期データの取得に失敗しました", "ko" to "초기 데이터를 가져오지 못했습니다", "nl" to "Vooraf ingevulde gegevens ophalen mislukt", "zh" to "获取初始数据失败"), + "err.api.failed_fetch_task_templates" to mapOf("en" to "Failed to fetch task templates", "es" to "No se pudieron obtener las plantillas de tareas", "fr" to "Échec de la récupération des modèles de t—ches", "de" to "Aufgabenvorlagen konnten nicht abgerufen werden", "pt" to "Falha ao buscar os modelos de tarefa", "it" to "Impossibile recuperare i modelli di attività", "ja" to "タスクテンプレートの取得に失敗しました", "ko" to "작업 템플릿을 가져오지 못했습니다", "nl" to "Taaksjablonen ophalen mislukt", "zh" to "获取任务模板失败"), + "err.api.failed_fetch_grouped_task_templates" to mapOf("en" to "Failed to fetch grouped task templates", "es" to "No se pudieron obtener las plantillas de tareas agrupadas", "fr" to "Échec de la récupération des modèles de t—ches groupés", "de" to "Gruppierte Aufgabenvorlagen konnten nicht abgerufen werden", "pt" to "Falha ao buscar os modelos de tarefa agrupados", "it" to "Impossibile recuperare i modelli di attività raggruppati", "ja" to "グループ化されたタスクテンプレートの取得に失敗しました", "ko" to "그룹화된 작업 템플릿을 가져오지 못했습니다", "nl" to "Gegroepeerde taaksjablonen ophalen mislukt", "zh" to "获取分组任务模板失败"), + "err.api.failed_search_task_templates" to mapOf("en" to "Failed to search task templates", "es" to "No se pudieron buscar las plantillas de tareas", "fr" to "Échec de la recherche des modèles de t—ches", "de" to "Aufgabenvorlagen konnten nicht durchsucht werden", "pt" to "Falha ao pesquisar os modelos de tarefa", "it" to "Impossibile cercare i modelli di attività", "ja" to "タスクテンプレートの検索に失敗しました", "ko" to "작업 템플릿을 검색하지 못했습니다", "nl" to "Zoeken naar taaksjablonen mislukt", "zh" to "搜索任务模板失败"), + "err.api.failed_fetch_templates_by_category" to mapOf("en" to "Failed to fetch templates by category", "es" to "No se pudieron obtener las plantillas por categoría", "fr" to "Échec de la récupération des modèles par catégorie", "de" to "Vorlagen nach Kategorie konnten nicht abgerufen werden", "pt" to "Falha ao buscar os modelos por categoria", "it" to "Impossibile recuperare i modelli per categoria", "ja" to "カテゴリ別テンプレートの取得に失敗しました", "ko" to "카테고리별 템플릿을 가져오지 못했습니다", "nl" to "Sjablonen per categorie ophalen mislukt", "zh" to "按分类获取模板失败"), + "err.api.failed_fetch_task_suggestions" to mapOf("en" to "Failed to fetch task suggestions", "es" to "No se pudieron obtener las sugerencias de tareas", "fr" to "Échec de la récupération des suggestions de t—ches", "de" to "Aufgabenvorschläge konnten nicht abgerufen werden", "pt" to "Falha ao buscar as sugestões de tarefa", "it" to "Impossibile recuperare i suggerimenti di attività", "ja" to "タスクの提案の取得に失敗しました", "ko" to "작업 추천을 가져오지 못했습니다", "nl" to "Taaksuggesties ophalen mislukt", "zh" to "获取任务建议失败"), + "err.api.template_not_found" to mapOf("en" to "Template not found", "es" to "Plantilla no encontrada", "fr" to "Modèle introuvable", "de" to "Vorlage nicht gefunden", "pt" to "Modelo não encontrado", "it" to "Modello non trovato", "ja" to "テンプレートが見つかりません", "ko" to "템플릿을 찾을 수 없습니다", "nl" to "Sjabloon niet gevonden", "zh" to "未找到模板"), + "err.api.failed_fetch_residences" to mapOf("en" to "Failed to fetch residences", "es" to "No se pudieron obtener las residencias", "fr" to "Échec de la récupération des résidences", "de" to "Objekte konnten nicht abgerufen werden", "pt" to "Falha ao buscar os imóveis", "it" to "Impossibile recuperare le residenze", "ja" to "住居の取得に失敗しました", "ko" to "주거지를 가져오지 못했습니다", "nl" to "Woningen ophalen mislukt", "zh" to "获取住宅失败"), + "err.api.failed_fetch_residence" to mapOf("en" to "Failed to fetch residence", "es" to "No se pudo obtener la residencia", "fr" to "Échec de la récupération de la résidence", "de" to "Objekt konnte nicht abgerufen werden", "pt" to "Falha ao buscar o imóvel", "it" to "Impossibile recuperare la residenza", "ja" to "住居の取得に失敗しました", "ko" to "주거지를 가져오지 못했습니다", "nl" to "Woning ophalen mislukt", "zh" to "获取住宅失败"), + "err.api.failed_create_residence" to mapOf("en" to "Failed to create residence", "es" to "No se pudo crear la residencia", "fr" to "Échec de la création de la résidence", "de" to "Objekt konnte nicht erstellt werden", "pt" to "Falha ao criar o imóvel", "it" to "Impossibile creare la residenza", "ja" to "住居の作成に失敗しました", "ko" to "주거지를 생성하지 못했습니다", "nl" to "Woning aanmaken mislukt", "zh" to "创建住宅失败"), + "err.api.failed_update_residence" to mapOf("en" to "Failed to update residence", "es" to "No se pudo actualizar la residencia", "fr" to "Échec de la mise à jour de la résidence", "de" to "Objekt konnte nicht aktualisiert werden", "pt" to "Falha ao atualizar o imóvel", "it" to "Impossibile aggiornare la residenza", "ja" to "住居の更新に失敗しました", "ko" to "주거지를 업데이트하지 못했습니다", "nl" to "Woning bijwerken mislukt", "zh" to "更新住宅失败"), + "err.api.failed_delete_residence" to mapOf("en" to "Failed to delete residence", "es" to "No se pudo eliminar la residencia", "fr" to "Échec de la suppression de la résidence", "de" to "Objekt konnte nicht gelöscht werden", "pt" to "Falha ao excluir o imóvel", "it" to "Impossibile eliminare la residenza", "ja" to "住居の削除に失敗しました", "ko" to "주거지를 삭제하지 못했습니다", "nl" to "Woning verwijderen mislukt", "zh" to "删除住宅失败"), + "err.api.failed_fetch_summary" to mapOf("en" to "Failed to fetch summary", "es" to "No se pudo obtener el resumen", "fr" to "Échec de la récupération du résumé", "de" to "Übersicht konnte nicht abgerufen werden", "pt" to "Falha ao buscar o resumo", "it" to "Impossibile recuperare il riepilogo", "ja" to "サマリーの取得に失敗しました", "ko" to "요약을 가져오지 못했습니다", "nl" to "Overzicht ophalen mislukt", "zh" to "获取摘要失败"), + "err.api.failed_fetch_my_residences" to mapOf("en" to "Failed to fetch my residences", "es" to "No se pudieron obtener mis residencias", "fr" to "Échec de la récupération de mes résidences", "de" to "Meine Objekte konnten nicht abgerufen werden", "pt" to "Falha ao buscar os meus imóveis", "it" to "Impossibile recuperare le mie residenze", "ja" to "自分の住居の取得に失敗しました", "ko" to "내 주거지를 가져오지 못했습니다", "nl" to "Mijn woningen ophalen mislukt", "zh" to "获取我的住宅失败"), + "err.api.failed_fetch_subscription_status" to mapOf("en" to "Failed to fetch subscription status", "es" to "No se pudo obtener el estado de la suscripción", "fr" to "Échec de la récupération du statut de l'abonnement", "de" to "Abo-Status konnte nicht abgerufen werden", "pt" to "Falha ao buscar o status da assinatura", "it" to "Impossibile recuperare lo stato dell'abbonamento", "ja" to "サブスクリプション状況の取得に失敗しました", "ko" to "구독 상태를 가져오지 못했습니다", "nl" to "Abonnementsstatus ophalen mislukt", "zh" to "获取订阅状态失败"), + "err.api.failed_fetch_upgrade_triggers" to mapOf("en" to "Failed to fetch upgrade triggers", "es" to "No se pudieron obtener los activadores de mejora", "fr" to "Échec de la récupération des déclencheurs de mise à niveau", "de" to "Upgrade-Auslöser konnten nicht abgerufen werden", "pt" to "Falha ao buscar os gatilhos de upgrade", "it" to "Impossibile recuperare i trigger di upgrade", "ja" to "アップグレードトリガーの取得に失敗しました", "ko" to "업그레이드 조건을 가져오지 못했습니다", "nl" to "Upgrade-triggers ophalen mislukt", "zh" to "获取升级触发条件失败"), + "err.api.failed_fetch_feature_benefits" to mapOf("en" to "Failed to fetch feature benefits", "es" to "No se pudieron obtener los beneficios de las funciones", "fr" to "Échec de la récupération des avantages des fonctionnalités", "de" to "Funktionsvorteile konnten nicht abgerufen werden", "pt" to "Falha ao buscar os benefícios dos recursos", "it" to "Impossibile recuperare i vantaggi delle funzioni", "ja" to "機能の特典の取得に失敗しました", "ko" to "기능 혜택을 가져오지 못했습니다", "nl" to "Functievoordelen ophalen mislukt", "zh" to "获取功能权益失败"), + "err.api.failed_fetch_promotions" to mapOf("en" to "Failed to fetch promotions", "es" to "No se pudieron obtener las promociones", "fr" to "Échec de la récupération des promotions", "de" to "Aktionen konnten nicht abgerufen werden", "pt" to "Falha ao buscar as promoções", "it" to "Impossibile recuperare le promozioni", "ja" to "プロモーションの取得に失敗しました", "ko" to "프로모션을 가져오지 못했습니다", "nl" to "Promoties ophalen mislukt", "zh" to "获取促销活动失败"), + "err.api.failed_verify_ios_receipt" to mapOf("en" to "Failed to verify iOS receipt", "es" to "No se pudo verificar el recibo de iOS", "fr" to "Échec de la vérification du reçu iOS", "de" to "iOS-Beleg konnte nicht überprüft werden", "pt" to "Falha ao verificar o recibo do iOS", "it" to "Impossibile verificare la ricevuta iOS", "ja" to "iOSレシートの確認に失敗しました", "ko" to "iOS 영수증을 확인하지 못했습니다", "nl" to "iOS-bon verifiëren mislukt", "zh" to "验证 iOS 收据失败"), + "err.api.failed_verify_android_purchase" to mapOf("en" to "Failed to verify Android purchase", "es" to "No se pudo verificar la compra de Android", "fr" to "Échec de la vérification de l'achat Android", "de" to "Android-Kauf konnte nicht überprüft werden", "pt" to "Falha ao verificar a compra do Android", "it" to "Impossibile verificare l'acquisto Android", "ja" to "Androidの購入の確認に失敗しました", "ko" to "Android 구매를 확인하지 못했습니다", "nl" to "Android-aankoop verifiëren mislukt", "zh" to "验证 Android 购买失败"), + "err.api.failed_restore_subscription" to mapOf("en" to "Failed to restore subscription", "es" to "No se pudo restaurar la suscripción", "fr" to "Échec de la restauration de l'abonnement", "de" to "Abo konnte nicht wiederhergestellt werden", "pt" to "Falha ao restaurar a assinatura", "it" to "Impossibile ripristinare l'abbonamento", "ja" to "サブスクリプションの復元に失敗しました", "ko" to "구독을 복원하지 못했습니다", "nl" to "Abonnement herstellen mislukt", "zh" to "恢复订阅失败"), + "err.api.failed_fetch_contractors" to mapOf("en" to "Failed to fetch contractors", "es" to "No se pudieron obtener los contratistas", "fr" to "Échec de la récupération des prestataires", "de" to "Handwerker konnten nicht abgerufen werden", "pt" to "Falha ao buscar os prestadores", "it" to "Impossibile recuperare i tecnici", "ja" to "業者の取得に失敗しました", "ko" to "업체를 가져오지 못했습니다", "nl" to "Vakmensen ophalen mislukt", "zh" to "获取承包商失败"), + "err.api.failed_fetch_contractor" to mapOf("en" to "Failed to fetch contractor", "es" to "No se pudo obtener el contratista", "fr" to "Échec de la récupération du prestataire", "de" to "Handwerker konnte nicht abgerufen werden", "pt" to "Falha ao buscar o prestador", "it" to "Impossibile recuperare il tecnico", "ja" to "業者の取得に失敗しました", "ko" to "업체를 가져오지 못했습니다", "nl" to "Vakman ophalen mislukt", "zh" to "获取承包商失败"), + "err.api.failed_create_contractor" to mapOf("en" to "Failed to create contractor", "es" to "No se pudo crear el contratista", "fr" to "Échec de la création du prestataire", "de" to "Handwerker konnte nicht erstellt werden", "pt" to "Falha ao criar o prestador", "it" to "Impossibile creare il tecnico", "ja" to "業者の作成に失敗しました", "ko" to "업체를 생성하지 못했습니다", "nl" to "Vakman aanmaken mislukt", "zh" to "创建承包商失败"), + "err.api.failed_update_contractor" to mapOf("en" to "Failed to update contractor", "es" to "No se pudo actualizar el contratista", "fr" to "Échec de la mise à jour du prestataire", "de" to "Handwerker konnte nicht aktualisiert werden", "pt" to "Falha ao atualizar o prestador", "it" to "Impossibile aggiornare il tecnico", "ja" to "業者の更新に失敗しました", "ko" to "업체를 업데이트하지 못했습니다", "nl" to "Vakman bijwerken mislukt", "zh" to "更新承包商失败"), + "err.api.failed_delete_contractor" to mapOf("en" to "Failed to delete contractor", "es" to "No se pudo eliminar el contratista", "fr" to "Échec de la suppression du prestataire", "de" to "Handwerker konnte nicht gelöscht werden", "pt" to "Falha ao excluir o prestador", "it" to "Impossibile eliminare il tecnico", "ja" to "業者の削除に失敗しました", "ko" to "업체를 삭제하지 못했습니다", "nl" to "Vakman verwijderen mislukt", "zh" to "删除承包商失败"), + "err.api.failed_toggle_favorite" to mapOf("en" to "Failed to toggle favorite", "es" to "No se pudo cambiar el favorito", "fr" to "Échec de la modification du favori", "de" to "Favorit konnte nicht umgeschaltet werden", "pt" to "Falha ao alternar favorito", "it" to "Impossibile aggiornare i preferiti", "ja" to "お気に入りの切り替えに失敗しました", "ko" to "즐겨찾기를 변경하지 못했습니다", "nl" to "Favoriet wijzigen mislukt", "zh" to "切换收藏失败"), + "err.api.failed_fetch_contractor_tasks" to mapOf("en" to "Failed to fetch contractor tasks", "es" to "No se pudieron obtener las tareas del contratista", "fr" to "Échec de la récupération des t—ches du prestataire", "de" to "Handwerker-Aufgaben konnten nicht abgerufen werden", "pt" to "Falha ao buscar as tarefas do prestador", "it" to "Impossibile recuperare le attività del tecnico", "ja" to "業者のタスクの取得に失敗しました", "ko" to "업체 작업을 가져오지 못했습니다", "nl" to "Taken van vakman ophalen mislukt", "zh" to "获取承包商任务失败"), + "err.api.failed_fetch_contractors_for_residence" to mapOf("en" to "Failed to fetch contractors for residence", "es" to "No se pudieron obtener los contratistas de la residencia", "fr" to "Échec de la récupération des prestataires pour la résidence", "de" to "Handwerker für das Objekt konnten nicht abgerufen werden", "pt" to "Falha ao buscar os prestadores do imóvel", "it" to "Impossibile recuperare i tecnici per la residenza", "ja" to "住居の業者の取得に失敗しました", "ko" to "주거지의 업체를 가져오지 못했습니다", "nl" to "Vakmensen voor woning ophalen mislukt", "zh" to "获取该住宅的承包商失败"), + "err.api.failed_fetch_documents" to mapOf("en" to "Failed to fetch documents", "es" to "No se pudieron obtener los documentos", "fr" to "Échec de la récupération des documents", "de" to "Dokumente konnten nicht abgerufen werden", "pt" to "Falha ao buscar os documentos", "it" to "Impossibile recuperare i documenti", "ja" to "ドキュメントの取得に失敗しました", "ko" to "문서를 가져오지 못했습니다", "nl" to "Documenten ophalen mislukt", "zh" to "获取文档失败"), + "err.api.failed_fetch_document" to mapOf("en" to "Failed to fetch document", "es" to "No se pudo obtener el documento", "fr" to "Échec de la récupération du document", "de" to "Dokument konnte nicht abgerufen werden", "pt" to "Falha ao buscar o documento", "it" to "Impossibile recuperare il documento", "ja" to "ドキュメントの取得に失敗しました", "ko" to "문서를 가져오지 못했습니다", "nl" to "Document ophalen mislukt", "zh" to "获取文档失败"), + "err.api.failed_create_document" to mapOf("en" to "Failed to create document", "es" to "No se pudo crear el documento", "fr" to "Échec de la création du document", "de" to "Dokument konnte nicht erstellt werden", "pt" to "Falha ao criar o documento", "it" to "Impossibile creare il documento", "ja" to "ドキュメントの作成に失敗しました", "ko" to "문서를 생성하지 못했습니다", "nl" to "Document aanmaken mislukt", "zh" to "创建文档失败"), + "err.api.failed_update_document" to mapOf("en" to "Failed to update document", "es" to "No se pudo actualizar el documento", "fr" to "Échec de la mise à jour du document", "de" to "Dokument konnte nicht aktualisiert werden", "pt" to "Falha ao atualizar o documento", "it" to "Impossibile aggiornare il documento", "ja" to "ドキュメントの更新に失敗しました", "ko" to "문서를 업데이트하지 못했습니다", "nl" to "Document bijwerken mislukt", "zh" to "更新文档失败"), + "err.api.failed_delete_document" to mapOf("en" to "Failed to delete document", "es" to "No se pudo eliminar el documento", "fr" to "Échec de la suppression du document", "de" to "Dokument konnte nicht gelöscht werden", "pt" to "Falha ao excluir o documento", "it" to "Impossibile eliminare il documento", "ja" to "ドキュメントの削除に失敗しました", "ko" to "문서를 삭제하지 못했습니다", "nl" to "Document verwijderen mislukt", "zh" to "删除文档失败"), + "err.api.failed_download_document" to mapOf("en" to "Failed to download document", "es" to "No se pudo descargar el documento", "fr" to "Échec du téléchargement du document", "de" to "Dokument konnte nicht heruntergeladen werden", "pt" to "Falha ao baixar o documento", "it" to "Impossibile scaricare il documento", "ja" to "ドキュメントのダウンロードに失敗しました", "ko" to "문서를 다운로드하지 못했습니다", "nl" to "Document downloaden mislukt", "zh" to "下载文档失败"), + "err.api.failed_activate_document" to mapOf("en" to "Failed to activate document", "es" to "No se pudo activar el documento", "fr" to "Échec de l'activation du document", "de" to "Dokument konnte nicht aktiviert werden", "pt" to "Falha ao ativar o documento", "it" to "Impossibile attivare il documento", "ja" to "ドキュメントの有効化に失敗しました", "ko" to "문서를 활성화하지 못했습니다", "nl" to "Document activeren mislukt", "zh" to "激活文档失败"), + "err.api.failed_deactivate_document" to mapOf("en" to "Failed to deactivate document", "es" to "No se pudo desactivar el documento", "fr" to "Échec de la désactivation du document", "de" to "Dokument konnte nicht deaktiviert werden", "pt" to "Falha ao desativar o documento", "it" to "Impossibile disattivare il documento", "ja" to "ドキュメントの無効化に失敗しました", "ko" to "문서를 비활성화하지 못했습니다", "nl" to "Document deactiveren mislukt", "zh" to "停用文档失败"), + "err.api.failed_upload_document_image" to mapOf("en" to "Failed to upload document image", "es" to "No se pudo subir la imagen del documento", "fr" to "Échec de l'envoi de l'image du document", "de" to "Dokumentbild konnte nicht hochgeladen werden", "pt" to "Falha ao enviar a imagem do documento", "it" to "Impossibile caricare l'immagine del documento", "ja" to "ドキュメント画像のアップロードに失敗しました", "ko" to "문서 이미지를 업로드하지 못했습니다", "nl" to "Documentafbeelding uploaden mislukt", "zh" to "上传文档图片失败"), + "err.api.failed_delete_document_image" to mapOf("en" to "Failed to delete document image", "es" to "No se pudo eliminar la imagen del documento", "fr" to "Échec de la suppression de l'image du document", "de" to "Dokumentbild konnte nicht gelöscht werden", "pt" to "Falha ao excluir a imagem do documento", "it" to "Impossibile eliminare l'immagine del documento", "ja" to "ドキュメント画像の削除に失敗しました", "ko" to "문서 이미지를 삭제하지 못했습니다", "nl" to "Documentafbeelding verwijderen mislukt", "zh" to "删除文档图片失败"), + "err.api.device_registration_failed" to mapOf("en" to "Device registration failed", "es" to "Falló el registro del dispositivo", "fr" to "Échec de l'enregistrement de l'appareil", "de" to "Geräteregistrierung fehlgeschlagen", "pt" to "Falha no registro do dispositivo", "it" to "Registrazione del dispositivo non riuscita", "ja" to "デバイスの登録に失敗しました", "ko" to "기기 등록에 실패했습니다", "nl" to "Apparaatregistratie mislukt", "zh" to "设备注册失败"), + "err.api.device_unregistration_failed" to mapOf("en" to "Device unregistration failed", "es" to "Falló la cancelación del registro del dispositivo", "fr" to "Échec de la désinscription de l'appareil", "de" to "Geräteabmeldung fehlgeschlagen", "pt" to "Falha ao cancelar o registro do dispositivo", "it" to "Annullamento registrazione del dispositivo non riuscito", "ja" to "デバイスの登録解除に失敗しました", "ko" to "기기 등록 해제에 실패했습니다", "nl" to "Apparaatregistratie ongedaan maken mislukt", "zh" to "设备注销失败"), + "err.api.failed_get_preferences" to mapOf("en" to "Failed to get preferences", "es" to "No se pudieron obtener las preferencias", "fr" to "Échec de la récupération des préférences", "de" to "Einstellungen konnten nicht abgerufen werden", "pt" to "Falha ao obter as preferências", "it" to "Impossibile recuperare le preferenze", "ja" to "設定の取得に失敗しました", "ko" to "환경설정을 가져오지 못했습니다", "nl" to "Voorkeuren ophalen mislukt", "zh" to "获取偏好设置失败"), + "err.api.failed_update_preferences" to mapOf("en" to "Failed to update preferences", "es" to "No se pudieron actualizar las preferencias", "fr" to "Échec de la mise à jour des préférences", "de" to "Einstellungen konnten nicht aktualisiert werden", "pt" to "Falha ao atualizar as preferências", "it" to "Impossibile aggiornare le preferenze", "ja" to "設定の更新に失敗しました", "ko" to "환경설정을 업데이트하지 못했습니다", "nl" to "Voorkeuren bijwerken mislukt", "zh" to "更新偏好设置失败"), + "err.api.failed_get_notification_history" to mapOf("en" to "Failed to get notification history", "es" to "No se pudo obtener el historial de notificaciones", "fr" to "Échec de la récupération de l'historique des notifications", "de" to "Benachrichtigungsverlauf konnte nicht abgerufen werden", "pt" to "Falha ao obter o histórico de notificações", "it" to "Impossibile recuperare la cronologia delle notifiche", "ja" to "通知履歴の取得に失敗しました", "ko" to "알림 기록을 가져오지 못했습니다", "nl" to "Meldingsgeschiedenis ophalen mislukt", "zh" to "获取通知历史失败"), + "err.api.failed_mark_notification_read" to mapOf("en" to "Failed to mark notification as read", "es" to "No se pudo marcar la notificación como leída", "fr" to "Échec du marquage de la notification comme lue", "de" to "Benachrichtigung konnte nicht als gelesen markiert werden", "pt" to "Falha ao marcar a notificação como lida", "it" to "Impossibile contrassegnare la notifica come letta", "ja" to "通知を既読にできませんでした", "ko" to "알림을 읽음으로 표시하지 못했습니다", "nl" to "Melding als gelezen markeren mislukt", "zh" to "标记通知为已读失败"), + "err.api.failed_mark_all_notifications_read" to mapOf("en" to "Failed to mark all notifications as read", "es" to "No se pudieron marcar todas las notificaciones como leídas", "fr" to "Échec du marquage de toutes les notifications comme lues", "de" to "Benachrichtigungen konnten nicht alle als gelesen markiert werden", "pt" to "Falha ao marcar todas as notificações como lidas", "it" to "Impossibile contrassegnare tutte le notifiche come lette", "ja" to "すべての通知を既読にできませんでした", "ko" to "모든 알림을 읽음으로 표시하지 못했습니다", "nl" to "Alle meldingen als gelezen markeren mislukt", "zh" to "标记所有通知为已读失败"), + "err.api.failed_get_unread_count" to mapOf("en" to "Failed to get unread count", "es" to "No se pudo obtener el número de no leídas", "fr" to "Échec de la récupération du nombre de non lus", "de" to "Anzahl ungelesener Nachrichten konnte nicht abgerufen werden", "pt" to "Falha ao obter a contagem de não lidas", "it" to "Impossibile recuperare il numero di non letti", "ja" to "未読件数の取得に失敗しました", "ko" to "읽지 않은 개수를 가져오지 못했습니다", "nl" to "Aantal ongelezen ophalen mislukt", "zh" to "获取未读数量失败"), + "err.api.task_not_found" to mapOf("en" to "Task not found", "es" to "Tarea no encontrada", "fr" to "T—che introuvable", "de" to "Aufgabe nicht gefunden", "pt" to "Tarefa não encontrada", "it" to "Attività non trovata", "ja" to "タスクが見つかりません", "ko" to "작업을 찾을 수 없습니다", "nl" to "Taak niet gevonden", "zh" to "未找到任务"), + "err.api.access_denied" to mapOf("en" to "Access denied", "es" to "Acceso denegado", "fr" to "Accès refusé", "de" to "Zugriff verweigert", "pt" to "Acesso negado", "it" to "Accesso negato", "ja" to "アクセスが拒否されました", "ko" to "접근이 거부되었습니다", "nl" to "Toegang geweigerd", "zh" to "访问被拒绝"), + "err.api.task_action_failed" to mapOf("en" to "Task {0} failed: {1}", "es" to "La tarea {0} falló: {1}", "fr" to "Échec de la t—che {0} : {1}", "de" to "Aufgabe {0} fehlgeschlagen: {1}", "pt" to "Tarefa {0} falhou: {1}", "it" to "Attività {0} non riuscita: {1}", "ja" to "タスク{0}が失敗しました:{1}", "ko" to "작업 {0} 실패: {1}", "nl" to "Taak {0} mislukt: {1}", "zh" to "任务 {0} 失败:{1}"), + "err.api.init_lookups_failed" to mapOf("en" to "Failed to initialize lookups: {0}", "es" to "No se pudieron inicializar las consultas: {0}", "fr" to "Échec de l'initialisation des références : {0}", "de" to "Nachschlagewerte konnten nicht initialisiert werden: {0}", "pt" to "Falha ao inicializar as listas: {0}", "it" to "Impossibile inizializzare le ricerche: {0}", "ja" to "ルックアップの初期化に失敗しました:{0}", "ko" to "조회 항목 초기화 실패: {0}", "nl" to "Opzoekgegevens initialiseren mislukt: {0}", "zh" to "初始化查找数据失败:{0}"), + "err.api.load_lookups_failed" to mapOf("en" to "Failed to load lookups: {0}", "es" to "No se pudieron cargar las consultas: {0}", "fr" to "Échec du chargement des références : {0}", "de" to "Nachschlagewerte konnten nicht geladen werden: {0}", "pt" to "Falha ao carregar as listas: {0}", "it" to "Impossibile caricare le ricerche: {0}", "ja" to "ルックアップの読み込みに失敗しました:{0}", "ko" to "조회 항목 로드 실패: {0}", "nl" to "Opzoekgegevens laden mislukt: {0}", "zh" to "加载查找数据失败:{0}"), + "err.api.unknown_loading_lookups" to mapOf("en" to "Unknown error loading lookups", "es" to "Error desconocido al cargar las consultas", "fr" to "Erreur inconnue lors du chargement des références", "de" to "Unbekannter Fehler beim Laden der Nachschlagewerte", "pt" to "Erro desconhecido ao carregar as listas", "it" to "Errore sconosciuto durante il caricamento delle ricerche", "ja" to "ルックアップの読み込み中に不明なエラーが発生しました", "ko" to "조회 항목 로드 중 알 수 없는 오류", "nl" to "Onbekende fout bij laden van opzoekgegevens", "zh" to "加载查找数据时发生未知错误"), + "err.api.tasks_unavailable" to mapOf("en" to "Tasks unavailable", "es" to "Tareas no disponibles", "fr" to "T—ches indisponibles", "de" to "Aufgaben nicht verfügbar", "pt" to "Tarefas indisponíveis", "it" to "Attività non disponibili", "ja" to "タスクを利用できません", "ko" to "작업을 사용할 수 없습니다", "nl" to "Taken niet beschikbaar", "zh" to "任务不可用"), + "err.api.failed_load_task_templates" to mapOf("en" to "Failed to load task templates", "es" to "No se pudieron cargar las plantillas de tareas", "fr" to "Échec du chargement des modèles de t—ches", "de" to "Aufgabenvorlagen konnten nicht geladen werden", "pt" to "Falha ao carregar os modelos de tarefa", "it" to "Impossibile caricare i modelli di attività", "ja" to "タスクテンプレートの読み込みに失敗しました", "ko" to "작업 템플릿을 불러오지 못했습니다", "nl" to "Taaksjablonen laden mislukt", "zh" to "加载任务模板失败"), + "err.api.task_template_not_found" to mapOf("en" to "Task template not found", "es" to "Plantilla de tarea no encontrada", "fr" to "Modèle de t—che introuvable", "de" to "Aufgabenvorlage nicht gefunden", "pt" to "Modelo de tarefa não encontrado", "it" to "Modello di attività non trovato", "ja" to "タスクテンプレートが見つかりません", "ko" to "작업 템플릿을 찾을 수 없습니다", "nl" to "Taaksjabloon niet gevonden", "zh" to "未找到任务模板"), + "err.api.no_token" to mapOf("en" to "No token", "es" to "Sin token", "fr" to "Aucun jeton", "de" to "Kein Token", "pt" to "Sem token", "it" to "Nessun token", "ja" to "トークンがありません", "ko" to "토큰 없음", "nl" to "Geen token", "zh" to "无令牌"), + "err.api.unexpected_state" to mapOf("en" to "Unexpected state", "es" to "Estado inesperado", "fr" to "État inattendu", "de" to "Unerwarteter Zustand", "pt" to "Estado inesperado", "it" to "Stato imprevisto", "ja" to "予期しない状態です", "ko" to "예기치 않은 상태", "nl" to "Onverwachte status", "zh" to "意外状态"), + "err.auth.could_not_start_flow" to mapOf("en" to "Could not start {0} (Kratos {1})", "es" to "No se pudo iniciar {0} (Kratos {1})", "fr" to "Impossible de démarrer {0} (Kratos {1})", "de" to "{0} konnte nicht gestartet werden (Kratos {1})", "pt" to "Não foi possível iniciar {0} (Kratos {1})", "it" to "Impossibile avviare {0} (Kratos {1})", "ja" to "{0}を開始できませんでした(Kratos {1})", "ko" to "{0}을(를) 시작할 수 없습니다 (Kratos {1})", "nl" to "Kan {0} niet starten (Kratos {1})", "zh" to "无法启动 {0}(Kratos {1})"), + "err.auth.could_not_reach_server" to mapOf("en" to "Could not reach the authentication server", "es" to "No se pudo conectar con el servidor de autenticación", "fr" to "Impossible de joindre le serveur d'authentification", "de" to "Der Authentifizierungsserver ist nicht erreichbar", "pt" to "Não foi possível conectar ao servidor de autenticação", "it" to "Impossibile raggiungere il server di autenticazione", "ja" to "認証サーバーに接続できませんでした", "ko" to "인증 서버에 연결할 수 없습니다", "nl" to "Kan de authenticatieserver niet bereiken", "zh" to "无法连接到身份验证服务器"), + "err.auth.request_failed" to mapOf("en" to "Authentication request failed", "es" to "Falló la solicitud de autenticación", "fr" to "Échec de la demande d'authentification", "de" to "Authentifizierungsanfrage fehlgeschlagen", "pt" to "Falha na solicitação de autenticação", "it" to "Richiesta di autenticazione non riuscita", "ja" to "認証リクエストに失敗しました", "ko" to "인증 요청에 실패했습니다", "nl" to "Authenticatieverzoek mislukt", "zh" to "身份验证请求失败"), + "err.auth.authentication_failed_status" to mapOf("en" to "Authentication failed ({0})", "es" to "Falló la autenticación ({0})", "fr" to "Échec de l'authentification ({0})", "de" to "Authentifizierung fehlgeschlagen ({0})", "pt" to "Falha na autenticação ({0})", "it" to "Autenticazione non riuscita ({0})", "ja" to "認証に失敗しました({0})", "ko" to "인증 실패 ({0})", "nl" to "Authenticatie mislukt ({0})", "zh" to "身份验证失败({0})"), + "err.auth.could_not_start_login" to mapOf("en" to "Could not start login", "es" to "No se pudo iniciar sesión", "fr" to "Impossible de démarrer la connexion", "de" to "Anmeldung konnte nicht gestartet werden", "pt" to "Não foi possível iniciar o login", "it" to "Impossibile avviare l'accesso", "ja" to "ログインを開始できませんでした", "ko" to "로그인을 시작할 수 없습니다", "nl" to "Kan inloggen niet starten", "zh" to "无法开始登录"), + "err.auth.login_failed" to mapOf("en" to "Login failed", "es" to "Falló el inicio de sesión", "fr" to "Échec de la connexion", "de" to "Anmeldung fehlgeschlagen", "pt" to "Falha no login", "it" to "Accesso non riuscito", "ja" to "ログインに失敗しました", "ko" to "로그인에 실패했습니다", "nl" to "Inloggen mislukt", "zh" to "登录失败"), + "err.auth.registration_failed" to mapOf("en" to "Registration failed", "es" to "Falló el registro", "fr" to "Échec de l'inscription", "de" to "Registrierung fehlgeschlagen", "pt" to "Falha no cadastro", "it" to "Registrazione non riuscita", "ja" to "登録に失敗しました", "ko" to "회원가입에 실패했습니다", "nl" to "Registratie mislukt", "zh" to "注册失败"), + "err.auth.could_not_create_account" to mapOf("en" to "Could not create account", "es" to "No se pudo crear la cuenta", "fr" to "Impossible de créer le compte", "de" to "Konto konnte nicht erstellt werden", "pt" to "Não foi possível criar a conta", "it" to "Impossibile creare l'account", "ja" to "アカウントを作成できませんでした", "ko" to "계정을 생성할 수 없습니다", "nl" to "Kan account niet aanmaken", "zh" to "无法创建账户"), + "err.auth.could_not_start_signin" to mapOf("en" to "Could not start sign-in", "es" to "No se pudo iniciar la sesión", "fr" to "Impossible de démarrer la connexion", "de" to "Anmeldung konnte nicht gestartet werden", "pt" to "Não foi possível iniciar o login", "it" to "Impossibile avviare l'accesso", "ja" to "サインインを開始できませんでした", "ko" to "로그인을 시작할 수 없습니다", "nl" to "Kan aanmelden niet starten", "zh" to "无法开始登录"), + "err.auth.could_not_start_signup" to mapOf("en" to "Could not start sign-up", "es" to "No se pudo iniciar el registro", "fr" to "Impossible de démarrer l'inscription", "de" to "Registrierung konnte nicht gestartet werden", "pt" to "Não foi possível iniciar o cadastro", "it" to "Impossibile avviare la registrazione", "ja" to "サインアップを開始できませんでした", "ko" to "회원가입을 시작할 수 없습니다", "nl" to "Kan registreren niet starten", "zh" to "无法开始注册"), + "err.auth.signin_no_session" to mapOf("en" to "Sign-in did not return a session", "es" to "El inicio de sesión no devolvió una sesión", "fr" to "La connexion n'a pas renvoyé de session", "de" to "Bei der Anmeldung wurde keine Sitzung zurückgegeben", "pt" to "O login não retornou uma sessão", "it" to "L'accesso non ha restituito una sessione", "ja" to "サインインでセッションが返されませんでした", "ko" to "로그인 시 세션이 반환되지 않았습니다", "nl" to "Aanmelden heeft geen sessie opgeleverd", "zh" to "登录未返回会话"), + "err.auth.signin_failed" to mapOf("en" to "Sign-in failed", "es" to "Falló el inicio de sesión", "fr" to "Échec de la connexion", "de" to "Anmeldung fehlgeschlagen", "pt" to "Falha no login", "it" to "Accesso non riuscito", "ja" to "サインインに失敗しました", "ko" to "로그인에 실패했습니다", "nl" to "Aanmelden mislukt", "zh" to "登录失败"), + "err.auth.apple_signin_failed" to mapOf("en" to "Apple Sign In failed", "es" to "Falló Iniciar sesión con Apple", "fr" to "Échec de la connexion avec Apple", "de" to "Apple-Anmeldung fehlgeschlagen", "pt" to "Falha no Login com a Apple", "it" to "Accedi con Apple non riuscito", "ja" to "Appleでのサインインに失敗しました", "ko" to "Apple 로그인에 실패했습니다", "nl" to "Inloggen met Apple mislukt", "zh" to "Apple 登录失败"), + "err.auth.google_signin_failed" to mapOf("en" to "Google Sign In failed", "es" to "Falló Iniciar sesión con Google", "fr" to "Échec de la connexion avec Google", "de" to "Google-Anmeldung fehlgeschlagen", "pt" to "Falha no Login com o Google", "it" to "Accedi con Google non riuscito", "ja" to "Googleでのサインインに失敗しました", "ko" to "Google 로그인에 실패했습니다", "nl" to "Inloggen met Google mislukt", "zh" to "Google 登录失败"), + "err.auth.could_not_start_recovery" to mapOf("en" to "Could not start password recovery", "es" to "No se pudo iniciar la recuperación de contraseña", "fr" to "Impossible de démarrer la récupération du mot de passe", "de" to "Passwort-Wiederherstellung konnte nicht gestartet werden", "pt" to "Não foi possível iniciar a recuperação de senha", "it" to "Impossibile avviare il recupero della password", "ja" to "パスワードの復旧を開始できませんでした", "ko" to "비밀번호 복구를 시작할 수 없습니다", "nl" to "Kan wachtwoordherstel niet starten", "zh" to "无法开始密码找回"), + "err.auth.could_not_send_recovery_code" to mapOf("en" to "Could not send recovery code", "es" to "No se pudo enviar el código de recuperación", "fr" to "Impossible d'envoyer le code de récupération", "de" to "Wiederherstellungscode konnte nicht gesendet werden", "pt" to "Não foi possível enviar o código de recuperação", "it" to "Impossibile inviare il codice di recupero", "ja" to "復旧コードを送信できませんでした", "ko" to "복구 코드를 전송할 수 없습니다", "nl" to "Kan herstelcode niet verzenden", "zh" to "无法发送找回验证码"), + "err.auth.recovery_session_expired" to mapOf("en" to "Your recovery session expired. Request a new code.", "es" to "Tu sesión de recuperación expiró. Solicita un nuevo código.", "fr" to "Votre session de récupération a expiré. Demandez un nouveau code.", "de" to "Deine Wiederherstellungssitzung ist abgelaufen. Fordere einen neuen Code an.", "pt" to "Sua sessão de recuperação expirou. Solicite um novo código.", "it" to "La tua sessione di recupero è scaduta. Richiedi un nuovo codice.", "ja" to "復旧セッションの有効期限が切れました。新しいコードをリクエストしてください。", "ko" to "복구 세션이 만료되었습니다. 새 코드를 요청하세요.", "nl" to "Je herstelsessie is verlopen. Vraag een nieuwe code aan.", "zh" to "找回会话已过期,请重新获取验证码。"), + "err.auth.invalid_code" to mapOf("en" to "Invalid or expired code", "es" to "Código no válido o expirado", "fr" to "Code non valide ou expiré", "de" to "Ungültiger oder abgelaufener Code", "pt" to "Código inválido ou expirado", "it" to "Codice non valido o scaduto", "ja" to "コードが無効か期限切れです", "ko" to "잘못되었거나 만료된 코드입니다", "nl" to "Ongeldige of verlopen code", "zh" to "验证码无效或已过期"), + "err.auth.invalid_code_resend" to mapOf("en" to "Invalid or expired code. Tap resend for a new one.", "es" to "Código no válido o expirado. Toca reenviar para obtener uno nuevo.", "fr" to "Code non valide ou expiré. Touchez Renvoyer pour en obtenir un nouveau.", "de" to "Ungültiger oder abgelaufener Code. Tippe auf Erneut senden für einen neuen.", "pt" to "Código inválido ou expirado. Toque em reenviar para receber um novo.", "it" to "Codice non valido o scaduto. Tocca Invia di nuovo per ottenerne uno nuovo.", "ja" to "コードが無効か期限切れです。再送信をタップして新しいコードを取得してください。", "ko" to "잘못되었거나 만료된 코드입니다. 재전송을 눌러 새 코드를 받으세요.", "nl" to "Ongeldige of verlopen code. Tik op opnieuw verzenden voor een nieuwe.", "zh" to "验证码无效或已过期。点击重新发送以获取新验证码。"), + "err.auth.reset_session_expired" to mapOf("en" to "This password reset session has expired. Request a new code.", "es" to "Esta sesión de restablecimiento de contraseña expiró. Solicita un nuevo código.", "fr" to "Cette session de réinitialisation du mot de passe a expiré. Demandez un nouveau code.", "de" to "Diese Passwort-Zurücksetzungssitzung ist abgelaufen. Fordere einen neuen Code an.", "pt" to "Esta sessão de redefinição de senha expirou. Solicite um novo código.", "it" to "Questa sessione di reimpostazione password è scaduta. Richiedi un nuovo codice.", "ja" to "このパスワードリセットセッションは期限切れです。新しいコードをリクエストしてください。", "ko" to "비밀번호 재설정 세션이 만료되었습니다. 새 코드를 요청하세요.", "nl" to "Deze sessie voor wachtwoordherstel is verlopen. Vraag een nieuwe code aan.", "zh" to "此密码重置会话已过期,请重新获取验证码。"), + "err.auth.could_not_reset_password" to mapOf("en" to "Could not reset password", "es" to "No se pudo restablecer la contraseña", "fr" to "Impossible de réinitialiser le mot de passe", "de" to "Passwort konnte nicht zurückgesetzt werden", "pt" to "Não foi possível redefinir a senha", "it" to "Impossibile reimpostare la password", "ja" to "パスワードをリセットできませんでした", "ko" to "비밀번호를 재설정할 수 없습니다", "nl" to "Kan wachtwoord niet opnieuw instellen", "zh" to "无法重置密码"), + "err.auth.could_not_start_verification" to mapOf("en" to "Could not start verification", "es" to "No se pudo iniciar la verificación", "fr" to "Impossible de démarrer la vérification", "de" to "Verifizierung konnte nicht gestartet werden", "pt" to "Não foi possível iniciar a verificação", "it" to "Impossibile avviare la verifica", "ja" to "認証を開始できませんでした", "ko" to "인증을 시작할 수 없습니다", "nl" to "Kan verificatie niet starten", "zh" to "无法开始验证"), + "err.auth.could_not_send_verification_code" to mapOf("en" to "Could not send verification code", "es" to "No se pudo enviar el código de verificación", "fr" to "Impossible d'envoyer le code de vérification", "de" to "Verifizierungscode konnte nicht gesendet werden", "pt" to "Não foi possível enviar o código de verificação", "it" to "Impossibile inviare il codice di verifica", "ja" to "認証コードを送信できませんでした", "ko" to "인증 코드를 전송할 수 없습니다", "nl" to "Kan verificatiecode niet verzenden", "zh" to "无法发送验证码"), + "err.auth.request_verification_first" to mapOf("en" to "Please request a verification code first.", "es" to "Solicita primero un código de verificación.", "fr" to "Veuillez d'abord demander un code de vérification.", "de" to "Bitte fordere zuerst einen Verifizierungscode an.", "pt" to "Solicite primeiro um código de verificação.", "it" to "Richiedi prima un codice di verifica.", "ja" to "先に認証コードをリクエストしてください。", "ko" to "먼저 인증 코드를 요청하세요.", "nl" to "Vraag eerst een verificatiecode aan.", "zh" to "请先获取验证码。"), + "err.auth.verification_failed" to mapOf("en" to "Verification failed", "es" to "Falló la verificación", "fr" to "Échec de la vérification", "de" to "Verifizierung fehlgeschlagen", "pt" to "Falha na verificação", "it" to "Verifica non riuscita", "ja" to "認証に失敗しました", "ko" to "인증에 실패했습니다", "nl" to "Verificatie mislukt", "zh" to "验证失败"), + "err.auth.failed_get_user" to mapOf("en" to "Failed to get user", "es" to "No se pudo obtener el usuario", "fr" to "Échec de la récupération de l'utilisateur", "de" to "Benutzer konnte nicht abgerufen werden", "pt" to "Falha ao obter o usuário", "it" to "Impossibile recuperare l'utente", "ja" to "ユーザー情報の取得に失敗しました", "ko" to "사용자 정보를 가져오지 못했습니다", "nl" to "Gebruiker ophalen mislukt", "zh" to "获取用户失败"), + "err.auth.session_expired" to mapOf("en" to "Session expired — please sign in again", "es" to "La sesión expiró — inicia sesión de nuevo", "fr" to "Session expirée — veuillez vous reconnecter", "de" to "Sitzung abgelaufen — bitte melde dich erneut an", "pt" to "Sessão expirada — faça login novamente", "it" to "Sessione scaduta — accedi di nuovo", "ja" to "セッションの有効期限が切れました。もう一度サインインしてください", "ko" to "세션이 만료되었습니다 — 다시 로그인하세요", "nl" to "Sessie verlopen — meld je opnieuw aan", "zh" to "会话已过期 — 请重新登录"), + "err.auth.could_not_validate_session" to mapOf("en" to "Could not validate session", "es" to "No se pudo validar la sesión", "fr" to "Impossible de valider la session", "de" to "Sitzung konnte nicht validiert werden", "pt" to "Não foi possível validar a sessão", "it" to "Impossibile convalidare la sessione", "ja" to "セッションを検証できませんでした", "ko" to "세션을 확인할 수 없습니다", "nl" to "Kan sessie niet valideren", "zh" to "无法验证会话"), + "err.auth.could_not_load_profile" to mapOf("en" to "Could not load profile after sign-in", "es" to "No se pudo cargar el perfil después de iniciar sesión", "fr" to "Impossible de charger le profil après la connexion", "de" to "Profil konnte nach der Anmeldung nicht geladen werden", "pt" to "Não foi possível carregar o perfil após o login", "it" to "Impossibile caricare il profilo dopo l'accesso", "ja" to "サインイン後にプロフィールを読み込めませんでした", "ko" to "로그인 후 프로필을 불러올 수 없습니다", "nl" to "Kan profiel niet laden na aanmelden", "zh" to "登录后无法加载个人资料"), + "err.vm.failed_create_residence" to mapOf("en" to "Failed to create residence", "es" to "No se pudo crear la residencia", "fr" to "Échec de la création de la résidence", "de" to "Objekt konnte nicht erstellt werden", "pt" to "Falha ao criar o imóvel", "it" to "Impossibile creare la residenza", "ja" to "住居の作成に失敗しました", "ko" to "주거지를 생성하지 못했습니다", "nl" to "Woning aanmaken mislukt", "zh" to "创建住宅失败"), + "err.vm.failed_join_residence" to mapOf("en" to "Failed to join residence", "es" to "No se pudo unir a la residencia", "fr" to "Échec pour rejoindre la résidence", "de" to "Objekt konnte nicht beigetreten werden", "pt" to "Falha ao entrar no imóvel", "it" to "Impossibile unirsi alla residenza", "ja" to "住居への参加に失敗しました", "ko" to "주거지에 참여하지 못했습니다", "nl" to "Deelnemen aan woning mislukt", "zh" to "加入住宅失败"), + "err.vm.upload_unexpected_state" to mapOf("en" to "Upload failed in unexpected state", "es" to "La subida falló en un estado inesperado", "fr" to "Échec de l'envoi dans un état inattendu", "de" to "Upload in unerwartetem Zustand fehlgeschlagen", "pt" to "Falha no envio em estado inesperado", "it" to "Caricamento non riuscito in uno stato imprevisto", "ja" to "予期しない状態でアップロードに失敗しました", "ko" to "예기치 않은 상태로 업로드에 실패했습니다", "nl" to "Upload mislukt in onverwachte status", "zh" to "上传因意外状态失败"), + "err.vm.document_updated_image_upload_failed" to mapOf("en" to "Document updated but failed to upload image: {0}", "es" to "Se actualizó el documento pero no se pudo subir la imagen: {0}", "fr" to "Document mis à jour, mais échec de l'envoi de l'image : {0}", "de" to "Dokument aktualisiert, aber Bild-Upload fehlgeschlagen: {0}", "pt" to "Documento atualizado, mas falha ao enviar a imagem: {0}", "it" to "Documento aggiornato ma caricamento dell'immagine non riuscito: {0}", "ja" to "ドキュメントは更新されましたが、画像のアップロードに失敗しました:{0}", "ko" to "문서는 업데이트되었지만 이미지 업로드에 실패했습니다: {0}", "nl" to "Document bijgewerkt, maar afbeelding uploaden mislukt: {0}", "zh" to "文档已更新,但图片上传失败:{0}"), + "err.vm.invalid_reset_token" to mapOf("en" to "Invalid reset token. Please start over.", "es" to "Token de restablecimiento no válido. Vuelve a empezar.", "fr" to "Jeton de réinitialisation non valide. Veuillez recommencer.", "de" to "Ungültiges Zurücksetzungs-Token. Bitte beginne von vorn.", "pt" to "Token de redefinição inválido. Comece novamente.", "it" to "Token di reimpostazione non valido. Ricomincia da capo.", "ja" to "リセットトークンが無効です。最初からやり直してください。", "ko" to "잘못된 재설정 토큰입니다. 처음부터 다시 시작하세요.", "nl" to "Ongeldige reset-token. Begin opnieuw.", "zh" to "重置令牌无效,请重新开始。"), + "doc.type.warranty" to mapOf("en" to "Warranty", "es" to "Garantía", "fr" to "Garantie", "de" to "Garantie", "pt" to "Garantia", "it" to "Garanzia", "ja" to "保証書", "ko" to "보증서", "nl" to "Garantie", "zh" to "保修单"), + "doc.type.manual" to mapOf("en" to "User Manual", "es" to "Manual de usuario", "fr" to "Manuel d'utilisation", "de" to "Bedienungsanleitung", "pt" to "Manual do usuário", "it" to "Manuale utente", "ja" to "取扱説明書", "ko" to "사용 설명서", "nl" to "Handleiding", "zh" to "用户手册"), + "doc.type.receipt" to mapOf("en" to "Receipt/Invoice", "es" to "Recibo/Factura", "fr" to "Reçu/Facture", "de" to "Beleg/Rechnung", "pt" to "Recibo/Nota fiscal", "it" to "Ricevuta/Fattura", "ja" to "領収書/請求書", "ko" to "영수증/청구서", "nl" to "Bon/factuur", "zh" to "收据/发票"), + "doc.type.inspection" to mapOf("en" to "Inspection Report", "es" to "Informe de inspección", "fr" to "Rapport d'inspection", "de" to "Prüfbericht", "pt" to "Laudo de vistoria", "it" to "Rapporto di ispezione", "ja" to "点検報告書", "ko" to "점검 보고서", "nl" to "Inspectierapport", "zh" to "检查报告"), + "doc.type.permit" to mapOf("en" to "Permit", "es" to "Permiso", "fr" to "Permis", "de" to "Genehmigung", "pt" to "Alvará", "it" to "Permesso", "ja" to "許可証", "ko" to "허가증", "nl" to "Vergunning", "zh" to "许可证"), + "doc.type.deed" to mapOf("en" to "Deed/Title", "es" to "Escritura/Título", "fr" to "Acte/Titre", "de" to "Urkunde/Eigentumstitel", "pt" to "Escritura/Título", "it" to "Atto/Titolo", "ja" to "権利証/登記", "ko" to "등기/권리증", "nl" to "Akte/eigendomsbewijs", "zh" to "房契/产权证"), + "doc.type.insurance" to mapOf("en" to "Insurance", "es" to "Seguro", "fr" to "Assurance", "de" to "Versicherung", "pt" to "Seguro", "it" to "Assicurazione", "ja" to "保険", "ko" to "보험", "nl" to "Verzekering", "zh" to "保险"), + "doc.type.contract" to mapOf("en" to "Contract", "es" to "Contrato", "fr" to "Contrat", "de" to "Vertrag", "pt" to "Contrato", "it" to "Contratto", "ja" to "契約書", "ko" to "계약서", "nl" to "Contract", "zh" to "合同"), + "doc.type.photo" to mapOf("en" to "Photo", "es" to "Foto", "fr" to "Photo", "de" to "Foto", "pt" to "Foto", "it" to "Foto", "ja" to "写真", "ko" to "사진", "nl" to "Foto", "zh" to "照片"), + "doc.type.other" to mapOf("en" to "Other", "es" to "Otro", "fr" to "Autre", "de" to "Sonstiges", "pt" to "Outro", "it" to "Altro", "ja" to "その他", "ko" to "기타", "nl" to "Overig", "zh" to "其他"), + "doc.category.appliance" to mapOf("en" to "Appliance", "es" to "Electrodoméstico", "fr" to "Appareil électroménager", "de" to "Gerät", "pt" to "Eletrodoméstico", "it" to "Elettrodomestico", "ja" to "家電", "ko" to "가전제품", "nl" to "Apparaat", "zh" to "家电"), + "doc.category.hvac" to mapOf("en" to "HVAC", "es" to "Climatización", "fr" to "CVC", "de" to "Heizung/Klima", "pt" to "Climatização", "it" to "HVAC", "ja" to "空調", "ko" to "냉난방", "nl" to "HVAC", "zh" to "暖通空调"), + "doc.category.plumbing" to mapOf("en" to "Plumbing", "es" to "Fontanería", "fr" to "Plomberie", "de" to "Sanitär", "pt" to "Hidráulica", "it" to "Idraulica", "ja" to "配管", "ko" to "배관", "nl" to "Loodgieterswerk", "zh" to "管道"), + "doc.category.electrical" to mapOf("en" to "Electrical", "es" to "Electricidad", "fr" to "Électricité", "de" to "Elektrik", "pt" to "Elétrica", "it" to "Impianto elettrico", "ja" to "電気", "ko" to "전기", "nl" to "Elektra", "zh" to "电气"), + "doc.category.roofing" to mapOf("en" to "Roofing", "es" to "Techado", "fr" to "Toiture", "de" to "Dach", "pt" to "Telhado", "it" to "Copertura", "ja" to "屋根", "ko" to "지붕", "nl" to "Dakbedekking", "zh" to "屋顶"), + "doc.category.structural" to mapOf("en" to "Structural", "es" to "Estructural", "fr" to "Structure", "de" to "Bausubstanz", "pt" to "Estrutural", "it" to "Struttura", "ja" to "構造", "ko" to "구조", "nl" to "Constructie", "zh" to "结构"), + "doc.category.landscaping" to mapOf("en" to "Landscaping", "es" to "Jardinería", "fr" to "Aménagement paysager", "de" to "Garten", "pt" to "Paisagismo", "it" to "Giardinaggio", "ja" to "造園", "ko" to "조경", "nl" to "Tuinaanleg", "zh" to "园艺绿化"), + "doc.category.general" to mapOf("en" to "General", "es" to "General", "fr" to "Général", "de" to "Allgemein", "pt" to "Geral", "it" to "Generale", "ja" to "一般", "ko" to "일반", "nl" to "Algemeen", "zh" to "通用"), + "doc.category.other" to mapOf("en" to "Other", "es" to "Otro", "fr" to "Autre", "de" to "Sonstiges", "pt" to "Outro", "it" to "Altro", "ja" to "その他", "ko" to "기타", "nl" to "Overig", "zh" to "其他"), + "validation.title_required" to mapOf("en" to "Title is required", "es" to "El título es obligatorio", "fr" to "Le titre est obligatoire", "de" to "Titel ist erforderlich", "pt" to "O título é obrigatório", "it" to "Il titolo è obbligatorio", "ja" to "タイトルは必須です", "ko" to "제목은 필수입니다", "nl" to "Titel is verplicht", "zh" to "标题为必填项"), + "validation.priority_required" to mapOf("en" to "Please select a priority", "es" to "Selecciona una prioridad", "fr" to "Veuillez sélectionner une priorité", "de" to "Bitte wähle eine Priorität aus", "pt" to "Selecione uma prioridade", "it" to "Seleziona una priorità", "ja" to "優先度を選択してください", "ko" to "우선순위를 선택하세요", "nl" to "Selecteer een prioriteit", "zh" to "请选择优先级"), + "validation.category_required" to mapOf("en" to "Please select a category", "es" to "Selecciona una categoría", "fr" to "Veuillez sélectionner une catégorie", "de" to "Bitte wähle eine Kategorie aus", "pt" to "Selecione uma categoria", "it" to "Seleziona una categoria", "ja" to "カテゴリを選択してください", "ko" to "카테고리를 선택하세요", "nl" to "Selecteer een categorie", "zh" to "请选择类别"), + "validation.frequency_required" to mapOf("en" to "Please select a frequency", "es" to "Selecciona una frecuencia", "fr" to "Veuillez sélectionner une fréquence", "de" to "Bitte wähle eine Häufigkeit aus", "pt" to "Selecione uma frequência", "it" to "Seleziona una frequenza", "ja" to "頻度を選択してください", "ko" to "빈도를 선택하세요", "nl" to "Selecteer een frequentie", "zh" to "请选择频率"), + "validation.est_cost_invalid" to mapOf("en" to "Estimated cost must be a valid number", "es" to "El costo estimado debe ser un número válido", "fr" to "Le coût estimé doit être un nombre valide", "de" to "Die geschätzten Kosten müssen eine gültige Zahl sein", "pt" to "O custo estimado deve ser um número válido", "it" to "Il costo stimato deve essere un numero valido", "ja" to "見積もり費用は有効な数値である必要があります", "ko" to "예상 비용은 유효한 숫자여야 합니다", "nl" to "Geschatte kosten moeten een geldig getal zijn", "zh" to "预估费用必须是有效的数字"), + "validation.property_required" to mapOf("en" to "Property is required", "es" to "La propiedad es obligatoria", "fr" to "La propriété est obligatoire", "de" to "Immobilie ist erforderlich", "pt" to "A propriedade é obrigatória", "it" to "La proprietà è obbligatoria", "ja" to "物件は必須です", "ko" to "건물은 필수입니다", "nl" to "Woning is verplicht", "zh" to "房产为必填项"), + "validation.name_required" to mapOf("en" to "Name is required", "es" to "El nombre es obligatorio", "fr" to "Le nom est obligatoire", "de" to "Name ist erforderlich", "pt" to "O nome é obrigatório", "it" to "Il nome è obbligatorio", "ja" to "名前は必須です", "ko" to "이름은 필수입니다", "nl" to "Naam is verplicht", "zh" to "名称为必填项"), + "validation.name_too_long" to mapOf("en" to "Name must be {0} characters or fewer", "es" to "El nombre debe tener {0} caracteres o menos", "fr" to "Le nom doit comporter {0} caractères ou moins", "de" to "Der Name darf höchstens {0} Zeichen lang sein", "pt" to "O nome deve ter {0} caracteres ou menos", "it" to "Il nome deve contenere {0} caratteri o meno", "ja" to "名前は{0}文字以内で入力してください", "ko" to "이름은 {0}자 이하여야 합니다", "nl" to "De naam mag maximaal {0} tekens bevatten", "zh" to "名称不得超过{0}个字符"), + "validation.bedrooms_invalid" to mapOf("en" to "Bedrooms must be a non-negative whole number", "es" to "Los dormitorios deben ser un número entero no negativo", "fr" to "Le nombre de chambres doit être un entier non négatif", "de" to "Schlafzimmer müssen eine nicht negative ganze Zahl sein", "pt" to "Os quartos devem ser um número inteiro não negativo", "it" to "Le camere da letto devono essere un numero intero non negativo", "ja" to "寝室数は0以上の整数である必要があります", "ko" to "침실 수는 0 이상의 정수여야 합니다", "nl" to "Slaapkamers moeten een niet-negatief geheel getal zijn", "zh" to "卧室数必须是非负整数"), + "validation.bathrooms_invalid" to mapOf("en" to "Bathrooms must be a non-negative number", "es" to "Los baños deben ser un número no negativo", "fr" to "Le nombre de salles de bain doit être un nombre non négatif", "de" to "Badezimmer müssen eine nicht negative Zahl sein", "pt" to "Os banheiros devem ser um número não negativo", "it" to "I bagni devono essere un numero non negativo", "ja" to "浴室数は0以上の数値である必要があります", "ko" to "욕실 수는 0 이상의 숫자여야 합니다", "nl" to "Badkamers moeten een niet-negatief getal zijn", "zh" to "浴室数必须是非负数"), + "validation.sqft_invalid" to mapOf("en" to "Square footage must be a positive whole number", "es" to "Los pies cuadrados deben ser un número entero positivo", "fr" to "La surface doit être un entier positif", "de" to "Die Quadratmeterzahl muss eine positive ganze Zahl sein", "pt" to "A metragem quadrada deve ser um número inteiro positivo", "it" to "La metratura deve essere un numero intero positivo", "ja" to "面積は正の整数である必要があります", "ko" to "면적은 양의 정수여야 합니다", "nl" to "De oppervlakte moet een positief geheel getal zijn", "zh" to "面积必须是正整数"), + "validation.lot_size_invalid" to mapOf("en" to "Lot size must be a positive number", "es" to "El tamaño del terreno debe ser un número positivo", "fr" to "La taille du terrain doit être un nombre positif", "de" to "Die Grundstücksgröße muss eine positive Zahl sein", "pt" to "O tamanho do lote deve ser um número positivo", "it" to "La dimensione del lotto deve essere un numero positivo", "ja" to "敷地面積は正の数値である必要があります", "ko" to "대지 면적은 양수여야 합니다", "nl" to "De perceelgrootte moet een positief getal zijn", "zh" to "占地面积必须是正数"), + "validation.year_built_format" to mapOf("en" to "Year built must be a 4-digit year", "es" to "El año de construcción debe tener 4 dígitos", "fr" to "L'année de construction doit comporter 4 chiffres", "de" to "Das Baujahr muss eine 4-stellige Jahreszahl sein", "pt" to "O ano de construção deve ter 4 dígitos", "it" to "L'anno di costruzione deve essere di 4 cifre", "ja" to "築年は4桁の西暦で入力してください", "ko" to "건축 연도는 4자리 연도여야 합니다", "nl" to "Het bouwjaar moet een jaartal van 4 cijfers zijn", "zh" to "建造年份必须为4位数年份"), + "validation.year_built_range" to mapOf("en" to "Year built must be between {0} and the current year", "es" to "El año de construcción debe estar entre {0} y el año actual", "fr" to "L'année de construction doit être comprise entre {0} et l'année actuelle", "de" to "Das Baujahr muss zwischen {0} und dem aktuellen Jahr liegen", "pt" to "O ano de construção deve estar entre {0} e o ano atual", "it" to "L'anno di costruzione deve essere compreso tra {0} e l'anno corrente", "ja" to "築年は{0}年から現在の年までの間で入力してください", "ko" to "건축 연도는 {0}년부터 현재 연도 사이여야 합니다", "nl" to "Het bouwjaar moet tussen {0} en het huidige jaar liggen", "zh" to "建造年份必须介于{0}和当前年份之间"), + "validation.share_code_length" to mapOf("en" to "Share code must be 6 characters", "es" to "El código para compartir debe tener 6 caracteres", "fr" to "Le code de partage doit comporter 6 caractères", "de" to "Der Freigabecode muss 6 Zeichen lang sein", "pt" to "O código de compartilhamento deve ter 6 caracteres", "it" to "Il codice di condivisione deve avere 6 caratteri", "ja" to "共有コードは6文字である必要があります", "ko" to "공유 코드는 6자여야 합니다", "nl" to "De deelcode moet 6 tekens lang zijn", "zh" to "分享码必须为6个字符"), + "auth.recovery_sent" to mapOf("en" to "If that email exists, a recovery code has been sent.", "es" to "Si ese correo existe, se ha enviado un código de recuperación.", "fr" to "Si cet e-mail existe, un code de récupération a été envoyé.", "de" to "Falls diese E-Mail existiert, wurde ein Wiederherstellungscode gesendet.", "pt" to "Se esse e-mail existir, um código de recuperação foi enviado.", "it" to "Se questa email esiste, è stato inviato un codice di recupero.", "ja" to "そのメールアドレスが登録されている場合、復旧コードを送信しました。", "ko" to "해당 이메일이 존재하는 경우 복구 코드가 전송되었습니다.", "nl" to "Als dat e-mailadres bestaat, is er een herstelcode verzonden.", "zh" to "如果该邮箱存在,恢复代码已发送。"), + "auth.code_verified" to mapOf("en" to "Code verified.", "es" to "Código verificado.", "fr" to "Code vérifié.", "de" to "Code verifiziert.", "pt" to "Código verificado.", "it" to "Codice verificato.", "ja" to "コードを確認しました。", "ko" to "코드가 확인되었습니다.", "nl" to "Code geverifieerd.", "zh" to "代码已验证。"), + "auth.password_updated" to mapOf("en" to "Password updated. You can now sign in.", "es" to "Contraseña actualizada. Ya puedes iniciar sesión.", "fr" to "Mot de passe mis à jour. Vous pouvez maintenant vous connecter.", "de" to "Passwort aktualisiert. Du kannst dich jetzt anmelden.", "pt" to "Senha atualizada. Agora você pode entrar.", "it" to "Password aggiornata. Ora puoi accedere.", "ja" to "パスワードを更新しました。サインインできます。", "ko" to "비밀번호가 업데이트되었습니다. 이제 로그인할 수 있습니다.", "nl" to "Wachtwoord bijgewerkt. Je kunt nu inloggen.", "zh" to "密码已更新。您现在可以登录。"), + "auth.email_verified" to mapOf("en" to "Email verified.", "es" to "Correo verificado.", "fr" to "E-mail vérifié.", "de" to "E-Mail verifiziert.", "pt" to "E-mail verificado.", "it" to "Email verificata.", "ja" to "メールアドレスを確認しました。", "ko" to "이메일이 확인되었습니다.", "nl" to "E-mail geverifieerd.", "zh" to "邮箱已验证。"), + // Home profile picker fallback option labels (apiValue stays stable; these localize display) + "home_profile.heating.gas_furnace" to mapOf("en" to "Gas Furnace", "es" to "Caldera de gas", "fr" to "Chaudière à gaz", "de" to "Gasheizung", "pt" to "Aquecedor a gás", "it" to "Caldaia a gas", "ja" to "ガス暖房", "ko" to "가스 난방", "nl" to "Gasverwarming", "zh" to "燃气炉"), + "home_profile.heating.electric" to mapOf("en" to "Electric", "es" to "Eléctrica", "fr" to "Électrique", "de" to "Elektrisch", "pt" to "Elétrico", "it" to "Elettrico", "ja" to "電気", "ko" to "전기", "nl" to "Elektrisch", "zh" to "电力"), + "home_profile.heating.heat_pump" to mapOf("en" to "Heat Pump", "es" to "Bomba de calor", "fr" to "Pompe à chaleur", "de" to "Wärmepumpe", "pt" to "Bomba de calor", "it" to "Pompa di calore", "ja" to "ヒートポンプ", "ko" to "히트 펌프", "nl" to "Warmtepomp", "zh" to "热泵"), + "home_profile.heating.boiler" to mapOf("en" to "Boiler", "es" to "Caldera", "fr" to "Chaudière", "de" to "Heizkessel", "pt" to "Caldeira", "it" to "Caldaia", "ja" to "ボイラー", "ko" to "보일러", "nl" to "Ketel", "zh" to "锅炉"), + "home_profile.heating.radiant" to mapOf("en" to "Radiant", "es" to "Radiante", "fr" to "Rayonnant", "de" to "Strahlungsheizung", "pt" to "Radiante", "it" to "Radiante", "ja" to "輻射熱", "ko" to "복사 난방", "nl" to "Stralingsverwarming", "zh" to "辐射供暖"), + "home_profile.heating.wood_stove" to mapOf("en" to "Wood Stove", "es" to "Estufa de leña", "fr" to "Poêle à bois", "de" to "Holzofen", "pt" to "Fogão a lenha", "it" to "Stufa a legna", "ja" to "薪ストーブ", "ko" to "장작 난로", "nl" to "Houtkachel", "zh" to "柴火炉"), + "home_profile.heating.none" to mapOf("en" to "None", "es" to "Ninguna", "fr" to "Aucun", "de" to "Keine", "pt" to "Nenhum", "it" to "Nessuno", "ja" to "なし", "ko" to "없음", "nl" to "Geen", "zh" to "无"), + "home_profile.cooling.central_ac" to mapOf("en" to "Central AC", "es" to "Aire central", "fr" to "Clim centrale", "de" to "Zentrale Klimaanlage", "pt" to "Ar central", "it" to "Climatizzazione centrale", "ja" to "セントラル空調", "ko" to "중앙 냉방", "nl" to "Centrale airco", "zh" to "中央空调"), + "home_profile.cooling.window_unit" to mapOf("en" to "Window Unit", "es" to "Equipo de ventana", "fr" to "Climatiseur de fenêtre", "de" to "Fenstergerät", "pt" to "Aparelho de janela", "it" to "Condizionatore da finestra", "ja" to "窓用エアコン", "ko" to "창문형 에어컨", "nl" to "Raamunit", "zh" to "窗式空调"), + "home_profile.cooling.mini_split" to mapOf("en" to "Mini Split", "es" to "Mini split", "fr" to "Mini-split", "de" to "Mini-Split", "pt" to "Mini split", "it" to "Mini split", "ja" to "ミニスプリット", "ko" to "미니 스플릿", "nl" to "Mini-split", "zh" to "分体式空调"), + "home_profile.cooling.evaporative" to mapOf("en" to "Evaporative", "es" to "Evaporativo", "fr" to "Évaporatif", "de" to "Verdunstung", "pt" to "Evaporativo", "it" to "Evaporativo", "ja" to "気化式", "ko" to "증발식", "nl" to "Verdampingskoeling", "zh" to "蒸发式"), + "home_profile.cooling.none" to mapOf("en" to "None", "es" to "Ninguno", "fr" to "Aucun", "de" to "Keine", "pt" to "Nenhum", "it" to "Nessuno", "ja" to "なし", "ko" to "없음", "nl" to "Geen", "zh" to "无"), + "home_profile.water_heater.tank_gas" to mapOf("en" to "Tank (Gas)", "es" to "Tanque (gas)", "fr" to "Réservoir (gaz)", "de" to "Speicher (Gas)", "pt" to "Boiler (gás)", "it" to "Serbatoio (gas)", "ja" to "タンク(ガス)", "ko" to "탱크 (가스)", "nl" to "Boiler (gas)", "zh" to "储水式(燃气)"), + "home_profile.water_heater.tank_electric" to mapOf("en" to "Tank (Electric)", "es" to "Tanque (eléctrico)", "fr" to "Réservoir (électrique)", "de" to "Speicher (elektrisch)", "pt" to "Boiler (elétrico)", "it" to "Serbatoio (elettrico)", "ja" to "タンク(電気)", "ko" to "탱크 (전기)", "nl" to "Boiler (elektrisch)", "zh" to "储水式(电)"), + "home_profile.water_heater.tankless" to mapOf("en" to "Tankless", "es" to "Sin tanque", "fr" to "Sans réservoir", "de" to "Durchlauferhitzer", "pt" to "Sem tanque", "it" to "Istantaneo", "ja" to "タンクレス", "ko" to "순간식", "nl" to "Doorstroom", "zh" to "即热式"), + "home_profile.water_heater.solar" to mapOf("en" to "Solar", "es" to "Solar", "fr" to "Solaire", "de" to "Solar", "pt" to "Solar", "it" to "Solare", "ja" to "ソーラー", "ko" to "태양열", "nl" to "Zonne-energie", "zh" to "太阳能"), + "home_profile.water_heater.heat_pump" to mapOf("en" to "Heat Pump", "es" to "Bomba de calor", "fr" to "Pompe à chaleur", "de" to "Wärmepumpe", "pt" to "Bomba de calor", "it" to "Pompa di calore", "ja" to "ヒートポンプ", "ko" to "히트 펌프", "nl" to "Warmtepomp", "zh" to "热泵"), + "home_profile.roof.asphalt_shingle" to mapOf("en" to "Asphalt Shingle", "es" to "Teja asfáltica", "fr" to "Bardeau d'asphalte", "de" to "Asphaltschindel", "pt" to "Telha asfáltica", "it" to "Tegola bituminosa", "ja" to "アスファルトシングル", "ko" to "아스팔트 슁글", "nl" to "Asfaltshingle", "zh" to "沥青瓦"), + "home_profile.roof.metal" to mapOf("en" to "Metal", "es" to "Metal", "fr" to "Métal", "de" to "Metall", "pt" to "Metal", "it" to "Metallo", "ja" to "金属", "ko" to "금속", "nl" to "Metaal", "zh" to "金属"), + "home_profile.roof.tile" to mapOf("en" to "Tile", "es" to "Teja", "fr" to "Tuile", "de" to "Ziegel", "pt" to "Telha", "it" to "Tegola", "ja" to "瓦", "ko" to "기와", "nl" to "Dakpan", "zh" to "瓦片"), + "home_profile.roof.flat_tpo" to mapOf("en" to "Flat/TPO", "es" to "Plano/TPO", "fr" to "Plat/TPO", "de" to "Flach/TPO", "pt" to "Plano/TPO", "it" to "Piano/TPO", "ja" to "陸屋根/TPO", "ko" to "평지붕/TPO", "nl" to "Plat/TPO", "zh" to "平顶/TPO"), + "home_profile.roof.slate" to mapOf("en" to "Slate", "es" to "Pizarra", "fr" to "Ardoise", "de" to "Schiefer", "pt" to "Ardósia", "it" to "Ardesia", "ja" to "スレート", "ko" to "슬레이트", "nl" to "Leisteen", "zh" to "石板"), + "home_profile.roof.wood_shake" to mapOf("en" to "Wood Shake", "es" to "Tejamanil de madera", "fr" to "Bardeau de bois", "de" to "Holzschindel", "pt" to "Telha de madeira", "it" to "Scandola di legno", "ja" to "木製シェイク", "ko" to "목재 셰이크", "nl" to "Houten shingle", "zh" to "木瓦"), + "home_profile.exterior.vinyl_siding" to mapOf("en" to "Vinyl Siding", "es" to "Revestimiento de vinilo", "fr" to "Revêtement en vinyle", "de" to "Vinylverkleidung", "pt" to "Revestimento de vinil", "it" to "Rivestimento in vinile", "ja" to "ビニールサイディング", "ko" to "비닐 사이딩", "nl" to "Vinyl gevelbekleding", "zh" to "乙烯基壁板"), + "home_profile.exterior.brick" to mapOf("en" to "Brick", "es" to "Ladrillo", "fr" to "Brique", "de" to "Ziegelstein", "pt" to "Tijolo", "it" to "Mattone", "ja" to "レンガ", "ko" to "벽돌", "nl" to "Baksteen", "zh" to "砖"), + "home_profile.exterior.stucco" to mapOf("en" to "Stucco", "es" to "Estuco", "fr" to "Stuc", "de" to "Putz", "pt" to "Estuque", "it" to "Stucco", "ja" to "スタッコ", "ko" to "스투코", "nl" to "Stucwerk", "zh" to "灰泥"), + "home_profile.exterior.wood" to mapOf("en" to "Wood", "es" to "Madera", "fr" to "Bois", "de" to "Holz", "pt" to "Madeira", "it" to "Legno", "ja" to "木材", "ko" to "목재", "nl" to "Hout", "zh" to "木材"), + "home_profile.exterior.stone" to mapOf("en" to "Stone", "es" to "Piedra", "fr" to "Pierre", "de" to "Stein", "pt" to "Pedra", "it" to "Pietra", "ja" to "石", "ko" to "석재", "nl" to "Steen", "zh" to "石材"), + "home_profile.exterior.fiber_cement" to mapOf("en" to "Fiber Cement", "es" to "Fibrocemento", "fr" to "Fibrociment", "de" to "Faserzement", "pt" to "Fibrocimento", "it" to "Fibrocemento", "ja" to "繊維セメント", "ko" to "섬유 시멘트", "nl" to "Vezelcement", "zh" to "纤维水泥"), + "home_profile.flooring.hardwood" to mapOf("en" to "Hardwood", "es" to "Madera maciza", "fr" to "Bois massif", "de" to "Hartholz", "pt" to "Madeira maciça", "it" to "Legno massello", "ja" to "無垢材", "ko" to "원목", "nl" to "Hardhout", "zh" to "实木"), + "home_profile.flooring.carpet" to mapOf("en" to "Carpet", "es" to "Alfombra", "fr" to "Moquette", "de" to "Teppich", "pt" to "Carpete", "it" to "Moquette", "ja" to "カーペット", "ko" to "카펫", "nl" to "Tapijt", "zh" to "地毯"), + "home_profile.flooring.tile" to mapOf("en" to "Tile", "es" to "Baldosa", "fr" to "Carrelage", "de" to "Fliesen", "pt" to "Cerâmica", "it" to "Piastrelle", "ja" to "タイル", "ko" to "타일", "nl" to "Tegel", "zh" to "瓷砖"), + "home_profile.flooring.laminate" to mapOf("en" to "Laminate", "es" to "Laminado", "fr" to "Stratifié", "de" to "Laminat", "pt" to "Laminado", "it" to "Laminato", "ja" to "ラミネート", "ko" to "라미네이트", "nl" to "Laminaat", "zh" to "复合地板"), + "home_profile.flooring.vinyl" to mapOf("en" to "Vinyl", "es" to "Vinilo", "fr" to "Vinyle", "de" to "Vinyl", "pt" to "Vinil", "it" to "Vinile", "ja" to "ビニール", "ko" to "비닐", "nl" to "Vinyl", "zh" to "乙烯基"), + "home_profile.landscaping.lawn" to mapOf("en" to "Lawn", "es" to "Césped", "fr" to "Pelouse", "de" to "Rasen", "pt" to "Gramado", "it" to "Prato", "ja" to "芝生", "ko" to "잔디", "nl" to "Gazon", "zh" to "草坪"), + "home_profile.landscaping.xeriscaping" to mapOf("en" to "Xeriscaping", "es" to "Xerojardinería", "fr" to "Xéropaysagisme", "de" to "Xeriscaping", "pt" to "Xerojardinagem", "it" to "Xeriscaping", "ja" to "ゼリスケープ", "ko" to "건조 조경", "nl" to "Xeriscaping", "zh" to "旱生园艺"), + "home_profile.landscaping.none" to mapOf("en" to "None", "es" to "Ninguno", "fr" to "Aucun", "de" to "Keine", "pt" to "Nenhum", "it" to "Nessuno", "ja" to "なし", "ko" to "없음", "nl" to "Geen", "zh" to "无"), +) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Document.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Document.kt index 4e8a674..739a54f 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Document.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Document.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.models +import com.tt.honeyDue.i18n.ClientStrings import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -120,17 +121,19 @@ data class DocumentUpdateRequest( // API now returns List directly // Document type choices -enum class DocumentType(val value: String, val displayName: String) { - WARRANTY("warranty", "Warranty"), - MANUAL("manual", "User Manual"), - RECEIPT("receipt", "Receipt/Invoice"), - INSPECTION("inspection", "Inspection Report"), - PERMIT("permit", "Permit"), - DEED("deed", "Deed/Title"), - INSURANCE("insurance", "Insurance"), - CONTRACT("contract", "Contract"), - PHOTO("photo", "Photo"), - OTHER("other", "Other"); +enum class DocumentType(val value: String, private val displayNameKey: String) { + WARRANTY("warranty", "doc.type.warranty"), + MANUAL("manual", "doc.type.manual"), + RECEIPT("receipt", "doc.type.receipt"), + INSPECTION("inspection", "doc.type.inspection"), + PERMIT("permit", "doc.type.permit"), + DEED("deed", "doc.type.deed"), + INSURANCE("insurance", "doc.type.insurance"), + CONTRACT("contract", "doc.type.contract"), + PHOTO("photo", "doc.type.photo"), + OTHER("other", "doc.type.other"); + + val displayName: String get() = ClientStrings.t(displayNameKey) companion object { fun fromValue(value: String): DocumentType { @@ -140,16 +143,18 @@ enum class DocumentType(val value: String, val displayName: String) { } // Document/Warranty category choices -enum class DocumentCategory(val value: String, val displayName: String) { - APPLIANCE("appliance", "Appliance"), - HVAC("hvac", "HVAC"), - PLUMBING("plumbing", "Plumbing"), - ELECTRICAL("electrical", "Electrical"), - ROOFING("roofing", "Roofing"), - STRUCTURAL("structural", "Structural"), - LANDSCAPING("landscaping", "Landscaping"), - GENERAL("general", "General"), - OTHER("other", "Other"); +enum class DocumentCategory(val value: String, private val displayNameKey: String) { + APPLIANCE("appliance", "doc.category.appliance"), + HVAC("hvac", "doc.category.hvac"), + PLUMBING("plumbing", "doc.category.plumbing"), + ELECTRICAL("electrical", "doc.category.electrical"), + ROOFING("roofing", "doc.category.roofing"), + STRUCTURAL("structural", "doc.category.structural"), + LANDSCAPING("landscaping", "doc.category.landscaping"), + GENERAL("general", "doc.category.general"), + OTHER("other", "doc.category.other"); + + val displayName: String get() = ClientStrings.t(displayNameKey) companion object { fun fromValue(value: String): DocumentCategory { diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/HomeProfile.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/HomeProfile.kt index 04b2074..2050fe6 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/HomeProfile.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/HomeProfile.kt @@ -1,59 +1,62 @@ package com.tt.honeyDue.models /** - * Static option lists for home profile pickers. - * Each entry is a (apiValue, displayLabel) pair. + * Static option lists for home profile pickers (live fallback shown when the + * backend options aren't loaded). Each entry is a (apiValue, displayLabelKey) + * pair: the FIRST element is the stable backend API value and must never + * change; the SECOND element is a [com.tt.honeyDue.i18n.ClientStrings] key + * resolved to a localized label at the render site. */ object HomeProfileOptions { val heatingTypes = listOf( - "gas_furnace" to "Gas Furnace", - "electric" to "Electric", - "heat_pump" to "Heat Pump", - "boiler" to "Boiler", - "radiant" to "Radiant", - "wood_stove" to "Wood Stove", - "none" to "None" + "gas_furnace" to "home_profile.heating.gas_furnace", + "electric" to "home_profile.heating.electric", + "heat_pump" to "home_profile.heating.heat_pump", + "boiler" to "home_profile.heating.boiler", + "radiant" to "home_profile.heating.radiant", + "wood_stove" to "home_profile.heating.wood_stove", + "none" to "home_profile.heating.none" ) val coolingTypes = listOf( - "central_ac" to "Central AC", - "window_unit" to "Window Unit", - "mini_split" to "Mini Split", - "evaporative" to "Evaporative", - "none" to "None" + "central_ac" to "home_profile.cooling.central_ac", + "window_unit" to "home_profile.cooling.window_unit", + "mini_split" to "home_profile.cooling.mini_split", + "evaporative" to "home_profile.cooling.evaporative", + "none" to "home_profile.cooling.none" ) val waterHeaterTypes = listOf( - "tank_gas" to "Tank (Gas)", - "tank_electric" to "Tank (Electric)", - "tankless" to "Tankless", - "solar" to "Solar", - "heat_pump_wh" to "Heat Pump" + "tank_gas" to "home_profile.water_heater.tank_gas", + "tank_electric" to "home_profile.water_heater.tank_electric", + "tankless" to "home_profile.water_heater.tankless", + "solar" to "home_profile.water_heater.solar", + "heat_pump_wh" to "home_profile.water_heater.heat_pump" ) val roofTypes = listOf( - "asphalt_shingle" to "Asphalt Shingle", - "metal" to "Metal", - "tile" to "Tile", - "flat_tpo" to "Flat/TPO", - "slate" to "Slate", - "wood_shake" to "Wood Shake" + "asphalt_shingle" to "home_profile.roof.asphalt_shingle", + "metal" to "home_profile.roof.metal", + "tile" to "home_profile.roof.tile", + "flat_tpo" to "home_profile.roof.flat_tpo", + "slate" to "home_profile.roof.slate", + "wood_shake" to "home_profile.roof.wood_shake" ) val exteriorTypes = listOf( - "vinyl_siding" to "Vinyl Siding", - "brick" to "Brick", - "stucco" to "Stucco", - "wood" to "Wood", - "stone" to "Stone", - "fiber_cement" to "Fiber Cement" + "vinyl_siding" to "home_profile.exterior.vinyl_siding", + "brick" to "home_profile.exterior.brick", + "stucco" to "home_profile.exterior.stucco", + "wood" to "home_profile.exterior.wood", + "stone" to "home_profile.exterior.stone", + "fiber_cement" to "home_profile.exterior.fiber_cement" ) val flooringTypes = listOf( - "hardwood" to "Hardwood", - "carpet" to "Carpet", - "tile" to "Tile", - "laminate" to "Laminate", - "vinyl" to "Vinyl" + "hardwood" to "home_profile.flooring.hardwood", + "carpet" to "home_profile.flooring.carpet", + "tile" to "home_profile.flooring.tile", + "laminate" to "home_profile.flooring.laminate", + "vinyl" to "home_profile.flooring.vinyl" ) val landscapingTypes = listOf( - "lawn" to "Lawn", - "xeriscaping" to "Xeriscaping", - "none" to "None" + "lawn" to "home_profile.landscaping.lawn", + "xeriscaping" to "home_profile.landscaping.xeriscaping", + "none" to "home_profile.landscaping.none" ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Lookups.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Lookups.kt index 57a1f1b..1460447 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Lookups.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/Lookups.kt @@ -10,8 +10,13 @@ import kotlinx.serialization.Serializable @Serializable data class ResidenceType( val id: Int, - val name: String -) + val name: String, + @SerialName("display_name") val displayNameLocalized: String = "" +) { + /** Localized label for the current locale; falls back to [name]. */ + val displayName: String + get() = displayNameLocalized.ifBlank { name } +} /** * Task frequency lookup - matching Go API TaskFrequencyResponse @@ -20,12 +25,13 @@ data class ResidenceType( data class TaskFrequency( val id: Int, val name: String, + @SerialName("display_name") val displayNameLocalized: String = "", val days: Int? = null, @SerialName("display_order") val displayOrder: Int = 0 ) { - // Helper for display + /** Localized label for the current locale; falls back to [name]. */ val displayName: String - get() = name + get() = displayNameLocalized.ifBlank { name } } /** @@ -35,13 +41,14 @@ data class TaskFrequency( data class TaskPriority( val id: Int, val name: String, + @SerialName("display_name") val displayNameLocalized: String = "", val level: Int = 0, val color: String = "", @SerialName("display_order") val displayOrder: Int = 0 ) { - // Helper for display + /** Localized label for the current locale; falls back to [name]. */ val displayName: String - get() = name + get() = displayNameLocalized.ifBlank { name } } /** @@ -51,11 +58,16 @@ data class TaskPriority( data class TaskCategory( val id: Int, val name: String, + @SerialName("display_name") val displayNameLocalized: String = "", val description: String = "", val icon: String = "", val color: String = "", @SerialName("display_order") val displayOrder: Int = 0 -) +) { + /** Localized label for the current locale; falls back to [name]. */ + val displayName: String + get() = displayNameLocalized.ifBlank { name } +} /** * Contractor specialty lookup @@ -64,9 +76,25 @@ data class TaskCategory( data class ContractorSpecialty( val id: Int, val name: String, + @SerialName("display_name") val displayNameLocalized: String = "", val description: String? = null, val icon: String? = null, @SerialName("display_order") val displayOrder: Int = 0 +) { + /** Localized label for the current locale; falls back to [name]. */ + val displayName: String + get() = displayNameLocalized.ifBlank { name } +} + +/** + * A selectable home-profile field option (heating type, roof type, etc.), + * served localized by the backend. [value] is the stable code stored on the + * residence; [displayName] is the localized label. + */ +@Serializable +data class HomeProfileOption( + val value: String, + @SerialName("display_name") val displayName: String ) /** @@ -103,7 +131,10 @@ data class SeededDataResponse( @SerialName("task_priorities") val taskPriorities: List, @SerialName("task_frequencies") val taskFrequencies: List, @SerialName("contractor_specialties") val contractorSpecialties: List, - @SerialName("task_templates") val taskTemplates: TaskTemplatesGroupedResponse + @SerialName("task_templates") val taskTemplates: TaskTemplatesGroupedResponse, + @SerialName("home_profile_options") val homeProfileOptions: Map> = emptyMap(), + @SerialName("document_types") val documentTypes: List = emptyList(), + @SerialName("document_categories") val documentCategories: List = emptyList() ) // Legacy wrapper responses for backward compatibility diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/TaskTemplate.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/TaskTemplate.kt index 4508b5e..0adcfda 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/TaskTemplate.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/models/TaskTemplate.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.models +import com.tt.honeyDue.i18n.ClientStrings import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,13 +27,13 @@ data class TaskTemplate( * Human-readable frequency display */ val frequencyDisplay: String - get() = frequency?.displayName ?: "One time" + get() = frequency?.displayName ?: ClientStrings.t("task.frequency.one_time") /** * Category name for display */ val categoryName: String - get() = category?.name ?: "Uncategorized" + get() = category?.name ?: ClientStrings.t("task.category.uncategorized") } /** diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/APILayer.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/APILayer.kt index bffa03d..ddaccbb 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/APILayer.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/APILayer.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.data.DataManager import com.tt.honeyDue.models.* import com.tt.honeyDue.network.* @@ -54,7 +56,7 @@ object APILayer { * Call this when app comes to foreground or when limits might have changed. */ suspend fun refreshSubscriptionStatus(): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) println("🔄 [APILayer] Force refreshing subscription status from backend...") val result = subscriptionApi.getSubscriptionStatus(token) @@ -184,7 +186,7 @@ object APILayer { DataManager.markLookupsInitialized() return ApiResult.Success(Unit) } catch (e: Exception) { - return ApiResult.Error("Failed to initialize lookups: ${e.message}") + return ApiResult.Error(ClientStrings.t("err.api.init_lookups_failed", e.message ?: "")) } finally { lookupsInitMutex.unlock() } @@ -251,10 +253,10 @@ object APILayer { DataManager.markLookupsInitialized() return ApiResult.Success(Unit) } else if (staticDataResult is ApiResult.Error) { - return ApiResult.Error("Failed to load lookups: ${staticDataResult.message}") + return ApiResult.Error(ClientStrings.t("err.api.load_lookups_failed", staticDataResult.message)) } - return ApiResult.Error("Unknown error loading lookups") + return ApiResult.Error(ClientStrings.t("err.api.unknown_loading_lookups")) } /** @@ -268,7 +270,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = lookupsApi.getResidenceTypes(token) if (result is ApiResult.Success) { @@ -289,7 +291,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = lookupsApi.getTaskFrequencies(token) if (result is ApiResult.Success) { @@ -310,7 +312,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = lookupsApi.getTaskPriorities(token) if (result is ApiResult.Success) { @@ -331,7 +333,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = lookupsApi.getTaskCategories(token) if (result is ApiResult.Success) { @@ -352,7 +354,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = lookupsApi.getContractorSpecialties(token) if (result is ApiResult.Success) { @@ -374,7 +376,7 @@ object APILayer { println("[APILayer] CACHE MISS: residences (forceRefresh=$forceRefresh)") // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.getResidences(token) // Update DataManager on success @@ -397,7 +399,7 @@ object APILayer { println("[APILayer] CACHE MISS: myResidences (forceRefresh=$forceRefresh)") // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.getMyResidences(token) // Update DataManager on success @@ -422,7 +424,7 @@ object APILayer { * cache without requiring a manual pull-to-refresh. */ suspend fun acceptResidenceInvite(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.acceptResidenceInvite(token, residenceId) if (result is ApiResult.Success) { // Residence list may have changed — force a refresh so any @@ -438,7 +440,7 @@ object APILayer { * client-side; the next app-open will re-query the server anyway. */ suspend fun declineResidenceInvite(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.declineResidenceInvite(token, residenceId) } @@ -462,7 +464,7 @@ object APILayer { } // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.getResidence(token, id) // Update DataManager on success @@ -486,7 +488,7 @@ object APILayer { } } - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.getSummary(token) if (result is ApiResult.Success) { @@ -497,7 +499,7 @@ object APILayer { } suspend fun createResidence(request: ResidenceCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.createResidence(token, request) // Extract summary and update local cache @@ -509,12 +511,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun updateResidence(id: Int, request: ResidenceCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.updateResidence(token, id, request) // Extract summary and update local cache @@ -526,12 +528,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun deleteResidence(id: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.deleteResidence(token, id) // Extract summary and update local cache @@ -543,17 +545,17 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun generateTasksReport(residenceId: Int, email: String? = null): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.generateTasksReport(token, residenceId, email) } suspend fun joinWithCode(code: String): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = residenceApi.joinWithCode(token, code) // Extract summary and update local cache @@ -566,27 +568,27 @@ object APILayer { } suspend fun getResidenceUsers(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.getResidenceUsers(token, residenceId) } suspend fun getShareCode(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.getShareCode(token, residenceId) } suspend fun generateShareCode(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.generateShareCode(token, residenceId) } suspend fun generateSharePackage(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.generateSharePackage(token, residenceId) } suspend fun removeUser(residenceId: Int, userId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return residenceApi.removeUser(token, residenceId, userId) } @@ -604,7 +606,7 @@ object APILayer { println("[APILayer] CACHE MISS: tasks (forceRefresh=$forceRefresh)") // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.getTasks(token) // Update DataManager on success @@ -629,12 +631,12 @@ object APILayer { if (allTasksResult is ApiResult.Error) return allTasksResult val filtered = DataManager.getTasksForResidence(residenceId) - ?: return ApiResult.Error("Tasks unavailable", 0) + ?: return ApiResult.Error(ClientStrings.t("err.api.tasks_unavailable"), 0) return ApiResult.Success(filtered) } suspend fun createTask(request: TaskCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.createTask(token, request) // Extract summary and update local cache with new task @@ -647,7 +649,7 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } @@ -664,7 +666,7 @@ object APILayer { * after onboarding), silently dropping the new tasks from cache. */ suspend fun bulkCreateTasks(request: BulkCreateTasksRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.bulkCreateTasks(token, request) if (result is ApiResult.Success) { @@ -677,7 +679,7 @@ object APILayer { } suspend fun updateTask(id: Int, request: TaskCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.updateTask(token, id, request) // Extract summary and update local cache with modified task @@ -690,12 +692,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun cancelTask(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.cancelTask(token, taskId) if (result is ApiResult.Success) { @@ -706,12 +708,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun uncancelTask(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.uncancelTask(token, taskId) if (result is ApiResult.Success) { @@ -722,12 +724,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun markInProgress(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.markInProgress(token, taskId) if (result is ApiResult.Success) { @@ -738,12 +740,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun clearInProgress(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.clearInProgress(token, taskId) if (result is ApiResult.Success) { @@ -754,12 +756,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun archiveTask(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.archiveTask(token, taskId) if (result is ApiResult.Success) { @@ -770,12 +772,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun unarchiveTask(taskId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.unarchiveTask(token, taskId) if (result is ApiResult.Success) { @@ -786,12 +788,12 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } suspend fun createTaskCompletion(request: TaskCompletionCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskCompletionApi.createCompletion(token, request) if (result is ApiResult.Success) { @@ -806,7 +808,7 @@ object APILayer { return when (result) { is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } @@ -814,7 +816,7 @@ object APILayer { * Get all completions for a specific task */ suspend fun getTaskCompletions(taskId: Int): ApiResult> { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = taskApi.getTaskCompletions(token, taskId) if (result is ApiResult.Success) { DataManager.setTaskCompletions(taskId, result.data) @@ -848,7 +850,7 @@ object APILayer { println("[APILayer] CACHE MISS: documents (forceRefresh=$forceRefresh, hasFilters=$hasFilters)") // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.getDocuments( token, residenceId, documentType, category, contractorId, isActive, expiringSoon, tags, search @@ -872,7 +874,7 @@ object APILayer { } // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.getDocument(token, id) // Update DataManager on success @@ -912,7 +914,7 @@ object APILayer { fileNamesList: List? = null, mimeTypesList: List? = null ): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.createDocument( token, title, documentType, residenceId, description, category, tags, notes, contractorId, isActive, itemName, modelNumber, @@ -951,7 +953,7 @@ object APILayer { startDate: String? = null, endDate: String? = null ): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.updateDocument( token, id, title, documentType, description, category, tags, notes, contractorId, isActive, itemName, modelNumber, serialNumber, provider, @@ -968,7 +970,7 @@ object APILayer { } suspend fun deleteDocument(id: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.deleteDocument(token, id) // Update DataManager on success @@ -986,7 +988,7 @@ object APILayer { mimeType: String, caption: String? = null ): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.uploadDocumentImage(token, documentId, imageBytes, fileName, mimeType, caption) if (result is ApiResult.Success) { DataManager.updateDocument(result.data) @@ -995,7 +997,7 @@ object APILayer { } suspend fun deleteDocumentImage(documentId: Int, imageId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = documentApi.deleteDocumentImage(token, documentId, imageId) if (result is ApiResult.Success) { DataManager.updateDocument(result.data) @@ -1004,7 +1006,7 @@ object APILayer { } suspend fun downloadDocument(url: String): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return documentApi.downloadDocument(token, url) } @@ -1026,7 +1028,7 @@ object APILayer { } // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.getContractors(token, specialty, isFavorite, isActive, search) // Update DataManager on success (only for unfiltered results) @@ -1039,7 +1041,7 @@ object APILayer { suspend fun getContractor(id: Int, forceRefresh: Boolean = false): ApiResult { // Fetch from API (summaries don't have full detail, always fetch) - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.getContractor(token, id) // Update the summary in DataManager on success @@ -1052,7 +1054,7 @@ object APILayer { } suspend fun createContractor(request: ContractorCreateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.createContractor(token, request) // Update DataManager on success @@ -1064,7 +1066,7 @@ object APILayer { } suspend fun updateContractor(id: Int, request: ContractorUpdateRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.updateContractor(token, id, request) // Update DataManager on success @@ -1076,7 +1078,7 @@ object APILayer { } suspend fun deleteContractor(id: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.deleteContractor(token, id) // Update DataManager on success @@ -1088,7 +1090,7 @@ object APILayer { } suspend fun toggleFavorite(id: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.toggleFavorite(token, id) // Update DataManager on success @@ -1110,7 +1112,7 @@ object APILayer { // If cache is empty or stale, fetch all contractors first to populate cache if (DataManager.contractors.value.isEmpty() || !DataManager.isCacheValid(DataManager.contractorsCacheTime)) { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = contractorApi.getContractors(token, null, null, null, null) if (result is ApiResult.Success) { DataManager.setContractors(result.data) @@ -1172,7 +1174,7 @@ object APILayer { initializeLookups() return DataManager.taskTemplatesGrouped.value?.let { ApiResult.Success(it) - } ?: ApiResult.Error("Failed to load task templates") + } ?: ApiResult.Error(ClientStrings.t("err.api.failed_load_task_templates")) } /** @@ -1220,14 +1222,14 @@ object APILayer { val cached = DataManager.taskTemplates.value.find { it.id == id } return cached?.let { ApiResult.Success(it) - } ?: ApiResult.Error("Task template not found") + } ?: ApiResult.Error(ClientStrings.t("err.api.task_template_not_found")) } /** * Get personalized task suggestions for a residence based on its home profile. */ suspend fun getTaskSuggestions(residenceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return taskTemplateApi.getTaskSuggestions(token, residenceId) } @@ -1266,7 +1268,7 @@ object APILayer { } suspend fun logout(): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = authApi.logout(token) // Clear DataManager on logout (success or failure) @@ -1289,13 +1291,13 @@ object APILayer { * `ApiClient` 401 plumbing continue to compile. */ suspend fun refreshToken(): ApiResult { - val currentToken = getToken() ?: return ApiResult.Error("No token", 401) + val currentToken = getToken() ?: return ApiResult.Error(ClientStrings.t("err.api.no_token"), 401) return when (val result = authApi.refreshToken(currentToken)) { // Kratos session tokens are never rotated — echo the same token // back when the session is confirmed still valid. is ApiResult.Success -> ApiResult.Success(currentToken) is ApiResult.Error -> ApiResult.Error(result.message, result.code) - else -> ApiResult.Error("Unexpected state") + else -> ApiResult.Error(ClientStrings.t("err.api.unexpected_state")) } } @@ -1309,7 +1311,7 @@ object APILayer { } // Fetch from API - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = authApi.getCurrentUser(token) // Update DataManager on success @@ -1389,7 +1391,7 @@ object APILayer { } suspend fun deleteAccount(password: String? = null, confirmation: String? = null): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = authApi.deleteAccount(token, DeleteAccountRequest(password = password, confirmation = confirmation)) // Clear DataManager on successful deletion @@ -1426,7 +1428,7 @@ object APILayer { bytes: ByteArray, fileName: String, ): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return uploadApi.uploadOne( token = token, category = category, @@ -1439,46 +1441,46 @@ object APILayer { // ==================== Notification Operations ==================== suspend fun registerDevice(request: DeviceRegistrationRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.registerDevice(token, request) } suspend fun unregisterDevice(deviceId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.unregisterDevice(token, deviceId) } suspend fun getNotificationPreferences(): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = notificationApi.getNotificationPreferences(token) if (result is ApiResult.Success) DataManager.setNotificationPreferences(result.data) return result } suspend fun updateNotificationPreferences(request: UpdateNotificationPreferencesRequest): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = notificationApi.updateNotificationPreferences(token, request) if (result is ApiResult.Success) DataManager.setNotificationPreferences(result.data) return result } suspend fun getNotificationHistory(): ApiResult> { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.getNotificationHistory(token) } suspend fun markNotificationAsRead(notificationId: Int): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.markNotificationAsRead(token, notificationId) } suspend fun markAllNotificationsAsRead(): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.markAllNotificationsAsRead(token) } suspend fun getUnreadCount(): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return notificationApi.getUnreadCount(token) } @@ -1489,7 +1491,7 @@ object APILayer { * Returns cached data from DataManager if available and forceRefresh is false. */ suspend fun getSubscriptionStatus(forceRefresh: Boolean = false): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) // Return cached subscription if available and not forcing refresh if (!forceRefresh) { @@ -1513,7 +1515,7 @@ object APILayer { * Verify Android purchase with backend */ suspend fun verifyAndroidPurchase(purchaseToken: String, productId: String): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return subscriptionApi.verifyAndroidPurchase(token, purchaseToken, productId) } @@ -1521,7 +1523,7 @@ object APILayer { * Verify iOS receipt with backend */ suspend fun verifyIOSReceipt(receiptData: String, transactionId: String): ApiResult { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) return subscriptionApi.verifyIOSReceipt(token, receiptData, transactionId) } @@ -1529,7 +1531,7 @@ object APILayer { * Fetch feature benefits from backend (requires auth). */ suspend fun getFeatureBenefits(): ApiResult> { - val token = getToken() ?: return ApiResult.Error("Not authenticated", 401) + val token = getToken() ?: return ApiResult.Error(ClientStrings.t("err.not_authenticated"), 401) val result = subscriptionApi.getFeatureBenefits(token) if (result is ApiResult.Success) { DataManager.setFeatureBenefits(result.data) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiClient.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiClient.kt index 1371e06..4dcb7b6 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiClient.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiClient.kt @@ -196,8 +196,8 @@ private suspend fun attemptTokenRefresh(currentToken: String): Boolean { * ([CoilAuthInterceptor] plumbing, tests) continue to compile. */ class TokenExpiredException(val refreshed: Boolean) : Exception( - if (refreshed) "Session was briefly rejected but is still valid — retry the request" - else "Session expired — user must re-authenticate" + if (refreshed) "Session was briefly rejected but is still valid — retry the request" // i18n-ignore: internal log/diagnostic message, non-UI + else "Session expired — user must re-authenticate" // i18n-ignore: internal log/diagnostic message, non-UI ) object ApiClient { diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiConfig.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiConfig.kt index b059a0c..1c798d1 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiConfig.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ApiConfig.kt @@ -67,9 +67,9 @@ object ApiConfig { */ fun getEnvironmentName(): String { return when (CURRENT_ENV) { - Environment.LOCAL -> "Local (${getLocalhostAddress()}:8000)" - Environment.DEV -> "Dev Server (devapi.myhoneydue.com)" - Environment.PROD -> "Production (api.myhoneydue.com)" + Environment.LOCAL -> "Local (${getLocalhostAddress()}:8000)" // i18n-ignore: dev environment label, non-UI debug menu + Environment.DEV -> "Dev Server (devapi.myhoneydue.com)" // i18n-ignore: dev environment label, non-UI debug menu + Environment.PROD -> "Production (api.myhoneydue.com)" // i18n-ignore: dev environment label, non-UI debug menu } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/AuthApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/AuthApi.kt index 5e6af8f..17bc5d2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/AuthApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/AuthApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.data.DataManager import com.tt.honeyDue.models.* import io.ktor.client.* @@ -102,12 +104,12 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Success(json.decodeFromString(KratosFlow.serializer(), response.bodyAsText())) } else { ApiResult.Error( - "Could not start $flow (Kratos ${response.status.value})", + ClientStrings.t("err.auth.could_not_start_flow", flow, response.status.value.toString()), response.status.value, ) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Could not reach the authentication server") + ApiResult.Error(e.message ?: ClientStrings.t("err.auth.could_not_reach_server")) } } @@ -134,7 +136,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(extractKratosError(text, response.status.value), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Authentication request failed") + ApiResult.Error(e.message ?: ClientStrings.t("err.auth.request_failed")) } } @@ -164,7 +166,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val msg = env.error?.reason ?: env.error?.message if (!msg.isNullOrBlank()) return msg } - return "Authentication failed ($statusCode)" + return ClientStrings.t("err.auth.authentication_failed_status", statusCode.toString()) } // ==================== Login ==================== @@ -179,7 +181,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val flow = when (val f = initFlow("login")) { is ApiResult.Success -> f.data is ApiResult.Error -> return f - else -> return ApiResult.Error("Could not start login") + else -> return ApiResult.Error(ClientStrings.t("err.auth.could_not_start_login")) } val body = json.encodeToString( KratosPasswordLoginBody.serializer(), @@ -197,7 +199,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { resolveSession(success.data.sessionToken, success.data.session) } is ApiResult.Error -> success - else -> ApiResult.Error("Login failed") + else -> ApiResult.Error(ClientStrings.t("err.auth.login_failed")) } } @@ -227,7 +229,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { when (val created = createAccount(request)) { is ApiResult.Success -> Unit is ApiResult.Error -> return created - else -> return ApiResult.Error("Registration failed") + else -> return ApiResult.Error(ClientStrings.t("err.auth.registration_failed")) } // 2. Log in immediately to get a session token. The identifier is the // email (the Kratos credential identifier), not the display username. @@ -252,7 +254,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(ErrorParser.parseError(response), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Could not create account") + ApiResult.Error(e.message ?: ClientStrings.t("err.auth.could_not_create_account")) } } @@ -279,7 +281,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val loginFlow = when (val f = initFlow("login")) { is ApiResult.Success -> f.data is ApiResult.Error -> return f - else -> return ApiResult.Error("Could not start sign-in") + else -> return ApiResult.Error(ClientStrings.t("err.auth.could_not_start_signin")) } val loginBody = json.encodeToString( KratosOidcBody.serializer(), @@ -302,7 +304,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val regFlow = when (val f = initFlow("registration")) { is ApiResult.Success -> f.data is ApiResult.Error -> return (loginResult as? ApiResult.Error) ?: f - else -> return ApiResult.Error("Could not start sign-up") + else -> return ApiResult.Error(ClientStrings.t("err.auth.could_not_start_signup")) } val regBody = json.encodeToString( KratosOidcBody.serializer(), @@ -320,13 +322,13 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val token = regResult.data.sessionToken if (token.isNullOrBlank()) { (loginResult as? ApiResult.Error) - ?: ApiResult.Error("Sign-in did not return a session") + ?: ApiResult.Error(ClientStrings.t("err.auth.signin_no_session")) } else { resolveSession(token, regResult.data.session) } } is ApiResult.Error -> regResult - else -> ApiResult.Error("Sign-in failed") + else -> ApiResult.Error(ClientStrings.t("err.auth.signin_failed")) } } @@ -350,7 +352,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { AppleSignInResponse(token = r.data.token, user = r.data.user, isNewUser = false), ) is ApiResult.Error -> r - else -> ApiResult.Error("Apple Sign In failed") + else -> ApiResult.Error(ClientStrings.t("err.auth.apple_signin_failed")) } } @@ -364,7 +366,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { GoogleSignInResponse(token = r.data.token, user = r.data.user, isNewUser = false), ) is ApiResult.Error -> r - else -> ApiResult.Error("Google Sign In failed") + else -> ApiResult.Error(ClientStrings.t("err.auth.google_signin_failed")) } } @@ -405,7 +407,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val flow = when (val f = initFlow("recovery")) { is ApiResult.Success -> f.data is ApiResult.Error -> return f - else -> return ApiResult.Error("Could not start password recovery") + else -> return ApiResult.Error(ClientStrings.t("err.auth.could_not_start_recovery")) } val body = json.encodeToString( KratosRecoveryBody.serializer(), @@ -424,12 +426,12 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val info = result.data?.ui?.messages?.firstOrNull()?.text ApiResult.Success( ForgotPasswordResponse( - message = info ?: "If that email exists, a recovery code has been sent.", + message = info ?: ClientStrings.t("auth.recovery_sent"), ), ) } is ApiResult.Error -> result - else -> ApiResult.Error("Could not send recovery code") + else -> ApiResult.Error(ClientStrings.t("err.auth.could_not_send_recovery_code")) } } @@ -445,7 +447,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { */ suspend fun verifyResetCode(request: VerifyResetCodeRequest): ApiResult { val action = pendingRecoveryAction - ?: return ApiResult.Error("Your recovery session expired. Request a new code.") + ?: return ApiResult.Error(ClientStrings.t("err.auth.recovery_session_expired")) val body = json.encodeToString( KratosRecoveryBody.serializer(), KratosRecoveryBody(code = request.code.trim()), @@ -464,7 +466,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { pendingRecoveryAction = null ApiResult.Success( VerifyResetCodeResponse( - message = "Code verified.", + message = ClientStrings.t("auth.code_verified"), // Opaque to the UI: carries the settings flow id and // the privileged session token resetPassword needs, // packed as "|". @@ -477,11 +479,11 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val msg = flow?.ui?.messages?.firstOrNull { it.type == "error" }?.text ?: flow?.ui?.nodes?.flatMap { it.messages } ?.firstOrNull { it.type == "error" }?.text - ApiResult.Error(msg ?: "Invalid or expired code") + ApiResult.Error(msg ?: ClientStrings.t("err.auth.invalid_code")) } } is ApiResult.Error -> result - else -> ApiResult.Error("Invalid or expired code") + else -> ApiResult.Error(ClientStrings.t("err.auth.invalid_code")) } } @@ -496,7 +498,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { suspend fun resetPassword(request: ResetPasswordRequest): ApiResult { val parts = request.resetToken.split("|", limit = 2) if (parts.size != 2 || parts[0].isBlank() || parts[1].isBlank()) { - return ApiResult.Error("This password reset session has expired. Request a new code.") + return ApiResult.Error(ClientStrings.t("err.auth.reset_session_expired")) } val settingsFlowId = parts[0] val sessionToken = parts[1] @@ -517,12 +519,12 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { } val text = response.bodyAsText() if (response.status.isSuccess()) { - ApiResult.Success(ResetPasswordResponse(message = "Password updated. You can now sign in.")) + ApiResult.Success(ResetPasswordResponse(message = ClientStrings.t("auth.password_updated"))) } else { ApiResult.Error(extractKratosError(text, response.status.value), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Could not reset password") + ApiResult.Error(e.message ?: ClientStrings.t("err.auth.could_not_reset_password")) } } @@ -554,7 +556,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { val flow = when (val f = initFlow("verification")) { is ApiResult.Success -> f.data is ApiResult.Error -> return f - else -> return ApiResult.Error("Could not start verification") + else -> return ApiResult.Error(ClientStrings.t("err.auth.could_not_start_verification")) } val body = json.encodeToString( KratosVerificationBody.serializer(), @@ -571,7 +573,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Success(Unit) } is ApiResult.Error -> result - else -> ApiResult.Error("Could not send verification code") + else -> ApiResult.Error(ClientStrings.t("err.auth.could_not_send_verification_code")) } } @@ -593,7 +595,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { suspend fun verifyEmail(token: String, request: VerifyEmailRequest): ApiResult { val pendingFlowId = DataManager.pendingVerificationFlowId.value if (pendingFlowId.isNullOrBlank()) { - return ApiResult.Error("Please request a verification code first.") + return ApiResult.Error(ClientStrings.t("err.auth.request_verification_first")) } val body = json.encodeToString( KratosVerificationBody.serializer(), @@ -609,18 +611,18 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { // One-shot — drop the cached flow so a future verification // (different account, address change, etc.) starts clean. DataManager.setPendingVerificationFlowId(null) - ApiResult.Success(VerifyEmailResponse(message = "Email verified.", verified = true)) + ApiResult.Success(VerifyEmailResponse(message = ClientStrings.t("auth.email_verified"), verified = true)) } else { // 200 with a re-rendered flow == wrong/expired code. Surface // Kratos' own message so the user knows to retry/resend. val msg = result.data?.ui?.messages?.firstOrNull { it.type == "error" }?.text ?: result.data?.ui?.nodes?.flatMap { it.messages } ?.firstOrNull { it.type == "error" }?.text - ApiResult.Error(msg ?: "Invalid or expired code. Tap resend for a new one.") + ApiResult.Error(msg ?: ClientStrings.t("err.auth.invalid_code_resend")) } } is ApiResult.Error -> result - else -> ApiResult.Error("Verification failed") + else -> ApiResult.Error(ClientStrings.t("err.auth.verification_failed")) } } @@ -641,10 +643,10 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to get user", response.status.value) + ApiResult.Error(ClientStrings.t("err.auth.failed_get_user"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -665,7 +667,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(ErrorParser.parseError(response), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -687,7 +689,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(ErrorParser.parseError(response), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -710,10 +712,10 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(TokenRefreshResponse(token = token)) } else { - ApiResult.Error("Session expired — please sign in again", response.status.value) + ApiResult.Error(ClientStrings.t("err.auth.session_expired"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Could not validate session") + ApiResult.Error(e.message ?: ClientStrings.t("err.auth.could_not_validate_session")) } } @@ -744,7 +746,7 @@ class AuthApi(private val client: HttpClient = ApiClient.httpClient) { me } } - else -> ApiResult.Error("Could not load profile after sign-in") + else -> ApiResult.Error(ClientStrings.t("err.auth.could_not_load_profile")) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ContractorApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ContractorApi.kt index d289250..59400f7 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ContractorApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ContractorApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -28,10 +30,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch contractors", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_contractors"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -44,10 +46,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch contractor", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_contractor"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -65,12 +67,12 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body() } catch (e: Exception) { - "Failed to create contractor" + ClientStrings.t("err.api.failed_create_contractor") } ApiResult.Error(errorBody, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -88,12 +90,12 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body() } catch (e: Exception) { - "Failed to update contractor" + ClientStrings.t("err.api.failed_update_contractor") } ApiResult.Error(errorBody, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -106,10 +108,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(Unit) } else { - ApiResult.Error("Failed to delete contractor", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_delete_contractor"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -122,10 +124,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to toggle favorite", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_toggle_favorite"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -138,10 +140,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch contractor tasks", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_contractor_tasks"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -154,10 +156,10 @@ class ContractorApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch contractors for residence", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_contractors_for_residence"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/DocumentApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/DocumentApi.kt index ba2ad3d..34857ac 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/DocumentApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/DocumentApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -37,10 +39,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch documents", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_documents"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -53,10 +55,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch document", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_document"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -117,12 +119,12 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { // Send first file as "file" (backend only accepts single file) append("file", fileBytesList[0], Headers.build { append(HttpHeaders.ContentType, mimeTypesList.getOrElse(0) { "application/octet-stream" }) - append(HttpHeaders.ContentDisposition, "filename=\"${fileNamesList.getOrElse(0) { "file_0" }}\"") + append(HttpHeaders.ContentDisposition, "filename=\"${fileNamesList.getOrElse(0) { "file_0" }}\"") // i18n-ignore: Content-Disposition filename, non-UI }) } else if (fileBytes != null && fileName != null && mimeType != null) { append("file", fileBytes, Headers.build { append(HttpHeaders.ContentType, mimeType) - append(HttpHeaders.ContentDisposition, "filename=\"$fileName\"") + append(HttpHeaders.ContentDisposition, "filename=\"$fileName\"") // i18n-ignore: Content-Disposition filename, non-UI }) } } @@ -155,12 +157,12 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body() } catch (e: Exception) { - "Failed to create document" + ClientStrings.t("err.api.failed_create_document") } ApiResult.Error(errorBody, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -212,12 +214,12 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body() } catch (e: Exception) { - "Failed to update document" + ClientStrings.t("err.api.failed_update_document") } ApiResult.Error(errorBody, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -230,10 +232,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(Unit) } else { - ApiResult.Error("Failed to delete document", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_delete_document"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -246,10 +248,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to download document", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_download_document"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -264,10 +266,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { val document: Document = response.body() ApiResult.Success(document) } else { - ApiResult.Error("Failed to activate document", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_activate_document"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -282,10 +284,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { val document: Document = response.body() ApiResult.Success(document) } else { - ApiResult.Error("Failed to deactivate document", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_deactivate_document"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -303,7 +305,7 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { formData = formData { append("image", imageBytes, Headers.build { append(HttpHeaders.ContentType, mimeType) - append(HttpHeaders.ContentDisposition, "filename=\"$fileName\"") + append(HttpHeaders.ContentDisposition, "filename=\"$fileName\"") // i18n-ignore: Content-Disposition filename, non-UI }) caption?.let { append("caption", it) } } @@ -317,12 +319,12 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body() } catch (e: Exception) { - "Failed to upload document image" + ClientStrings.t("err.api.failed_upload_document_image") } ApiResult.Error(errorBody, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -335,10 +337,10 @@ class DocumentApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to delete document image", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_delete_document_image"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ErrorParser.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ErrorParser.kt index cbf2146..28bd882 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ErrorParser.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ErrorParser.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.ErrorResponse import io.ktor.client.call.body import io.ktor.client.statement.HttpResponse @@ -22,9 +23,9 @@ object ErrorParser { if (response.status.value == 429) { val retryAfter = response.headers["Retry-After"]?.toLongOrNull() return if (retryAfter != null) { - "Too many requests. Please try again in $retryAfter seconds." + ClientStrings.t("err.too_many_requests_retry", retryAfter) } else { - "Too many requests. Please try again later." + ClientStrings.t("err.too_many_requests") } } @@ -47,9 +48,9 @@ object ErrorParser { // Add field-specific errors if present errorResponse.errors?.let { fieldErrors -> if (fieldErrors.isNotEmpty()) { - message.append("\n\nDetails:") + message.append("\n\n${ClientStrings.t("err.details")}") // i18n-ignore: interpolation residue; 'Details:' localized via ClientStrings fieldErrors.forEach { (field, errors) -> - message.append("\n• $field: ${errors.joinToString(", ")}") + message.append("\n• $field: ${errors.joinToString(", ")}") // i18n-ignore: interpolation residue; backend field name, non-UI prose } } } @@ -60,13 +61,13 @@ object ErrorParser { try { val simpleError = response.body>() simpleError["error"] ?: simpleError["message"] ?: simpleError["detail"] - ?: "An error occurred (${response.status.value})" + ?: ClientStrings.t("err.with_status", response.status.value) } catch (e2: Exception) { // Last resort: read as plain text try { response.body() } catch (e3: Exception) { - "An error occurred (${response.status.value})" + ClientStrings.t("err.with_status", response.status.value) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/LookupsApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/LookupsApi.kt index a54492e..4068f7a 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/LookupsApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/LookupsApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -42,10 +44,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch residence types", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_residence_types"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -58,10 +60,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch task frequencies", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_task_frequencies"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -74,10 +76,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch task priorities", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_task_priorities"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -90,10 +92,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch task categories", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_task_categories"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -106,10 +108,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch contractor specialties", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_contractor_specialties"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -123,10 +125,10 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch static data", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_static_data"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -158,18 +160,18 @@ class LookupsApi(private val client: HttpClient = ApiClient.httpClient) { response.status.isSuccess() -> { // Data has changed or first request - get new data and ETag val data: SeededDataResponse = response.body() - val newETag = response.headers["ETag"] + val newETag = response.headers["ETag"] // i18n-ignore: HTTP header name, non-UI ConditionalResult.Success(data, newETag) } else -> { ConditionalResult.Error( - "Failed to fetch seeded data", + ClientStrings.t("err.api.failed_fetch_seeded_data"), response.status.value ) } } } catch (e: Exception) { - ConditionalResult.Error(e.message ?: "Unknown error occurred") + ConditionalResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/NotificationApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/NotificationApi.kt index 6fdfc6a..069f192 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/NotificationApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/NotificationApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -29,12 +31,12 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { val errorBody = try { response.body>() } catch (e: Exception) { - mapOf("error" to "Device registration failed") + mapOf("error" to ClientStrings.t("err.api.device_registration_failed")) } - ApiResult.Error(errorBody["error"] ?: "Device registration failed", response.status.value) + ApiResult.Error(errorBody["error"] ?: ClientStrings.t("err.api.device_registration_failed"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -50,10 +52,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(Unit) } else { - ApiResult.Error("Device unregistration failed", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.device_unregistration_failed"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -69,10 +71,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to get preferences", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_get_preferences"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -93,10 +95,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to update preferences", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_update_preferences"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -110,10 +112,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { val listResponse: NotificationListResponse = response.body() ApiResult.Success(listResponse.results) } else { - ApiResult.Error("Failed to get notification history", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_get_notification_history"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -129,10 +131,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to mark notification as read", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_mark_notification_read"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -145,10 +147,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to mark all notifications as read", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_mark_all_notifications_read"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -161,10 +163,10 @@ class NotificationApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to get unread count", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_get_unread_count"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ResidenceApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ResidenceApi.kt index dff98f4..d696484 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ResidenceApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/ResidenceApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -18,10 +20,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch residences", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_residences"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -34,10 +36,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch residence", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_residence"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -52,10 +54,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to create residence", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_create_residence"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -70,10 +72,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to update residence", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_update_residence"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -86,10 +88,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to delete residence", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_delete_residence"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -102,10 +104,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch summary", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_summary"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -118,10 +120,10 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch my residences", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_my_residences"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -139,7 +141,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -156,7 +158,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -173,7 +175,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -196,7 +198,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -217,7 +219,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -236,7 +238,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -254,7 +256,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -271,7 +273,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -293,7 +295,7 @@ class ResidenceApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/SubscriptionApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/SubscriptionApi.kt index ebdcbf2..bb2cdb7 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/SubscriptionApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/SubscriptionApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -18,10 +20,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch subscription status", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_subscription_status"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -35,10 +37,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch upgrade triggers", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_upgrade_triggers"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -51,10 +53,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch feature benefits", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_feature_benefits"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -67,10 +69,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch promotions", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_promotions"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -97,10 +99,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to verify iOS receipt", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_verify_ios_receipt"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -127,10 +129,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to verify Android purchase", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_verify_android_purchase"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -162,10 +164,10 @@ class SubscriptionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to restore subscription", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_restore_subscription"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskApi.kt index 61de40a..8870731 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -26,7 +28,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -43,7 +45,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -62,7 +64,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -87,7 +89,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -106,7 +108,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -123,7 +125,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -145,7 +147,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -169,7 +171,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -214,16 +216,16 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { val data = response.body>() ApiResult.Success(data) } - HttpStatusCode.NotFound -> ApiResult.Error("Task not found", 404) - HttpStatusCode.Forbidden -> ApiResult.Error("Access denied", 403) + HttpStatusCode.NotFound -> ApiResult.Error(ClientStrings.t("err.api.task_not_found"), 404) + HttpStatusCode.Forbidden -> ApiResult.Error(ClientStrings.t("err.api.access_denied"), 403) HttpStatusCode.BadRequest -> { val errorBody = response.body() ApiResult.Error(errorBody, 400) } - else -> ApiResult.Error("Task $action failed: ${response.status}", response.status.value) + else -> ApiResult.Error(ClientStrings.t("err.api.task_action_failed", action, response.status.toString()), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -243,7 +245,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) { ApiResult.Error(errorMessage, response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskCompletionApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskCompletionApi.kt index 40a187c..a80728a 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskCompletionApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskCompletionApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.* import io.ktor.client.* import io.ktor.client.call.* @@ -19,10 +21,10 @@ class TaskCompletionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch completions", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_completions"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -35,10 +37,10 @@ class TaskCompletionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch completion", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_completion"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -53,10 +55,10 @@ class TaskCompletionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to create completion", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_create_completion"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -71,10 +73,10 @@ class TaskCompletionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to update completion", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_update_completion"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -87,10 +89,10 @@ class TaskCompletionApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to delete completion", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_delete_completion"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskTemplateApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskTemplateApi.kt index 7b90dd1..3bb3a93 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskTemplateApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/TaskTemplateApi.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings + import com.tt.honeyDue.models.TaskTemplate import com.tt.honeyDue.models.TaskSuggestionsResponse import com.tt.honeyDue.models.TaskTemplatesGroupedResponse @@ -25,10 +27,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch task templates", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_task_templates"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -42,10 +44,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch grouped task templates", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_grouped_task_templates"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -61,10 +63,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to search task templates", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_search_task_templates"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -78,10 +80,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch templates by category", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_templates_by_category"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -99,10 +101,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Failed to fetch task suggestions", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.failed_fetch_task_suggestions"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } @@ -116,10 +118,10 @@ class TaskTemplateApi(private val client: HttpClient = ApiClient.httpClient) { if (response.status.isSuccess()) { ApiResult.Success(response.body()) } else { - ApiResult.Error("Template not found", response.status.value) + ApiResult.Error(ClientStrings.t("err.api.template_not_found"), response.status.value) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Unknown error occurred") + ApiResult.Error(e.message ?: ClientStrings.t("err.unknown_occurred")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/UploadApi.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/UploadApi.kt index 5bac006..3ba026e 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/UploadApi.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/network/UploadApi.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.network +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.PresignUploadRequest import com.tt.honeyDue.models.PresignUploadResponse import io.ktor.client.* @@ -45,16 +46,16 @@ class UploadApi(private val client: HttpClient = ApiClient.httpClient) { } else { ApiResult.Error( when (response.status.value) { - 413 -> "That photo is too large after resizing." - 422 -> "That image format isn't supported." - 429 -> "Too many uploads in flight; try again shortly." - else -> "Couldn't start upload (HTTP ${response.status.value})." + 413 -> ClientStrings.t("upload.too_large") + 422 -> ClientStrings.t("upload.unsupported") + 429 -> ClientStrings.t("upload.too_many") + else -> ClientStrings.t("upload.start_failed") }, response.status.value, ) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Network error during presign") + ApiResult.Error(e.message ?: ClientStrings.t("upload.net_presign")) } } @@ -98,12 +99,12 @@ class UploadApi(private val client: HttpClient = ApiClient.httpClient) { "" } ApiResult.Error( - "Upload to storage failed (HTTP ${response.status.value}): $body", + ClientStrings.t("upload.storage_failed"), response.status.value, ) } } catch (e: Exception) { - ApiResult.Error(e.message ?: "Network error during upload") + ApiResult.Error(e.message ?: ClientStrings.t("upload.net_upload")) } } @@ -125,7 +126,7 @@ class UploadApi(private val client: HttpClient = ApiClient.httpClient) { val presignResult = presign(token, category, contentType, data.size.toLong()) val presigned = (presignResult as? ApiResult.Success)?.data ?: return ApiResult.Error( - (presignResult as? ApiResult.Error)?.message ?: "Presign failed", + (presignResult as? ApiResult.Error)?.message ?: ClientStrings.t("upload.failed"), (presignResult as? ApiResult.Error)?.code, ) @@ -138,7 +139,7 @@ class UploadApi(private val client: HttpClient = ApiClient.httpClient) { return when (putResult) { is ApiResult.Success -> ApiResult.Success(presigned.id) is ApiResult.Error -> putResult - else -> ApiResult.Error("Upload failed in unknown state") + else -> ApiResult.Error(ClientStrings.t("upload.failed")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/animation/TaskAnimations.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/animation/TaskAnimations.kt index 0853440..30472b2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/animation/TaskAnimations.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/animation/TaskAnimations.kt @@ -136,7 +136,7 @@ object TaskAnimations { * iOS: `.spring(response: 0.4, dampingFraction: 0.6)` */ val completionCheckmark = AnimationSpecValues( - name = "completionCheckmark", + name = "completionCheckmark", // i18n-ignore: animation transition label, non-UI durationMillis = 400, easing = Easing.SPRING, springResponseMillis = 400, @@ -150,7 +150,7 @@ object TaskAnimations { * exit starts). */ val cardEnter = AnimationSpecValues( - name = "cardEnter", + name = "cardEnter", // i18n-ignore: animation transition label, non-UI durationMillis = 350, easing = Easing.SPRING, springResponseMillis = 350, @@ -162,7 +162,7 @@ object TaskAnimations { * iOS: `.easeIn(duration: 0.3)` on the card shrink+fade. */ val cardDismiss = AnimationSpecValues( - name = "cardDismiss", + name = "cardDismiss", // i18n-ignore: animation transition label, non-UI durationMillis = 300, easing = Easing.EASE_IN, ) @@ -174,7 +174,7 @@ object TaskAnimations { * pulse so the motion reads as "breathing" at ~50bpm. */ val priorityPulse = LoopSpecValues( - name = "priorityPulse", + name = "priorityPulse", // i18n-ignore: animation transition label, non-UI periodMillis = 1200, easing = Easing.EASE_IN_OUT, reverses = true, @@ -186,7 +186,7 @@ object TaskAnimations { * cycle; we match that for the loading shimmer. */ val honeycombLoop = LoopSpecValues( - name = "honeycombLoop", + name = "honeycombLoop", // i18n-ignore: animation transition label, non-UI periodMillis = 8000, easing = Easing.LINEAR, reverses = false, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AddTaskDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AddTaskDialog.kt index 4a82dc5..f804858 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AddTaskDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AddTaskDialog.kt @@ -294,7 +294,7 @@ fun AddTaskDialog( frequency = freq showFrequencyDropdown = false // Clear interval days if frequency is not "Custom" - if (!freq.name.equals("Custom", ignoreCase = true)) { + if (!freq.name.equals("Custom", ignoreCase = true)) { // i18n-ignore: API enum value comparison, non-UI intervalDays = "" } } @@ -304,7 +304,7 @@ fun AddTaskDialog( } // Custom Interval Days (only for "Custom" frequency) - if (frequency.name.equals("Custom", ignoreCase = true)) { + if (frequency.name.equals("Custom", ignoreCase = true)) { // i18n-ignore: API enum value comparison, non-UI OutlinedTextField( value = intervalDays, onValueChange = { intervalDays = it.filter { char -> char.isDigit() } }, @@ -425,7 +425,7 @@ fun AddTaskDialog( description = description.ifBlank { null }, categoryId = if (category.id > 0) category.id else null, frequencyId = if (frequency.id > 0) frequency.id else null, - customIntervalDays = if (frequency.name.equals("Custom", ignoreCase = true) && intervalDays.isNotBlank()) { + customIntervalDays = if (frequency.name.equals("Custom", ignoreCase = true) && intervalDays.isNotBlank()) { // i18n-ignore: API enum value comparison, non-UI intervalDays.toIntOrNull() } else null, priorityId = if (priority.id > 0) priority.id else null, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ApiResultHandler.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ApiResultHandler.kt index 962ee27..35dbbd5 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ApiResultHandler.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ApiResultHandler.kt @@ -7,6 +7,9 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.tt.honeyDue.network.ApiResult +import honeydue.composeapp.generated.resources.Res +import honeydue.composeapp.generated.resources.error_network_title +import org.jetbrains.compose.resources.stringResource /** * Handles ApiResult states automatically with loading, error dialogs, and success content. @@ -38,9 +41,10 @@ fun ApiResultHandler( onRetry: () -> Unit, modifier: Modifier = Modifier, loadingContent: @Composable (() -> Unit)? = null, - errorTitle: String = "Network Error", + errorTitle: String? = null, content: @Composable (T) -> Unit ) { + val resolvedErrorTitle = errorTitle ?: stringResource(Res.string.error_network_title) var showErrorDialog by remember { mutableStateOf(false) } var errorMessage by remember { mutableStateOf("") } @@ -84,7 +88,7 @@ fun ApiResultHandler( // Error dialog if (showErrorDialog) { ErrorDialog( - title = errorTitle, + title = resolvedErrorTitle, message = errorMessage, onRetry = { showErrorDialog = false @@ -120,8 +124,9 @@ fun ApiResultHandler( @Composable fun ApiResult.HandleErrors( onRetry: () -> Unit, - errorTitle: String = "Network Error" + errorTitle: String? = null ) { + val resolvedErrorTitle = errorTitle ?: stringResource(Res.string.error_network_title) var showErrorDialog by remember { mutableStateOf(false) } var errorMessage by remember { mutableStateOf("") } @@ -134,7 +139,7 @@ fun ApiResult.HandleErrors( if (showErrorDialog) { ErrorDialog( - title = errorTitle, + title = resolvedErrorTitle, message = errorMessage, onRetry = { showErrorDialog = false diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AuthenticatedImage.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AuthenticatedImage.kt index 3f8446c..e66b556 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AuthenticatedImage.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/AuthenticatedImage.kt @@ -19,6 +19,8 @@ import coil3.network.httpHeaders import com.tt.honeyDue.network.ApiClient import com.tt.honeyDue.network.SESSION_TOKEN_HEADER import com.tt.honeyDue.storage.TokenStorage +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * A Compose component that loads images from authenticated API endpoints. @@ -114,13 +116,13 @@ private fun DefaultErrorContent() { ) { Icon( Icons.Default.BrokenImage, - contentDescription = "Failed to load", + contentDescription = stringResource(Res.string.image_failed_to_load), modifier = Modifier.size(40.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant ) Spacer(modifier = Modifier.height(4.dp)) Text( - "Failed to load", + stringResource(Res.string.image_failed_to_load), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/CompleteTaskDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/CompleteTaskDialog.kt index c774130..fbf3938 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/CompleteTaskDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/CompleteTaskDialog.kt @@ -88,6 +88,8 @@ fun CompleteTaskDialog( val noneManualEntry = stringResource(Res.string.completions_none_manual) val cancelText = stringResource(Res.string.common_cancel) val removeImageDesc = stringResource(Res.string.completions_remove_image) + val contractorPrefix = stringResource(Res.string.completions_contractor_prefix) + val completedByPrefix = stringResource(Res.string.completions_completed_by_prefix) AlertDialog( onDismissRequest = onDismiss, @@ -239,7 +241,7 @@ fun CompleteTaskDialog( val starColor by animateColorAsState( targetValue = if (isSelected) Color(0xFFFFD700) else MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.3f), animationSpec = tween(durationMillis = 150), - label = "starColor" + label = "starColor" // i18n-ignore: animation label, non-UI ) IconButton( @@ -251,7 +253,7 @@ fun CompleteTaskDialog( ) { Icon( imageVector = if (isSelected) Icons.Default.Star else Icons.Default.StarOutline, - contentDescription = "$star stars", + contentDescription = stringResource(Res.string.completions_star_rating_cd, star), tint = starColor, modifier = Modifier.size(32.dp) ) @@ -360,10 +362,10 @@ fun CompleteTaskDialog( // Build notes with contractor info if selected val notesWithContractor = buildString { if (selectedContractorName != null) { - append("Contractor: $selectedContractorName\n") + append("$contractorPrefix $selectedContractorName\n") // i18n-ignore: localized prefix var + data concatenation, no literal prose } if (completedByName.isNotBlank()) { - append("Completed by: $completedByName\n") + append("$completedByPrefix $completedByName\n") // i18n-ignore: localized prefix var + data concatenation, no literal prose } if (notes.isNotBlank()) { append(notes) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt index 115250f..f4393dc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ContractorImportDialog.kt @@ -156,7 +156,7 @@ fun ContractorImportSuccessDialog( icon = { Icon( imageVector = Icons.Default.CheckCircle, - contentDescription = "Success", + contentDescription = stringResource(Res.string.common_success), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.primary ) @@ -202,7 +202,7 @@ fun ContractorImportErrorDialog( icon = { Icon( imageVector = Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ErrorDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ErrorDialog.kt index a9d620e..960f57c 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ErrorDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ErrorDialog.kt @@ -10,6 +10,11 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.graphics.Color import com.tt.honeyDue.ui.haptics.Haptics +import honeydue.composeapp.generated.resources.Res +import honeydue.composeapp.generated.resources.error_network_title +import honeydue.composeapp.generated.resources.common_try_again +import honeydue.composeapp.generated.resources.common_cancel +import org.jetbrains.compose.resources.stringResource /** * Reusable error dialog component that shows network errors with retry/cancel options @@ -23,12 +28,12 @@ import com.tt.honeyDue.ui.haptics.Haptics */ @Composable fun ErrorDialog( - title: String = "Network Error", + title: String = stringResource(Res.string.error_network_title), message: String, onRetry: () -> Unit, onDismiss: () -> Unit, - retryButtonText: String = "Try Again", - dismissButtonText: String = "Cancel" + retryButtonText: String = stringResource(Res.string.common_try_again), + dismissButtonText: String = stringResource(Res.string.common_cancel) ) { // P5 Stream S — error haptic when the dialog appears LaunchedEffect(message) { Haptics.error() } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ManageUsersDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ManageUsersDialog.kt index 99f0e3b..4a67f3e 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ManageUsersDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ManageUsersDialog.kt @@ -25,6 +25,8 @@ import com.tt.honeyDue.models.ResidenceShareCode import com.tt.honeyDue.network.ApiResult import com.tt.honeyDue.network.APILayer import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import kotlinx.coroutines.launch @Composable @@ -83,10 +85,10 @@ fun ManageUsersDialog( modifier = Modifier.size(28.dp) ) Spacer(modifier = Modifier.width(AppSpacing.sm)) - Text("Invite Others") + Text(stringResource(Res.string.manage_users_invite_title)) } IconButton(onClick = onDismiss) { - Icon(Icons.Default.Close, "Close") + Icon(Icons.Default.Close, stringResource(Res.string.a11y_close)) } } }, @@ -101,7 +103,7 @@ fun ManageUsersDialog( } } else if (error != null) { Text( - text = error ?: "Unknown error", + text = error ?: stringResource(Res.string.error_generic), color = MaterialTheme.colorScheme.error, modifier = Modifier.padding(AppSpacing.lg) ) @@ -117,7 +119,7 @@ fun ManageUsersDialog( ) { Column(modifier = Modifier.padding(AppSpacing.lg)) { Text( - text = "Easy Share", + text = stringResource(Res.string.manage_users_easy_share), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -127,13 +129,13 @@ fun ManageUsersDialog( onClick = { onSharePackage() }, modifier = Modifier.fillMaxWidth() ) { - Icon(Icons.Default.Share, "Share", modifier = Modifier.size(18.dp)) + Icon(Icons.Default.Share, stringResource(Res.string.common_share), modifier = Modifier.size(18.dp)) Spacer(modifier = Modifier.width(AppSpacing.sm)) - Text("Send Invite Link") + Text(stringResource(Res.string.manage_users_send_invite)) } Text( - text = "Send a .honeydue file via Messages, Email, or share. They just tap to join.", + text = stringResource(Res.string.manage_users_easy_share_desc), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = AppSpacing.sm) @@ -148,7 +150,7 @@ fun ManageUsersDialog( ) { HorizontalDivider(modifier = Modifier.weight(1f)) Text( - text = "or", + text = stringResource(Res.string.manage_users_or), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(horizontal = AppSpacing.lg) @@ -165,7 +167,7 @@ fun ManageUsersDialog( ) { Column(modifier = Modifier.padding(AppSpacing.lg)) { Text( - text = "Share Code", + text = stringResource(Res.string.manage_users_share_code), style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -192,13 +194,13 @@ fun ManageUsersDialog( ) { Icon( Icons.Default.ContentCopy, - contentDescription = "Copy code", + contentDescription = stringResource(Res.string.manage_users_copy_code), tint = MaterialTheme.colorScheme.primary ) } } else { Text( - text = "No active code", + text = stringResource(Res.string.manage_users_no_code), style = MaterialTheme.typography.bodyMedium.copy( fontStyle = FontStyle.Italic ), @@ -235,15 +237,15 @@ fun ManageUsersDialog( strokeWidth = 2.dp ) } else { - Icon(Icons.Default.Refresh, "Generate", modifier = Modifier.size(18.dp)) + Icon(Icons.Default.Refresh, stringResource(Res.string.manage_users_generate), modifier = Modifier.size(18.dp)) } Spacer(modifier = Modifier.width(AppSpacing.sm)) - Text(if (shareCode != null) "Generate New Code" else "Generate Code") + Text(if (shareCode != null) stringResource(Res.string.manage_users_generate_new) else stringResource(Res.string.manage_users_generate)) } if (shareCode != null) { Text( - text = "Share this 6-character code. They can enter it in the app to join.", + text = stringResource(Res.string.manage_users_code_desc), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = AppSpacing.sm) @@ -255,7 +257,7 @@ fun ManageUsersDialog( // Users list Text( - text = "Users (${users.size})", + text = stringResource(Res.string.manage_users_users_count, users.size), style = MaterialTheme.typography.titleMedium, modifier = Modifier.padding(bottom = AppSpacing.sm) ) @@ -290,7 +292,7 @@ fun ManageUsersDialog( }, confirmButton = { TextButton(onClick = onDismiss) { - Text("Close") + Text(stringResource(Res.string.common_close)) } } ) @@ -324,7 +326,7 @@ private fun UserListItem( shape = MaterialTheme.shapes.small ) { Text( - text = "Owner", + text = stringResource(Res.string.manage_users_owner_badge), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onPrimaryContainer, modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp) @@ -355,7 +357,7 @@ private fun UserListItem( IconButton(onClick = onRemove) { Icon( Icons.Default.Delete, - contentDescription = "Remove user", + contentDescription = stringResource(Res.string.manage_users_remove_user), tint = MaterialTheme.colorScheme.error ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/PhotoViewerScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/PhotoViewerScreen.kt index 15eb292..ef0a7fb 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/PhotoViewerScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/PhotoViewerScreen.kt @@ -27,6 +27,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import coil3.compose.AsyncImage import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Full-screen photo viewer with swipeable gallery. @@ -87,7 +89,7 @@ fun PhotoViewerScreen( ) { Icon( Icons.Default.Close, - contentDescription = "Close", + contentDescription = stringResource(Res.string.common_close), tint = Color.White ) } @@ -122,11 +124,11 @@ fun PhotoViewerScreen( val isSelected = pagerState.currentPage == index val size by animateFloatAsState( targetValue = if (isSelected) 10f else 6f, - label = "dotSize" + label = "dotSize" // i18n-ignore: animation label, non-UI ) val alpha by animateFloatAsState( targetValue = if (isSelected) 1f else 0.5f, - label = "dotAlpha" + label = "dotAlpha" // i18n-ignore: animation label, non-UI ) Box( @@ -187,7 +189,7 @@ private fun ZoomableImage( ) { AsyncImage( model = imageUrl, - contentDescription = "Photo", + contentDescription = stringResource(Res.string.common_photo), modifier = Modifier .fillMaxSize() .graphicsLayer( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt index 74ab432..64298df 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/ResidenceImportDialog.kt @@ -145,7 +145,7 @@ fun ResidenceImportSuccessDialog( icon = { Icon( imageVector = Icons.Default.CheckCircle, - contentDescription = "Success", + contentDescription = stringResource(Res.string.common_success), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.primary ) @@ -191,7 +191,7 @@ fun ResidenceImportErrorDialog( icon = { Icon( imageVector = Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/TaskSuggestionDropdown.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/TaskSuggestionDropdown.kt index 75f0417..c3e0951 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/TaskSuggestionDropdown.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/TaskSuggestionDropdown.kt @@ -146,7 +146,7 @@ internal fun getCategoryColor(category: String): androidx.compose.ui.graphics.Co "safety", "electrical" -> MaterialTheme.colorScheme.error "hvac" -> MaterialTheme.colorScheme.primary "appliances" -> MaterialTheme.colorScheme.tertiary - "exterior", "lawn & garden" -> androidx.compose.ui.graphics.Color(0xFF34C759) + "exterior", "lawn & garden" -> androidx.compose.ui.graphics.Color(0xFF34C759) // i18n-ignore: category key color lookup, non-UI "interior" -> androidx.compose.ui.graphics.Color(0xFFAF52DE) "general", "seasonal" -> androidx.compose.ui.graphics.Color(0xFFFF9500) else -> MaterialTheme.colorScheme.primary diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/AuthHeader.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/AuthHeader.kt index 4fe9379..723f568 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/AuthHeader.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/AuthHeader.kt @@ -54,7 +54,7 @@ fun AuthHeaderPreview() { AuthHeader( icon = Icons.Default.Home, title = "honeyDue", - subtitle = "Manage your properties with ease", + subtitle = "Manage your properties with ease", // i18n-ignore: Compose @Preview sample data, not shipped UI modifier = Modifier.padding(32.dp) ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt index 151a3a3..1be3af7 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/auth/RequirementItem.kt @@ -14,6 +14,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import honeydue.composeapp.generated.resources.Res +import honeydue.composeapp.generated.resources.auth_requirement_met +import honeydue.composeapp.generated.resources.auth_requirement_not_met +import org.jetbrains.compose.resources.stringResource @Composable fun RequirementItem(text: String, satisfied: Boolean) { @@ -22,7 +26,7 @@ fun RequirementItem(text: String, satisfied: Boolean) { ) { Icon( if (satisfied) Icons.Default.CheckCircle else Icons.Default.Circle, - contentDescription = if (satisfied) "Requirement met" else "Requirement not met", + contentDescription = if (satisfied) stringResource(Res.string.auth_requirement_met) else stringResource(Res.string.auth_requirement_not_met), tint = if (satisfied) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.size(16.dp) ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/ErrorCard.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/ErrorCard.kt index 0393863..8584b5a 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/ErrorCard.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/ErrorCard.kt @@ -49,7 +49,7 @@ fun ErrorCard( fun ErrorCardPreview() { MaterialTheme { ErrorCard( - message = "Invalid username or password. Please try again.", + message = "Invalid username or password. Please try again.", // i18n-ignore: Compose @Preview sample data, not shipped UI modifier = Modifier.padding(16.dp) ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/InfoCard.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/InfoCard.kt index 988877d..6ca4ac6 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/InfoCard.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/InfoCard.kt @@ -59,11 +59,11 @@ fun InfoCardPreview() { MaterialTheme { InfoCard( icon = Icons.Default.Info, - title = "Sample Information" + title = "Sample Information" // i18n-ignore: Compose @Preview sample data, not shipped UI ) { - Text("This is sample content") - Text("Line 2 of content") - Text("Line 3 of content") + Text("This is sample content") // i18n-ignore: Compose @Preview sample data, not shipped UI + Text("Line 2 of content") // i18n-ignore: Compose @Preview sample data, not shipped UI + Text("Line 3 of content") // i18n-ignore: Compose @Preview sample data, not shipped UI } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt index b1d0965..6887a09 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StandardErrorState.kt @@ -11,6 +11,8 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * StandardErrorState - Inline error state with retry button @@ -34,9 +36,9 @@ fun StandardErrorState( message: String, onRetry: () -> Unit, modifier: Modifier = Modifier, - title: String = "Something went wrong", + title: String = stringResource(Res.string.error_something_wrong), icon: ImageVector = Icons.Default.ErrorOutline, - retryLabel: String = "Retry" + retryLabel: String = stringResource(Res.string.common_retry) ) { Column( modifier = modifier @@ -47,7 +49,7 @@ fun StandardErrorState( ) { Icon( imageVector = icon, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) @@ -79,7 +81,7 @@ fun CompactErrorState( message: String, onRetry: () -> Unit, modifier: Modifier = Modifier, - retryLabel: String = "Retry" + retryLabel: String = stringResource(Res.string.common_retry) ) { Card( colors = CardDefaults.cardColors( @@ -99,7 +101,7 @@ fun CompactErrorState( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.onErrorContainer ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StatItem.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StatItem.kt index 12cda7d..ead1f4d 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StatItem.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/common/StatItem.kt @@ -56,7 +56,7 @@ fun StatItemPreview() { StatItem( icon = Icons.Default.Home, value = "5", - label = "Properties" + label = "Properties" // i18n-ignore: Compose @Preview sample data, not shipped UI ) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt index f77dbdf..dc43fdf 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/dialogs/DeleteAccountDialog.kt @@ -61,7 +61,7 @@ fun DeleteAccountDialog( // Warning Icon Icon( imageVector = Icons.Default.Warning, - contentDescription = "Warning", + contentDescription = stringResource(Res.string.common_warning), tint = MaterialTheme.colorScheme.error, modifier = Modifier.size(48.dp) ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentCard.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentCard.kt index 32226ca..777c36a 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentCard.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentCard.kt @@ -21,6 +21,8 @@ import com.tt.honeyDue.models.DocumentType import com.tt.honeyDue.testing.AccessibilityIds import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun DocumentCard(document: Document, isWarrantyCard: Boolean = false, onClick: () -> Unit) { @@ -83,10 +85,10 @@ private fun WarrantyCardContent(document: Document, onClick: () -> Unit) { ) { Text( when { - !document.isActive -> "Inactive" - daysUntilExpiration < 0 -> "Expired" - daysUntilExpiration < 30 -> "Expiring soon" - else -> "Active" + !document.isActive -> stringResource(Res.string.documents_inactive) + daysUntilExpiration < 0 -> stringResource(Res.string.documents_expired) + daysUntilExpiration < 30 -> stringResource(Res.string.documents_expiring_soon) + else -> stringResource(Res.string.documents_active) }, style = MaterialTheme.typography.labelSmall, color = statusColor, @@ -102,19 +104,19 @@ private fun WarrantyCardContent(document: Document, onClick: () -> Unit) { horizontalArrangement = Arrangement.SpaceBetween ) { Column { - Text("Provider", style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant) - Text(document.provider ?: "N/A", style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium) + Text(stringResource(Res.string.documents_provider), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(document.provider ?: stringResource(Res.string.tasks_card_not_available), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium) } Column(horizontalAlignment = Alignment.End) { - Text("Expires", style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant) - Text(document.endDate ?: "N/A", style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium) + Text(stringResource(Res.string.documents_expires_label), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + Text(document.endDate ?: stringResource(Res.string.tasks_card_not_available), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium) } } if (document.isActive && daysUntilExpiration >= 0) { Spacer(modifier = Modifier.height(AppSpacing.sm)) Text( - "$daysUntilExpiration days remaining", + stringResource(Res.string.documents_days_remaining_count, daysUntilExpiration), style = MaterialTheme.typography.labelMedium, color = statusColor ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt index 8123ef7..c3b9775 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentStates.kt @@ -10,6 +10,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.unit.dp +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun EmptyState( @@ -35,12 +37,12 @@ fun ErrorState(message: String, onRetry: () -> Unit) { horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { - Icon(Icons.Default.Error, contentDescription = "Error", modifier = Modifier.size(64.dp) , tint = MaterialTheme.colorScheme.error) + Icon(Icons.Default.Error, contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(64.dp) , tint = MaterialTheme.colorScheme.error) Spacer(modifier = Modifier.height(16.dp)) Text(message, style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant) Spacer(modifier = Modifier.height(16.dp)) OutlinedButton(onClick = onRetry) { - Text("Retry") + Text(stringResource(Res.string.common_retry)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentsTabContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentsTabContent.kt index 6938f52..73e04fb 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentsTabContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/documents/DocumentsTabContent.kt @@ -19,6 +19,10 @@ import com.tt.honeyDue.network.ApiResult import com.tt.honeyDue.testing.AccessibilityIds import com.tt.honeyDue.ui.subscription.UpgradeFeatureScreen import com.tt.honeyDue.utils.SubscriptionHelper +import honeydue.composeapp.generated.resources.Res +import honeydue.composeapp.generated.resources.documents_empty_no_warranties +import honeydue.composeapp.generated.resources.documents_empty_no_documents +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -65,7 +69,7 @@ fun DocumentsTabContent( EmptyState( modifier = Modifier.testTag(AccessibilityIds.Document.emptyStateView), icon = if (isWarrantyTab) Icons.Default.ReceiptLong else Icons.Default.Description, - message = if (isWarrantyTab) "No warranties found" else "No documents found" + message = if (isWarrantyTab) stringResource(Res.string.documents_empty_no_warranties) else stringResource(Res.string.documents_empty_no_documents) ) } } else { diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/DetailRow.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/DetailRow.kt index 2c14eb0..c6fe5ac 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/DetailRow.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/DetailRow.kt @@ -48,8 +48,8 @@ fun DetailRowPreview() { MaterialTheme { DetailRow( icon = Icons.Default.SquareFoot, - label = "Square Footage", - value = "1800 sq ft" + label = "Square Footage", // i18n-ignore: Compose @Preview sample data, not shipped UI + value = "1800 sq ft" // i18n-ignore: Compose @Preview sample data, not shipped UI ) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/PropertyDetailItem.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/PropertyDetailItem.kt index 850e1bc..edb6975 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/PropertyDetailItem.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/PropertyDetailItem.kt @@ -48,7 +48,7 @@ fun PropertyDetailItemPreview() { PropertyDetailItem( icon = Icons.Default.Bed, value = "3", - label = "Bedrooms" + label = "Bedrooms" // i18n-ignore: Compose @Preview sample data, not shipped UI ) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/TaskStatChip.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/TaskStatChip.kt index 19cf3cf..14a4f42 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/TaskStatChip.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/residence/TaskStatChip.kt @@ -51,7 +51,7 @@ fun TaskStatChipPreview() { TaskStatChip( icon = Icons.Default.CheckCircle, value = "12", - label = "Completed", + label = "Completed", // i18n-ignore: Compose @Preview sample data, not shipped UI color = MaterialTheme.colorScheme.tertiary ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/CompletionHistorySheet.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/CompletionHistorySheet.kt index f8252f9..c21c421 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/CompletionHistorySheet.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/CompletionHistorySheet.kt @@ -17,6 +17,8 @@ import com.tt.honeyDue.models.TaskCompletion import com.tt.honeyDue.network.ApiResult import com.tt.honeyDue.network.APILayer import com.tt.honeyDue.util.DateUtils +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource import kotlinx.coroutines.launch /** @@ -66,7 +68,7 @@ fun CompletionHistorySheet( ) { // Header Text( - text = "Completion History", + text = stringResource(Res.string.completion_history_title), style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold, modifier = Modifier.padding(bottom = 8.dp) @@ -98,7 +100,8 @@ fun CompletionHistorySheet( shape = RoundedCornerShape(12.dp) ) { Text( - text = "${completions.size} ${if (completions.size == 1) "completion" else "completions"}", + text = if (completions.size == 1) stringResource(Res.string.completion_history_count_one, completions.size) + else stringResource(Res.string.completion_history_count_other, completions.size), modifier = Modifier.padding(horizontal = 12.dp, vertical = 6.dp), style = MaterialTheme.typography.labelMedium, color = MaterialTheme.colorScheme.onPrimaryContainer @@ -125,7 +128,7 @@ fun CompletionHistorySheet( ) Spacer(modifier = Modifier.height(16.dp)) Text( - text = "Loading completions...", + text = stringResource(Res.string.completion_history_loading), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -148,7 +151,7 @@ fun CompletionHistorySheet( ) Spacer(modifier = Modifier.height(16.dp)) Text( - text = "Failed to load completions", + text = stringResource(Res.string.completion_history_load_failed), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface @@ -182,7 +185,7 @@ fun CompletionHistorySheet( ) { Icon(Icons.Default.Refresh, contentDescription = null) // decorative Spacer(modifier = Modifier.width(8.dp)) - Text("Retry") + Text(stringResource(Res.string.common_retry)) } } } @@ -203,13 +206,13 @@ fun CompletionHistorySheet( ) Spacer(modifier = Modifier.height(16.dp)) Text( - text = "No Completions Yet", + text = stringResource(Res.string.completion_history_empty_title), style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurface ) Text( - text = "This task has not been completed.", + text = stringResource(Res.string.completion_history_empty_message), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -275,7 +278,7 @@ private fun CompletionHistoryCard(completion: TaskCompletionResponse) { ) Spacer(modifier = Modifier.width(4.dp)) Text( - text = "Completed by ${user.displayName}", + text = stringResource(Res.string.completion_history_completed_by, user.displayName), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -308,7 +311,7 @@ private fun CompletionHistoryCard(completion: TaskCompletionResponse) { if (completion.notes.isNotEmpty()) { Spacer(modifier = Modifier.height(12.dp)) Text( - text = "Notes", + text = stringResource(Res.string.completions_notes_label), style = MaterialTheme.typography.labelMedium, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurfaceVariant @@ -360,7 +363,8 @@ private fun CompletionHistoryCard(completion: TaskCompletionResponse) { ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = if (completion.images.size == 1) "View Photo" else "View Photos (${completion.images.size})", + text = if (completion.images.size == 1) stringResource(Res.string.completion_history_view_photo) + else stringResource(Res.string.tasks_card_view_photos, completion.images.size), style = MaterialTheme.typography.labelLarge, fontWeight = FontWeight.SemiBold ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/PhotoViewerDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/PhotoViewerDialog.kt index 03eb53c..499c7b2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/PhotoViewerDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/PhotoViewerDialog.kt @@ -28,6 +28,8 @@ import com.tt.honeyDue.network.ApiClient import com.tt.honeyDue.ui.components.AuthenticatedImage import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun PhotoViewerDialog( @@ -69,7 +71,7 @@ fun PhotoViewerDialog( verticalAlignment = Alignment.CenterVertically ) { Text( - text = if (selectedImage != null) "Photo" else "Completion Photos", + text = if (selectedImage != null) stringResource(Res.string.common_photo) else stringResource(Res.string.photos_completion_title), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold ) @@ -82,7 +84,7 @@ fun PhotoViewerDialog( }) { Icon( Icons.Default.Close, - contentDescription = "Close" + contentDescription = stringResource(Res.string.common_close) ) } } @@ -101,7 +103,7 @@ fun PhotoViewerDialog( ) { AuthenticatedImage( mediaUrl = selectedImage!!.mediaUrl, - contentDescription = selectedImage!!.caption ?: "Task completion photo", + contentDescription = selectedImage!!.caption ?: stringResource(Res.string.photos_task_completion_cd), modifier = Modifier .fillMaxWidth() .weight(1f), @@ -143,7 +145,7 @@ fun PhotoViewerDialog( Column { AuthenticatedImage( mediaUrl = image.mediaUrl, - contentDescription = image.caption ?: "Task completion photo", + contentDescription = image.caption ?: stringResource(Res.string.photos_task_completion_cd), modifier = Modifier .fillMaxWidth() .aspectRatio(1f), diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskCard.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskCard.kt index 8c1c718..d5e9627 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskCard.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskCard.kt @@ -660,8 +660,8 @@ fun TaskCardPreview() { id = 1, residenceId = 1, createdById = 1, - title = "Clean Gutters", - description = "Remove all debris from gutters and downspouts", + title = "Clean Gutters", // i18n-ignore: Compose @Preview sample data, not shipped UI + description = "Remove all debris from gutters and downspouts", // i18n-ignore: Compose @Preview sample data, not shipped UI category = TaskCategory(id = 1, name = "maintenance"), priority = TaskPriority(id = 2, name = "medium"), frequency = TaskFrequency( @@ -670,8 +670,8 @@ fun TaskCardPreview() { inProgress = false, dueDate = "2024-12-15", estimatedCost = 150.00, - createdAt = "2024-01-01T00:00:00Z", - updatedAt = "2024-01-01T00:00:00Z", + createdAt = "2024-01-01T00:00:00Z", // i18n-ignore: Compose @Preview sample data, not shipped UI + updatedAt = "2024-01-01T00:00:00Z", // i18n-ignore: Compose @Preview sample data, not shipped UI completions = emptyList() ), onCompleteClick = {}, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskKanbanView.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskKanbanView.kt index d29fa7b..1c053ef 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskKanbanView.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/components/task/TaskKanbanView.kt @@ -26,6 +26,8 @@ import com.tt.honeyDue.models.TaskDetail import com.tt.honeyDue.testing.AccessibilityIds import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalFoundationApi::class) @Composable @@ -53,7 +55,7 @@ fun TaskKanbanView( ) { page -> when (page) { 0 -> TaskColumn( - title = "Upcoming", + title = stringResource(Res.string.tasks_column_upcoming), icon = Icons.Default.CalendarToday, color = MaterialTheme.colorScheme.primary, count = upcomingTasks.size, @@ -67,7 +69,7 @@ fun TaskKanbanView( onUnarchiveTask = null ) 1 -> TaskColumn( - title = "In Progress", + title = stringResource(Res.string.tasks_column_in_progress), icon = Icons.Default.PlayCircle, color = MaterialTheme.colorScheme.tertiary, count = inProgressTasks.size, @@ -81,7 +83,7 @@ fun TaskKanbanView( onUnarchiveTask = null ) 2 -> TaskColumn( - title = "Done", + title = stringResource(Res.string.tasks_column_done), icon = Icons.Default.CheckCircle, color = MaterialTheme.colorScheme.secondary, count = doneTasks.size, @@ -95,7 +97,7 @@ fun TaskKanbanView( onUnarchiveTask = null ) 3 -> TaskColumn( - title = "Archived", + title = stringResource(Res.string.tasks_column_archived), icon = Icons.Default.Archive, color = MaterialTheme.colorScheme.outline, count = archivedTasks.size, @@ -193,7 +195,7 @@ private fun TaskColumn( ) Spacer(modifier = Modifier.height(AppSpacing.sm)) Text( - text = "No tasks", + text = stringResource(Res.string.tasks_column_empty), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -314,7 +316,7 @@ private fun DynamicTaskColumn( bottomPadding: androidx.compose.ui.unit.Dp = 0.dp ) { // Get icon from API response, with fallback - val columnIcon = getIconFromName(column.icons["android"] ?: "List") + val columnIcon = getIconFromName(column.icons["android"] ?: "List") // i18n-ignore: icon name identifier, non-UI val columnColor = hexToColor(column.color) @@ -378,7 +380,7 @@ private fun DynamicTaskColumn( ) Spacer(modifier = Modifier.height(AppSpacing.sm)) Text( - text = "No tasks", + text = stringResource(Res.string.tasks_column_empty), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/design/OrganicDesign.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/design/OrganicDesign.kt index e63696b..57ee547 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/design/OrganicDesign.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/design/OrganicDesign.kt @@ -157,9 +157,9 @@ class BlobShape( object Close : PathOp() fun toSerialized(): String = when (this) { - is MoveTo -> "M ${fmt(p.x)},${fmt(p.y)}" - is LineTo -> "L ${fmt(p.x)},${fmt(p.y)}" - is CubicTo -> "C ${fmt(c1.x)},${fmt(c1.y)} ${fmt(c2.x)},${fmt(c2.y)} ${fmt(end.x)},${fmt(end.y)}" + is MoveTo -> "M ${fmt(p.x)},${fmt(p.y)}" // i18n-ignore: SVG path command, non-UI geometry + is LineTo -> "L ${fmt(p.x)},${fmt(p.y)}" // i18n-ignore: SVG path command, non-UI geometry + is CubicTo -> "C ${fmt(c1.x)},${fmt(c1.y)} ${fmt(c2.x)},${fmt(c2.y)} ${fmt(end.x)},${fmt(end.y)}" // i18n-ignore: SVG path command, non-UI geometry Close -> "Z" } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/AllTasksScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/AllTasksScreen.kt index 3d0137c..93aa201 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/AllTasksScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/AllTasksScreen.kt @@ -28,6 +28,8 @@ import com.tt.honeyDue.viewmodel.TaskViewModel import com.tt.honeyDue.models.TaskDetail import com.tt.honeyDue.network.ApiResult import com.tt.honeyDue.ui.theme.* +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -102,7 +104,7 @@ fun AllTasksScreen( // Handle errors for task creation createTaskState.HandleErrors( onRetry = { /* Retry handled in dialog */ }, - errorTitle = "Failed to Create Task" + errorTitle = stringResource(Res.string.tasks_create_failed_title) ) LaunchedEffect(createTaskState) { @@ -125,7 +127,7 @@ fun AllTasksScreen( TopAppBar( title = { Text( - "All Tasks", + stringResource(Res.string.tasks_all_title), fontWeight = FontWeight.Bold ) }, @@ -136,7 +138,7 @@ fun AllTasksScreen( ) { Icon( Icons.Default.Refresh, - contentDescription = "Refresh" + contentDescription = stringResource(Res.string.common_refresh) ) } IconButton( @@ -147,7 +149,7 @@ fun AllTasksScreen( ) { Icon( Icons.Default.Add, - contentDescription = "Add Task" + contentDescription = stringResource(Res.string.tasks_add) ) } }, @@ -161,7 +163,7 @@ fun AllTasksScreen( state = tasksState, onRetry = { viewModel.loadTasks(forceRefresh = true) }, modifier = Modifier.padding(paddingValues), - errorTitle = "Failed to Load Tasks" + errorTitle = stringResource(Res.string.tasks_load_failed_title) ) { taskData -> val hasNoTasks = taskData.columns.all { it.tasks.isEmpty() } @@ -184,19 +186,19 @@ fun AllTasksScreen( iconColor = MaterialTheme.colorScheme.primary ) Text( - "No tasks yet", + stringResource(Res.string.tasks_empty_title), style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.textPrimary ) Text( - "Create your first task to get started", + stringResource(Res.string.tasks_all_empty_subtitle), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.textSecondary ) Spacer(modifier = Modifier.height(OrganicSpacing.compact)) OrganicPrimaryButton( - text = "Add Task", + text = stringResource(Res.string.tasks_add), onClick = { showNewTaskDialog = true }, modifier = Modifier .fillMaxWidth(0.7f) @@ -207,7 +209,7 @@ fun AllTasksScreen( if (myResidencesState is ApiResult.Success && (myResidencesState as ApiResult.Success).data.residences.isEmpty()) { Text( - "Add a property first from the Residences tab", + stringResource(Res.string.tasks_add_property_first), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.error ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/BiometricLockScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/BiometricLockScreen.kt index ba119bc..84c2f03 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/BiometricLockScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/BiometricLockScreen.kt @@ -47,6 +47,7 @@ fun BiometricLockScreen( val promptTitle = stringResource(Res.string.biometric_prompt_title) val promptSubtitle = stringResource(Res.string.biometric_prompt_subtitle) + val incorrectPinMessage = stringResource(Res.string.biometric_incorrect_pin) // Callback that maps platform result back onto the state machine. fun triggerPrompt() { @@ -134,7 +135,7 @@ fun BiometricLockScreen( if (showFallback) { // ----- Fallback PIN UI (after 3 biometric failures) ----- Text( - text = "Enter PIN to unlock", + text = stringResource(Res.string.biometric_enter_pin), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold, textAlign = TextAlign.Center @@ -148,7 +149,7 @@ fun BiometricLockScreen( pinError = null } }, - label = { Text("4-digit PIN") }, + label = { Text(stringResource(Res.string.biometric_pin_label)) }, singleLine = true, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.NumberPassword), isError = pinError != null, @@ -164,7 +165,7 @@ fun BiometricLockScreen( // storage. See BiometricLockScreen.kt:line // for the PIN constant below. if (!lockState.onPinEntered(pinInput, TODO_FALLBACK_PIN)) { - pinError = "Incorrect PIN" + pinError = incorrectPinMessage } }, enabled = pinInput.length == 4, @@ -174,7 +175,7 @@ fun BiometricLockScreen( shape = MaterialTheme.shapes.medium, ) { Text( - text = "Unlock", + text = stringResource(Res.string.biometric_unlock), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/CompleteTaskScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/CompleteTaskScreen.kt index 0f4e9dc..9c96cfe 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/CompleteTaskScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/CompleteTaskScreen.kt @@ -165,7 +165,7 @@ fun CompleteTaskScreen( modifier = Modifier .fillMaxWidth() .padding(horizontal = OrganicSpacing.lg) - .clickableWithRipple(onClickLabel = "Select contractor") { + .clickableWithRipple(onClickLabel = stringResource(Res.string.completions_select_contractor)) { showContractorPicker = true } ) { @@ -305,7 +305,7 @@ fun CompleteTaskScreen( targetValue = if (isSelected) Color(0xFFFFD700) else MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.3f), animationSpec = tween(durationMillis = 150), - label = "starColor" + label = "starColor" // i18n-ignore: animation label, non-UI ) IconButton( @@ -317,7 +317,7 @@ fun CompleteTaskScreen( ) { Icon( imageVector = if (isSelected) Icons.Default.Star else Icons.Default.StarOutline, - contentDescription = "$star stars", + contentDescription = stringResource(Res.string.completions_star_rating_cd, star), tint = starColor, modifier = Modifier.size(40.dp) ) @@ -395,6 +395,8 @@ fun CompleteTaskScreen( Spacer(modifier = Modifier.height(OrganicSpacing.xl)) // Complete Button + val contractorPrefix = stringResource(Res.string.completions_contractor_prefix) + val completedByPrefix = stringResource(Res.string.completions_completed_by_prefix) OrganicPrimaryButton( text = stringResource(Res.string.completions_complete_button), onClick = { @@ -402,12 +404,12 @@ fun CompleteTaskScreen( isSubmitting = true val notesWithContractor = buildString { selectedContractor?.let { - append("Contractor: ${it.name}") + append("$contractorPrefix ${it.name}") it.company?.let { company -> append(" ($company)") } append("\n") } if (completedByName.isNotBlank()) { - append("Completed by: $completedByName\n") + append("$completedByPrefix $completedByName\n") // i18n-ignore: localized prefix var + data concatenation, no literal prose } if (notes.isNotBlank()) { append(notes) @@ -527,7 +529,7 @@ private fun ImageThumbnailCard( modifier = Modifier .align(Alignment.TopEnd) .minTouchTarget() - .clickableWithRipple(onClickLabel = "Remove photo", onClick = onRemove), + .clickableWithRipple(onClickLabel = stringResource(Res.string.completions_remove_photo), onClick = onRemove), contentAlignment = Alignment.Center, ) { Box( @@ -585,7 +587,7 @@ private fun ContractorPickerSheet( if (selectedContractor == null) { Icon( Icons.Default.Check, - contentDescription = "Selected", + contentDescription = stringResource(Res.string.common_selected), tint = MaterialTheme.colorScheme.primary ) } @@ -617,7 +619,7 @@ private fun ContractorPickerSheet( if (selectedContractor?.id == contractor.id) { Icon( Icons.Default.Check, - contentDescription = "Selected", + contentDescription = stringResource(Res.string.common_selected), tint = MaterialTheme.colorScheme.primary ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ContractorDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ContractorDetailScreen.kt index 8ac7874..ff44ead 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ContractorDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ContractorDetailScreen.kt @@ -157,6 +157,7 @@ fun ContractorDetailScreen( CircularProgressIndicator(color = MaterialTheme.colorScheme.primary) } ) { contractor -> + val propertyRefLabel = stringResource(Res.string.contractors_property_ref) LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(OrganicSpacing.medium), @@ -281,7 +282,7 @@ fun ContractorDetailScreen( .testTag(AccessibilityIds.Contractor.callButton), onClick = { try { - uriHandler.openUri("tel:${phone.replace(" ", "")}") + uriHandler.openUri("tel:${phone.replace(" ", "")}") // i18n-ignore: tel: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -297,7 +298,7 @@ fun ContractorDetailScreen( .testTag(AccessibilityIds.Contractor.emailButton), onClick = { try { - uriHandler.openUri("mailto:$email") + uriHandler.openUri("mailto:$email") // i18n-ignore: mailto: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -332,7 +333,7 @@ fun ContractorDetailScreen( contractor.stateProvince, contractor.postalCode ).joinToString(", ") - uriHandler.openUri("geo:0,0?q=$address") + uriHandler.openUri("geo:0,0?q=$address") // i18n-ignore: geo: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -352,7 +353,7 @@ fun ContractorDetailScreen( iconTint = MaterialTheme.colorScheme.primary, onClick = { try { - uriHandler.openUri("tel:${phone.replace(" ", "")}") + uriHandler.openUri("tel:${phone.replace(" ", "")}") // i18n-ignore: tel: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -366,7 +367,7 @@ fun ContractorDetailScreen( iconTint = MaterialTheme.colorScheme.secondary, onClick = { try { - uriHandler.openUri("mailto:$email") + uriHandler.openUri("mailto:$email") // i18n-ignore: mailto: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -432,7 +433,7 @@ fun ContractorDetailScreen( contractor.stateProvince, contractor.postalCode ).joinToString(", ") - uriHandler.openUri("geo:0,0?q=$address") + uriHandler.openUri("geo:0,0?q=$address") // i18n-ignore: geo: URI, non-UI } catch (e: Exception) { /* Handle error */ } } ) @@ -444,7 +445,7 @@ fun ContractorDetailScreen( // Associated Property contractor.residenceId?.let { resId -> val residenceName = residences.find { r -> r.id == resId }?.name - ?: "Property #$resId" + ?: "$propertyRefLabel$resId" item { DetailSection(title = stringResource(Res.string.contractors_associated_property)) { @@ -683,7 +684,7 @@ fun ClickableDetailRow( } Icon( Icons.Default.OpenInNew, - contentDescription = "Open", + contentDescription = stringResource(Res.string.common_open), modifier = Modifier.size(16.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/DocumentDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/DocumentDetailScreen.kt index 9d39943..18f957c 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/DocumentDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/DocumentDetailScreen.kt @@ -295,8 +295,8 @@ fun DocumentDetailScreen( ) OrganicDivider() - document.residenceId?.let { DetailRow(stringResource(Res.string.documents_residence), "Residence #$it") } - document.taskId?.let { DetailRow(stringResource(Res.string.documents_contractor), "Task #$it") } + document.residenceId?.let { DetailRow(stringResource(Res.string.documents_residence), stringResource(Res.string.documents_residence_ref, it)) } + document.taskId?.let { DetailRow(stringResource(Res.string.documents_contractor), stringResource(Res.string.documents_task_ref, it)) } } } @@ -531,7 +531,7 @@ fun DocumentImageViewer( verticalAlignment = Alignment.CenterVertically ) { Text( - text = if (showFullImage) "Image ${selectedIndex + 1} of ${images.size}" else "Document Images", + text = if (showFullImage) stringResource(Res.string.documents_image_index, selectedIndex + 1, images.size) else stringResource(Res.string.documents_images_title), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold ) @@ -544,7 +544,7 @@ fun DocumentImageViewer( }) { Icon( Icons.Default.Close, - contentDescription = "Close" + contentDescription = stringResource(Res.string.common_close) ) } } @@ -594,17 +594,17 @@ fun DocumentImageViewer( onClick = { selectedIndex = (selectedIndex - 1 + images.size) % images.size }, enabled = selectedIndex > 0 ) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, "Previous") + Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(Res.string.documents_previous)) Spacer(modifier = Modifier.width(OrganicSpacing.sm)) - Text("Previous") + Text(stringResource(Res.string.documents_previous)) } OutlinedButton( onClick = { selectedIndex = (selectedIndex + 1) % images.size }, enabled = selectedIndex < images.size - 1 ) { - Text("Next") + Text(stringResource(Res.string.documents_next)) Spacer(modifier = Modifier.width(OrganicSpacing.sm)) - Icon(Icons.AutoMirrored.Filled.ArrowForward, "Next") + Icon(Icons.AutoMirrored.Filled.ArrowForward, stringResource(Res.string.documents_next)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/EditTaskScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/EditTaskScreen.kt index 996b6c9..c0b5955 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/EditTaskScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/EditTaskScreen.kt @@ -210,7 +210,7 @@ fun EditTaskScreen( selectedFrequency = frequency frequencyExpanded = false // Clear custom interval if not Custom frequency - if (!frequency.name.equals("Custom", ignoreCase = true)) { + if (!frequency.name.equals("Custom", ignoreCase = true)) { // i18n-ignore: API enum value comparison, non-UI customIntervalDays = "" } } @@ -220,7 +220,7 @@ fun EditTaskScreen( } // Custom Interval Days (only for "Custom" frequency) - if (selectedFrequency?.name?.equals("Custom", ignoreCase = true) == true) { + if (selectedFrequency?.name?.equals("Custom", ignoreCase = true) == true) { // i18n-ignore: API enum value comparison, non-UI OutlinedTextField( value = customIntervalDays, onValueChange = { customIntervalDays = it.filter { char -> char.isDigit() } }, @@ -325,7 +325,7 @@ fun EditTaskScreen( description = description.ifBlank { null }, categoryId = selectedCategory!!.id, frequencyId = selectedFrequency!!.id, - customIntervalDays = if (selectedFrequency?.name?.equals("Custom", ignoreCase = true) == true && customIntervalDays.isNotBlank()) { + customIntervalDays = if (selectedFrequency?.name?.equals("Custom", ignoreCase = true) == true && customIntervalDays.isNotBlank()) { // i18n-ignore: API enum value comparison, non-UI customIntervalDays.toIntOrNull() } else null, priorityId = selectedPriority!!.id, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt index 248891b..76624cf 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ForgotPasswordScreen.kt @@ -40,7 +40,7 @@ fun ForgotPasswordScreen( viewModel.setEmail(email) viewModel.requestPasswordReset(email) }, - errorTitle = "Failed to Send Reset Code" + errorTitle = stringResource(Res.string.forgot_send_failed_title) ) // Handle automatic navigation to next step @@ -138,7 +138,7 @@ fun ForgotPasswordScreen( ) Text( - "We'll send a 6-digit verification code to this address", + stringResource(Res.string.forgot_send_code_hint), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center @@ -161,11 +161,11 @@ fun ForgotPasswordScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = "Success", + contentDescription = stringResource(Res.string.common_success), tint = MaterialTheme.colorScheme.primary ) Text( - "Check your email for a 6-digit verification code", + stringResource(Res.string.forgot_check_email_msg), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textPrimary ) @@ -192,7 +192,7 @@ fun ForgotPasswordScreen( modifier = Modifier.fillMaxWidth() ) { Text( - "Remember your password? Back to Login", + stringResource(Res.string.forgot_back_to_login), style = MaterialTheme.typography.bodyMedium ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/LoginScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/LoginScreen.kt index a4a8473..880495e 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/LoginScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/LoginScreen.kt @@ -228,7 +228,7 @@ fun LoginScreen( modifier = Modifier.weight(1f) ) Text( - text = "or", + text = stringResource(Res.string.common_or), modifier = Modifier.padding(horizontal = OrganicSpacing.lg), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ManageUsersScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ManageUsersScreen.kt index ed2cd6b..5bde2ff 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ManageUsersScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ManageUsersScreen.kt @@ -50,6 +50,7 @@ fun ManageUsersScreen( val scope = rememberCoroutineScope() val clipboardManager = LocalClipboardManager.current val snackbarHostState = remember { SnackbarHostState() } + val codeCopiedMessage = stringResource(Res.string.manage_users_code_copied) // Extracted so retry can reuse it. suspend fun loadUsers() { @@ -115,8 +116,8 @@ fun ManageUsersScreen( } } else if (error != null) { StandardErrorState( - title = "Couldn't load users", - message = error ?: "Unknown error", + title = stringResource(Res.string.manage_users_load_failed), + message = error ?: stringResource(Res.string.error_generic), onRetry = { scope.launch { loadUsers() } }, modifier = Modifier.padding(paddingValues) ) @@ -245,13 +246,13 @@ fun ManageUsersScreen( onClick = { clipboardManager.setText(AnnotatedString(shareCode!!.code)) scope.launch { - snackbarHostState.showSnackbar("Code copied to clipboard") + snackbarHostState.showSnackbar(codeCopiedMessage) } } ) { Icon( Icons.Default.ContentCopy, - contentDescription = "Copy code", + contentDescription = stringResource(Res.string.manage_users_copy_code), tint = MaterialTheme.colorScheme.primary ) } @@ -341,7 +342,7 @@ fun ManageUsersScreen( AlertDialog( onDismissRequest = { showRemoveConfirmation = null }, title = { Text(stringResource(Res.string.manage_users_remove)) }, - text = { Text("Remove ${user.username} from this property?") }, + text = { Text(stringResource(Res.string.manage_users_remove_confirm, user.username)) }, confirmButton = { TextButton( onClick = { diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt index 6826047..b8357d4 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/NotificationPreferencesScreen.kt @@ -296,7 +296,7 @@ fun NotificationPreferencesScreen( ) { Icon( Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error, ) Text( @@ -702,13 +702,13 @@ private fun HourPickerDialog( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly, ) { - HourColumn(label = "AM", range = 6..11, selectedHour = selectedHour) { + HourColumn(label = stringResource(Res.string.time_am), range = 6..11, selectedHour = selectedHour) { selectedHour = it } - HourColumn(label = "PM", range = 12..17, selectedHour = selectedHour) { + HourColumn(label = stringResource(Res.string.time_pm), range = 12..17, selectedHour = selectedHour) { selectedHour = it } - HourColumn(label = "EVE", range = 18..23, selectedHour = selectedHour) { + HourColumn(label = stringResource(Res.string.time_eve), range = 18..23, selectedHour = selectedHour) { selectedHour = it } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt index 6b7f53b..9151fc7 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ProfileScreen.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.tt.honeyDue.ui.components.HandleErrors +import com.tt.honeyDue.ui.screens.theme.themeDisplayName import com.tt.honeyDue.ui.components.common.ErrorCard import com.tt.honeyDue.ui.components.dialogs.DeleteAccountDialog import com.tt.honeyDue.utils.SubscriptionHelper @@ -267,7 +268,7 @@ fun ProfileScreen( fontWeight = FontWeight.SemiBold ) Text( - text = currentTheme.displayName, + text = themeDisplayName(currentTheme.id), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.primary ) @@ -379,7 +380,7 @@ fun ProfileScreen( modifier = Modifier .fillMaxWidth() .clickable { - uriHandler.openUri("mailto:honeydueSupport@treymail.com?subject=honeyDue%20Support%20Request") + uriHandler.openUri("mailto:honeydueSupport@treymail.com?subject=honeyDue%20Support%20Request") // i18n-ignore: mailto: support URI, non-UI } .naturalShadow() ) { @@ -471,7 +472,7 @@ fun ProfileScreen( ) { Icon( imageVector = Icons.Default.Star, - contentDescription = "Subscription", + contentDescription = stringResource(Res.string.profile_subscription_cd), tint = if (SubscriptionHelper.currentTier == "pro") MaterialTheme.colorScheme.tertiary else MaterialTheme.colorScheme.onSurfaceVariant ) @@ -636,7 +637,7 @@ fun ProfileScreen( ) { Icon( Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error ) Text( @@ -666,7 +667,7 @@ fun ProfileScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = "Success", + contentDescription = stringResource(Res.string.common_success), tint = MaterialTheme.colorScheme.onPrimaryContainer ) Text( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResetPasswordScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResetPasswordScreen.kt index bbc3695..f1c61ef 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResetPasswordScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResetPasswordScreen.kt @@ -43,7 +43,7 @@ fun ResetPasswordScreen( // Handle errors for password reset resetPasswordState.HandleErrors( onRetry = { viewModel.resetPassword(newPassword, confirmPassword) }, - errorTitle = "Password Reset Failed" + errorTitle = stringResource(Res.string.reset_pw_failed_title) ) val errorMessage = when (resetPasswordState) { @@ -116,7 +116,7 @@ fun ResetPasswordScreen( ) Text( - text = "Success!", + text = stringResource(Res.string.common_success), style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.textPrimary, @@ -124,7 +124,7 @@ fun ResetPasswordScreen( ) Text( - text = "Your password has been reset successfully", + text = stringResource(Res.string.reset_pw_success_msg), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center @@ -136,7 +136,7 @@ fun ResetPasswordScreen( showBlob = false ) { Text( - "You can now log in with your new password", + stringResource(Res.string.reset_pw_can_login), modifier = Modifier.padding(OrganicSpacing.cozy), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textPrimary, @@ -149,7 +149,7 @@ fun ResetPasswordScreen( ) OrganicPrimaryButton( - text = "Return to Login", + text = stringResource(Res.string.reset_return_to_login), onClick = onPasswordResetSuccess ) } else { @@ -163,7 +163,7 @@ fun ResetPasswordScreen( ) Text( - text = "Set New Password", + text = stringResource(Res.string.reset_set_new_pw_title), style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.textPrimary, @@ -171,7 +171,7 @@ fun ResetPasswordScreen( ) Text( - text = "Create a strong password to secure your account", + text = stringResource(Res.string.reset_create_strong_pw), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center @@ -190,7 +190,7 @@ fun ResetPasswordScreen( verticalArrangement = Arrangement.spacedBy(OrganicSpacing.compact) ) { Text( - "Password Requirements", + stringResource(Res.string.reset_pw_requirements), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.textPrimary @@ -233,7 +233,7 @@ fun ResetPasswordScreen( IconButton(onClick = { newPasswordVisible = !newPasswordVisible }) { Icon( if (newPasswordVisible) Icons.Default.Visibility else Icons.Default.VisibilityOff, - contentDescription = if (newPasswordVisible) "Hide password" else "Show password" + contentDescription = if (newPasswordVisible) stringResource(Res.string.auth_hide_password) else stringResource(Res.string.auth_show_password) ) } }, @@ -257,7 +257,7 @@ fun ResetPasswordScreen( IconButton(onClick = { confirmPasswordVisible = !confirmPasswordVisible }) { Icon( if (confirmPasswordVisible) Icons.Default.Visibility else Icons.Default.VisibilityOff, - contentDescription = if (confirmPasswordVisible) "Hide password" else "Show password" + contentDescription = if (confirmPasswordVisible) stringResource(Res.string.auth_hide_password) else stringResource(Res.string.auth_show_password) ) } }, @@ -274,7 +274,7 @@ fun ResetPasswordScreen( ) OrganicPrimaryButton( - text = if (isLoggingIn) "Logging in..." else stringResource(Res.string.auth_reset_button), + text = if (isLoggingIn) stringResource(Res.string.auth_logging_in) else stringResource(Res.string.auth_reset_button), onClick = { viewModel.resetPassword(newPassword, confirmPassword) }, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceDetailScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceDetailScreen.kt index 2df2c6e..91eb6cc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceDetailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceDetailScreen.kt @@ -402,7 +402,7 @@ fun ResidenceDetailScreen( AlertDialog( onDismissRequest = { showShareError = false }, title = { Text(stringResource(Res.string.common_error)) }, - text = { Text(shareState.error ?: "Failed to share residence") }, + text = { Text(shareState.error ?: stringResource(Res.string.residence_share_failed)) }, confirmButton = { TextButton(onClick = { showShareError = false }) { Text(stringResource(Res.string.common_ok)) @@ -666,13 +666,13 @@ fun ResidenceDetailScreen( } if (residence.apartmentUnit != null) { Text( - text = "Unit: ${residence.apartmentUnit}", + text = stringResource(Res.string.residence_unit_label, residence.apartmentUnit), color = MaterialTheme.colorScheme.textSecondary ) } if (residence.city != null || residence.stateProvince != null || residence.postalCode != null) { Text( - text = "${residence.city ?: ""}, ${residence.stateProvince ?: ""} ${residence.postalCode ?: ""}", + text = "${residence.city ?: ""}, ${residence.stateProvince ?: ""} ${residence.postalCode ?: ""}", // i18n-ignore: address data concatenation, no translatable prose color = MaterialTheme.colorScheme.textSecondary ) } @@ -876,7 +876,7 @@ fun ResidenceDetailScreen( is ApiResult.Error -> { item { CompactErrorState( - message = "Error loading tasks: ${com.tt.honeyDue.util.ErrorMessageParser.parse((tasksState as ApiResult.Error).message)}", + message = stringResource(Res.string.residence_error_loading_tasks, com.tt.honeyDue.util.ErrorMessageParser.parse((tasksState as ApiResult.Error).message)), onRetry = { residenceViewModel.loadResidenceTasks(residenceId) } ) } @@ -1011,7 +1011,7 @@ fun ResidenceDetailScreen( is ApiResult.Error -> { item { CompactErrorState( - message = "Error loading contractors: ${com.tt.honeyDue.util.ErrorMessageParser.parse((contractorsState as ApiResult.Error).message)}", + message = stringResource(Res.string.residence_error_loading_contractors, com.tt.honeyDue.util.ErrorMessageParser.parse((contractorsState as ApiResult.Error).message)), onRetry = { residenceViewModel.loadResidenceContractors(residenceId) } ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceFormScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceFormScreen.kt index b7f65ce..d088a33 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceFormScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidenceFormScreen.kt @@ -390,7 +390,7 @@ fun ResidenceFormScreen( if (isEditMode && isCurrentUserOwner) { OrganicDivider() Text( - text = "Shared Users (${users.size})", + text = stringResource(Res.string.properties_shared_users_count, users.size), style = MaterialTheme.typography.titleMedium, color = MaterialTheme.colorScheme.primary ) @@ -404,7 +404,7 @@ fun ResidenceFormScreen( } } else if (users.isEmpty()) { Text( - text = "No shared users", + text = stringResource(Res.string.properties_no_shared_users), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(vertical = OrganicSpacing.compact) @@ -422,7 +422,7 @@ fun ResidenceFormScreen( } Text( - text = "Users with access to this residence. Use the share button to invite others.", + text = stringResource(Res.string.properties_shared_users_helper), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier.padding(top = 4.dp) @@ -485,9 +485,9 @@ fun ResidenceFormScreen( showRemoveUserConfirmation = false userToRemove = null }, - title = { Text("Remove User") }, + title = { Text(stringResource(Res.string.properties_remove_user)) }, text = { - Text("Are you sure you want to remove ${userToRemove?.username} from this residence?") + Text(stringResource(Res.string.properties_remove_user_confirm, userToRemove?.username ?: "")) }, confirmButton = { TextButton( @@ -514,7 +514,7 @@ fun ResidenceFormScreen( contentColor = MaterialTheme.colorScheme.error ) ) { - Text("Remove") + Text(stringResource(Res.string.properties_remove_button)) } }, dismissButton = { @@ -524,7 +524,7 @@ fun ResidenceFormScreen( userToRemove = null } ) { - Text("Cancel") + Text(stringResource(Res.string.common_cancel)) } } ) @@ -572,7 +572,7 @@ private fun UserListItem( IconButton(onClick = onRemove) { Icon( Icons.Default.Delete, - contentDescription = "Remove user", + contentDescription = stringResource(Res.string.manage_users_remove_user), tint = MaterialTheme.colorScheme.error ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidencesScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidencesScreen.kt index 517ff50..51159c3 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidencesScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/ResidencesScreen.kt @@ -327,7 +327,7 @@ fun ResidencesScreen( ) { Icon(Icons.Default.Star, contentDescription = null) // decorative Text( - "Upgrade to Add", + stringResource(Res.string.residences_upgrade_to_add), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) @@ -462,7 +462,7 @@ fun ResidencesScreen( animation = tween(800, easing = EaseInOut), repeatMode = RepeatMode.Reverse ), - label = "pulseScale" + label = "pulseScale" // i18n-ignore: animation label, non-UI ) OrganicCard( @@ -570,7 +570,7 @@ fun ResidencesScreen( if (residence.isPrimary) { Icon( Icons.Default.Star, - contentDescription = "Primary residence", + contentDescription = stringResource(Res.string.residences_primary_cd), modifier = Modifier.size(16.dp), tint = Color(0xFFFFD700) // Gold color ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/TasksScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/TasksScreen.kt index 1e0acb0..e83f60d 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/TasksScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/TasksScreen.kt @@ -237,7 +237,7 @@ fun TasksScreen( verticalAlignment = androidx.compose.ui.Alignment.CenterVertically ) { OrganicIconContainer( - icon = getIconFromName(column.icons["android"] ?: "List"), + icon = getIconFromName(column.icons["android"] ?: "List"), // i18n-ignore: icon name identifier, non-UI size = 40.dp, iconScale = 0.5f, backgroundColor = hexToColor(column.color).copy(alpha = 0.2f), @@ -251,7 +251,7 @@ fun TasksScreen( } Icon( if (isExpanded) Icons.Default.KeyboardArrowUp else Icons.Default.KeyboardArrowDown, - contentDescription = if (isExpanded) "Collapse" else "Expand", + contentDescription = if (isExpanded) stringResource(Res.string.common_collapse) else stringResource(Res.string.common_expand), tint = MaterialTheme.colorScheme.textSecondary ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt index 967a1d7..5443e76 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyEmailScreen.kt @@ -41,10 +41,12 @@ fun VerifyEmailScreen( val verifyState by viewModel.verifyEmailState.collectAsStateWithLifecycle() + val invalidCodeMessage = stringResource(Res.string.verify_email_invalid_code) + // Handle errors for email verification verifyState.HandleErrors( onRetry = { viewModel.verifyEmail(code) }, - errorTitle = "Verification Failed" + errorTitle = stringResource(Res.string.verify_email_failed_title) ) LaunchedEffect(verifyState) { @@ -147,11 +149,11 @@ fun VerifyEmailScreen( ) { Icon( Icons.Default.Info, - contentDescription = "Info", + contentDescription = stringResource(Res.string.common_info), tint = MaterialTheme.colorScheme.error ) Text( - text = "Email verification is required. Check your inbox for a 6-digit code.", + text = stringResource(Res.string.verify_email_required_msg), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textPrimary, textAlign = TextAlign.Center, @@ -196,7 +198,7 @@ fun VerifyEmailScreen( isLoading = true viewModel.verifyEmail(code) } else { - errorMessage = "Please enter a valid 6-digit code" + errorMessage = invalidCodeMessage } }, modifier = Modifier.testTag(AccessibilityIds.Authentication.verifyButton), @@ -207,7 +209,7 @@ fun VerifyEmailScreen( Spacer(modifier = Modifier.height(OrganicSpacing.compact)) Text( - text = "Didn't receive the code? Check your spam folder or contact support.", + text = stringResource(Res.string.verify_email_didnt_receive), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt index 31d2fd0..c73cde0 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/VerifyResetCodeScreen.kt @@ -38,7 +38,7 @@ fun VerifyResetCodeScreen( // Handle errors for code verification verifyCodeState.HandleErrors( onRetry = { viewModel.verifyResetCode(email, code) }, - errorTitle = "Code Verification Failed" + errorTitle = stringResource(Res.string.reset_verify_failed_title) ) // Handle automatic navigation to next step @@ -102,7 +102,7 @@ fun VerifyResetCodeScreen( ) Text( - text = "Check Your Email", + text = stringResource(Res.string.reset_check_email_title), style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.textPrimary, @@ -110,7 +110,7 @@ fun VerifyResetCodeScreen( ) Text( - text = "We sent a 6-digit code to", + text = stringResource(Res.string.reset_sent_code_to), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center @@ -142,7 +142,7 @@ fun VerifyResetCodeScreen( tint = MaterialTheme.colorScheme.secondary ) Text( - "Code expires in 15 minutes", + stringResource(Res.string.reset_code_expires), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.textPrimary @@ -173,7 +173,7 @@ fun VerifyResetCodeScreen( ) Text( - "Enter the 6-digit code from your email", + stringResource(Res.string.reset_enter_code_hint), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center @@ -196,11 +196,11 @@ fun VerifyResetCodeScreen( ) { Icon( Icons.Default.CheckCircle, - contentDescription = "Verified", + contentDescription = stringResource(Res.string.common_verified), tint = MaterialTheme.colorScheme.primary ) Text( - "Code verified! Now set your new password", + stringResource(Res.string.reset_code_verified_msg), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.textPrimary ) @@ -226,7 +226,7 @@ fun VerifyResetCodeScreen( verticalArrangement = Arrangement.spacedBy(OrganicSpacing.compact) ) { Text( - "Didn't receive the code?", + stringResource(Res.string.reset_didnt_receive), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.textSecondary ) @@ -245,7 +245,7 @@ fun VerifyResetCodeScreen( } Text( - "Check your spam folder if you don't see it", + stringResource(Res.string.reset_check_spam), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.textSecondary, textAlign = TextAlign.Center diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt index 630b86f..536800f 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingCreateAccountContent.kt @@ -260,7 +260,7 @@ fun OnboardingCreateAccountContent( ) { Icon( Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error ) Text( @@ -275,13 +275,14 @@ fun OnboardingCreateAccountContent( Spacer(modifier = Modifier.height(OrganicSpacing.sm)) // Create Account button + val passwordsDontMatchMsg = stringResource(Res.string.auth_passwords_dont_match) OrganicPrimaryButton( text = stringResource(Res.string.auth_register_button), onClick = { if (password == confirmPassword) { viewModel.register(username, email, password) } else { - localErrorMessage = "Passwords don't match" + localErrorMessage = passwordsDontMatchMsg } }, modifier = Modifier.fillMaxWidth(), diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt index 363e3e3..e742fcc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingFirstTaskContent.kt @@ -25,6 +25,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.tt.honeyDue.analytics.AnalyticsEvents import com.tt.honeyDue.analytics.PostHogAnalytics import com.tt.honeyDue.data.LocalDataManager +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.TaskCreateRequest import com.tt.honeyDue.models.TaskSuggestionResponse import com.tt.honeyDue.models.TaskSuggestionsResponse @@ -206,7 +207,7 @@ fun OnboardingFirstTaskContent( tint = MaterialTheme.colorScheme.primary ) Text( - text = "$totalSelectedCount task${if (totalSelectedCount == 1) "" else "s"} selected", + text = stringResource(Res.string.onboarding_first_task_selected_count, totalSelectedCount), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.primary @@ -321,7 +322,7 @@ fun OnboardingFirstTaskContent( ) { OrganicPrimaryButton( text = if (totalSelectedCount > 0) { - "Add $totalSelectedCount Task${if (totalSelectedCount == 1) "" else "s"} & Continue" + stringResource(Res.string.onboarding_first_task_add_continue, totalSelectedCount) } else { stringResource(Res.string.onboarding_tasks_skip) }, @@ -410,7 +411,7 @@ private fun ForYouTabContent( when (suggestionsState) { is ApiResult.Loading, ApiResult.Idle -> { LoadingPane( - message = "Finding tasks for your home...", + message = stringResource(Res.string.onboarding_first_task_finding), modifier = modifier ) } @@ -418,8 +419,8 @@ private fun ForYouTabContent( val suggestions = suggestionsState.data.suggestions if (suggestions.isEmpty()) { EmptyPane( - message = "No personalised suggestions yet — browse the full catalog or skip this step.", - primaryLabel = if (hasBrowseFallback) "Browse All" else "Skip", + message = stringResource(Res.string.onboarding_first_task_no_suggestions), + primaryLabel = if (hasBrowseFallback) stringResource(Res.string.onboarding_first_task_browse_all) else stringResource(Res.string.onboarding_first_task_skip), onPrimary = if (hasBrowseFallback) onSwitchToBrowse else onSkip, modifier = modifier ) @@ -444,9 +445,9 @@ private fun ForYouTabContent( } is ApiResult.Error -> { ErrorPane( - headline = "Couldn't load your suggestions", + headline = stringResource(Res.string.onboarding_first_task_suggestions_error), body = suggestionsState.message.takeIf { it.isNotBlank() } - ?: "Check your connection and try again.", + ?: stringResource(Res.string.onboarding_first_task_connection_error), onRetry = onRetry, onSkip = onSkip, modifier = modifier @@ -488,7 +489,7 @@ private fun SuggestionRow( contentAlignment = Alignment.Center ) { if (isSelected) { - Icon(Icons.Default.Check, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(16.dp) ) + Icon(Icons.Default.Check, contentDescription = stringResource(Res.string.onboarding_first_task_selected), tint = Color.White, modifier = Modifier.size(16.dp) ) } } @@ -549,13 +550,13 @@ private fun BrowseTabContent( ) { when (templatesGroupedState) { is ApiResult.Loading, ApiResult.Idle -> { - LoadingPane(message = "Loading the task catalog...", modifier = modifier) + LoadingPane(message = stringResource(Res.string.onboarding_first_task_loading_catalog), modifier = modifier) } is ApiResult.Error -> { ErrorPane( - headline = "Couldn't load the task catalog", + headline = stringResource(Res.string.onboarding_first_task_catalog_error), body = templatesGroupedState.message.takeIf { it.isNotBlank() } - ?: "Check your connection and try again.", + ?: stringResource(Res.string.onboarding_first_task_connection_error), onRetry = onRetry, onSkip = onSkip, modifier = modifier @@ -564,8 +565,8 @@ private fun BrowseTabContent( is ApiResult.Success -> { if (browseCategories.isEmpty()) { EmptyPane( - message = "No templates available right now.", - primaryLabel = "Skip", + message = stringResource(Res.string.onboarding_first_task_no_templates), + primaryLabel = stringResource(Res.string.onboarding_first_task_skip), onPrimary = onSkip, modifier = modifier ) @@ -653,7 +654,7 @@ private fun TaskCategorySection( Icon( imageVector = if (isExpanded) Icons.Default.ExpandLess else Icons.Default.ExpandMore, - contentDescription = if (isExpanded) "Collapse" else "Expand", + contentDescription = if (isExpanded) stringResource(Res.string.templates_collapse) else stringResource(Res.string.templates_expand), tint = MaterialTheme.colorScheme.onSurfaceVariant ) } @@ -712,7 +713,7 @@ private fun TaskTemplateRow( contentAlignment = Alignment.Center ) { if (isSelected) { - Icon(Icons.Default.Check, contentDescription = "Selected", tint = Color.White, modifier = Modifier.size(16.dp) ) + Icon(Icons.Default.Check, contentDescription = stringResource(Res.string.onboarding_first_task_selected), tint = Color.White, modifier = Modifier.size(16.dp) ) } } @@ -773,7 +774,7 @@ private fun ErrorPane( ) { Icon( imageVector = Icons.Default.CloudOff, - contentDescription = "Offline", + contentDescription = stringResource(Res.string.onboarding_first_task_offline), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) @@ -795,12 +796,12 @@ private fun ErrorPane( Spacer(modifier = Modifier.height(OrganicSpacing.lg)) Row(horizontalArrangement = Arrangement.spacedBy(OrganicSpacing.md)) { OutlinedButton(onClick = onSkip) { - Text("Skip for now") + Text(stringResource(Res.string.onboarding_first_task_skip_for_now)) } OutlinedButton(onClick = onRetry) { Icon(Icons.Default.Refresh, contentDescription = null, modifier = Modifier.size(18.dp) ) // decorative Spacer(modifier = Modifier.width(OrganicSpacing.xs)) - Text("Retry") + Text(stringResource(Res.string.common_retry)) } } } @@ -841,7 +842,7 @@ private fun EmptyPane( // ==================== Mapping: server → adapter ==================== private fun TaskTemplateCategoryGroup.toAdapter(): OnboardingTaskCategory { - val categoryName = categoryName.ifBlank { "Uncategorized" } + val categoryName = categoryName.ifBlank { ClientStrings.t("task.category.uncategorized") } return OnboardingTaskCategory( id = categoryId ?: stableFallbackIdFor(categoryName), name = categoryName, @@ -852,7 +853,7 @@ private fun TaskTemplateCategoryGroup.toAdapter(): OnboardingTaskCategory { } private fun TaskTemplate.toAdapter(categoryName: String): OnboardingTaskTemplate { - val label = frequency?.displayName ?: frequency?.name?.replaceFirstChar { it.uppercase() } ?: "One time" + val label = frequency?.displayName ?: frequency?.name?.replaceFirstChar { it.uppercase() } ?: ClientStrings.t("task.frequency.one_time") return OnboardingTaskTemplate( id = id, title = title, diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingHomeProfileContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingHomeProfileContent.kt index dc565bf..f3883f6 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingHomeProfileContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingHomeProfileContent.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.HomeProfileOptions import com.tt.honeyDue.ui.theme.* import com.tt.honeyDue.viewmodel.OnboardingViewModel @@ -100,7 +101,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Heating", + label = stringResource(Res.string.home_profile_heating), options = HomeProfileOptions.heatingTypes, selectedValue = heatingType, onSelect = { viewModel.setHeatingType(it) } @@ -110,7 +111,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Cooling", + label = stringResource(Res.string.home_profile_cooling), options = HomeProfileOptions.coolingTypes, selectedValue = coolingType, onSelect = { viewModel.setCoolingType(it) } @@ -120,7 +121,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Water Heater", + label = stringResource(Res.string.home_profile_water_heater), options = HomeProfileOptions.waterHeaterTypes, selectedValue = waterHeaterType, onSelect = { viewModel.setWaterHeaterType(it) } @@ -143,13 +144,13 @@ fun OnboardingHomeProfileContent( horizontalArrangement = Arrangement.spacedBy(OrganicSpacing.sm), verticalArrangement = Arrangement.spacedBy(OrganicSpacing.sm) ) { - ToggleChip(label = "Pool", selected = hasPool, onToggle = { viewModel.setHasPool(!hasPool) }) - ToggleChip(label = "Sprinkler System", selected = hasSprinklerSystem, onToggle = { viewModel.setHasSprinklerSystem(!hasSprinklerSystem) }) - ToggleChip(label = "Fireplace", selected = hasFireplace, onToggle = { viewModel.setHasFireplace(!hasFireplace) }) - ToggleChip(label = "Garage", selected = hasGarage, onToggle = { viewModel.setHasGarage(!hasGarage) }) - ToggleChip(label = "Basement", selected = hasBasement, onToggle = { viewModel.setHasBasement(!hasBasement) }) - ToggleChip(label = "Attic", selected = hasAttic, onToggle = { viewModel.setHasAttic(!hasAttic) }) - ToggleChip(label = "Septic", selected = hasSeptic, onToggle = { viewModel.setHasSeptic(!hasSeptic) }) + ToggleChip(label = stringResource(Res.string.home_profile_pool), selected = hasPool, onToggle = { viewModel.setHasPool(!hasPool) }) + ToggleChip(label = stringResource(Res.string.home_profile_sprinkler_system), selected = hasSprinklerSystem, onToggle = { viewModel.setHasSprinklerSystem(!hasSprinklerSystem) }) + ToggleChip(label = stringResource(Res.string.home_profile_fireplace), selected = hasFireplace, onToggle = { viewModel.setHasFireplace(!hasFireplace) }) + ToggleChip(label = stringResource(Res.string.home_profile_garage), selected = hasGarage, onToggle = { viewModel.setHasGarage(!hasGarage) }) + ToggleChip(label = stringResource(Res.string.home_profile_basement), selected = hasBasement, onToggle = { viewModel.setHasBasement(!hasBasement) }) + ToggleChip(label = stringResource(Res.string.home_profile_attic), selected = hasAttic, onToggle = { viewModel.setHasAttic(!hasAttic) }) + ToggleChip(label = stringResource(Res.string.home_profile_septic), selected = hasSeptic, onToggle = { viewModel.setHasSeptic(!hasSeptic) }) } Spacer(modifier = Modifier.height(OrganicSpacing.xl)) } @@ -165,7 +166,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Roof Type", + label = stringResource(Res.string.home_profile_roof_type), options = HomeProfileOptions.roofTypes, selectedValue = roofType, onSelect = { viewModel.setRoofType(it) } @@ -175,7 +176,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Exterior", + label = stringResource(Res.string.home_profile_exterior), options = HomeProfileOptions.exteriorTypes, selectedValue = exteriorType, onSelect = { viewModel.setExteriorType(it) } @@ -194,7 +195,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Flooring", + label = stringResource(Res.string.home_profile_flooring), options = HomeProfileOptions.flooringTypes, selectedValue = flooringPrimary, onSelect = { viewModel.setFlooringPrimary(it) } @@ -204,7 +205,7 @@ fun OnboardingHomeProfileContent( item { OptionDropdownChips( - label = "Landscaping", + label = stringResource(Res.string.home_profile_landscaping), options = HomeProfileOptions.landscapingTypes, selectedValue = landscapingType, onSelect = { viewModel.setLandscapingType(it) } @@ -290,7 +291,7 @@ private fun OptionDropdownChips( horizontalArrangement = Arrangement.spacedBy(OrganicSpacing.xs), verticalArrangement = Arrangement.spacedBy(OrganicSpacing.xs) ) { - options.forEach { (apiValue, displayLabel) -> + options.forEach { (apiValue, displayLabelKey) -> val isSelected = selectedValue == apiValue FilterChip( selected = isSelected, @@ -299,7 +300,7 @@ private fun OptionDropdownChips( }, label = { Text( - text = displayLabel, + text = ClientStrings.t(displayLabelKey), style = MaterialTheme.typography.bodySmall ) }, @@ -331,7 +332,7 @@ private fun ToggleChip( } else { MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f) }, - label = "toggleChipColor" + label = "toggleChipColor" // i18n-ignore: animation label, non-UI ) val contentColor by animateColorAsState( targetValue = if (selected) { @@ -339,7 +340,7 @@ private fun ToggleChip( } else { MaterialTheme.colorScheme.onSurfaceVariant }, - label = "toggleChipContentColor" + label = "toggleChipContentColor" // i18n-ignore: animation label, non-UI ) FilterChip( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt index cc4cdf2..5747bc2 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingJoinResidenceContent.kt @@ -139,7 +139,7 @@ fun OnboardingJoinResidenceContent( ) { Icon( Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error ) Text( @@ -163,7 +163,7 @@ fun OnboardingJoinResidenceContent( strokeWidth = 2.dp ) Text( - text = "Joining residence...", + text = stringResource(Res.string.onboarding_joining_residence), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingScreen.kt index 3660fb8..2c81a13 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingScreen.kt @@ -19,6 +19,8 @@ import com.tt.honeyDue.ui.theme.* import com.tt.honeyDue.viewmodel.OnboardingStep import com.tt.honeyDue.viewmodel.OnboardingViewModel import com.tt.honeyDue.viewmodel.OnboardingIntent +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @OptIn(ExperimentalAnimationApi::class) @Composable @@ -221,7 +223,7 @@ private fun OnboardingNavigationBar( IconButton(onClick = onBack) { Icon( Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.common_back), tint = MaterialTheme.colorScheme.primary ) } @@ -246,7 +248,7 @@ private fun OnboardingNavigationBar( if (showSkipButton) { TextButton(onClick = onSkip) { Text( - "Skip", + stringResource(Res.string.common_skip), style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Medium, color = MaterialTheme.colorScheme.onSurfaceVariant diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt index ef8ce75..8da1fd7 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingSubscriptionContent.kt @@ -299,13 +299,13 @@ fun OnboardingSubscriptionContent( // Legal text Text( - text = "7-day free trial, then ${if (selectedPlan == SubscriptionPlan.YEARLY) "$23.99/year" else "$2.99/month"}", + text = stringResource(Res.string.onboarding_sub_trial_legal, if (selectedPlan == SubscriptionPlan.YEARLY) "$23.99/year" else "$2.99/month"), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) Text( - text = "Cancel anytime in Settings • No commitment", + text = stringResource(Res.string.onboarding_sub_cancel_note), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.7f) ) @@ -352,7 +352,7 @@ private fun BenefitRow(benefit: SubscriptionBenefit) { Icon( Icons.Default.Check, - contentDescription = "Included", + contentDescription = stringResource(Res.string.common_included), modifier = Modifier.size(20.dp), tint = benefit.gradientColors.first() ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt index aa750e2..07ef870 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/onboarding/OnboardingVerifyEmailContent.kt @@ -146,7 +146,7 @@ fun OnboardingVerifyEmailContent( ) { Icon( Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error ) Text( @@ -170,7 +170,7 @@ fun OnboardingVerifyEmailContent( strokeWidth = 2.dp ) Text( - text = "Verifying...", + text = stringResource(Res.string.common_verifying), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt index 6042a55..6c96972 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceScreen.kt @@ -52,6 +52,8 @@ import com.tt.honeyDue.ui.components.common.StandardCard import com.tt.honeyDue.ui.components.forms.FormTextField import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Full-screen residence-join UI matching iOS @@ -91,7 +93,7 @@ fun JoinResidenceScreen( TopAppBar( title = { Text( - text = "Join Property", + text = stringResource(Res.string.join_property_title), fontWeight = FontWeight.SemiBold, ) }, @@ -102,7 +104,7 @@ fun JoinResidenceScreen( ) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.common_back), ) } }, @@ -129,13 +131,13 @@ fun JoinResidenceScreen( modifier = Modifier.size(72.dp), ) Text( - text = "Join a Shared Property", + text = stringResource(Res.string.join_shared_property_header), style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onBackground, ) Text( - text = "Enter the 6-character share code provided by the owner.", + text = stringResource(Res.string.join_enter_code_desc), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -146,12 +148,12 @@ fun JoinResidenceScreen( FormTextField( value = code, onValueChange = { viewModel.updateCode(it) }, - label = "Share Code", + label = stringResource(Res.string.join_share_code_label), modifier = Modifier.testTag(AccessibilityIds.Residence.joinShareCodeField), - placeholder = "ABC123", + placeholder = stringResource(Res.string.join_share_code_placeholder), enabled = !isLoading, error = error, - helperText = if (error == null) "Codes are 6 uppercase characters" else null, + helperText = if (error == null) stringResource(Res.string.join_code_helper) else null, keyboardOptions = KeyboardOptions( capitalization = KeyboardCapitalization.Characters, keyboardType = KeyboardType.Ascii, @@ -173,7 +175,7 @@ fun JoinResidenceScreen( ) { Icon( imageVector = Icons.Default.Error, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error, ) Text( @@ -206,7 +208,7 @@ fun JoinResidenceScreen( ) Spacer(modifier = Modifier.size(AppSpacing.sm)) Text( - text = "Joining…", + text = stringResource(Res.string.join_joining), fontWeight = FontWeight.SemiBold, ) } else { @@ -216,7 +218,7 @@ fun JoinResidenceScreen( ) Spacer(modifier = Modifier.size(AppSpacing.sm)) Text( - text = "Join Property", + text = stringResource(Res.string.join_property_title), fontWeight = FontWeight.SemiBold, ) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceViewModel.kt index e95aa36..3bd6426 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/JoinResidenceViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.analytics.AnalyticsEvents import com.tt.honeyDue.analytics.PostHogAnalytics +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.JoinResidenceResponse import com.tt.honeyDue.network.APILayer import com.tt.honeyDue.network.ApiResult @@ -69,7 +70,7 @@ class JoinResidenceViewModel( */ fun submit() { if (_code.value.length != REQUIRED_LENGTH) { - _errorMessage.value = ERROR_LENGTH + _errorMessage.value = ClientStrings.t("validation.share_code_length") return } @@ -108,6 +109,5 @@ class JoinResidenceViewModel( companion object { const val REQUIRED_LENGTH = 6 - const val ERROR_LENGTH = "Share code must be 6 characters" } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/ResidenceFormValidation.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/ResidenceFormValidation.kt index 5e43888..24d1da6 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/ResidenceFormValidation.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/residence/ResidenceFormValidation.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.ui.screens.residence +import com.tt.honeyDue.i18n.ClientStrings import kotlin.time.Clock import kotlin.time.ExperimentalTime import kotlinx.datetime.Instant @@ -34,9 +35,9 @@ object ResidenceFormValidation { private const val YEAR_BUILT_MIN = 1800 fun validateName(value: String): String? { - if (value.isBlank()) return "Name is required" + if (value.isBlank()) return ClientStrings.t("validation.name_required") if (value.length > NAME_MAX_LENGTH) { - return "Name must be $NAME_MAX_LENGTH characters or fewer" + return ClientStrings.t("validation.name_too_long", NAME_MAX_LENGTH) } return null } @@ -49,7 +50,7 @@ object ResidenceFormValidation { if (value.isBlank()) return null val n = value.toIntOrNull() if (n == null || n < 0) { - return "Bedrooms must be a non-negative whole number" + return ClientStrings.t("validation.bedrooms_invalid") } return null } @@ -59,7 +60,7 @@ object ResidenceFormValidation { if (value.isBlank()) return null val n = value.toDoubleOrNull() if (n == null || n < 0.0) { - return "Bathrooms must be a non-negative number" + return ClientStrings.t("validation.bathrooms_invalid") } return null } @@ -69,7 +70,7 @@ object ResidenceFormValidation { if (value.isBlank()) return null val n = value.toIntOrNull() if (n == null || n <= 0) { - return "Square footage must be a positive whole number" + return ClientStrings.t("validation.sqft_invalid") } return null } @@ -79,7 +80,7 @@ object ResidenceFormValidation { if (value.isBlank()) return null val n = value.toDoubleOrNull() if (n == null || n <= 0.0) { - return "Lot size must be a positive number" + return ClientStrings.t("validation.lot_size_invalid") } return null } @@ -91,10 +92,10 @@ object ResidenceFormValidation { */ fun validateYearBuilt(value: String, currentYear: Int = defaultCurrentYear()): String? { if (value.isBlank()) return null - if (value.length != 4) return "Year built must be a 4-digit year" - val n = value.toIntOrNull() ?: return "Year built must be a 4-digit year" + if (value.length != 4) return ClientStrings.t("validation.year_built_format") + val n = value.toIntOrNull() ?: return ClientStrings.t("validation.year_built_format") if (n < YEAR_BUILT_MIN || n > currentYear) { - return "Year built must be between $YEAR_BUILT_MIN and the current year" + return ClientStrings.t("validation.year_built_range", YEAR_BUILT_MIN) } return null } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt index 9f49260..29cd1ee 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/subscription/FeatureComparisonScreen.kt @@ -44,6 +44,8 @@ import com.tt.honeyDue.data.LocalDataManager import com.tt.honeyDue.models.FeatureBenefit import com.tt.honeyDue.ui.components.common.StandardCard import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * FeatureComparisonScreen — full-screen Free vs. Pro comparison matching @@ -82,7 +84,7 @@ fun FeatureComparisonScreen( TopAppBar( title = { Text( - text = "Choose Your Plan", + text = stringResource(Res.string.paywall_choose_plan_title), fontWeight = FontWeight.SemiBold, ) }, @@ -92,7 +94,7 @@ fun FeatureComparisonScreen( }) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Close", + contentDescription = stringResource(Res.string.common_close), tint = MaterialTheme.colorScheme.primary, ) } @@ -117,13 +119,13 @@ fun FeatureComparisonScreen( verticalArrangement = Arrangement.spacedBy(AppSpacing.sm), ) { Text( - text = "Choose Your Plan", + text = stringResource(Res.string.paywall_choose_plan_title), style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onBackground, ) Text( - text = "Upgrade to Pro for unlimited access", + text = stringResource(Res.string.paywall_choose_plan_subtitle), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center, @@ -140,9 +142,9 @@ fun FeatureComparisonScreen( rows.forEachIndexed { index, row -> ComparisonRow( - featureName = row.featureName, - freeText = row.freeTierText, - proText = row.proTierText, + featureName = localizedFeatureText(row.featureName), + freeText = localizedFeatureText(row.freeTierText), + proText = localizedFeatureText(row.proTierText), freeHas = FeatureComparisonScreenState.freeHasFeature(row), proHas = FeatureComparisonScreenState.premiumHasFeature(row), ) @@ -171,7 +173,7 @@ fun FeatureComparisonScreen( ), ) { Text( - text = "Upgrade to Pro", + text = stringResource(Res.string.paywall_upgrade_to_pro), fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onPrimary, ) @@ -195,14 +197,14 @@ private fun ComparisonHeaderRow() { verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "Feature", + text = stringResource(Res.string.paywall_col_feature), modifier = Modifier.weight(1f), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Free", + text = stringResource(Res.string.paywall_col_free), modifier = Modifier.width(80.dp), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold, @@ -210,7 +212,7 @@ private fun ComparisonHeaderRow() { color = MaterialTheme.colorScheme.onSurfaceVariant, ) Text( - text = "Pro", + text = stringResource(Res.string.paywall_col_pro), modifier = Modifier.width(80.dp), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold, @@ -283,7 +285,7 @@ private fun TierCell( ) { Icon( imageVector = if (hasFeature) Icons.Default.Check else Icons.Default.Close, - contentDescription = if (hasFeature) "Included" else "Not included", + contentDescription = if (hasFeature) stringResource(Res.string.common_included) else stringResource(Res.string.paywall_feat_not_included), modifier = Modifier.size(18.dp), tint = if (hasFeature) { if (emphasize) MaterialTheme.colorScheme.primary @@ -306,6 +308,29 @@ private fun TierCell( } } +/** + * Maps the known default-row English values to their localized + * [stringResource]. Server-driven benefit text (already localized by the + * API) and any unrecognized value falls through unchanged. + * + * IMPORTANT: this only affects DISPLAY. The "Not available" sentinel + * comparison in [FeatureComparisonScreenState.isUnavailable] runs against + * the raw, non-localized [FeatureBenefit] fields — so localizing the + * display here does not break the free/pro availability logic. + */ +@Composable +private fun localizedFeatureText(raw: String): String = when (raw) { + "Properties" -> stringResource(Res.string.paywall_feat_properties) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "Tasks" -> stringResource(Res.string.paywall_feat_tasks) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "Contractors" -> stringResource(Res.string.paywall_feat_contractors) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "Documents" -> stringResource(Res.string.paywall_feat_documents) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "1 property" -> stringResource(Res.string.paywall_val_1_property) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "10 tasks" -> stringResource(Res.string.paywall_val_10_tasks) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "Unlimited" -> stringResource(Res.string.paywall_val_unlimited) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + "Not available" -> stringResource(Res.string.paywall_val_not_available) // i18n-ignore: stable English lookup key for localizedFeatureText, non-UI + else -> raw +} + /** * State helper for [FeatureComparisonScreen]. * @@ -332,24 +357,24 @@ object FeatureComparisonScreenState { fun defaultFeatureRows(): List = listOf( FeatureBenefit( - featureName = "Properties", - freeTierText = "1 property", - proTierText = "Unlimited", + featureName = "Properties", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + freeTierText = "1 property", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + proTierText = "Unlimited", // i18n-ignore: stable sentinel; displayed via localizedFeatureText ), FeatureBenefit( - featureName = "Tasks", - freeTierText = "10 tasks", - proTierText = "Unlimited", + featureName = "Tasks", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + freeTierText = "10 tasks", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + proTierText = "Unlimited", // i18n-ignore: stable sentinel; displayed via localizedFeatureText ), FeatureBenefit( - featureName = "Contractors", - freeTierText = "Not available", - proTierText = "Unlimited", + featureName = "Contractors", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + freeTierText = "Not available", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + proTierText = "Unlimited", // i18n-ignore: stable sentinel; displayed via localizedFeatureText ), FeatureBenefit( - featureName = "Documents", - freeTierText = "Not available", - proTierText = "Unlimited", + featureName = "Documents", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + freeTierText = "Not available", // i18n-ignore: stable sentinel; displayed via localizedFeatureText + proTierText = "Unlimited", // i18n-ignore: stable sentinel; displayed via localizedFeatureText ), ) @@ -364,7 +389,7 @@ object FeatureComparisonScreenState { !isUnavailable(benefit.proTierText) private fun isUnavailable(text: String): Boolean = - text.trim().equals("Not available", ignoreCase = true) + text.trim().equals("Not available", ignoreCase = true) // i18n-ignore: availability sentinel; compared raw, must stay English /** * CTA handler. Fires the paywall analytics event and navigates to diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceScreen.kt index 175dcbb..3826854 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceScreen.kt @@ -45,6 +45,8 @@ import com.tt.honeyDue.ui.components.forms.FormTextField import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing import com.tt.honeyDue.util.ErrorMessageParser +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Android port of iOS AddTaskWithResidenceView (P2 Stream I). @@ -88,13 +90,13 @@ fun AddTaskWithResidenceScreen( Scaffold( topBar = { TopAppBar( - title = { Text("New Task", fontWeight = FontWeight.SemiBold) }, + title = { Text(stringResource(Res.string.tasks_new_title), fontWeight = FontWeight.SemiBold) }, navigationIcon = { IconButton( onClick = onNavigateBack, modifier = Modifier.testTag(AccessibilityIds.Task.formCancelButton) ) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(Res.string.a11y_back)) } }, colors = TopAppBarDefaults.topAppBarColors( @@ -116,9 +118,9 @@ fun AddTaskWithResidenceScreen( FormTextField( value = title, onValueChange = viewModel::onTitleChange, - label = "Title", + label = stringResource(Res.string.tasks_title_field_label), modifier = Modifier.testTag(AccessibilityIds.Task.titleField), - placeholder = "e.g. Flush water heater", + placeholder = stringResource(Res.string.tasks_title_placeholder), error = titleError, enabled = !isSubmitting ) @@ -128,9 +130,9 @@ fun AddTaskWithResidenceScreen( FormTextField( value = description, onValueChange = viewModel::onDescriptionChange, - label = "Description", + label = stringResource(Res.string.tasks_description_label), modifier = Modifier.testTag(AccessibilityIds.Task.descriptionField), - placeholder = "Optional details", + placeholder = stringResource(Res.string.tasks_description_placeholder), singleLine = false, maxLines = 4, enabled = !isSubmitting @@ -140,7 +142,7 @@ fun AddTaskWithResidenceScreen( // Priority chips StandardCard(modifier = Modifier.fillMaxWidth()) { Text( - text = "Priority", + text = stringResource(Res.string.tasks_priority_label), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface @@ -165,7 +167,7 @@ fun AddTaskWithResidenceScreen( // Category chips StandardCard(modifier = Modifier.fillMaxWidth()) { Text( - text = "Category", + text = stringResource(Res.string.tasks_category_label), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface @@ -189,7 +191,7 @@ fun AddTaskWithResidenceScreen( // Frequency chips StandardCard(modifier = Modifier.fillMaxWidth()) { Text( - text = "Frequency", + text = stringResource(Res.string.tasks_frequency_label), style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface @@ -215,10 +217,10 @@ fun AddTaskWithResidenceScreen( FormTextField( value = dueDate, onValueChange = viewModel::onDueDateChange, - label = "Due date (optional)", - placeholder = "yyyy-MM-dd", + label = stringResource(Res.string.tasks_due_date_optional_label), + placeholder = stringResource(Res.string.tasks_due_date_placeholder_format), enabled = !isSubmitting, - helperText = "Leave blank for no due date" + helperText = stringResource(Res.string.tasks_due_date_blank_helper) ) } @@ -227,7 +229,7 @@ fun AddTaskWithResidenceScreen( FormTextField( value = estimatedCost, onValueChange = viewModel::onEstimatedCostChange, - label = "Estimated cost (optional)", + label = stringResource(Res.string.tasks_estimated_cost_optional_label), placeholder = "0.00", keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Decimal), enabled = !isSubmitting @@ -265,7 +267,7 @@ fun AddTaskWithResidenceScreen( } else { Icon(Icons.Default.Save, contentDescription = null) // decorative Text( - text = "Create Task", + text = stringResource(Res.string.tasks_create), modifier = Modifier.padding(start = AppSpacing.sm), fontWeight = FontWeight.SemiBold ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceViewModel.kt index f1e9988..b9aa4eb 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/AddTaskWithResidenceViewModel.kt @@ -2,6 +2,7 @@ package com.tt.honeyDue.ui.screens.task import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.TaskCreateRequest import com.tt.honeyDue.models.TaskResponse import com.tt.honeyDue.network.APILayer @@ -105,7 +106,7 @@ class AddTaskWithResidenceViewModel( fun submit(onSuccess: () -> Unit) { val currentTitle = _title.value.trim() if (currentTitle.isEmpty()) { - _titleError.value = "Title is required" + _titleError.value = ClientStrings.t("validation.title_required") return } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskFormValidation.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskFormValidation.kt index 72eeddb..41a803d 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskFormValidation.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskFormValidation.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.ui.screens.task +import com.tt.honeyDue.i18n.ClientStrings + /** * Pure-function validators for the task create/edit form. * @@ -15,16 +17,16 @@ package com.tt.honeyDue.ui.screens.task object TaskFormValidation { fun validateTitle(value: String): String? = - if (value.isBlank()) "Title is required" else null + if (value.isBlank()) ClientStrings.t("validation.title_required") else null fun validatePriorityId(value: Int?): String? = - if (value == null) "Please select a priority" else null + if (value == null) ClientStrings.t("validation.priority_required") else null fun validateCategoryId(value: Int?): String? = - if (value == null) "Please select a category" else null + if (value == null) ClientStrings.t("validation.category_required") else null fun validateFrequencyId(value: Int?): String? = - if (value == null) "Please select a frequency" else null + if (value == null) ClientStrings.t("validation.frequency_required") else null /** * Estimated cost is optional — an empty/blank string is valid. A non-empty @@ -35,12 +37,12 @@ object TaskFormValidation { fun validateEstimatedCost(value: String): String? { if (value.isBlank()) return null return if (value.toDoubleOrNull() == null) { - "Estimated cost must be a valid number" + ClientStrings.t("validation.est_cost_invalid") } else { null } } fun validateResidenceId(value: Int?): String? = - if (value == null) "Property is required" else null + if (value == null) ClientStrings.t("validation.property_required") else null } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt index 0fbd1a4..65cdb7d 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskSuggestionsScreen.kt @@ -51,6 +51,8 @@ import com.tt.honeyDue.ui.components.common.StandardCard import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing import com.tt.honeyDue.util.ErrorMessageParser +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Standalone screen that lets users pick personalized task suggestions @@ -104,18 +106,18 @@ fun TaskSuggestionsScreen( topBar = { TopAppBar( title = { - Text(text = "Suggested Tasks", fontWeight = FontWeight.SemiBold) + Text(text = stringResource(Res.string.suggestions_title), fontWeight = FontWeight.SemiBold) }, navigationIcon = { IconButton(onClick = onNavigateBack) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") + Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(Res.string.a11y_back)) } }, actions = { OutlinedButton( onClick = onNavigateBack, modifier = Modifier.padding(end = AppSpacing.md) - ) { Text("Skip") } + ) { Text(stringResource(Res.string.suggestions_skip)) } }, colors = TopAppBarDefaults.topAppBarColors( containerColor = MaterialTheme.colorScheme.surface @@ -173,7 +175,7 @@ fun TaskSuggestionsScreen( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), tint = MaterialTheme.colorScheme.error ) Text( @@ -275,7 +277,7 @@ private fun SuggestionRow( } else { Icon(Icons.Default.Check, contentDescription = null) // decorative Spacer(Modifier.width(AppSpacing.sm)) - Text("Accept", fontWeight = FontWeight.SemiBold) + Text(stringResource(Res.string.suggestions_accept), fontWeight = FontWeight.SemiBold) } } } @@ -291,17 +293,17 @@ private fun ErrorView(message: String, onRetry: () -> Unit) { ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) - Text(text = "Couldn't load suggestions", style = MaterialTheme.typography.titleMedium) + Text(text = stringResource(Res.string.suggestions_load_failed), style = MaterialTheme.typography.titleMedium) Text( text = message, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) - OutlinedButton(onClick = onRetry) { Text("Retry") } + OutlinedButton(onClick = onRetry) { Text(stringResource(Res.string.common_retry)) } } } @@ -318,9 +320,9 @@ private fun EmptyView() { modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.5f) ) - Text(text = "No suggestions yet", style = MaterialTheme.typography.titleMedium) + Text(text = stringResource(Res.string.suggestions_empty_title), style = MaterialTheme.typography.titleMedium) Text( - text = "Complete your home profile to see personalized recommendations.", + text = stringResource(Res.string.suggestions_empty_subtitle), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt index fa1eb52..b163e65 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/task/TaskTemplatesBrowserScreen.kt @@ -49,6 +49,9 @@ import com.tt.honeyDue.ui.theme.AppSpacing import com.tt.honeyDue.util.ErrorMessageParser import honeydue.composeapp.generated.resources.Res import honeydue.composeapp.generated.resources.common_back +import honeydue.composeapp.generated.resources.common_error +import honeydue.composeapp.generated.resources.common_selected +import honeydue.composeapp.generated.resources.common_not_selected import honeydue.composeapp.generated.resources.templates_all_categories import honeydue.composeapp.generated.resources.templates_apply_count import honeydue.composeapp.generated.resources.templates_create_failed @@ -386,7 +389,7 @@ private fun TemplateCard( Icon( imageVector = if (selected) Icons.Default.CheckCircle else Icons.Default.RadioButtonUnchecked, - contentDescription = if (selected) "Selected" else "Not selected", + contentDescription = if (selected) stringResource(Res.string.common_selected) else stringResource(Res.string.common_not_selected), tint = if (selected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier @@ -452,7 +455,7 @@ private fun LoadErrorView( ) { Icon( imageVector = Icons.Default.ErrorOutline, - contentDescription = "Error", + contentDescription = stringResource(Res.string.common_error), modifier = Modifier.size(48.dp), tint = MaterialTheme.colorScheme.error ) @@ -560,7 +563,7 @@ private fun categoryBubbleColor(category: String): Color = when (category.lowerc "hvac" -> Color(0xFF07A0C3) "appliances" -> Color(0xFF7B1FA2) "exterior" -> Color(0xFF34C759) - "lawn & garden" -> Color(0xFF2E7D32) + "lawn & garden" -> Color(0xFF2E7D32) // i18n-ignore: category key color lookup, non-UI "interior" -> Color(0xFFAF52DE) "general", "seasonal" -> Color(0xFFFF9500) else -> Color(0xFF455A64) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/theme/ThemeSelectionScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/theme/ThemeSelectionScreen.kt index e400ae5..b689345 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/theme/ThemeSelectionScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/screens/theme/ThemeSelectionScreen.kt @@ -54,6 +54,8 @@ import com.tt.honeyDue.ui.theme.AppThemes import com.tt.honeyDue.ui.theme.ThemeColors import com.tt.honeyDue.ui.theme.ThemeManager import com.tt.honeyDue.ui.theme.isDynamicColorSupported +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * ThemeSelectionScreen — full-screen theme picker matching iOS @@ -88,7 +90,7 @@ fun ThemeSelectionScreen( TopAppBar( title = { Text( - text = "Appearance", + text = stringResource(Res.string.theme_appearance_title), fontWeight = FontWeight.SemiBold, ) }, @@ -98,7 +100,7 @@ fun ThemeSelectionScreen( }) { Icon( imageVector = Icons.AutoMirrored.Filled.ArrowBack, - contentDescription = "Back", + contentDescription = stringResource(Res.string.common_back), tint = MaterialTheme.colorScheme.primary, ) } @@ -108,7 +110,7 @@ fun ThemeSelectionScreen( ThemeSelectionScreenState.onConfirm(onBack = onNavigateBack) }) { Text( - text = "Done", + text = stringResource(Res.string.common_done), fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.primary, ) @@ -196,19 +198,19 @@ private fun LivePreviewHeader(theme: ThemeColors) { contentAlignment = Alignment.Center, ) { Text( - text = "Aa", + text = "Aa", // i18n-ignore: font preview glyph, non-translatable color = textOnPrimary, fontWeight = FontWeight.Bold, ) } Column { Text( - text = theme.displayName, + text = themeDisplayName(theme.id), fontWeight = FontWeight.SemiBold, color = textPrimary, ) Text( - text = theme.description, + text = themeDescription(theme.id), color = textSecondary, style = MaterialTheme.typography.bodySmall, ) @@ -241,12 +243,12 @@ private fun DynamicColorToggleRow( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = "Use system colors", + text = stringResource(Res.string.theme_use_system_colors), fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = "Follow Android 12+ Material You (wallpaper colors)", + text = stringResource(Res.string.theme_material_you_desc), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -309,12 +311,12 @@ private fun ThemeRowCard( verticalArrangement = Arrangement.spacedBy(AppSpacing.xs), ) { Text( - text = theme.displayName, + text = themeDisplayName(theme.id), fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface, ) Text( - text = theme.description, + text = themeDescription(theme.id), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -334,7 +336,7 @@ private fun ThemeRowCard( ) { Icon( imageVector = Icons.Default.Check, - contentDescription = "Selected", + contentDescription = stringResource(Res.string.common_selected), tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(16.dp), ) @@ -407,3 +409,43 @@ object ThemeSelectionScreenState { onBack() } } + +/** + * Resolves a theme's localized display name from its stable [ThemeColors.id]. + * The English [ThemeColors.displayName] remains a stable iOS-parity identifier; + * only the rendered label is localized here. + */ +@Composable +fun themeDisplayName(themeId: String): String = when (themeId) { + "default" -> stringResource(Res.string.theme_default) + "teal" -> stringResource(Res.string.theme_teal) + "ocean" -> stringResource(Res.string.theme_ocean) + "forest" -> stringResource(Res.string.theme_forest) + "sunset" -> stringResource(Res.string.theme_sunset) + "monochrome" -> stringResource(Res.string.theme_monochrome) + "lavender" -> stringResource(Res.string.theme_lavender) + "crimson" -> stringResource(Res.string.theme_crimson) + "midnight" -> stringResource(Res.string.theme_midnight) + "desert" -> stringResource(Res.string.theme_desert) + "mint" -> stringResource(Res.string.theme_mint) + else -> themeId +} + +/** + * Resolves a theme's localized description from its stable [ThemeColors.id]. + */ +@Composable +fun themeDescription(themeId: String): String = when (themeId) { + "default" -> stringResource(Res.string.theme_default_desc) + "teal" -> stringResource(Res.string.theme_teal_desc) + "ocean" -> stringResource(Res.string.theme_ocean_desc) + "forest" -> stringResource(Res.string.theme_forest_desc) + "sunset" -> stringResource(Res.string.theme_sunset_desc) + "monochrome" -> stringResource(Res.string.theme_monochrome_desc) + "lavender" -> stringResource(Res.string.theme_lavender_desc) + "crimson" -> stringResource(Res.string.theme_crimson_desc) + "midnight" -> stringResource(Res.string.theme_midnight_desc) + "desert" -> stringResource(Res.string.theme_desert_desc) + "mint" -> stringResource(Res.string.theme_mint_desc) + else -> "" +} diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt index 49b2b8c..053b0f8 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeFeatureScreen.kt @@ -19,6 +19,8 @@ import com.tt.honeyDue.ui.screens.subscription.FeatureComparisonScreen import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing import com.tt.honeyDue.utils.SubscriptionProducts +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource /** * Full inline paywall screen for upgrade prompts. @@ -42,9 +44,9 @@ fun UpgradeFeatureScreen( } } // Fallback values if trigger not found - val title = triggerData?.title ?: "Upgrade Required" - val message = triggerData?.message ?: "This feature is available with a Pro subscription." - val buttonText = triggerData?.buttonText ?: "Upgrade to Pro" + val title = triggerData?.title ?: stringResource(Res.string.upgrade_feature_required_title) + val message = triggerData?.message ?: stringResource(Res.string.upgrade_feature_required_message) + val buttonText = triggerData?.buttonText ?: stringResource(Res.string.profile_upgrade_to_pro) Scaffold( topBar = { @@ -52,7 +54,7 @@ fun UpgradeFeatureScreen( title = { Text(title, fontWeight = FontWeight.SemiBold) }, navigationIcon = { IconButton(onClick = onNavigateBack) { - Icon(Icons.AutoMirrored.Filled.ArrowBack, "Back") + Icon(Icons.AutoMirrored.Filled.ArrowBack, stringResource(Res.string.a11y_back)) } }, colors = TopAppBarDefaults.topAppBarColors( @@ -114,10 +116,10 @@ fun UpgradeFeatureScreen( modifier = Modifier.padding(AppSpacing.lg), verticalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { - FeatureRow(Icons.Default.Home, "Unlimited properties") - FeatureRow(Icons.Default.CheckCircle, "Unlimited tasks") - FeatureRow(Icons.Default.People, "Contractor management") - FeatureRow(Icons.Default.Description, "Document & warranty storage") + FeatureRow(Icons.Default.Home, stringResource(Res.string.upgrade_feature_unlimited_properties)) + FeatureRow(Icons.Default.CheckCircle, stringResource(Res.string.upgrade_feature_unlimited_tasks)) + FeatureRow(Icons.Default.People, stringResource(Res.string.upgrade_feature_contractor_management)) + FeatureRow(Icons.Default.Description, stringResource(Res.string.upgrade_feature_document_warranty_storage)) } } @@ -157,7 +159,7 @@ fun UpgradeFeatureScreen( ) { Icon( Icons.Default.Warning, - contentDescription = "Warning", + contentDescription = stringResource(Res.string.upgrade_warning), tint = MaterialTheme.colorScheme.error ) Text( @@ -173,7 +175,7 @@ fun UpgradeFeatureScreen( // Compare Plans TextButton(onClick = { showFeatureComparison = true }) { - Text("Compare Free vs Pro") + Text(stringResource(Res.string.upgrade_compare_free_vs_pro)) } // Restore Purchases @@ -183,7 +185,7 @@ fun UpgradeFeatureScreen( errorMessage = null }) { Text( - "Restore Purchases", + stringResource(Res.string.upgrade_restore_purchases), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -205,14 +207,14 @@ fun UpgradeFeatureScreen( if (showSuccessAlert) { AlertDialog( onDismissRequest = { showSuccessAlert = false }, - title = { Text("Subscription Active") }, - text = { Text("You now have full access to all Pro features!") }, + title = { Text(stringResource(Res.string.upgrade_subscription_active)) }, + text = { Text(stringResource(Res.string.upgrade_subscription_active_message)) }, confirmButton = { TextButton(onClick = { showSuccessAlert = false onNavigateBack() }) { - Text("Done") + Text(stringResource(Res.string.common_done)) } } ) @@ -256,9 +258,9 @@ private fun SubscriptionProductsSection( // Monthly Option SubscriptionProductCard( productId = SubscriptionProducts.MONTHLY, - name = "honeyDue Pro Monthly", + name = stringResource(Res.string.upgrade_product_monthly_name), price = "$2.99/month", - description = "Billed monthly", + description = stringResource(Res.string.upgrade_billed_monthly), savingsBadge = null, isSelected = false, isProcessing = isProcessing, @@ -268,10 +270,10 @@ private fun SubscriptionProductsSection( // Annual Option SubscriptionProductCard( productId = SubscriptionProducts.ANNUAL, - name = "honeyDue Pro Annual", + name = stringResource(Res.string.upgrade_product_annual_name), price = "$27.99/year", - description = "Billed annually", - savingsBadge = "Save 22%", + description = stringResource(Res.string.upgrade_billed_annually), + savingsBadge = stringResource(Res.string.upgrade_save_22), isSelected = false, isProcessing = isProcessing, onSelect = { onProductSelected(SubscriptionProducts.ANNUAL) } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradePromptDialog.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradePromptDialog.kt index 52105cf..5f46830 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradePromptDialog.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradePromptDialog.kt @@ -15,6 +15,8 @@ import com.tt.honeyDue.data.DataManager import com.tt.honeyDue.ui.screens.subscription.FeatureComparisonScreen import com.tt.honeyDue.ui.theme.AppRadius import com.tt.honeyDue.ui.theme.AppSpacing +import honeydue.composeapp.generated.resources.* +import org.jetbrains.compose.resources.stringResource @Composable fun UpgradePromptDialog( @@ -65,7 +67,7 @@ fun UpgradePromptDialog( // Title Text( - triggerData?.title ?: "Upgrade to Pro", + triggerData?.title ?: stringResource(Res.string.profile_upgrade_to_pro), style = MaterialTheme.typography.titleLarge, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center @@ -73,7 +75,7 @@ fun UpgradePromptDialog( // Message Text( - triggerData?.message ?: "Unlock unlimited access to all features", + triggerData?.message ?: stringResource(Res.string.upgrade_prompt_default_message), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center @@ -92,10 +94,10 @@ fun UpgradePromptDialog( .padding(AppSpacing.md), verticalArrangement = Arrangement.spacedBy(AppSpacing.sm) ) { - FeatureRow(Icons.Default.Home, "Unlimited properties") - FeatureRow(Icons.Default.CheckCircle, "Unlimited tasks") - FeatureRow(Icons.Default.People, "Contractor management") - FeatureRow(Icons.Default.Description, "Document & warranty storage") + FeatureRow(Icons.Default.Home, stringResource(Res.string.upgrade_feature_unlimited_properties)) + FeatureRow(Icons.Default.CheckCircle, stringResource(Res.string.upgrade_feature_unlimited_tasks)) + FeatureRow(Icons.Default.People, stringResource(Res.string.upgrade_feature_contractor_management)) + FeatureRow(Icons.Default.Description, stringResource(Res.string.upgrade_feature_document_warranty_storage)) } } @@ -119,7 +121,7 @@ fun UpgradePromptDialog( ) } else { Text( - triggerData?.buttonText ?: "Upgrade to Pro", + triggerData?.buttonText ?: stringResource(Res.string.profile_upgrade_to_pro), fontWeight = FontWeight.Bold ) } @@ -127,12 +129,12 @@ fun UpgradePromptDialog( // Compare Plans TextButton(onClick = { showFeatureComparison = true }) { - Text("Compare Free vs Pro") + Text(stringResource(Res.string.upgrade_compare_free_vs_pro)) } // Cancel TextButton(onClick = onDismiss) { - Text("Maybe Later") + Text(stringResource(Res.string.upgrade_maybe_later)) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt index 0ee044a..d5d1797 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/subscription/UpgradeScreen.kt @@ -59,7 +59,7 @@ fun UpgradeScreen( title = {}, navigationIcon = { IconButton(onClick = onNavigateBack) { - Icon(Icons.Default.Close, contentDescription = "Close") + Icon(Icons.Default.Close, contentDescription = stringResource(Res.string.a11y_close)) } }, colors = TopAppBarDefaults.topAppBarColors( @@ -110,13 +110,13 @@ fun UpgradeScreen( } Text( - text = "Upgrade to Pro", + text = stringResource(Res.string.upgrade_hero_title), style = MaterialTheme.typography.headlineMedium, fontWeight = FontWeight.Bold ) Text( - text = "Unlock the full potential of honeyDue", + text = stringResource(Res.string.upgrade_hero_subtitle), style = MaterialTheme.typography.bodyLarge, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center @@ -132,16 +132,16 @@ fun UpgradeScreen( verticalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { Text( - text = "Choose Your Plan", + text = stringResource(Res.string.upgrade_choose_plan), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) // Yearly Plan (Recommended) PlanCard( - title = "Yearly", + title = stringResource(Res.string.upgrade_plan_yearly), price = "$29.99/year", - savings = "Save 50%", + savings = stringResource(Res.string.upgrade_plan_save_50), isSelected = selectedPlan == PlanType.YEARLY, isRecommended = true, onClick = { selectedPlan = PlanType.YEARLY } @@ -149,7 +149,7 @@ fun UpgradeScreen( // Monthly Plan PlanCard( - title = "Monthly", + title = stringResource(Res.string.upgrade_plan_monthly), price = "$4.99/month", savings = null, isSelected = selectedPlan == PlanType.MONTHLY, @@ -166,45 +166,45 @@ fun UpgradeScreen( verticalArrangement = Arrangement.spacedBy(AppSpacing.md) ) { Text( - text = "What's Included", + text = stringResource(Res.string.upgrade_whats_included), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.SemiBold ) FeatureItem( icon = Icons.Default.Home, - title = "Unlimited Properties", - description = "Track maintenance for all your homes" + title = stringResource(Res.string.upgrade_feature_unlimited_properties), + description = stringResource(Res.string.upgrade_feature_unlimited_properties_desc) ) FeatureItem( icon = Icons.Default.CheckCircle, - title = "Unlimited Tasks", - description = "Never forget a maintenance task again" + title = stringResource(Res.string.upgrade_feature_unlimited_tasks), + description = stringResource(Res.string.upgrade_feature_unlimited_tasks_desc) ) FeatureItem( icon = Icons.Default.People, - title = "Contractor Management", - description = "Save and rate your trusted contractors" + title = stringResource(Res.string.upgrade_feature_contractor_management), + description = stringResource(Res.string.upgrade_feature_contractor_management_desc) ) FeatureItem( icon = Icons.Default.Description, - title = "Document Vault", - description = "Store warranties, receipts, and manuals" + title = stringResource(Res.string.upgrade_feature_document_vault), + description = stringResource(Res.string.upgrade_feature_document_vault_desc) ) FeatureItem( icon = Icons.Default.Share, - title = "Family Sharing", - description = "Invite family members to collaborate" + title = stringResource(Res.string.upgrade_feature_family_sharing), + description = stringResource(Res.string.upgrade_feature_family_sharing_desc) ) FeatureItem( icon = Icons.Default.Notifications, - title = "Smart Reminders", - description = "Get notified when tasks are due" + title = stringResource(Res.string.upgrade_feature_smart_reminders), + description = stringResource(Res.string.upgrade_feature_smart_reminders_desc) ) } @@ -232,7 +232,7 @@ fun UpgradeScreen( ) } else { Text( - text = "Subscribe Now", + text = stringResource(Res.string.upgrade_subscribe_now), fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleMedium ) @@ -257,12 +257,12 @@ fun UpgradeScreen( ) Spacer(modifier = Modifier.width(AppSpacing.sm)) } - Text("Restore Purchases") + Text(stringResource(Res.string.upgrade_restore_purchases)) } // Terms Text( - text = "Subscription automatically renews unless cancelled at least 24 hours before the end of the current period. Manage subscriptions in your device settings.", + text = stringResource(Res.string.upgrade_terms_text), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center, @@ -281,7 +281,7 @@ fun UpgradeScreen( ) { TextButton(onClick = { /* Open terms */ }) { Text( - "Terms of Use", + stringResource(Res.string.upgrade_terms_of_use), style = MaterialTheme.typography.bodySmall ) } @@ -291,7 +291,7 @@ fun UpgradeScreen( ) TextButton(onClick = { /* Open privacy */ }) { Text( - "Privacy Policy", + stringResource(Res.string.profile_privacy), style = MaterialTheme.typography.bodySmall ) } @@ -316,13 +316,13 @@ private fun PlanCard( val borderColor by animateColorAsState( targetValue = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outline.copy(alpha = 0.3f), - label = "borderColor" + label = "borderColor" // i18n-ignore: animation label, non-UI ) val backgroundColor by animateColorAsState( targetValue = if (isSelected) MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.3f) else MaterialTheme.colorScheme.surface, - label = "backgroundColor" + label = "backgroundColor" // i18n-ignore: animation label, non-UI ) Card( @@ -375,7 +375,7 @@ private fun PlanCard( color = MaterialTheme.colorScheme.primary ) { Text( - text = "BEST VALUE", + text = stringResource(Res.string.upgrade_best_value), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.padding(horizontal = AppSpacing.sm, vertical = 2.dp) @@ -453,7 +453,7 @@ private fun FeatureItem( Icon( Icons.Default.Check, - contentDescription = "Included", + contentDescription = stringResource(Res.string.upgrade_included), tint = MaterialTheme.colorScheme.primary, modifier = Modifier.size(20.dp) ) diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/OrganicDesign.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/OrganicDesign.kt index 30e6815..a830157 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/OrganicDesign.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/OrganicDesign.kt @@ -656,7 +656,7 @@ fun FloatingLeaf( ), repeatMode = RepeatMode.Reverse ), - label = "leafRotation" + label = "leafRotation" // i18n-ignore: animation label, non-UI ) val offsetY by infiniteTransition.animateFloat( @@ -670,7 +670,7 @@ fun FloatingLeaf( ), repeatMode = RepeatMode.Reverse ), - label = "leafOffset" + label = "leafOffset" // i18n-ignore: animation label, non-UI ) Icon( diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/ThemeColors.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/ThemeColors.kt index f243281..cd563dc 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/ThemeColors.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/ui/theme/ThemeColors.kt @@ -51,8 +51,8 @@ data class ThemeColors( object AppThemes { val Default = ThemeColors( id = "default", - displayName = "Default", - description = "Vibrant iOS system colors", + displayName = "Default", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Vibrant iOS system colors", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription // Light mode — iOS Default lightPrimary = Color(0xFF007AFF), @@ -81,8 +81,8 @@ object AppThemes { val Teal = ThemeColors( id = "teal", - displayName = "Teal", - description = "Blue-green with warm accents", + displayName = "Teal", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Blue-green with warm accents", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF07A0C3), lightSecondary = Color(0xFF0055A5), @@ -107,8 +107,8 @@ object AppThemes { val Ocean = ThemeColors( id = "ocean", - displayName = "Ocean", - description = "Deep blues and coral tones", + displayName = "Ocean", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Deep blues and coral tones", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF006B8F), lightSecondary = Color(0xFF008B8B), @@ -133,8 +133,8 @@ object AppThemes { val Forest = ThemeColors( id = "forest", - displayName = "Forest", - description = "Earth greens and golden hues", + displayName = "Forest", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Earth greens and golden hues", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF2D5016), lightSecondary = Color(0xFF6B8E23), @@ -159,8 +159,8 @@ object AppThemes { val Sunset = ThemeColors( id = "sunset", - displayName = "Sunset", - description = "Warm oranges and reds", + displayName = "Sunset", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Warm oranges and reds", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFFFF4500), lightSecondary = Color(0xFFFF6347), @@ -185,8 +185,8 @@ object AppThemes { val Monochrome = ThemeColors( id = "monochrome", - displayName = "Monochrome", - description = "Elegant grayscale", + displayName = "Monochrome", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Elegant grayscale", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF333333), lightSecondary = Color(0xFF666666), @@ -211,8 +211,8 @@ object AppThemes { val Lavender = ThemeColors( id = "lavender", - displayName = "Lavender", - description = "Soft purple with pink accents", + displayName = "Lavender", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Soft purple with pink accents", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF6B418B), lightSecondary = Color(0xFF8B61B0), @@ -237,8 +237,8 @@ object AppThemes { val Crimson = ThemeColors( id = "crimson", - displayName = "Crimson", - description = "Bold red with warm highlights", + displayName = "Crimson", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Bold red with warm highlights", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFFB51E28), lightSecondary = Color(0xFF992E38), @@ -263,8 +263,8 @@ object AppThemes { val Midnight = ThemeColors( id = "midnight", - displayName = "Midnight", - description = "Deep navy with sky blue", + displayName = "Midnight", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Deep navy with sky blue", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF1E4A94), lightSecondary = Color(0xFF2E61B0), @@ -289,8 +289,8 @@ object AppThemes { val Desert = ThemeColors( id = "desert", - displayName = "Desert", - description = "Warm terracotta and sand tones", + displayName = "Desert", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Warm terracotta and sand tones", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFFB0614A), lightSecondary = Color(0xFF9E7D61), @@ -315,8 +315,8 @@ object AppThemes { val Mint = ThemeColors( id = "mint", - displayName = "Mint", - description = "Fresh green with turquoise", + displayName = "Mint", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription + description = "Fresh green with turquoise", // i18n-ignore: iOS-parity identifier; localized display resolved at render via themeDisplayName/themeDescription lightPrimary = Color(0xFF38B094), lightSecondary = Color(0xFF61C7B0), diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/DateUtils.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/DateUtils.kt index ca1c998..4f0f01b 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/DateUtils.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/DateUtils.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.util +import com.tt.honeyDue.i18n.ClientStrings import kotlin.time.Clock import kotlin.time.ExperimentalTime import kotlinx.datetime.DateTimeUnit @@ -46,9 +47,9 @@ object DateUtils { val today = getToday() when { - date == today -> "Today" - date == today.plus(1, DateTimeUnit.DAY) -> "Tomorrow" - date == today.minus(1, DateTimeUnit.DAY) -> "Yesterday" + date == today -> ClientStrings.t("date.today") + date == today.plus(1, DateTimeUnit.DAY) -> ClientStrings.t("date.tomorrow") + date == today.minus(1, DateTimeUnit.DAY) -> ClientStrings.t("date.yesterday") else -> formatDateMedium(date) } } catch (e: Exception) { @@ -75,7 +76,7 @@ object DateUtils { * Format a LocalDate to medium format (e.g., "Dec 15, 2024") */ private fun formatDateMedium(date: LocalDate): String { - val monthName = date.month.name.lowercase().replaceFirstChar { it.uppercase() }.take(3) + val monthName = ClientStrings.t("month.${date.monthNumber}") return "$monthName ${date.dayOfMonth}, ${date.year}" } @@ -94,9 +95,9 @@ object DateUtils { val today = getToday() when { - date == today -> "Today" - date == today.plus(1, DateTimeUnit.DAY) -> "Tomorrow" - date == today.minus(1, DateTimeUnit.DAY) -> "Yesterday" + date == today -> ClientStrings.t("date.today") + date == today.plus(1, DateTimeUnit.DAY) -> ClientStrings.t("date.tomorrow") + date == today.minus(1, DateTimeUnit.DAY) -> ClientStrings.t("date.yesterday") else -> formatDateMedium(date) } } catch (e: Exception) { @@ -118,10 +119,10 @@ object DateUtils { val time = localDateTime.time val hour = if (time.hour == 0) 12 else if (time.hour > 12) time.hour - 12 else time.hour - val amPm = if (time.hour < 12) "AM" else "PM" + val amPm = if (time.hour < 12) ClientStrings.t("time.am") else ClientStrings.t("time.pm") val minuteStr = time.minute.toString().padStart(2, '0') - "${formatDateMedium(date)} at $hour:$minuteStr $amPm" + "${formatDateMedium(date)} ${ClientStrings.t("date.at")} $hour:$minuteStr $amPm" // i18n-ignore: interpolated time format; label localized via ClientStrings } catch (e: Exception) { formatDate(dateTimeString) } @@ -140,11 +141,11 @@ object DateUtils { val daysDiff = (date.toEpochDays() - today.toEpochDays()).toInt() when (daysDiff) { - 0 -> "Today" - 1 -> "Tomorrow" - -1 -> "Yesterday" - in 2..7 -> "in $daysDiff days" - in -7..-2 -> "${-daysDiff} days ago" + 0 -> ClientStrings.t("date.today") + 1 -> ClientStrings.t("date.tomorrow") + -1 -> ClientStrings.t("date.yesterday") + in 2..7 -> ClientStrings.t("date.in_days", daysDiff) + in -7..-2 -> ClientStrings.t("date.days_ago", -daysDiff) else -> formatDateMedium(date) } } catch (e: Exception) { @@ -237,11 +238,13 @@ object DateUtils { * @return Formatted string like "8:00 AM" or "2:00 PM" */ fun formatHour(hour: Int): String { + val am = ClientStrings.t("time.am") + val pm = ClientStrings.t("time.pm") return when { - hour == 0 -> "12:00 AM" - hour < 12 -> "$hour:00 AM" - hour == 12 -> "12:00 PM" - else -> "${hour - 12}:00 PM" + hour == 0 -> "12:00 $am" + hour < 12 -> "$hour:00 $am" // i18n-ignore: interpolated time format; am/pm localized via ClientStrings + hour == 12 -> "12:00 $pm" + else -> "${hour - 12}:00 $pm" // i18n-ignore: interpolated time format; pm localized via ClientStrings } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/ErrorMessageParser.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/ErrorMessageParser.kt index 5c61505..7b49638 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/ErrorMessageParser.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/util/ErrorMessageParser.kt @@ -1,5 +1,6 @@ package com.tt.honeyDue.util +import com.tt.honeyDue.i18n.ClientStrings import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive @@ -9,27 +10,27 @@ import kotlinx.serialization.json.jsonPrimitive */ object ErrorMessageParser { - // Network/connection error patterns to detect + // Network/connection error patterns to detect, mapped to a localized message key. private val networkErrorPatterns = listOf( - "Could not connect to the server" to "Unable to connect to the server. Please check your internet connection.", - "NSURLErrorDomain" to "Unable to connect to the server. Please check your internet connection.", - "UnresolvedAddressException" to "Unable to connect to the server. Please check your internet connection.", - "ConnectException" to "Unable to connect to the server. Please check your internet connection.", - "SocketTimeoutException" to "Request timed out. Please try again.", - "TimeoutException" to "Request timed out. Please try again.", - "No address associated" to "Unable to connect to the server. Please check your internet connection.", - "Network is unreachable" to "No internet connection. Please check your network settings.", - "Connection refused" to "Unable to connect to the server. The server may be down.", - "Connection reset" to "Connection was interrupted. Please try again.", - "SSLHandshakeException" to "Secure connection failed. Please try again.", - "CertificateException" to "Secure connection failed. Please try again.", - "UnknownHostException" to "Unable to connect to the server. Please check your internet connection.", - "java.net.SocketException" to "Connection error. Please try again.", - "CFNetwork" to "Unable to connect to the server. Please check your internet connection.", - "kCFStreamError" to "Unable to connect to the server. Please check your internet connection.", - "Code=-1004" to "Unable to connect to the server. Please check your internet connection.", - "Code=-1009" to "No internet connection. Please check your network settings.", - "Code=-1001" to "Request timed out. Please try again." + "Could not connect to the server" to "err.net.no_connection", + "NSURLErrorDomain" to "err.net.no_connection", + "UnresolvedAddressException" to "err.net.no_connection", + "ConnectException" to "err.net.no_connection", + "SocketTimeoutException" to "err.net.timeout", + "TimeoutException" to "err.net.timeout", + "No address associated" to "err.net.no_connection", + "Network is unreachable" to "err.net.no_internet", + "Connection refused" to "err.net.server_down", + "Connection reset" to "err.net.interrupted", + "SSLHandshakeException" to "err.net.ssl", + "CertificateException" to "err.net.ssl", + "UnknownHostException" to "err.net.no_connection", + "java.net.SocketException" to "err.net.generic", + "CFNetwork" to "err.net.no_connection", + "kCFStreamError" to "err.net.no_connection", + "Code=-1004" to "err.net.no_connection", + "Code=-1009" to "err.net.no_internet", + "Code=-1001" to "err.net.timeout" ) /** @@ -42,22 +43,22 @@ object ErrorMessageParser { val trimmed = rawMessage.trim() // Check for network/connection errors first (these are technical messages from exceptions) - for ((pattern, friendlyMessage) in networkErrorPatterns) { + for ((pattern, messageKey) in networkErrorPatterns) { if (trimmed.contains(pattern, ignoreCase = true)) { - return friendlyMessage + return ClientStrings.t(messageKey) } } // Check if it looks like a technical exception message if (isTechnicalError(trimmed)) { - return "Something went wrong. Please try again." + return ClientStrings.t("err.generic") } // Check if the message looks like JSON (starts with { or [) if (!trimmed.startsWith("{") && !trimmed.startsWith("[")) { // Not JSON - if it's a short, readable message, return it // Otherwise return a generic message - return if (isUserFriendly(trimmed)) trimmed else "Something went wrong. Please try again." + return if (isUserFriendly(trimmed)) trimmed else ClientStrings.t("err.generic") } // If it's JSON, try to parse and extract meaningful error info @@ -75,15 +76,15 @@ object ErrorMessageParser { // Check if this looks like a data object (has id, title/name, etc) // rather than an error response if (json.containsKey("id") && (json.containsKey("title") || json.containsKey("name"))) { - return "Request failed. Please check your input and try again." + return ClientStrings.t("err.request_failed") } } // If we couldn't extract a message, return a generic error - "An error occurred. Please try again." + ClientStrings.t("err.generic_retry") } catch (e: Exception) { // JSON parsing failed, return generic error - "An error occurred. Please try again." + ClientStrings.t("err.generic_retry") } } @@ -92,22 +93,22 @@ object ErrorMessageParser { */ private fun isTechnicalError(message: String): Boolean { val technicalIndicators = listOf( - "Exception", - "Error Domain=", - "UserInfo=", - "at com.", - "at org.", - "at java.", - "at kotlin.", - "at io.", - "Caused by:", - "Stack trace:", - ".kt:", - ".java:", + "Exception", // i18n-ignore: error-detection substring, non-UI + "Error Domain=", // i18n-ignore: error-detection substring, non-UI + "UserInfo=", // i18n-ignore: error-detection substring, non-UI + "at com.", // i18n-ignore: error-detection substring, non-UI + "at org.", // i18n-ignore: error-detection substring, non-UI + "at java.", // i18n-ignore: error-detection substring, non-UI + "at kotlin.", // i18n-ignore: error-detection substring, non-UI + "at io.", // i18n-ignore: error-detection substring, non-UI + "Caused by:", // i18n-ignore: error-detection substring, non-UI + "Stack trace:", // i18n-ignore: error-detection substring, non-UI + ".kt:", // i18n-ignore: error-detection substring, non-UI + ".java:", // i18n-ignore: error-detection substring, non-UI "0x", - "Code=", - "interface:", - "LocalDataTask" + "Code=", // i18n-ignore: error-detection substring, non-UI + "interface:", // i18n-ignore: error-detection substring, non-UI + "LocalDataTask" // i18n-ignore: error-detection substring, non-UI ) return technicalIndicators.any { message.contains(it, ignoreCase = true) } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/utils/SubscriptionHelper.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/utils/SubscriptionHelper.kt index 129a765..faaabc9 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/utils/SubscriptionHelper.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/utils/SubscriptionHelper.kt @@ -385,9 +385,9 @@ object SubscriptionHelper { // ===== DEPRECATED - Keep for backwards compatibility ===== - @Deprecated("Use isContractorsBlocked() instead", ReplaceWith("isContractorsBlocked()")) + @Deprecated("Use isContractorsBlocked() instead", ReplaceWith("isContractorsBlocked()")) // i18n-ignore: deprecation annotation, non-UI fun shouldShowUpgradePromptForContractors(): UsageCheck = isContractorsBlocked() - @Deprecated("Use isDocumentsBlocked() instead", ReplaceWith("isDocumentsBlocked()")) + @Deprecated("Use isDocumentsBlocked() instead", ReplaceWith("isDocumentsBlocked()")) // i18n-ignore: deprecation annotation, non-UI fun shouldShowUpgradePromptForDocuments(): UsageCheck = isDocumentsBlocked() } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/AuthViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/AuthViewModel.kt index a3a7ea4..0bfd4f8 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/AuthViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/AuthViewModel.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.viewmodel +import com.tt.honeyDue.i18n.ClientStrings + import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.data.DataManager @@ -83,7 +85,7 @@ class AuthViewModel( _loginState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -106,7 +108,7 @@ class AuthViewModel( ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -119,14 +121,14 @@ class AuthViewModel( viewModelScope.launch { _verifyEmailState.value = ApiResult.Loading val token = DataManager.authToken.value ?: run { - _verifyEmailState.value = ApiResult.Error("Not authenticated") + _verifyEmailState.value = ApiResult.Error(ClientStrings.t("err.not_authenticated")) return@launch } val result = APILayer.verifyEmail(token, VerifyEmailRequest(code = code)) _verifyEmailState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -139,7 +141,7 @@ class AuthViewModel( viewModelScope.launch { _updateProfileState.value = ApiResult.Loading val token = DataManager.authToken.value ?: run { - _updateProfileState.value = ApiResult.Error("Not authenticated") + _updateProfileState.value = ApiResult.Error(ClientStrings.t("err.not_authenticated")) return@launch } val result = APILayer.updateProfile( @@ -153,7 +155,7 @@ class AuthViewModel( _updateProfileState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -184,7 +186,7 @@ class AuthViewModel( _forgotPasswordState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -200,7 +202,7 @@ class AuthViewModel( _verifyResetCodeState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -222,7 +224,7 @@ class AuthViewModel( _resetPasswordState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -253,7 +255,7 @@ class AuthViewModel( _appleSignInState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -272,7 +274,7 @@ class AuthViewModel( _googleSignInState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -295,7 +297,7 @@ class AuthViewModel( _deleteAccountState.value = when (result) { is ApiResult.Success -> ApiResult.Success(result.data) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/DocumentViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/DocumentViewModel.kt index 554f9af..dc3c859 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/DocumentViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/DocumentViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.data.DataManager import com.tt.honeyDue.data.IDataManager +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.models.* import com.tt.honeyDue.network.APILayer import com.tt.honeyDue.network.ApiResult @@ -189,12 +190,12 @@ class DocumentViewModel( images.mapIndexed { index, image -> // Always use .jpg extension since we compress to JPEG val baseName = image.fileName.ifBlank { "image_$index" } - if (baseName.endsWith(".jpg", ignoreCase = true) || - baseName.endsWith(".jpeg", ignoreCase = true)) { + if (baseName.endsWith(".jpg", ignoreCase = true) || // i18n-ignore: file-extension check, non-UI + baseName.endsWith(".jpeg", ignoreCase = true)) { // i18n-ignore: file-extension check, non-UI baseName } else { // Remove any existing extension and add .jpg - baseName.substringBeforeLast('.', baseName) + ".jpg" + baseName.substringBeforeLast('.', baseName) + ".jpg" // i18n-ignore: file-extension suffix, non-UI } } } else null @@ -295,11 +296,11 @@ class DocumentViewModel( // Determine filename with .jpg extension val fileName = if (image.fileName.isNotBlank()) { val baseName = image.fileName - if (baseName.endsWith(".jpg", ignoreCase = true) || - baseName.endsWith(".jpeg", ignoreCase = true)) { + if (baseName.endsWith(".jpg", ignoreCase = true) || // i18n-ignore: file-extension check, non-UI + baseName.endsWith(".jpeg", ignoreCase = true)) { // i18n-ignore: file-extension check, non-UI baseName } else { - baseName.substringBeforeLast('.', baseName) + ".jpg" + baseName.substringBeforeLast('.', baseName) + ".jpg" // i18n-ignore: file-extension suffix, non-UI } } else { "image_$index.jpg" @@ -315,7 +316,7 @@ class DocumentViewModel( if (uploadResult is ApiResult.Error) { uploadFailed = true _updateState.value = ApiResult.Error( - "Document updated but failed to upload image: ${uploadResult.message}", + ClientStrings.t("err.vm.document_updated_image_upload_failed", uploadResult.message), uploadResult.code ) break @@ -379,11 +380,11 @@ class DocumentViewModel( val compressedBytes = ImageCompressor.compressImage(imageData) val fileName = if (imageData.fileName.isNotBlank()) { val baseName = imageData.fileName - if (baseName.endsWith(".jpg", ignoreCase = true) || - baseName.endsWith(".jpeg", ignoreCase = true)) { + if (baseName.endsWith(".jpg", ignoreCase = true) || // i18n-ignore: file-extension check, non-UI + baseName.endsWith(".jpeg", ignoreCase = true)) { // i18n-ignore: file-extension check, non-UI baseName } else { - baseName.substringBeforeLast('.', baseName) + ".jpg" + baseName.substringBeforeLast('.', baseName) + ".jpg" // i18n-ignore: file-extension suffix, non-UI } } else { "image.jpg" diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/OnboardingViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/OnboardingViewModel.kt index 44c23a3..3bb7295 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/OnboardingViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/OnboardingViewModel.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.viewmodel +import com.tt.honeyDue.i18n.ClientStrings + import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.data.DataManager @@ -285,7 +287,7 @@ class OnboardingViewModel : ViewModel() { ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -303,7 +305,7 @@ class OnboardingViewModel : ViewModel() { ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -315,14 +317,14 @@ class OnboardingViewModel : ViewModel() { viewModelScope.launch { _verifyEmailState.value = ApiResult.Loading val token = DataManager.authToken.value ?: run { - _verifyEmailState.value = ApiResult.Error("Not authenticated") + _verifyEmailState.value = ApiResult.Error(ClientStrings.t("err.not_authenticated")) return@launch } val result = APILayer.verifyEmail(token, VerifyEmailRequest(code = code)) _verifyEmailState.value = when (result) { is ApiResult.Success -> ApiResult.Success(Unit) is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -378,7 +380,7 @@ class OnboardingViewModel : ViewModel() { _createResidenceState.value = when (result) { is ApiResult.Success -> ApiResult.Success(Unit) is ApiResult.Error -> result - else -> ApiResult.Error("Failed to create residence") + else -> ApiResult.Error(ClientStrings.t("err.vm.failed_create_residence")) } } } @@ -393,7 +395,7 @@ class OnboardingViewModel : ViewModel() { _joinResidenceState.value = when (result) { is ApiResult.Success -> ApiResult.Success(Unit) is ApiResult.Error -> result - else -> ApiResult.Error("Failed to join residence") + else -> ApiResult.Error(ClientStrings.t("err.vm.failed_join_residence")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/PasswordResetViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/PasswordResetViewModel.kt index e0f8a7f..c4ddd94 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/PasswordResetViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/PasswordResetViewModel.kt @@ -1,5 +1,7 @@ package com.tt.honeyDue.viewmodel +import com.tt.honeyDue.i18n.ClientStrings + import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.models.* @@ -64,7 +66,7 @@ class PasswordResetViewModel( ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -82,7 +84,7 @@ class PasswordResetViewModel( ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } @@ -92,7 +94,7 @@ class PasswordResetViewModel( fun resetPassword(newPassword: String, confirmPassword: String) { val token = _resetToken.value if (token == null) { - _resetPasswordState.value = ApiResult.Error("Invalid reset token. Please start over.") + _resetPasswordState.value = ApiResult.Error(ClientStrings.t("err.vm.invalid_reset_token")) return } @@ -115,7 +117,7 @@ class PasswordResetViewModel( ApiResult.Success(result.data) } is ApiResult.Error -> result - else -> ApiResult.Error("Unknown error") + else -> ApiResult.Error(ClientStrings.t("err.unknown")) } } } diff --git a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/TaskCompletionViewModel.kt b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/TaskCompletionViewModel.kt index 72145bc..7c5fd4b 100644 --- a/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/TaskCompletionViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/tt/honeyDue/viewmodel/TaskCompletionViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.tt.honeyDue.models.TaskCompletionCreateRequest import com.tt.honeyDue.models.TaskCompletionResponse +import com.tt.honeyDue.i18n.ClientStrings import com.tt.honeyDue.network.ApiResult import com.tt.honeyDue.network.APILayer import com.tt.honeyDue.util.ImageCompressor @@ -51,9 +52,9 @@ class TaskCompletionViewModel : ViewModel() { val compressed = ImageCompressor.compressImage(image) val fileName = run { val base = image.fileName.ifBlank { "completion_$index" } - if (base.endsWith(".jpg", ignoreCase = true) || - base.endsWith(".jpeg", ignoreCase = true) - ) base else base.substringBeforeLast('.', base) + ".jpg" + if (base.endsWith(".jpg", ignoreCase = true) || // i18n-ignore: file-extension check, non-UI + base.endsWith(".jpeg", ignoreCase = true) // i18n-ignore: file-extension check, non-UI + ) base else base.substringBeforeLast('.', base) + ".jpg" // i18n-ignore: file-extension suffix, non-UI } val uploadResult = APILayer.uploadImage( category = "completion", @@ -68,7 +69,7 @@ class TaskCompletionViewModel : ViewModel() { return@launch } else -> { - _createCompletionState.value = ApiResult.Error("Upload failed in unexpected state") + _createCompletionState.value = ApiResult.Error(ClientStrings.t("err.vm.upload_unexpected_state")) return@launch } } diff --git a/iosApp/HoneyDue/HoneyDue.swift b/iosApp/HoneyDue/HoneyDue.swift index 93a2007..28176ca 100644 --- a/iosApp/HoneyDue/HoneyDue.swift +++ b/iosApp/HoneyDue/HoneyDue.swift @@ -59,17 +59,21 @@ private func formatWidgetDate(_ dateString: String) -> String { let dueDay = calendar.startOfDay(for: parsedDate) if calendar.isDateInToday(parsedDate) { - return "Today" + return String(localized: "Today") } let components = calendar.dateComponents([.day], from: today, to: dueDay) let days = components.day ?? 0 if days > 0 { - return days == 1 ? "in 1 day" : "in \(days) days" + return days == 1 + ? String(localized: "in 1 day") + : String(format: String(localized: "in %lld days"), days) } else { let overdueDays = abs(days) - return overdueDays == 1 ? "1 day ago" : "\(overdueDays) days ago" + return overdueDays == 1 + ? String(localized: "1 day ago") + : String(format: String(localized: "%lld days ago"), overdueDays) } } @@ -380,7 +384,9 @@ struct FreeWidgetView: View { ) } - Text(entry.taskCount == 1 ? "task waiting" : "tasks waiting") + Text(entry.taskCount == 1 + ? String(localized: "task waiting") + : String(localized: "tasks waiting")) .font(.system(size: 14, weight: .semibold, design: .rounded)) .foregroundStyle(Color.appTextSecondary) .multilineTextAlignment(.center) @@ -423,7 +429,7 @@ struct SmallWidgetView: View { ) if entry.taskCount > 0 { - Text(entry.taskCount == 1 ? "task" : "tasks") + Text(entry.taskCount == 1 ? String(localized: "task") : String(localized: "tasks")) .font(.system(size: 11, weight: .semibold, design: .rounded)) .foregroundStyle(Color.appTextSecondary) } @@ -556,7 +562,7 @@ struct MediumWidgetView: View { ) } - Text(entry.taskCount == 1 ? "task" : "tasks") + Text(entry.taskCount == 1 ? String(localized: "task") : String(localized: "tasks")) .font(.system(size: 12, weight: .semibold, design: .rounded)) .foregroundStyle(Color.appTextSecondary) @@ -748,7 +754,7 @@ struct LargeWidgetView: View { } if entry.upcomingTasks.count > maxTasksToShow { - Text("+ \(entry.upcomingTasks.count - maxTasksToShow) more") + Text(String(format: String(localized: "+ %lld more"), entry.upcomingTasks.count - maxTasksToShow)) .font(.system(size: 10, weight: .semibold, design: .rounded)) .foregroundStyle(Color.appTextSecondary) .frame(maxWidth: .infinity, alignment: .center) @@ -776,21 +782,21 @@ struct OrganicStatsView: View { // Overdue OrganicStatPillWidget( value: entry.overdueCount, - label: "Overdue", + label: String(localized: "Overdue"), color: entry.overdueCount > 0 ? Color.appError : Color.appTextSecondary ) // Next 7 Days OrganicStatPillWidget( value: entry.dueNext7DaysCount, - label: "7 Days", + label: String(localized: "7 Days"), color: Color.appAccent ) // Next 30 Days OrganicStatPillWidget( value: entry.dueNext30DaysCount, - label: "30 Days", + label: String(localized: "30 Days"), color: Color.appPrimary ) } @@ -816,7 +822,7 @@ struct OrganicStatPillWidget: View { ) ) - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 9, weight: .semibold, design: .rounded)) .foregroundStyle(Color.appTextSecondary) .lineLimit(1) diff --git a/iosApp/HoneyDue/Localizable.xcstrings b/iosApp/HoneyDue/Localizable.xcstrings new file mode 100644 index 0000000..7c4dd1d --- /dev/null +++ b/iosApp/HoneyDue/Localizable.xcstrings @@ -0,0 +1,1696 @@ +{ + "sourceLanguage": "en", + "strings": { + "Today": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Today" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Hoy" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aujourd'hui" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Heute" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Oggi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오늘" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vandaag" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Hoje" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "今天" + } + } + } + }, + "in 1 day": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "in 1 day" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "en 1 día" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "dans 1 jour" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "in 1 Tag" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "tra 1 giorno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "1日後" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "1일 후" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "over 1 dag" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "em 1 dia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "1 天后" + } + } + } + }, + "in %lld days": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "in %lld days" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "en %lld días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "dans %lld jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "in %lld Tagen" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "tra %lld giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日後" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 후" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "over %lld dagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "em %lld dias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天后" + } + } + } + }, + "1 day ago": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "1 day ago" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "hace 1 día" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "il y a 1 jour" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "vor 1 Tag" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "1 giorno fa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "1日前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "1일 전" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "1 dag geleden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "há 1 dia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "1 天前" + } + } + } + }, + "%lld days ago": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld days ago" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "hace %lld días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "il y a %lld jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "vor %lld Tagen" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld giorni fa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 전" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld dagen geleden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "há %lld dias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天前" + } + } + } + }, + "task waiting": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "task waiting" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "tarea pendiente" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "tâche en attente" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe wartet" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "attività in attesa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件のタスク待ち" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개 작업 대기 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "taak wacht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "tarefa pendente" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "项任务待处理" + } + } + } + }, + "tasks waiting": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "tasks waiting" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "tareas pendientes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "tâches en attente" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben warten" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "attività in attesa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件のタスク待ち" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개 작업 대기 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "taken wachten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "tarefas pendentes" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "项任务待处理" + } + } + } + }, + "task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件のタスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "taak" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "项任务" + } + } + } + }, + "tasks": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件のタスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "项任务" + } + } + } + }, + "+ %lld more": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "+ %lld more" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "+ %lld más" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "+ %lld de plus" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "+ %lld weitere" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "+ %lld altre" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "+ 他%lld件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "+ %lld개 더" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "+ %lld meer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "+ %lld mais" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "+ 还有 %lld 项" + } + } + } + }, + "Upgrade for interactive widgets": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Upgrade for interactive widgets" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Mejora para widgets interactivos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Passez à la version supérieure pour les widgets interactifs" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Upgrade für interaktive Widgets" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esegui l'upgrade per i widget interattivi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "インタラクティブウィジェットにアップグレード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인터랙티브 위젯으로 업그레이드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Upgrade voor interactieve widgets" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Faça upgrade para widgets interativos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "升级以使用交互式小组件" + } + } + } + }, + "All caught up!": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "All caught up!" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Todo al día!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tout est à jour !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alles erledigt!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutto in ordine!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべて完了!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모두 완료!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alles is bij!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tudo em dia!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "全部完成!" + } + } + } + }, + "Overdue": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Overdue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Vencida" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "En retard" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Überfällig" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "In ritardo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限切れ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기한 초과" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te laat" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atrasada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已逾期" + } + } + } + }, + "7 Days": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "7 Days" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "7 días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "7 jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "7 Tage" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "7 giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "7日間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "7일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "7 dagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "7 dias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "7 天" + } + } + } + }, + "30 Days": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "30 Days" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "30 días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "30 jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "30 Tage" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "30 giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "30日間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "30일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "30 dagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "30 dias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "30 天" + } + } + } + }, + "honeyDue Tasks": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue Tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tareas de honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâches honeyDue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-Aufgaben" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività di honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefas do honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 任务" + } + } + } + }, + "View and complete your upcoming tasks.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "View and complete your upcoming tasks." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Mira y completa tus próximas tareas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Consultez et terminez vos prochaines tâches." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sieh dir deine anstehenden Aufgaben an und erledige sie." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza e completa le tue prossime attività." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今後のタスクを確認して完了しましょう。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예정된 작업을 확인하고 완료하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bekijk en voltooi je komende taken." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Veja e conclua suas próximas tarefas." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看并完成即将到来的任务。" + } + } + } + }, + "honeyDue Configuration": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue Configuration" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Configuración de honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Configuration honeyDue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-Konfiguration" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Configurazione di honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-configuratie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Configuração do honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 配置" + } + } + } + }, + "Pick which residence this widget shows tasks for.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Pick which residence this widget shows tasks for." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Elige de qué residencia muestra tareas este widget." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisissez la résidence dont ce widget affiche les tâches." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wähle, für welche Residenz dieses Widget Aufgaben anzeigt." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scegli per quale residenza questo widget mostra le attività." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このウィジェットにタスクを表示する住居を選択します。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 위젯에 작업을 표시할 거주지를 선택하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kies voor welke residentie deze widget taken toont." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escolha de qual residência este widget mostra tarefas." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择此小组件显示哪个住所的任务。" + } + } + } + }, + "Residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résidence" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Residenz" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Residentie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + } + } + }, + "Complete Task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Complete Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe erledigen" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak voltooien" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成任务" + } + } + } + }, + "Mark a task as completed": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Mark a task as completed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Marcar una tarea como completada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Marquer une tâche comme terminée" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Eine Aufgabe als erledigt markieren" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Segna un'attività come completata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを完了としてマーク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 완료로 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Een taak als voltooid markeren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Marcar uma tarefa como concluída" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将任务标记为已完成" + } + } + } + }, + "Task ID": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task ID" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "ID de tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "ID de tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben-ID" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "ID attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクID" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 ID" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak-ID" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "ID da tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务 ID" + } + } + } + }, + "Task Title": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Title" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Título de tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Titre de la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabentitel" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Titolo attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 제목" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taaktitel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Título da tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务标题" + } + } + } + }, + "Open Task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Open Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Abrir tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ouvrir la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe öffnen" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Apri attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを開く" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 열기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak openen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Abrir tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "打开任务" + } + } + } + }, + "Open task details in the app": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Open task details in the app" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Abrir los detalles de la tarea en la app" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ouvrir les détails de la tâche dans l'app" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabendetails in der App öffnen" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Apri i dettagli dell'attività nell'app" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アプリでタスクの詳細を開く" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "앱에서 작업 상세 정보 열기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taakdetails in de app openen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Abrir os detalhes da tarefa no app" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在应用中打开任务详情" + } + } + } + } + }, + "version": "1.0" +} diff --git a/iosApp/iosApp/Analytics/AnalyticsManager.swift b/iosApp/iosApp/Analytics/AnalyticsManager.swift index ae04b98..e426cea 100644 --- a/iosApp/iosApp/Analytics/AnalyticsManager.swift +++ b/iosApp/iosApp/Analytics/AnalyticsManager.swift @@ -22,7 +22,7 @@ final class AnalyticsManager { private static let host = "https://analytics.88oakapps.com" - private static let optOutKey = "analyticsOptedOut" + private static let optOutKey = "analyticsOptedOut" // i18n-ignore: UserDefaults key (non-UI) private static let sessionReplayKey = "analytics_session_replay_enabled" private var isConfigured = false @@ -110,7 +110,7 @@ final class AnalyticsManager { guard isConfigured else { return } PostHogSDK.shared.capture("$exception", properties: [ "$exception_type": exception.name.rawValue, - "$exception_message": exception.reason ?? "No reason", + "$exception_message": exception.reason ?? "No reason", // i18n-ignore: analytics event payload (non-UI) "$exception_stack_trace_raw": exception.callStackSymbols.joined(separator: "\n"), "$exception_is_fatal": isFatal ]) @@ -124,7 +124,7 @@ final class AnalyticsManager { // so call PostHogSDK directly. PostHogSDK.shared.capture("$exception", properties: [ "$exception_type": exception.name.rawValue, - "$exception_message": exception.reason ?? "No reason", + "$exception_message": exception.reason ?? "No reason", // i18n-ignore: analytics event payload (non-UI) "$exception_stack_trace_raw": exception.callStackSymbols.joined(separator: "\n"), "$exception_is_fatal": true ]) diff --git a/iosApp/iosApp/Background/BackgroundTaskManager.swift b/iosApp/iosApp/Background/BackgroundTaskManager.swift index 2d90bea..3a3177a 100644 --- a/iosApp/iosApp/Background/BackgroundTaskManager.swift +++ b/iosApp/iosApp/Background/BackgroundTaskManager.swift @@ -182,7 +182,7 @@ final class BackgroundTaskManager { let formatter = DateFormatter() formatter.dateStyle = .short formatter.timeStyle = .short - return "Next refresh scheduled for approximately: \(formatter.string(from: nextDate))" + return "Next refresh scheduled for approximately: \(formatter.string(from: nextDate))" // i18n-ignore: debug-only scheduling status (non-UI) } /// Force a background refresh for testing (only works in debug builds with Xcode) diff --git a/iosApp/iosApp/Components/AuthenticatedImage.swift b/iosApp/iosApp/Components/AuthenticatedImage.swift index 719db82..ddb9301 100644 --- a/iosApp/iosApp/Components/AuthenticatedImage.swift +++ b/iosApp/iosApp/Components/AuthenticatedImage.swift @@ -110,7 +110,7 @@ private class AuthenticatedImageLoader: ObservableObject { _ = Self.memoryWarningObserver guard let mediaURL = mediaURL, !mediaURL.isEmpty else { - state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "No URL provided"])) + state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "No URL provided"])) // i18n-ignore: internal NSError description, never surfaced to UI (failure shows generic errorView) return } @@ -139,7 +139,7 @@ private class AuthenticatedImageLoader: ObservableObject { private func loadImage(mediaURL: String) async { // Get auth token guard let token = TokenStorage.shared.getToken() else { - state = .failure(NSError(domain: "AuthenticatedImage", code: 401, userInfo: [NSLocalizedDescriptionKey: "Not authenticated"])) + state = .failure(NSError(domain: "AuthenticatedImage", code: 401, userInfo: [NSLocalizedDescriptionKey: "Not authenticated"])) // i18n-ignore: internal NSError description, never surfaced to UI return } @@ -149,7 +149,7 @@ private class AuthenticatedImageLoader: ObservableObject { let fullURL = baseURL + mediaURL guard let url = URL(string: fullURL) else { - state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL: \(fullURL)"])) + state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid URL: \(fullURL)"])) // i18n-ignore: internal NSError description, never surfaced to UI return } @@ -170,14 +170,14 @@ private class AuthenticatedImageLoader: ObservableObject { // Validate response if let httpResponse = response as? HTTPURLResponse { guard (200...299).contains(httpResponse.statusCode) else { - state = .failure(NSError(domain: "AuthenticatedImage", code: httpResponse.statusCode, userInfo: [NSLocalizedDescriptionKey: "HTTP \(httpResponse.statusCode)"])) + state = .failure(NSError(domain: "AuthenticatedImage", code: httpResponse.statusCode, userInfo: [NSLocalizedDescriptionKey: "HTTP \(httpResponse.statusCode)"])) // i18n-ignore: internal NSError description, never surfaced to UI return } } // Convert to UIImage guard let image = UIImage(data: data) else { - state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid image data"])) + state = .failure(NSError(domain: "AuthenticatedImage", code: -1, userInfo: [NSLocalizedDescriptionKey: "Invalid image data"])) // i18n-ignore: internal NSError description, never surfaced to UI return } diff --git a/iosApp/iosApp/Contractor/ContractorCard.swift b/iosApp/iosApp/Contractor/ContractorCard.swift index e64dcf4..cef8037 100644 --- a/iosApp/iosApp/Contractor/ContractorCard.swift +++ b/iosApp/iosApp/Contractor/ContractorCard.swift @@ -76,7 +76,7 @@ struct ContractorCard: View { .foregroundColor(contractor.isFavorite ? Color.appAccent : Color.appTextSecondary.opacity(0.7)) } .buttonStyle(PlainButtonStyle()) - .accessibilityLabel(contractor.isFavorite ? "Remove \(contractor.name) from favorites" : "Add \(contractor.name) to favorites") + .accessibilityLabel(contractor.isFavorite ? String(format: String(localized: "Remove %@ from favorites"), contractor.name) : String(format: String(localized: "Add %@ to favorites"), contractor.name)) // Chevron Image(systemName: "chevron.right") diff --git a/iosApp/iosApp/Contractor/ContractorDetailView.swift b/iosApp/iosApp/Contractor/ContractorDetailView.swift index 37375b5..61777bc 100644 --- a/iosApp/iosApp/Contractor/ContractorDetailView.swift +++ b/iosApp/iosApp/Contractor/ContractorDetailView.swift @@ -230,7 +230,7 @@ struct ContractorDetailView: View { HStack(spacing: AppSpacing.xxs) { Image(systemName: "wrench.and.screwdriver") .font(.caption) - Text(specialty.name) + Text(specialty.displayName) .font(.body) } .padding(.horizontal, AppSpacing.sm) @@ -293,7 +293,7 @@ struct ContractorDetailView: View { label: L10n.Contractors.callAction, color: Color.appPrimary ) { - if let url = URL(string: "tel:\(phone.replacingOccurrences(of: " ", with: ""))") { + if let url = URL(string: "tel:\(phone.replacingOccurrences(of: " ", with: ""))") { // i18n-ignore: tel: URL construction (non-UI) openURL(url) } } @@ -385,7 +385,7 @@ struct ContractorDetailView: View { value: phone, iconColor: Color.appPrimary ) { - if let url = URL(string: "tel:\(phone.replacingOccurrences(of: " ", with: ""))") { + if let url = URL(string: "tel:\(phone.replacingOccurrences(of: " ", with: ""))") { // i18n-ignore: tel: URL construction (non-UI) openURL(url) } } diff --git a/iosApp/iosApp/Contractor/ContractorFormSheet.swift b/iosApp/iosApp/Contractor/ContractorFormSheet.swift index a38f351..37252b4 100644 --- a/iosApp/iosApp/Contractor/ContractorFormSheet.swift +++ b/iosApp/iosApp/Contractor/ContractorFormSheet.swift @@ -413,7 +413,7 @@ struct ContractorFormSheet: View { } }) { HStack { - Text(specialty.name) + Text(specialty.displayName) .foregroundColor(Color.appTextPrimary) Spacer() if selectedSpecialtyIds.contains(specialty.id) { diff --git a/iosApp/iosApp/Contractor/ContractorSharingManager.swift b/iosApp/iosApp/Contractor/ContractorSharingManager.swift index 56b81ea..b973286 100644 --- a/iosApp/iosApp/Contractor/ContractorSharingManager.swift +++ b/iosApp/iosApp/Contractor/ContractorSharingManager.swift @@ -30,7 +30,7 @@ class ContractorSharingManager: ObservableObject { /// - Returns: URL to the temporary file, or nil if creation failed func createShareableFile(contractor: Contractor) -> URL? { // Get current username for export metadata - let currentUsername = DataManagerObservable.shared.currentUser?.username ?? "Unknown" + let currentUsername = DataManagerObservable.shared.currentUser?.username ?? "Unknown" // i18n-ignore: export-metadata fallback serialized into share file (non-UI) let jsonContent = HoneyDueShareCodec.shared.encodeContractorPackage( contractor: contractor, @@ -68,7 +68,7 @@ class ContractorSharingManager: ObservableObject { // Verify user is authenticated guard TokenStorage.shared.getToken() != nil else { - importError = "You must be logged in to import a contractor" + importError = String(localized: "You must be logged in to import a contractor") isImporting = false completion(false) return @@ -109,7 +109,7 @@ class ContractorSharingManager: ObservableObject { self.isImporting = false completion(false) } else { - self.importError = "Unknown error occurred" + self.importError = String(localized: "Unknown error occurred") self.isImporting = false completion(false) } @@ -120,7 +120,7 @@ class ContractorSharingManager: ObservableObject { } } } catch { - importError = "Failed to read contractor file: \(error.localizedDescription)" + importError = String(format: String(localized: "Failed to read contractor file: %@"), error.localizedDescription) isImporting = false completion(false) } diff --git a/iosApp/iosApp/Contractor/ContractorViewModel.swift b/iosApp/iosApp/Contractor/ContractorViewModel.swift index a813a57..90d97b0 100644 --- a/iosApp/iosApp/Contractor/ContractorViewModel.swift +++ b/iosApp/iosApp/Contractor/ContractorViewModel.swift @@ -94,7 +94,7 @@ class ContractorViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to load contractors" + self.errorMessage = String(localized: "Failed to load contractors") self.isLoading = false } } catch { @@ -119,7 +119,7 @@ class ContractorViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to load contractor details" + self.errorMessage = String(localized: "Failed to load contractor details") self.isLoading = false } } catch { @@ -138,7 +138,7 @@ class ContractorViewModel: ObservableObject { let result = try await APILayer.shared.createContractor(request: request) if let success = result as? ApiResultSuccess { - self.successMessage = "Contractor added successfully" + self.successMessage = String(localized: "Contractor added successfully") self.isCreating = false // Update selectedContractor with the newly created contractor self.lastMutationTime = Date() @@ -149,7 +149,7 @@ class ContractorViewModel: ObservableObject { self.isCreating = false completion(false) } else { - self.errorMessage = "Failed to create contractor" + self.errorMessage = String(localized: "Failed to create contractor") self.isCreating = false completion(false) } @@ -170,7 +170,7 @@ class ContractorViewModel: ObservableObject { let result = try await APILayer.shared.updateContractor(id: id, request: request) if let success = result as? ApiResultSuccess { - self.successMessage = "Contractor updated successfully" + self.successMessage = String(localized: "Contractor updated successfully") self.isUpdating = false // Update selectedContractor immediately so detail views stay fresh self.lastMutationTime = Date() @@ -181,7 +181,7 @@ class ContractorViewModel: ObservableObject { self.isUpdating = false completion(false) } else { - self.errorMessage = "Failed to update contractor" + self.errorMessage = String(localized: "Failed to update contractor") self.isUpdating = false completion(false) } @@ -202,7 +202,7 @@ class ContractorViewModel: ObservableObject { let result = try await APILayer.shared.deleteContractor(id: id) if result is ApiResultSuccess { - self.successMessage = "Contractor deleted successfully" + self.successMessage = String(localized: "Contractor deleted successfully") self.isDeleting = false // DataManager is updated by APILayer, view updates via observation completion(true) @@ -211,7 +211,7 @@ class ContractorViewModel: ObservableObject { self.isDeleting = false completion(false) } else { - self.errorMessage = "Failed to delete contractor" + self.errorMessage = String(localized: "Failed to delete contractor") self.isDeleting = false completion(false) } @@ -237,7 +237,7 @@ class ContractorViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) completion(false) } else { - self.errorMessage = "Failed to update favorite status" + self.errorMessage = String(localized: "Failed to update favorite status") completion(false) } } catch { diff --git a/iosApp/iosApp/Contractor/ContractorsListView.swift b/iosApp/iosApp/Contractor/ContractorsListView.swift index 77129b6..7c09db2 100644 --- a/iosApp/iosApp/Contractor/ContractorsListView.swift +++ b/iosApp/iosApp/Contractor/ContractorsListView.swift @@ -119,7 +119,7 @@ struct ContractorsListView: View { .font(.system(size: 16, weight: .medium)) .foregroundColor(showFavoritesOnly ? Color.appAccent : Color.appTextSecondary) } - .accessibilityLabel(showFavoritesOnly ? "Show all contractors" : "Show favorites only") + .accessibilityLabel(showFavoritesOnly ? String(localized: "Show all contractors") : String(localized: "Show favorites only")) // Specialty Filter Menu { @@ -331,7 +331,7 @@ private struct OrganicContractorCard: View { if !contractor.specialties.isEmpty { HStack(spacing: 4) { ForEach(contractor.specialties.prefix(2), id: \.id) { specialty in - Text(specialty.name) + Text(specialty.displayName) .font(.system(size: 11, weight: .semibold)) .foregroundColor(Color.appPrimary) .padding(.horizontal, 8) @@ -357,7 +357,7 @@ private struct OrganicContractorCard: View { .foregroundColor(contractor.isFavorite ? Color.appAccent : Color.appTextSecondary) } .buttonStyle(.plain) - .accessibilityLabel(contractor.isFavorite ? "Remove \(contractor.name) from favorites" : "Add \(contractor.name) to favorites") + .accessibilityLabel(contractor.isFavorite ? String(format: String(localized: "Remove %@ from favorites"), contractor.name) : String(format: String(localized: "Add %@ to favorites"), contractor.name)) Image(systemName: "chevron.right") .font(.system(size: 12, weight: .semibold)) diff --git a/iosApp/iosApp/Core/FormStates/DocumentFormState.swift b/iosApp/iosApp/Core/FormStates/DocumentFormState.swift index ab1c854..96a8bfb 100644 --- a/iosApp/iosApp/Core/FormStates/DocumentFormState.swift +++ b/iosApp/iosApp/Core/FormStates/DocumentFormState.swift @@ -48,7 +48,7 @@ struct DocumentFormState: FormState { } mutating func validateAll() { - title.validate { ValidationRules.validateRequired($0, fieldName: "Title") } + title.validate { ValidationRules.validateRequired($0, fieldName: String(localized: "Title")) } // Validate email if provided if !claimEmail.isEmpty { diff --git a/iosApp/iosApp/Core/FormStates/ResidenceFormState.swift b/iosApp/iosApp/Core/FormStates/ResidenceFormState.swift index f1a96dc..84164b8 100644 --- a/iosApp/iosApp/Core/FormStates/ResidenceFormState.swift +++ b/iosApp/iosApp/Core/FormStates/ResidenceFormState.swift @@ -34,7 +34,7 @@ struct ResidenceFormState: FormState { } mutating func validateAll() { - name.validate { ValidationRules.validateRequired($0, fieldName: "Name") } + name.validate { ValidationRules.validateRequired($0, fieldName: String(localized: "Name")) } } mutating func reset() { diff --git a/iosApp/iosApp/Core/FormStates/TaskFormStates.swift b/iosApp/iosApp/Core/FormStates/TaskFormStates.swift index aa6b0f3..fb9a0ff 100644 --- a/iosApp/iosApp/Core/FormStates/TaskFormStates.swift +++ b/iosApp/iosApp/Core/FormStates/TaskFormStates.swift @@ -19,7 +19,7 @@ struct CompleteTaskFormState: FormState { mutating func validateAll() { completedByName.validate { value in - ValidationRules.validateRequired(value, fieldName: "Completed By") + ValidationRules.validateRequired(value, fieldName: String(localized: "Completed By")) } } @@ -71,7 +71,7 @@ struct TaskFormState: FormState { mutating func validateAll() { title.validate { value in - ValidationRules.validateRequired(value, fieldName: "Title") + ValidationRules.validateRequired(value, fieldName: String(localized: "Title")) } } diff --git a/iosApp/iosApp/Core/ValidationRules.swift b/iosApp/iosApp/Core/ValidationRules.swift index 0eb0c94..a8a2672 100644 --- a/iosApp/iosApp/Core/ValidationRules.swift +++ b/iosApp/iosApp/Core/ValidationRules.swift @@ -17,25 +17,25 @@ enum ValidationError: LocalizedError { var errorDescription: String? { switch self { case .required(let field): - return "\(field) is required" + return String(format: String(localized: "%@ is required"), field) case .invalidEmail: - return "Please enter a valid email address" + return String(localized: "Please enter a valid email address") case .passwordTooShort(let minLength): - return "Password must be at least \(minLength) characters" + return String(format: String(localized: "Password must be at least %lld characters"), minLength) case .passwordMismatch: - return "Passwords do not match" + return String(localized: "Passwords do not match") case .passwordMissingLetter: - return "Password must contain at least one letter" + return String(localized: "Password must contain at least one letter") case .passwordMissingUppercase: - return "Password must contain at least one uppercase letter" + return String(localized: "Password must contain at least one uppercase letter") case .passwordMissingLowercase: - return "Password must contain at least one lowercase letter" + return String(localized: "Password must contain at least one lowercase letter") case .passwordMissingNumber: - return "Password must contain at least one number" + return String(localized: "Password must contain at least one number") case .invalidCode(let length): - return "Code must be \(length) digits" + return String(format: String(localized: "Code must be %lld digits"), length) case .invalidUsername: - return "Username can only contain letters, numbers, and underscores" + return String(localized: "Username can only contain letters, numbers, and underscores") case .custom(let message): return message } @@ -55,7 +55,7 @@ enum ValidationRules { let trimmed = email.trimmingCharacters(in: .whitespacesAndNewlines) if trimmed.isEmpty { - return .required(field: "Email") + return .required(field: String(localized: "Email")) } let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}" @@ -86,7 +86,7 @@ enum ValidationRules { /// - Returns: ValidationError if invalid, nil if valid static func validatePassword(_ password: String, minLength: Int = 8) -> ValidationError? { if password.isEmpty { - return .required(field: "Password") + return .required(field: String(localized: "Password")) } if password.count < minLength { @@ -101,7 +101,7 @@ enum ValidationRules { /// - Returns: ValidationError if invalid, nil if valid static func validatePasswordStrength(_ password: String) -> ValidationError? { if password.isEmpty { - return .required(field: "Password") + return .required(field: String(localized: "Password")) } let hasUppercase = password.range(of: "[A-Z]", options: .regularExpression) != nil @@ -156,7 +156,7 @@ enum ValidationRules { let trimmed = code.trimmingCharacters(in: .whitespacesAndNewlines) if trimmed.isEmpty { - return .required(field: "Code") + return .required(field: String(localized: "Code")) } if trimmed.count != expectedLength || !trimmed.allSatisfy({ $0.isNumber }) { @@ -175,7 +175,7 @@ enum ValidationRules { let trimmed = username.trimmingCharacters(in: .whitespacesAndNewlines) if trimmed.isEmpty { - return .required(field: "Username") + return .required(field: String(localized: "Username")) } let usernameRegex = "^[A-Za-z0-9_]+$" diff --git a/iosApp/iosApp/Data/DataManagerObservable.swift b/iosApp/iosApp/Data/DataManagerObservable.swift index 9c6b9a1..b47474a 100644 --- a/iosApp/iosApp/Data/DataManagerObservable.swift +++ b/iosApp/iosApp/Data/DataManagerObservable.swift @@ -67,6 +67,16 @@ class DataManagerObservable: ObservableObject { @Published var taskCategories: [TaskCategory] = [] @Published var contractorSpecialties: [ContractorSpecialty] = [] + /// Home-profile field options (e.g. "heating_type" -> options), served + /// localized by the backend. Keyed by the backend field name. Uses the + /// shared Kotlin type (fully qualified to avoid colliding with the iOS-side + /// `HomeProfileOption` view struct). + @Published var homeProfileOptions: [String: [ComposeApp.HomeProfileOption]] = [:] + + /// Document type / category options, served localized by the backend. + @Published var documentTypes: [ComposeApp.HomeProfileOption] = [] + @Published var documentCategories: [ComposeApp.HomeProfileOption] = [] + // MARK: - Task Templates @Published var taskTemplates: [TaskTemplate] = [] @@ -150,6 +160,9 @@ class DataManagerObservable: ObservableObject { self.taskPriorities = fixture.taskPriorities.value self.taskCategories = fixture.taskCategories.value self.contractorSpecialties = fixture.contractorSpecialties.value + // Home-profile options aren't part of the IDataManager fixture protocol; + // previews fall back to the bundled defaults in the home-profile view. + self.homeProfileOptions = [:] // Task Templates self.taskTemplates = fixture.taskTemplates.value @@ -435,6 +448,32 @@ class DataManagerObservable: ObservableObject { } observationTasks.append(contractorSpecialtiesTask) + // Lookups - Home-profile field options (localized by the backend) + let homeProfileOptionsTask = Task { [weak self] in + for await items in DataManager.shared.homeProfileOptions { + guard let self else { return } + self.homeProfileOptions = items + } + } + observationTasks.append(homeProfileOptionsTask) + + // Lookups - Document types / categories (localized by the backend) + let documentTypesTask = Task { [weak self] in + for await items in DataManager.shared.documentTypes { + guard let self else { return } + self.documentTypes = items + } + } + observationTasks.append(documentTypesTask) + + let documentCategoriesTask = Task { [weak self] in + for await items in DataManager.shared.documentCategories { + guard let self else { return } + self.documentCategories = items + } + } + observationTasks.append(documentCategoriesTask) + // Task Templates let taskTemplatesTask = Task { [weak self] in for await items in DataManager.shared.taskTemplates { diff --git a/iosApp/iosApp/Documents/Components/DocumentCard.swift b/iosApp/iosApp/Documents/Components/DocumentCard.swift index 87bcd52..aa98dfd 100644 --- a/iosApp/iosApp/Documents/Components/DocumentCard.swift +++ b/iosApp/iosApp/Documents/Components/DocumentCard.swift @@ -88,7 +88,7 @@ struct DocumentCard: View { } private func getDocTypeDisplayName(_ type: String) -> String { - return DocumentType.companion.fromValue(value: type).displayName + return DocumentTypeHelper.displayName(for: type) } private func formatFileSize(_ bytes: Int) -> String { diff --git a/iosApp/iosApp/Documents/Components/WarrantyCard.swift b/iosApp/iosApp/Documents/Components/WarrantyCard.swift index edab805..c61d065 100644 --- a/iosApp/iosApp/Documents/Components/WarrantyCard.swift +++ b/iosApp/iosApp/Documents/Components/WarrantyCard.swift @@ -119,6 +119,6 @@ struct WarrantyCard: View { } private func getCategoryDisplayName(_ category: String) -> String { - return DocumentCategory.companion.fromValue(value: category).displayName + return DocumentCategoryHelper.displayName(for: category) } } diff --git a/iosApp/iosApp/Documents/DocumentDetailView.swift b/iosApp/iosApp/Documents/DocumentDetailView.swift index 52f97da..fdcc61a 100644 --- a/iosApp/iosApp/Documents/DocumentDetailView.swift +++ b/iosApp/iosApp/Documents/DocumentDetailView.swift @@ -141,12 +141,12 @@ struct DocumentDetailView: View { // or DocumentDownloadManager — architectural refactor deferred. private func downloadFile(document: Document) { guard let fileUrl = document.fileUrl else { - downloadError = "No file URL available" + downloadError = String(localized: "No file URL available") return } guard let token = TokenStorage.shared.getToken() else { - downloadError = "Not authenticated" + downloadError = String(localized: "Not authenticated") return } @@ -161,7 +161,7 @@ struct DocumentDetailView: View { guard let url = URL(string: fullURLString) else { await MainActor.run { - downloadError = "Invalid URL" + downloadError = String(localized: "Invalid URL") isDownloading = false } return @@ -179,7 +179,7 @@ struct DocumentDetailView: View { if let httpResponse = response as? HTTPURLResponse { guard (200...299).contains(httpResponse.statusCode) else { await MainActor.run { - downloadError = "Download failed: HTTP \(httpResponse.statusCode)" + downloadError = String(format: String(localized: "Download failed: HTTP %lld"), httpResponse.statusCode) isDownloading = false } return @@ -216,7 +216,7 @@ struct DocumentDetailView: View { } catch { await MainActor.run { - downloadError = "Download failed: \(error.localizedDescription)" + downloadError = String(format: String(localized: "Download failed: %@"), error.localizedDescription) isDownloading = false } } @@ -366,10 +366,10 @@ struct DocumentDetailView: View { sectionHeader(L10n.Documents.associations) if let residenceId = document.residenceId { - detailRow(label: L10n.Documents.residence, value: "Residence #\(residenceId)") + detailRow(label: L10n.Documents.residence, value: String(format: String(localized: "Residence #%lld"), Int(residenceId.intValue))) } if let taskId = document.taskId { - detailRow(label: "Task", value: "Task #\(taskId)") + detailRow(label: String(localized: "Task"), value: String(format: String(localized: "Task #%lld"), Int(taskId.intValue))) } } .padding() diff --git a/iosApp/iosApp/Documents/DocumentViewModel.swift b/iosApp/iosApp/Documents/DocumentViewModel.swift index cf045e6..4be2208 100644 --- a/iosApp/iosApp/Documents/DocumentViewModel.swift +++ b/iosApp/iosApp/Documents/DocumentViewModel.swift @@ -69,7 +69,7 @@ class DocumentViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to load documents" + self.errorMessage = String(localized: "Failed to load documents") self.isLoading = false } } catch { @@ -148,7 +148,7 @@ class DocumentViewModel: ObservableObject { success.data?.title == nil ? "title" : nil ].compactMap { $0 }.joined(separator: ", ") print("DocumentViewModel: Document creation returned incomplete data (missing: \(missingFields)), skipping image upload") - self.errorMessage = "Document created with incomplete data — images were not uploaded" + self.errorMessage = String(localized: "Document created with incomplete data — images were not uploaded") self.isLoading = false completion(false, self.errorMessage) return @@ -170,7 +170,7 @@ class DocumentViewModel: ObservableObject { self.isLoading = false completion(false, self.errorMessage) } else { - self.errorMessage = "Failed to create document" + self.errorMessage = String(localized: "Failed to create document") self.isLoading = false completion(false, self.errorMessage) } @@ -250,7 +250,7 @@ class DocumentViewModel: ObservableObject { self.isLoading = false completion(false, self.errorMessage) } else { - self.errorMessage = "Failed to update document" + self.errorMessage = String(localized: "Failed to update document") self.isLoading = false completion(false, self.errorMessage) } @@ -279,7 +279,7 @@ class DocumentViewModel: ObservableObject { self.isLoading = false completion(false) } else { - self.errorMessage = "Failed to delete document" + self.errorMessage = String(localized: "Failed to delete document") self.isLoading = false completion(false) } @@ -317,7 +317,7 @@ class DocumentViewModel: ObservableObject { private func uploadImages(documentId: Int32, images: [UIImage]) async -> String? { for (index, image) in images.enumerated() { guard let compressedData = ImageCompression.compressImage(image) else { - return "Failed to process image \(index + 1)" + return String(format: String(localized: "Failed to process image %lld"), index + 1) } let uploadResult: Any @@ -338,7 +338,7 @@ class DocumentViewModel: ObservableObject { } if !(uploadResult is ApiResultSuccess) { - return "Failed to upload image \(index + 1)" + return String(format: String(localized: "Failed to upload image %lld"), index + 1) } } diff --git a/iosApp/iosApp/Documents/DocumentViewModelWrapper.swift b/iosApp/iosApp/Documents/DocumentViewModelWrapper.swift index 3b014b0..3444a08 100644 --- a/iosApp/iosApp/Documents/DocumentViewModelWrapper.swift +++ b/iosApp/iosApp/Documents/DocumentViewModelWrapper.swift @@ -138,7 +138,7 @@ class DocumentViewModelWrapper: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { self.documentsState = DocumentStateError(message: error.message) } else { - self.documentsState = DocumentStateError(message: "Failed to load documents") + self.documentsState = DocumentStateError(message: String(localized: "Failed to load documents")) } } catch { self.documentsState = DocumentStateError(message: error.localizedDescription) @@ -170,7 +170,7 @@ class DocumentViewModelWrapper: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { self.documentDetailState = DocumentDetailStateError(message: error.message) } else { - self.documentDetailState = DocumentDetailStateError(message: "Failed to load document") + self.documentDetailState = DocumentDetailStateError(message: String(localized: "Failed to load document")) } } catch { self.documentDetailState = DocumentDetailStateError(message: error.localizedDescription) @@ -233,7 +233,7 @@ class DocumentViewModelWrapper: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { self.updateState = UpdateStateError(message: error.message) } else { - self.updateState = UpdateStateError(message: "Failed to update document") + self.updateState = UpdateStateError(message: String(localized: "Failed to update document")) } } catch { self.updateState = UpdateStateError(message: error.localizedDescription) @@ -253,7 +253,7 @@ class DocumentViewModelWrapper: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { self.deleteState = DeleteStateError(message: error.message) } else { - self.deleteState = DeleteStateError(message: "Failed to delete document") + self.deleteState = DeleteStateError(message: String(localized: "Failed to delete document")) } } catch { self.deleteState = DeleteStateError(message: error.localizedDescription) @@ -283,7 +283,7 @@ class DocumentViewModelWrapper: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { self.deleteImageState = DeleteImageStateError(message: error.message) } else { - self.deleteImageState = DeleteImageStateError(message: "Failed to delete image") + self.deleteImageState = DeleteImageStateError(message: String(localized: "Failed to delete image")) } } catch { self.deleteImageState = DeleteImageStateError(message: error.localizedDescription) diff --git a/iosApp/iosApp/Documents/DocumentsWarrantiesView.swift b/iosApp/iosApp/Documents/DocumentsWarrantiesView.swift index 423590b..096d5ce 100644 --- a/iosApp/iosApp/Documents/DocumentsWarrantiesView.swift +++ b/iosApp/iosApp/Documents/DocumentsWarrantiesView.swift @@ -118,7 +118,7 @@ struct DocumentsWarrantiesView: View { .font(.system(size: 16, weight: .medium)) .foregroundColor(showActiveOnly ? Color.appPrimary : Color.appTextSecondary) } - .accessibilityLabel(showActiveOnly ? "Show all warranties" : "Show active warranties only") + .accessibilityLabel(showActiveOnly ? String(localized: "Show all warranties") : String(localized: "Show active warranties only")) } // Filter Menu @@ -201,7 +201,7 @@ struct DocumentsWarrantiesView: View { UpgradePromptView(triggerKey: "view_documents", isPresented: $showingUpgradePrompt) } .onReceive(NotificationCenter.default.publisher(for: .navigateToDocument)) { notification in - if let documentId = notification.userInfo?["documentId"] as? Int { + if let documentId = notification.userInfo?["documentId"] as? Int { // i18n-ignore: NotificationCenter userInfo key (non-UI) navigateToDocumentFromPush(documentId: documentId) } else { selectedTab = .warranties @@ -383,16 +383,7 @@ extension DocumentCategory: CaseIterable { } var displayName: String { - switch self { - case .appliance: return "Appliance" - case .hvac: return "HVAC" - case .plumbing: return "Plumbing" - case .electrical: return "Electrical" - case .roofing: return "Roofing" - case .structural: return "Structural" - case .other: return "Other" - default: return "Unknown" - } + DocumentCategoryHelper.displayName(for: self.value) } } @@ -402,18 +393,6 @@ extension DocumentType: CaseIterable { } var displayName: String { - switch self { - case .warranty: return "Warranty" - case .manual: return "Manual" - case .receipt: return "Receipt" - case .inspection: return "Inspection" - case .permit: return "Permit" - case .deed: return "Deed" - case .insurance: return "Insurance" - case .contract: return "Contract" - case .photo: return "Photo" - case .other: return "Other" - default: return "Unknown" - } + DocumentTypeHelper.displayName(for: self.value) } } diff --git a/iosApp/iosApp/Documents/Helpers/DocumentHelpers.swift b/iosApp/iosApp/Documents/Helpers/DocumentHelpers.swift index 1d86779..4236aab 100644 --- a/iosApp/iosApp/Documents/Helpers/DocumentHelpers.swift +++ b/iosApp/iosApp/Documents/Helpers/DocumentHelpers.swift @@ -1,20 +1,31 @@ import Foundation +import ComposeApp struct DocumentTypeHelper { static let allTypes = ["warranty", "manual", "receipt", "inspection", "permit", "deed", "insurance", "contract", "photo", "other"] + /// Localized label for a document type. Prefers the backend-served + /// (localized) list; falls back to the bundled English defaults when the + /// lookup data hasn't loaded yet. static func displayName(for value: String) -> String { + if let opt = DataManager.shared.documentTypes.value.first(where: { $0.value == value }) { + return opt.displayName + } + return fallbackDisplayName(for: value) + } + + static func fallbackDisplayName(for value: String) -> String { switch value { - case "warranty": return "Warranty" - case "manual": return "User Manual" - case "receipt": return "Receipt/Invoice" - case "inspection": return "Inspection Report" - case "permit": return "Permit" - case "deed": return "Deed/Title" - case "insurance": return "Insurance" - case "contract": return "Contract" - case "photo": return "Photo" - default: return "Other" + case "warranty": return String(localized: "Warranty") + case "manual": return String(localized: "User Manual") + case "receipt": return String(localized: "Receipt/Invoice") + case "inspection": return String(localized: "Inspection Report") + case "permit": return String(localized: "Permit") + case "deed": return String(localized: "Deed/Title") + case "insurance": return String(localized: "Insurance") + case "contract": return String(localized: "Contract") + case "photo": return String(localized: "Photo") + default: return String(localized: "Other") } } } @@ -22,17 +33,26 @@ struct DocumentTypeHelper { struct DocumentCategoryHelper { static let allCategories = ["appliance", "hvac", "plumbing", "electrical", "roofing", "structural", "landscaping", "general", "other"] + /// Localized label for a document category. Prefers the backend-served + /// (localized) list; falls back to the bundled English defaults. static func displayName(for value: String) -> String { + if let opt = DataManager.shared.documentCategories.value.first(where: { $0.value == value }) { + return opt.displayName + } + return fallbackDisplayName(for: value) + } + + static func fallbackDisplayName(for value: String) -> String { switch value { - case "appliance": return "Appliance" - case "hvac": return "HVAC" - case "plumbing": return "Plumbing" - case "electrical": return "Electrical" - case "roofing": return "Roofing" - case "structural": return "Structural" - case "landscaping": return "Landscaping" - case "general": return "General" - default: return "Other" + case "appliance": return String(localized: "Appliance") + case "hvac": return String(localized: "HVAC") + case "plumbing": return String(localized: "Plumbing") + case "electrical": return String(localized: "Electrical") + case "roofing": return String(localized: "Roofing") + case "structural": return String(localized: "Structural") + case "landscaping": return String(localized: "Landscaping") + case "general": return String(localized: "General") + default: return String(localized: "Other") } } } diff --git a/iosApp/iosApp/Helpers/AccessibilityLabels.swift b/iosApp/iosApp/Helpers/AccessibilityLabels.swift index 0b18e36..2648eee 100644 --- a/iosApp/iosApp/Helpers/AccessibilityLabels.swift +++ b/iosApp/iosApp/Helpers/AccessibilityLabels.swift @@ -1,65 +1,78 @@ import Foundation -/// Centralized accessibility labels for VoiceOver -/// These labels provide human-readable descriptions for screen reader users +/// Centralized, localized accessibility labels for VoiceOver. struct A11y { // MARK: - Authentication struct Auth { - static let loginButton = "Sign in" - static let appleSignIn = "Sign in with Apple" - static let googleSignIn = "Sign in with Google" - static let forgotPassword = "Forgot password" - static let signUp = "Create account" - static let passwordToggle = "Toggle password visibility" - static let appLogo = "honeyDue app logo" + static var loginButton: String { String(localized: "Sign in") } + static var appleSignIn: String { String(localized: "Sign in with Apple") } + static var googleSignIn: String { String(localized: "Sign in with Google") } + static var forgotPassword: String { String(localized: "Forgot password") } + static var signUp: String { String(localized: "Create account") } + static var passwordToggle: String { String(localized: "Toggle password visibility") } + static var appLogo: String { String(localized: "honeyDue app logo") } } // MARK: - Navigation struct Navigation { - static let residencesTab = "Properties" - static let tasksTab = "Tasks" - static let contractorsTab = "Contractors" - static let documentsTab = "Documents" - static let settingsButton = "Settings" - static let addButton = "Add" - static let backButton = "Back" - static let closeButton = "Close" - static let editButton = "Edit" - static let deleteButton = "Delete" - static let saveButton = "Save" - static let cancelButton = "Cancel" + static var residencesTab: String { String(localized: "Properties") } + static var tasksTab: String { String(localized: "Tasks") } + static var contractorsTab: String { String(localized: "Contractors") } + static var documentsTab: String { String(localized: "Documents") } + static var settingsButton: String { String(localized: "Settings") } + static var addButton: String { String(localized: "Add") } + static var backButton: String { String(localized: "Back") } + static var closeButton: String { String(localized: "Close") } + static var editButton: String { String(localized: "Edit") } + static var deleteButton: String { String(localized: "Delete") } + static var saveButton: String { String(localized: "Save") } + static var cancelButton: String { String(localized: "Cancel") } } // MARK: - Residence struct Residence { static func card(name: String, taskCount: Int, overdueCount: Int) -> String { - "\(name), \(taskCount) tasks, \(overdueCount) overdue" + String(format: String(localized: "%1$@, %2$lld tasks, %3$lld overdue"), name, taskCount, overdueCount) + } + static var addProperty: String { String(localized: "Add new property") } + static var primaryBadge: String { String(localized: "Primary property") } + static func openInMaps(address: String) -> String { + String(format: String(localized: "Open %@ in Maps"), address) + } + static func shareCode(code: String) -> String { + String(format: String(localized: "Share code: %@"), code) + } + static var copyShareCode: String { String(localized: "Copy share code") } + static var generateShareCode: String { String(localized: "Generate new share code") } + static func removeUser(name: String) -> String { + String(format: String(localized: "Remove %@ from property"), name) } - static let addProperty = "Add new property" - static let primaryBadge = "Primary property" - static func openInMaps(address: String) -> String { "Open \(address) in Maps" } - static func shareCode(code: String) -> String { "Share code: \(code)" } - static let copyShareCode = "Copy share code" - static let generateShareCode = "Generate new share code" - static func removeUser(name: String) -> String { "Remove \(name) from property" } } // MARK: - Task struct Task { static func card(title: String, priority: String, dueDate: String) -> String { - "\(title), \(priority) priority, due \(dueDate)" + String(format: String(localized: "%1$@, %2$@ priority, due %3$@"), title, priority, dueDate) } - static let addTask = "Add new task" - static let taskActions = "Task actions" - static func priorityBadge(level: String) -> String { "Priority: \(level)" } - static func statusBadge(status: String) -> String { "Status: \(status)" } - static func completionCount(count: Int) -> String { "View \(count) completions" } - static func rating(value: Int) -> String { "Rated \(value) out of 5" } - static let markInProgress = "Mark as in progress" - static let completeTask = "Complete task" - static let archiveTask = "Archive task" - static let cancelTask = "Cancel task" + static var addTask: String { String(localized: "Add new task") } + static var taskActions: String { String(localized: "Task actions") } + static func priorityBadge(level: String) -> String { + String(format: String(localized: "Priority: %@"), level) + } + static func statusBadge(status: String) -> String { + String(format: String(localized: "Status: %@"), status) + } + static func completionCount(count: Int) -> String { + String(format: String(localized: "View %lld completions"), count) + } + static func rating(value: Int) -> String { + String(format: String(localized: "Rated %lld out of 5"), value) + } + static var markInProgress: String { String(localized: "Mark as in progress") } + static var completeTask: String { String(localized: "Complete task") } + static var archiveTask: String { String(localized: "Archive task") } + static var cancelTask: String { String(localized: "Cancel task") } } // MARK: - Contractor @@ -67,25 +80,33 @@ struct A11y { static func card(name: String, company: String?, specialty: String) -> String { [name, company, specialty].compactMap { $0 }.joined(separator: ", ") } - static let addContractor = "Add new contractor" + static var addContractor: String { String(localized: "Add new contractor") } static func toggleFavorite(name: String, isFavorite: Bool) -> String { - isFavorite ? "Remove \(name) from favorites" : "Add \(name) to favorites" + isFavorite + ? String(format: String(localized: "Remove %@ from favorites"), name) + : String(format: String(localized: "Add %@ to favorites"), name) } } // MARK: - Document struct Document { - static func card(title: String, type: String) -> String { "\(title), \(type)" } - static let addDocument = "Add new document" + static func card(title: String, type: String) -> String { + String(format: String(localized: "%1$@, %2$@"), title, type) + } + static var addDocument: String { String(localized: "Add new document") } } // MARK: - Common struct Common { - static func stat(value: String, label: String) -> String { "\(value) \(label)" } + static func stat(value: String, label: String) -> String { + String(format: String(localized: "%1$@ %2$@"), value, label) + } static let decorative = "" // For .accessibilityHidden(true) - static let retryButton = "Try again" - static let dismissError = "Dismiss error" - static func photo(index: Int) -> String { "Photo \(index)" } - static let removePhoto = "Remove photo" + static var retryButton: String { String(localized: "Try again") } + static var dismissError: String { String(localized: "Dismiss error") } + static func photo(index: Int) -> String { + String(format: String(localized: "Photo %lld"), index) + } + static var removePhoto: String { String(localized: "Remove photo") } } } diff --git a/iosApp/iosApp/Helpers/DateUtils.swift b/iosApp/iosApp/Helpers/DateUtils.swift index 88f0246..a8a346e 100644 --- a/iosApp/iosApp/Helpers/DateUtils.swift +++ b/iosApp/iosApp/Helpers/DateUtils.swift @@ -30,7 +30,7 @@ enum DateUtils { private static let dateTimeFormatter: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "MMM d, yyyy 'at' h:mm a" + formatter.dateFormat = "MMM d, yyyy 'at' h:mm a" // i18n-ignore: DateFormatter pattern (non-UI) return formatter }() @@ -53,11 +53,11 @@ enum DateUtils { switch daysDiff { case 0: - return "Today" + return String(localized: "Today") case 1: - return "Tomorrow" + return String(localized: "Tomorrow") case -1: - return "Yesterday" + return String(localized: "Yesterday") default: return mediumDateFormatter.string(from: date) } @@ -102,11 +102,11 @@ enum DateUtils { switch daysDiff { case 0: - return "Today" + return String(localized: "Today") case 1: - return "Tomorrow" + return String(localized: "Tomorrow") case -1: - return "Yesterday" + return String(localized: "Yesterday") default: return mediumDateFormatter.string(from: parsedDate) } @@ -149,15 +149,15 @@ enum DateUtils { switch daysDiff { case 0: - return "Today" + return String(localized: "Today") case 1: - return "Tomorrow" + return String(localized: "Tomorrow") case -1: - return "Yesterday" + return String(localized: "Yesterday") case 2...7: - return "in \(daysDiff) days" + return String(format: String(localized: "in %lld days"), daysDiff) case -7 ... -2: - return "\(-daysDiff) days ago" + return String(format: String(localized: "%lld days ago"), -daysDiff) default: return mediumDateFormatter.string(from: date) } @@ -247,13 +247,13 @@ enum DateUtils { static func formatHour(_ hour: Int) -> String { switch hour { case 0: - return "12:00 AM" + return String(localized: "12:00 AM") case 1..<12: - return "\(hour):00 AM" + return String(format: String(localized: "%lld:00 AM"), hour) case 12: - return "12:00 PM" + return String(localized: "12:00 PM") default: - return "\(hour - 12):00 PM" + return String(format: String(localized: "%lld:00 PM"), hour - 12) } } } diff --git a/iosApp/iosApp/Helpers/ErrorAlertModifier.swift b/iosApp/iosApp/Helpers/ErrorAlertModifier.swift index 240ab5c..60cc4aa 100644 --- a/iosApp/iosApp/Helpers/ErrorAlertModifier.swift +++ b/iosApp/iosApp/Helpers/ErrorAlertModifier.swift @@ -9,7 +9,7 @@ struct ErrorAlertModifier: ViewModifier { func body(content: Content) -> some View { content .alert( - error?.title ?? "Network Error", + error?.title ?? String(localized: "Network Error"), isPresented: Binding( get: { error != nil }, set: { if !$0 { onDismiss() } } @@ -35,7 +35,7 @@ struct ErrorAlertInfo: Identifiable { let title: String let message: String - init(title: String = "Network Error", message: String) { + init(title: String = String(localized: "Network Error"), message: String) { self.title = title self.message = message } diff --git a/iosApp/iosApp/Helpers/ErrorMessageParser.swift b/iosApp/iosApp/Helpers/ErrorMessageParser.swift index e61c05c..f7d5b0a 100644 --- a/iosApp/iosApp/Helpers/ErrorMessageParser.swift +++ b/iosApp/iosApp/Helpers/ErrorMessageParser.swift @@ -8,154 +8,155 @@ enum ErrorMessageParser { /// Maps backend error codes to user-friendly messages private static let errorCodeMappings: [String: String] = [ // Authentication errors - "error.invalid_credentials": "Invalid username or password. Please try again.", - "error.invalid_token": "Your session has expired. Please log in again.", - "error.not_authenticated": "Please log in to continue.", - "error.account_inactive": "Your account is inactive. Please contact support.", - "error.username_taken": "This username is already taken. Please choose another.", - "error.email_taken": "This email is already registered. Try logging in instead.", - "error.email_already_taken": "This email is already in use.", - "error.registration_failed": "Registration failed. Please try again.", - "error.failed_to_get_user": "Unable to load your profile. Please try again.", - "error.failed_to_update_profile": "Unable to update your profile. Please try again.", + "error.invalid_credentials": String(localized: "Invalid username or password. Please try again."), + "error.invalid_token": String(localized: "Your session has expired. Please log in again."), + "error.not_authenticated": String(localized: "Please log in to continue."), + "error.account_inactive": String(localized: "Your account is inactive. Please contact support."), + "error.username_taken": String(localized: "This username is already taken. Please choose another."), + "error.email_taken": String(localized: "This email is already registered. Try logging in instead."), + "error.email_already_taken": String(localized: "This email is already in use."), + "error.registration_failed": String(localized: "Registration failed. Please try again."), + "error.failed_to_get_user": String(localized: "Unable to load your profile. Please try again."), + "error.failed_to_update_profile": String(localized: "Unable to update your profile. Please try again."), // Email verification errors - "error.invalid_verification_code": "Invalid verification code. Please check and try again.", - "error.verification_code_expired": "Your verification code has expired. Please request a new one.", - "error.email_already_verified": "Your email is already verified.", - "error.verification_failed": "Verification failed. Please try again.", - "error.failed_to_resend_verification": "Unable to send verification code. Please try again.", + "error.invalid_verification_code": String(localized: "Invalid verification code. Please check and try again."), + "error.verification_code_expired": String(localized: "Your verification code has expired. Please request a new one."), + "error.email_already_verified": String(localized: "Your email is already verified."), + "error.verification_failed": String(localized: "Verification failed. Please try again."), + "error.failed_to_resend_verification": String(localized: "Unable to send verification code. Please try again."), // Password reset errors - "error.rate_limit_exceeded": "Too many attempts. Please wait a few minutes and try again.", - "error.too_many_requests": "Too many requests. Please try again later.", - "error.too_many_attempts": "Too many attempts. Please request a new code.", - "error.invalid_reset_token": "This reset link has expired. Please request a new one.", - "error.password_reset_failed": "Password reset failed. Please try again.", + "error.rate_limit_exceeded": String(localized: "Too many attempts. Please wait a few minutes and try again."), + "error.too_many_requests": String(localized: "Too many requests. Please try again later."), + "error.too_many_attempts": String(localized: "Too many attempts. Please request a new code."), + "error.invalid_reset_token": String(localized: "This reset link has expired. Please request a new one."), + "error.password_reset_failed": String(localized: "Password reset failed. Please try again."), // Social sign-in errors - "error.apple_signin_not_configured": "Apple Sign In is not available. Please use email login.", - "error.apple_signin_failed": "Apple Sign In failed. Please try again.", - "error.invalid_apple_token": "Apple Sign In failed. Please try again.", - "error.google_signin_not_configured": "Google Sign In is not available. Please use email login.", - "error.google_signin_failed": "Google Sign In failed. Please try again.", - "error.invalid_google_token": "Google Sign In failed. Please try again.", + "error.apple_signin_not_configured": String(localized: "Apple Sign In is not available. Please use email login."), + "error.apple_signin_failed": String(localized: "Apple Sign In failed. Please try again."), + "error.invalid_apple_token": String(localized: "Apple Sign In failed. Please try again."), + "error.google_signin_not_configured": String(localized: "Google Sign In is not available. Please use email login."), + "error.google_signin_failed": String(localized: "Google Sign In failed. Please try again."), + "error.invalid_google_token": String(localized: "Google Sign In failed. Please try again."), // Resource not found errors - "error.task_not_found": "Task not found. It may have been deleted.", - "error.residence_not_found": "Property not found. It may have been deleted.", - "error.contractor_not_found": "Contractor not found. It may have been deleted.", - "error.document_not_found": "Document not found. It may have been deleted.", - "error.completion_not_found": "Task completion not found.", - "error.user_not_found": "User not found.", - "error.notification_not_found": "Notification not found.", - "error.template_not_found": "Task template not found.", - "error.upgrade_trigger_not_found": "Feature not available.", + "error.task_not_found": String(localized: "Task not found. It may have been deleted."), + "error.residence_not_found": String(localized: "Property not found. It may have been deleted."), + "error.contractor_not_found": String(localized: "Contractor not found. It may have been deleted."), + "error.document_not_found": String(localized: "Document not found. It may have been deleted."), + "error.completion_not_found": String(localized: "Task completion not found."), + "error.user_not_found": String(localized: "User not found."), + "error.notification_not_found": String(localized: "Notification not found."), + "error.template_not_found": String(localized: "Task template not found."), + "error.upgrade_trigger_not_found": String(localized: "Feature not available."), // Access denied errors - "error.task_access_denied": "You don't have permission to view this task.", - "error.residence_access_denied": "You don't have permission to view this property.", - "error.contractor_access_denied": "You don't have permission to view this contractor.", - "error.document_access_denied": "You don't have permission to view this document.", - "error.not_residence_owner": "Only the property owner can do this.", - "error.cannot_remove_owner": "The property owner cannot be removed.", - "error.access_denied": "You don't have permission for this action.", + "error.task_access_denied": String(localized: "You don't have permission to view this task."), + "error.residence_access_denied": String(localized: "You don't have permission to view this property."), + "error.contractor_access_denied": String(localized: "You don't have permission to view this contractor."), + "error.document_access_denied": String(localized: "You don't have permission to view this document."), + "error.not_residence_owner": String(localized: "Only the property owner can do this."), + "error.cannot_remove_owner": String(localized: "The property owner cannot be removed."), + "error.access_denied": String(localized: "You don't have permission for this action."), // Sharing errors - "error.share_code_invalid": "Invalid share code. Please check and try again.", - "error.share_code_expired": "This share code has expired. Please request a new one.", - "error.user_already_member": "This user is already a member of this property.", + "error.share_code_invalid": String(localized: "Invalid share code. Please check and try again."), + "error.share_code_expired": String(localized: "This share code has expired. Please request a new one."), + "error.user_already_member": String(localized: "This user is already a member of this property."), // Subscription/limit errors - "error.properties_limit_reached": "You've reached your property limit. Upgrade to add more.", - "error.properties_limit_exceeded": "You've reached your property limit. Upgrade to add more.", - "error.tasks_limit_exceeded": "You've reached your task limit. Upgrade to add more.", - "error.contractors_limit_exceeded": "You've reached your contractor limit. Upgrade to add more.", - "error.documents_limit_exceeded": "You've reached your document limit. Upgrade to add more.", + "error.properties_limit_reached": String(localized: "You've reached your property limit. Upgrade to add more."), + "error.properties_limit_exceeded": String(localized: "You've reached your property limit. Upgrade to add more."), + "error.tasks_limit_exceeded": String(localized: "You've reached your task limit. Upgrade to add more."), + "error.contractors_limit_exceeded": String(localized: "You've reached your contractor limit. Upgrade to add more."), + "error.documents_limit_exceeded": String(localized: "You've reached your document limit. Upgrade to add more."), // Task state errors - "error.task_already_cancelled": "This task has already been cancelled.", - "error.task_already_archived": "This task has already been archived.", + "error.task_already_cancelled": String(localized: "This task has already been cancelled."), + "error.task_already_archived": String(localized: "This task has already been archived."), // Form/upload errors - "error.failed_to_parse_form": "Unable to process the form. Please try again.", - "error.task_id_required": "Task ID is required.", - "error.residence_id_required": "Property ID is required.", - "error.title_required": "Title is required.", - "error.failed_to_upload_image": "Unable to upload image. Please try again.", - "error.failed_to_upload_file": "Unable to upload file. Please try again.", - "error.no_file_provided": "Please select a file to upload.", + "error.failed_to_parse_form": String(localized: "Unable to process the form. Please try again."), + "error.task_id_required": String(localized: "Task ID is required."), + "error.residence_id_required": String(localized: "Property ID is required."), + "error.title_required": String(localized: "Title is required."), + "error.failed_to_upload_image": String(localized: "Unable to upload image. Please try again."), + "error.failed_to_upload_file": String(localized: "Unable to upload file. Please try again."), + "error.no_file_provided": String(localized: "Please select a file to upload."), // Invalid ID errors - "error.invalid_task_id": "Invalid task.", - "error.invalid_task_id_value": "Invalid task.", - "error.invalid_residence_id": "Invalid property.", - "error.invalid_residence_id_value": "Invalid property.", - "error.invalid_contractor_id": "Invalid contractor.", - "error.invalid_document_id": "Invalid document.", - "error.invalid_completion_id": "Invalid task completion.", - "error.invalid_user_id": "Invalid user.", - "error.invalid_notification_id": "Invalid notification.", - "error.invalid_device_id": "Invalid device.", - "error.invalid_platform": "Invalid platform.", - "error.invalid_id": "Invalid ID.", + "error.invalid_task_id": String(localized: "Invalid task."), + "error.invalid_task_id_value": String(localized: "Invalid task."), + "error.invalid_residence_id": String(localized: "Invalid property."), + "error.invalid_residence_id_value": String(localized: "Invalid property."), + "error.invalid_contractor_id": String(localized: "Invalid contractor."), + "error.invalid_document_id": String(localized: "Invalid document."), + "error.invalid_completion_id": String(localized: "Invalid task completion."), + "error.invalid_user_id": String(localized: "Invalid user."), + "error.invalid_notification_id": String(localized: "Invalid notification."), + "error.invalid_device_id": String(localized: "Invalid device."), + "error.invalid_platform": String(localized: "Invalid platform."), + "error.invalid_id": String(localized: "Invalid ID."), // Data fetch errors - "error.failed_to_fetch_residence_types": "Unable to load property types. Please try again.", - "error.failed_to_fetch_task_categories": "Unable to load task categories. Please try again.", - "error.failed_to_fetch_task_priorities": "Unable to load task priorities. Please try again.", - "error.failed_to_fetch_task_frequencies": "Unable to load task frequencies. Please try again.", - "error.failed_to_fetch_task_statuses": "Unable to load task statuses. Please try again.", - "error.failed_to_fetch_contractor_specialties": "Unable to load contractor specialties. Please try again.", - "error.failed_to_fetch_templates": "Unable to load task templates. Please try again.", - "error.failed_to_search_templates": "Unable to search templates. Please try again.", + "error.failed_to_fetch_residence_types": String(localized: "Unable to load property types. Please try again."), + "error.failed_to_fetch_task_categories": String(localized: "Unable to load task categories. Please try again."), + "error.failed_to_fetch_task_priorities": String(localized: "Unable to load task priorities. Please try again."), + "error.failed_to_fetch_task_frequencies": String(localized: "Unable to load task frequencies. Please try again."), + "error.failed_to_fetch_task_statuses": String(localized: "Unable to load task statuses. Please try again."), + "error.failed_to_fetch_contractor_specialties": String(localized: "Unable to load contractor specialties. Please try again."), + "error.failed_to_fetch_templates": String(localized: "Unable to load task templates. Please try again."), + "error.failed_to_search_templates": String(localized: "Unable to search templates. Please try again."), // Subscription purchase errors - "error.receipt_data_required": "Purchase verification failed. Please try again.", - "error.purchase_token_required": "Purchase verification failed. Please try again.", + "error.receipt_data_required": String(localized: "Purchase verification failed. Please try again."), + "error.purchase_token_required": String(localized: "Purchase verification failed. Please try again."), // Media errors - "error.file_not_found": "File not found.", - "error.image_not_found": "Image not found.", + "error.file_not_found": String(localized: "File not found."), + "error.image_not_found": String(localized: "Image not found."), // Generic errors - "error.invalid_request": "Invalid request. Please try again.", - "error.invalid_request_body": "Invalid request. Please check your input.", - "error.internal": "Something went wrong. Please try again.", - "error.query_required": "Search query is required.", - "error.query_too_short": "Search query is too short." + "error.invalid_request": String(localized: "Invalid request. Please try again."), + "error.invalid_request_body": String(localized: "Invalid request. Please check your input."), + "error.internal": String(localized: "Something went wrong. Please try again."), + "error.query_required": String(localized: "Search query is required."), + "error.query_too_short": String(localized: "Search query is too short.") ] // MARK: - Network Error Patterns /// Network/connection error patterns to detect private static let networkErrorPatterns: [(pattern: String, message: String)] = [ - ("Could not connect to the server", "Unable to connect. Please check your internet connection."), - ("NSURLErrorDomain", "Unable to connect. Please check your internet connection."), - ("The Internet connection appears to be offline", "No internet connection. Please check your network."), - ("A server with the specified hostname could not be found", "Unable to connect. Please check your internet connection."), - ("The request timed out", "Request timed out. Please try again."), - ("The network connection was lost", "Connection lost. Please try again."), - ("An SSL error has occurred", "Secure connection failed. Please try again."), - ("CFNetwork", "Unable to connect. Please check your internet connection."), - ("kCFStreamError", "Unable to connect. Please check your internet connection."), - ("Code=-1004", "Unable to connect. Please check your internet connection."), - ("Code=-1009", "No internet connection. Please check your network."), - ("Code=-1001", "Request timed out. Please try again."), - ("Code=-1003", "Unable to connect. Please check your internet connection."), - ("Code=-1005", "Connection lost. Please try again."), - ("Code=-1200", "Secure connection failed. Please try again."), - ("UnresolvedAddressException", "Unable to connect. Please check your internet connection."), - ("ConnectException", "Unable to connect. Please check your internet connection."), - ("SocketTimeoutException", "Request timed out. Please try again."), - ("Connection refused", "Unable to connect. The server may be temporarily unavailable."), - ("Connection reset", "Connection lost. Please try again."), - ("Too many requests", "Too many requests. Please try again later.") + ("Could not connect to the server", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("NSURLErrorDomain", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("The Internet connection appears to be offline", String(localized: "No internet connection. Please check your network.")), // i18n-ignore: lhs=error-detection substring + ("A server with the specified hostname could not be found", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("The request timed out", String(localized: "Request timed out. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("The network connection was lost", String(localized: "Connection lost. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("An SSL error has occurred", String(localized: "Secure connection failed. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("CFNetwork", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("kCFStreamError", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1004", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1009", String(localized: "No internet connection. Please check your network.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1001", String(localized: "Request timed out. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1003", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1005", String(localized: "Connection lost. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("Code=-1200", String(localized: "Secure connection failed. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("UnresolvedAddressException", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("ConnectException", String(localized: "Unable to connect. Please check your internet connection.")), // i18n-ignore: lhs=error-detection substring + ("SocketTimeoutException", String(localized: "Request timed out. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("Connection refused", String(localized: "Unable to connect. The server may be temporarily unavailable.")), // i18n-ignore: lhs=error-detection substring + ("Connection reset", String(localized: "Connection lost. Please try again.")), // i18n-ignore: lhs=error-detection substring + ("Too many requests", String(localized: "Too many requests. Please try again later.")) // i18n-ignore: lhs=error-detection substring ] // MARK: - Technical Error Indicators /// Indicators that a message is technical/developer-facing + // i18n-ignore-begin: error-detection substrings matched against incoming exception text (non-UI) private static let technicalIndicators = [ "Exception", "Error Domain=", @@ -177,6 +178,7 @@ enum ErrorMessageParser { "NSUnderlyingError", "_kCF" ] + // i18n-ignore-end // MARK: - Public Methods @@ -205,19 +207,19 @@ enum ErrorMessageParser { // Check if it looks like a technical exception message if isTechnicalError(trimmed) { - return "Something went wrong. Please try again." + return String(localized: "Something went wrong. Please try again.") } // Check if the message looks like JSON (starts with { or [) guard trimmed.hasPrefix("{") || trimmed.hasPrefix("[") else { // Not JSON - if it's a short, readable message, return it // Otherwise return a generic message - return isUserFriendly(trimmed) ? trimmed : "Something went wrong. Please try again." + return isUserFriendly(trimmed) ? trimmed : String(localized: "Something went wrong. Please try again.") } // If it's JSON, try to parse and extract meaningful error info guard let data = trimmed.data(using: .utf8) else { - return "An error occurred. Please try again." + return String(localized: "An error occurred. Please try again.") } do { @@ -236,7 +238,7 @@ enum ErrorMessageParser { // Check if this looks like a data object (has id, title, etc) if json["id"] != nil && (json["title"] != nil || json["name"] != nil) { - return "Request failed. Please check your input and try again." + return String(localized: "Request failed. Please check your input and try again.") } } } catch { @@ -244,7 +246,7 @@ enum ErrorMessageParser { } // If we couldn't parse or extract a message, return a generic error - return "An error occurred. Please try again." + return String(localized: "An error occurred. Please try again.") } // MARK: - Private Methods @@ -252,7 +254,7 @@ enum ErrorMessageParser { /// Generates a user-friendly message from an unknown error code private static func generateMessageFromCode(_ code: String) -> String { // Remove "error." prefix and convert underscores to spaces - var message = code.replacingOccurrences(of: "error.", with: "") + var message = code.replacingOccurrences(of: "error.", with: "") // i18n-ignore: error-code key prefix (non-UI) message = message.replacingOccurrences(of: "_", with: " ") // Capitalize first letter @@ -260,7 +262,7 @@ enum ErrorMessageParser { message = firstChar.uppercased() + message.dropFirst() } - return message + ". Please try again." + return String(format: String(localized: "%@. Please try again."), message) } /// Checks if the message looks like a technical/developer error (stack trace, exception, etc) diff --git a/iosApp/iosApp/Helpers/PresignedUploader.swift b/iosApp/iosApp/Helpers/PresignedUploader.swift index 19190e8..243256d 100644 --- a/iosApp/iosApp/Helpers/PresignedUploader.swift +++ b/iosApp/iosApp/Helpers/PresignedUploader.swift @@ -27,16 +27,16 @@ enum PresignedUploaderError: Error, LocalizedError { var errorDescription: String? { switch self { case .notAuthenticated: - return "You're not signed in." + return String(localized: "You're not signed in.") case .presignFailed(let status, _): switch status { - case 413: return "That photo is too large after resizing. Try a different one." - case 422: return "That image format isn't supported." - case 429: return "You're uploading too many photos. Try again in a few minutes." - default: return "Couldn't start upload (server returned \(status))." + case 413: return String(localized: "That photo is too large after resizing. Try a different one.") + case 422: return String(localized: "That image format isn't supported.") + case 429: return String(localized: "You're uploading too many photos. Try again in a few minutes.") + default: return String(format: String(localized: "Couldn't start upload (server returned %lld)."), status) } case .uploadFailed(let status, _): - return "Upload failed (storage returned \(status))." + return String(format: String(localized: "Upload failed (storage returned %lld)."), status) case .sessionError(let err): return err.localizedDescription } @@ -163,7 +163,7 @@ final class PresignedUploader { contentLength: Int64 ) async throws -> PresignResponse { guard var url = URL(string: apiBaseURL) else { - throw PresignedUploaderError.presignFailed(status: 0, body: "invalid base url") + throw PresignedUploaderError.presignFailed(status: 0, body: "invalid base url") // i18n-ignore: internal diagnostic body, not surfaced (errorDescription ignores it) } url.appendPathComponent("uploads/presign/") @@ -185,7 +185,7 @@ final class PresignedUploader { throw PresignedUploaderError.sessionError(error) } guard let http = response as? HTTPURLResponse else { - throw PresignedUploaderError.presignFailed(status: 0, body: "no response") + throw PresignedUploaderError.presignFailed(status: 0, body: "no response") // i18n-ignore: internal diagnostic body, not surfaced } guard (200..<300).contains(http.statusCode) else { throw PresignedUploaderError.presignFailed( @@ -196,7 +196,7 @@ final class PresignedUploader { do { return try JSONDecoder().decode(PresignResponse.self, from: body) } catch { - throw PresignedUploaderError.presignFailed(status: http.statusCode, body: "decode failed: \(error)") + throw PresignedUploaderError.presignFailed(status: http.statusCode, body: "decode failed: \(error)") // i18n-ignore: internal diagnostic body, not surfaced } } @@ -217,7 +217,7 @@ final class PresignedUploader { contentType: String ) async throws { guard let url = URL(string: uploadURL) else { - throw PresignedUploaderError.uploadFailed(status: 0, body: "invalid upload url") + throw PresignedUploaderError.uploadFailed(status: 0, body: "invalid upload url") // i18n-ignore: internal diagnostic body, not surfaced } var req = URLRequest(url: url) @@ -241,7 +241,7 @@ final class PresignedUploader { throw PresignedUploaderError.sessionError(error) } guard let http = response as? HTTPURLResponse else { - throw PresignedUploaderError.uploadFailed(status: 0, body: "no response") + throw PresignedUploaderError.uploadFailed(status: 0, body: "no response") // i18n-ignore: internal diagnostic body, not surfaced } guard (200..<300).contains(http.statusCode) else { throw PresignedUploaderError.uploadFailed( diff --git a/iosApp/iosApp/Helpers/ThemeManager.swift b/iosApp/iosApp/Helpers/ThemeManager.swift index 5bb11b3..73a3a85 100644 --- a/iosApp/iosApp/Helpers/ThemeManager.swift +++ b/iosApp/iosApp/Helpers/ThemeManager.swift @@ -5,6 +5,7 @@ import Combine // MARK: - Theme ID Enum enum ThemeID: String, CaseIterable, Codable { + // i18n-ignore-begin: rawValues are stable persistence keys + asset-catalog name roots (non-UI); localized labels are in displayName below case bright = "Default" case teal = "Teal" case ocean = "Ocean" @@ -16,35 +17,59 @@ enum ThemeID: String, CaseIterable, Codable { case midnight = "Midnight" case desert = "Desert" case mint = "Mint" + // i18n-ignore-end var displayName: String { - rawValue + switch self { + case .bright: + return String(localized: "Default") + case .teal: + return String(localized: "Teal") + case .ocean: + return String(localized: "Ocean") + case .forest: + return String(localized: "Forest") + case .sunset: + return String(localized: "Sunset") + case .monochrome: + return String(localized: "Monochrome") + case .lavender: + return String(localized: "Lavender") + case .crimson: + return String(localized: "Crimson") + case .midnight: + return String(localized: "Midnight") + case .desert: + return String(localized: "Desert") + case .mint: + return String(localized: "Mint") + } } var description: String { switch self { case .bright: - return "Vibrant iOS system colors" + return String(localized: "Vibrant iOS system colors") case .teal: - return "Blue-green with warm accents" + return String(localized: "Blue-green with warm accents") case .ocean: - return "Deep blues and coral tones" + return String(localized: "Deep blues and coral tones") case .forest: - return "Earth greens and golden hues" + return String(localized: "Earth greens and golden hues") case .sunset: - return "Warm oranges and reds" + return String(localized: "Warm oranges and reds") case .monochrome: - return "Elegant grayscale" + return String(localized: "Elegant grayscale") case .lavender: - return "Soft purple with pink accents" + return String(localized: "Soft purple with pink accents") case .crimson: - return "Bold red with warm highlights" + return String(localized: "Bold red with warm highlights") case .midnight: - return "Deep navy with sky blue" + return String(localized: "Deep navy with sky blue") case .desert: - return "Warm terracotta and sand tones" + return String(localized: "Warm terracotta and sand tones") case .mint: - return "Fresh green with turquoise" + return String(localized: "Fresh green with turquoise") } } @@ -66,7 +91,7 @@ private let appGroupID: String = { private let sharedDefaults: UserDefaults = { guard let defaults = UserDefaults(suiteName: appGroupID) else { #if DEBUG - assertionFailure("App Group '\(appGroupID)' not configured — theme won't sync to widgets") + assertionFailure("App Group '\(appGroupID)' not configured — theme won't sync to widgets") // i18n-ignore: DEBUG assertion message (non-UI) #endif return UserDefaults.standard } @@ -92,8 +117,8 @@ class ThemeManager { sharedDefaults.bool(forKey: honeycombKey) } - private let themeKey = "selectedTheme" - private let honeycombKey = "honeycombEnabled" + private let themeKey = "selectedTheme" // i18n-ignore: UserDefaults key (non-UI) + private let honeycombKey = "honeycombEnabled" // i18n-ignore: UserDefaults key (non-UI) private init() {} } @@ -115,8 +140,8 @@ class ThemeManager: ObservableObject { } } - private let themeKey = "selectedTheme" - private let honeycombKey = "honeycombEnabled" + private let themeKey = "selectedTheme" // i18n-ignore: UserDefaults key (non-UI) + private let honeycombKey = "honeycombEnabled" // i18n-ignore: UserDefaults key (non-UI) private init() { // Load saved theme from shared App Group defaults diff --git a/iosApp/iosApp/Helpers/UITestRuntime.swift b/iosApp/iosApp/Helpers/UITestRuntime.swift index 6082cba..00ed76a 100644 --- a/iosApp/iosApp/Helpers/UITestRuntime.swift +++ b/iosApp/iosApp/Helpers/UITestRuntime.swift @@ -4,11 +4,13 @@ import ComposeApp /// Runtime contract between the app and XCUITests. enum UITestRuntime { + // i18n-ignore-begin: launch-argument flag identifiers for XCUITests (non-UI) static let uiTestingFlag = "--ui-testing" static let disableAnimationsFlag = "--disable-animations" static let resetStateFlag = "--reset-state" static let mockAuthFlag = "--ui-test-mock-auth" static let completeOnboardingFlag = "--complete-onboarding" + // i18n-ignore-end static var launchArguments: [String] { ProcessInfo.processInfo.arguments diff --git a/iosApp/iosApp/Helpers/WidgetActionProcessor.swift b/iosApp/iosApp/Helpers/WidgetActionProcessor.swift index a4c6df6..21c179a 100644 --- a/iosApp/iosApp/Helpers/WidgetActionProcessor.swift +++ b/iosApp/iosApp/Helpers/WidgetActionProcessor.swift @@ -61,7 +61,7 @@ final class WidgetActionProcessor { let request = TaskCompletionCreateRequest( taskId: Int32(taskId), completedAt: nil, // Defaults to now on server - notes: "Completed from widget", + notes: String(localized: "Completed from widget"), actualCost: nil, rating: nil, uploadIds: nil diff --git a/iosApp/iosApp/InfoPlist.xcstrings b/iosApp/iosApp/InfoPlist.xcstrings new file mode 100644 index 0000000..30eee84 --- /dev/null +++ b/iosApp/iosApp/InfoPlist.xcstrings @@ -0,0 +1,201 @@ +{ + "sourceLanguage": "en", + "strings": { + "NSCameraUsageDescription": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue needs camera access to take photos of tasks, documents, and receipts." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue necesita acceso a la cámara para tomar fotos de tareas, documentos y recibos." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue a besoin d'accéder à l'appareil photo pour prendre des photos de tâches, de documents et de reçus." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue benötigt Zugriff auf die Kamera, um Fotos von Aufgaben, Dokumenten und Belegen aufzunehmen." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue ha bisogno dell'accesso alla fotocamera per scattare foto di attività, documenti e ricevute." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueは、タスク、書類、領収書の写真を撮影するためにカメラへのアクセスを必要とします。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue에서 작업, 문서, 영수증의 사진을 촬영하려면 카메라 접근 권한이 필요합니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue heeft toegang tot de camera nodig om foto's van taken, documenten en bonnen te maken." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O honeyDue precisa de acesso à câmera para tirar fotos de tarefas, documentos e recibos." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 需要访问相机,以便拍摄任务、文档和收据的照片。" + } + } + } + }, + "NSPhotoLibraryAddUsageDescription": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue needs permission to save photos to your library." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue necesita permiso para guardar fotos en tu biblioteca." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue a besoin de votre autorisation pour enregistrer des photos dans votre photothèque." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue benötigt die Berechtigung, um Fotos in deiner Mediathek zu speichern." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue ha bisogno dell'autorizzazione per salvare le foto nella tua libreria." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueは、写真をライブラリに保存するための許可を必要とします。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue에서 사진을 보관함에 저장하려면 권한이 필요합니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue heeft toestemming nodig om foto's in je bibliotheek op te slaan." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O honeyDue precisa de permissão para salvar fotos na sua biblioteca." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 需要权限以将照片保存到您的图库。" + } + } + } + }, + "NSPhotoLibraryUsageDescription": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue needs photo library access to attach photos to tasks and documents." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue necesita acceso a la biblioteca de fotos para adjuntar fotos a tareas y documentos." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue a besoin d'accéder à votre photothèque pour joindre des photos aux tâches et aux documents." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue benötigt Zugriff auf deine Fotomediathek, um Aufgaben und Dokumenten Fotos hinzuzufügen." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue ha bisogno dell'accesso alla libreria foto per allegare foto ad attività e documenti." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueは、タスクや書類に写真を添付するために写真ライブラリへのアクセスを必要とします。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue에서 작업과 문서에 사진을 첨부하려면 사진 보관함 접근 권한이 필요합니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue heeft toegang tot je fotobibliotheek nodig om foto's aan taken en documenten toe te voegen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O honeyDue precisa de acesso à biblioteca de fotos para anexar fotos a tarefas e documentos." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 需要访问照片图库,以便将照片附加到任务和文档。" + } + } + } + } + }, + "version": "1.0" +} diff --git a/iosApp/iosApp/Localizable.xcstrings b/iosApp/iosApp/Localizable.xcstrings index 5983a0d..369bc8a 100644 --- a/iosApp/iosApp/Localizable.xcstrings +++ b/iosApp/iosApp/Localizable.xcstrings @@ -1,30734 +1,81451 @@ { - "sourceLanguage" : "en", - "strings" : { - "" : { - + "sourceLanguage": "en", + "strings": { + "": {}, + " %@": { + "comment": "A chevron up and down symbol. The argument is the “chevron.up.chevron.down” symbol.", + "isCommentAutoGenerated": true }, - " %@" : { - "comment" : "A chevron up and down symbol. The argument is the “chevron.up.chevron.down” symbol.", - "isCommentAutoGenerated" : true - }, - "*" : { - - }, - "%@" : { - - }, - "%@ (%lld)" : { - "comment" : "A heading that lists the number of users in a residence. The argument is the count of users.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ (%2$lld)" + "*": {}, + "%@": {}, + "%@ (%lld)": { + "comment": "A heading that lists the number of users in a residence. The argument is the count of users.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@ (%2$lld)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld)" } } } }, - "%@ (%lld/5)" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ (%2$lld/5)" + "%@ (%lld/5)": { + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@ (%2$lld/5)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@ (%2$lld/5)" } } } }, - "%@ %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ %2$@" + "%@ %@": { + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@ %2$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } } } }, - "%@ has been added to your contacts." : { - "comment" : "A message displayed when a contractor is successfully imported to the user's contacts. The placeholder is replaced with the name of the imported contractor.", - "isCommentAutoGenerated" : true - }, - "%@ plan, %@%@%@" : { - "comment" : "A label describing a subscription plan. The first argument is the plan title. The second argument is the price of the plan. The third argument is the billing period. The fourth argument is the savings information, if available.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ plan, %2$@%3$@%4$@" + "%@ has been added to your contacts.": { + "comment": "A message displayed when a contractor is successfully imported to the user's contacts. The placeholder is replaced with the name of the imported contractor.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "%@ se ha añadido a tus contactos." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%@ a été ajouté à vos contacts." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ wurde zu deinen Kontakten hinzugefügt." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%@ foi adicionado aos seus contatos." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%@ è stato aggiunto ai tuoi contatti." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ を連絡先に追加しました。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@님이 연락처에 추가되었습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ is toegevoegd aan je contacten." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%@ 已添加到您的联系人。" } } } }, - "%@, %@" : { - "comment" : "Accessibility label and value that describe the task and its selection state.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@, %2$@" + "%@ plan, %@%@%@": { + "comment": "A label describing a subscription plan. The first argument is the plan title. The second argument is the price of the plan. The third argument is the billing period. The fourth argument is the savings information, if available.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@ plan, %2$@%3$@%4$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Plan %1$@, %2$@%3$@%4$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Forfait %1$@, %2$@%3$@%4$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@-Tarif, %2$@%3$@%4$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Plano %1$@, %2$@%3$@%4$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Piano %1$@, %2$@%3$@%4$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@ プラン、%2$@%3$@%4$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@ 요금제, %2$@%3$@%4$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@-abonnement, %2$@%3$@%4$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@ 套餐,%2$@%3$@%4$@" } } } }, - "%@, %@, %lld%% match" : { - "comment" : "A row that displays a suggestion with a title, frequency, and relevance percentage.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@, %2$@, %3$lld%% match" + "%@, %@": { + "comment": "Accessibility label and value that describe the task and its selection state.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@, %2$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、%2$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$@" } } } }, - "%@, %@%@" : { - "comment" : "A button that displays the name of a product and its price.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@, %2$@%3$@" + "%@, %@, %lld%% match": { + "comment": "A row that displays a suggestion with a title, frequency, and relevance percentage.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@, %2$@, %3$lld%% match" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% de coincidencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% de correspondance" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% Übereinstimmung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% de correspondência" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, corrispondenza %3$lld%%" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、%2$@、%3$lld%% 一致" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% 일치" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@, %3$lld%% match" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$@,%3$lld%% 匹配" } } } }, - "%@: %@" : { - "comment" : "An error message displayed when there was an issue loading tasks for a residence.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@: %2$@" + "%@, %@%@": { + "comment": "A button that displays the name of a product and its price.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@, %2$@%3$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、%2$@%3$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@%3$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$@%3$@" } } } }, - "%@: Free: %@, Pro: %@" : { - "comment" : "A label that describes a comparison between a free and a pro feature.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@: Free: %2$@, Pro: %3$@" + "%@: %@": { + "comment": "An error message displayed when there was an issue loading tasks for a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@: %2$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ : %2$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@:%2$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@: %2$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@:%2$@" } } } }, - "%d" : { - "comment" : "A badge displaying the number of tasks in a category. The argument is the count of tasks in the category.", - "isCommentAutoGenerated" : true - }, - "%d in the last 12 months" : { - "comment" : "A small label below the main number that explains that the number is for the last 12 months.", - "isCommentAutoGenerated" : true - }, - "%d tasks" : { - "comment" : "A label showing the number of tasks a contractor has. The argument is the number of tasks.", - "isCommentAutoGenerated" : true - }, - "%lld" : { - "comment" : "A badge displaying the number of tasks selected within a category.", - "isCommentAutoGenerated" : true - }, - "%lld / 5" : { - - }, - "%lld %@" : { - "comment" : "A text that shows the number of residences the user has.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$lld %2$@" + "%@: Free: %@, Pro: %@": { + "comment": "A label that describes a comparison between a free and a pro feature.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$@: Free: %2$@, Pro: %3$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@: Gratis: %2$@, Pro: %3$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ : Gratuit : %2$@, Pro : %3$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@: Free: %2$@, Pro: %3$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@: Grátis: %2$@, Pro: %3$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@: Free: %2$@, Pro: %3$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@:無料:%2$@、Pro:%3$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@: 무료: %2$@, 프로: %3$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@: Gratis: %2$@, Pro: %3$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@:免费版:%2$@,专业版:%3$@" } } } }, - "%lld common tasks" : { - + "%d": { + "comment": "A badge displaying the number of tasks in a category. The argument is the count of tasks in the category.", + "isCommentAutoGenerated": true }, - "%lld task%@ selected" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$lld task%2$@ selected" + "%d in the last 12 months": { + "comment": "A small label below the main number that explains that the number is for the last 12 months.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "%d en los últimos 12 meses" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%d au cours des 12 derniers mois" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%d in den letzten 12 Monaten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%d nos últimos 12 meses" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%d negli ultimi 12 mesi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "過去12か月で%d件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지난 12개월간 %d회" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d in de afgelopen 12 maanden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "过去 12 个月内 %d 次" } } } }, - "%lld%%" : { - "comment" : "A badge that shows the relevance of a suggestion. The argument is the relevance percentage.", - "isCommentAutoGenerated" : true - }, - "•" : { - "comment" : "A separator between different pieces of information in a text.", - "isCommentAutoGenerated" : true - }, - "• 10K+ homeowners" : { - - }, - "+%d" : { - "comment" : "A small label inside a hexagon that indicates how many more tasks were planned for a given month but were not completed. The text inside the label is the count of unaccomplished tasks for that month.", - "isCommentAutoGenerated" : true - }, - "+%lld" : { - - }, - "$" : { - - }, - "000000" : { - "comment" : "A placeholder text for a 6-digit code field.", - "isCommentAutoGenerated" : true - }, - "0.00" : { - - }, - "4.9" : { - - }, - "7-day free trial, then %@%@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "7-day free trial, then %1$@%2$@" + "%d tasks": { + "comment": "A label showing the number of tasks a contractor has. The argument is the number of tasks.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "%d tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%d tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%d Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%d tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%d attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%d件のタスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 %d개" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%d 项任务" } } } }, - "12345" : { - + "%lld": { + "comment": "A badge displaying the number of tasks selected within a category.", + "isCommentAutoGenerated": true }, - "ABC123" : { - - }, - "Actions" : { - "comment" : "A label for the actions menu in the task card.", - "isCommentAutoGenerated" : true - }, - "Add %@ to favorites" : { - "comment" : "A label for the favorite button. The argument is the name of the contractor.", - "isCommentAutoGenerated" : true - }, - "Add %lld Task%@ & Continue" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Add %1$lld Task%2$@ & Continue" + "%lld / 5": {}, + "%lld %@": { + "comment": "A text that shows the number of residences the user has.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$lld %2$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$lld %2$@" } } } }, - "Add contractor" : { - "comment" : "A label for the button that adds a new contractor.", - "isCommentAutoGenerated" : true - }, - "Add document" : { - - }, - "Add new property" : { - "comment" : "A label displayed as a button in the toolbar.", - "isCommentAutoGenerated" : true - }, - "Add new task" : { - "comment" : "A label for a button that adds a new task.", - "isCommentAutoGenerated" : true - }, - "Add task" : { - "comment" : "A button that adds a task.", - "isCommentAutoGenerated" : true - }, - "Add your first property to get started!" : { - "comment" : "A description below the image in the \"No properties yet\" view, encouraging the user to add their first property.", - "isCommentAutoGenerated" : true - }, - "Adds a subtle hexagonal grid overlay" : { - "comment" : "A description of the Honeycomb Pattern feature.", - "isCommentAutoGenerated" : true - }, - "All optional -- helps us personalize your plan" : { - + "%lld common tasks": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "%lld tareas comunes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%lld tâches courantes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld häufige Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%lld tarefas comuns" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld attività comuni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld件の一般的なタスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공통 작업 %lld개" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld veelvoorkomende taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 项常见任务" + } + } + } + }, + "%lld task%@ selected": { + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "%1$lld task%2$@ selected" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$lld tarea%2$@ seleccionada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$lld tâche%2$@ sélectionnée(s)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$lld Aufgabe%2$@ ausgewählt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$lld tarefa%2$@ selecionada(s)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$lld attività%2$@ selezionate" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$lld件のタスク%2$@を選択中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 %1$lld개%2$@ 선택됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$lld taak%2$@ geselecteerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已选 %1$lld 项任务%2$@" + } + } + } + }, + "%lld%%": { + "comment": "A badge that shows the relevance of a suggestion. The argument is the relevance percentage.", + "isCommentAutoGenerated": true + }, + "•": { + "comment": "A separator between different pieces of information in a text.", + "isCommentAutoGenerated": true + }, + "• 10K+ homeowners": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "• Más de 10 mil propietarios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "• plus de 10 000 propriétaires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "• Über 10.000 Eigenheimbesitzer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "• Mais de 10 mil proprietários" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "• Oltre 10.000 proprietari" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "• 1万人以上の住宅所有者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "• 1만+ 집주인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "• 10K+ huiseigenaren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "• 超 1 万名房主" + } + } + } + }, + "+%d": { + "comment": "A small label inside a hexagon that indicates how many more tasks were planned for a given month but were not completed. The text inside the label is the count of unaccomplished tasks for that month.", + "isCommentAutoGenerated": true + }, + "+%lld": {}, + "$": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "$" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "$" + } + } + } + }, + "000000": { + "comment": "A placeholder text for a 6-digit code field.", + "isCommentAutoGenerated": true + }, + "0.00": {}, + "4.9": {}, + "7-day free trial, then %@%@": { + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "7-day free trial, then %1$@%2$@" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Prueba gratis de 7 días, luego %@%@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Essai gratuit de 7 jours, puis %@%@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "7 Tage kostenlos testen, dann %@%@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Teste grátis de 7 dias, depois %@%@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Prova gratuita di 7 giorni, poi %@%@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "7日間の無料トライアル、その後%@%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "7일 무료 체험 후 %@%@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "7 dagen gratis proberen, daarna %@%@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "7天免费试用,之后%@%@" + } + } + } + }, + "12345": {}, + "ABC123": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "ABC123" + } + } + } + }, + "Actions": { + "comment": "A label for the actions menu in the task card.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Acciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actions" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktionen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ações" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Azioni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "操作" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Acties" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "操作" + } + } + } + }, + "Add %@ to favorites": { + "comment": "A label for the favorite button. The argument is the name of the contractor.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir %@ a favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter %@ aux favoris" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ zu Favoriten hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar %@ aos favoritos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi %@ ai preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ をお気に入りに追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@ 즐겨찾기에 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ aan favorieten toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将 %@ 加入收藏" + } + } + } + }, + "Add %lld Task%@ & Continue": { + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "Add %1$lld Task%2$@ & Continue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir %1$lld tarea%2$@ y continuar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter %1$lld tâche%2$@ et continuer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$lld Aufgabe%2$@ hinzufügen & weiter" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar %1$lld tarefa%2$@ e continuar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi %1$lld attività%2$@ e continua" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$lld件のタスク%2$@を追加して続行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 %1$lld개%2$@ 추가 후 계속" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$lld taak%2$@ toevoegen & doorgaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加 %1$lld 项任务%2$@ 并继续" + } + } + } + }, + "Add contractor": { + "comment": "A label for the button that adds a new contractor.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un prestataire" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar prestador" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi tecnico" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加承包商" + } + } + } + }, + "Add document": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un document" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar documento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加文档" + } + } + } + }, + "Add new property": { + "comment": "A label displayed as a button in the toolbar.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neue Immobilie hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar nova propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi nuovo immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 자산 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe woning toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加新房产" + } + } + } + }, + "Add new task": { + "comment": "A label for a button that adds a new task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neue Aufgabe hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar nova tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi nuova attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 작업 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe taak toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加新任务" + } + } + } + }, + "Add task": { + "comment": "A button that adds a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe hinzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak toevoegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加任务" + } + } + } + }, + "Add your first property to get started!": { + "comment": "A description below the image in the \"No properties yet\" view, encouraging the user to add their first property.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Añade tu primera propiedad para empezar!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez votre premier logement pour commencer !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Füge deine erste Immobilie hinzu, um loszulegen!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione sua primeira propriedade para começar!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi il tuo primo immobile per iniziare!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初の物件を追加して始めましょう!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첫 자산을 추가해 시작하세요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg je eerste woning toe om te beginnen!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加第一处房产即可开始!" + } + } + } + }, + "Adds a subtle hexagonal grid overlay": { + "comment": "A description of the Honeycomb Pattern feature.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Añade una sutil cuadrícula hexagonal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoute une subtile grille hexagonale" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügt ein dezentes Sechseck-Raster hinzu" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adiciona uma sutil grade hexagonal sobreposta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiunge una sottile griglia esagonale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "控えめな六角形グリッドを重ねて表示します" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "은은한 육각형 격자 오버레이를 추가합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voegt een subtiel zeshoekig raster toe" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加淡雅的六边形网格叠层" + } + } + } + }, + "All optional -- helps us personalize your plan": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Todo opcional: nos ayuda a personalizar tu plan" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tout est facultatif -- cela nous aide à personnaliser votre forfait" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alles optional -- hilft uns, deinen Plan zu personalisieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tudo opcional -- ajuda a personalizar seu plano" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutto facoltativo -- ci aiuta a personalizzare il tuo piano" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべて任意です。プランの最適化に役立ちます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모두 선택 사항 — 맞춤 플랜에 도움이 됩니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Allemaal optioneel -- helpt ons je plan te personaliseren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "均为可选——有助于为您定制方案" + } + } + } + }, + "Already have an account?": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Ya tienes una cuenta?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez déjà un compte ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Hast du schon ein Konto?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Já tem uma conta?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai già un account?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すでにアカウントをお持ちですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 계정이 있으신가요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Heb je al een account?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已有账户?" + } + } + } + }, + "Already have an account? Log in": { + "comment": "A link that directs users to log in if they already have an account.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Ya tienes una cuenta? Inicia sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez déjà un compte ? Connectez-vous" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Hast du schon ein Konto? Anmelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Já tem uma conta? Entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai già un account? Accedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すでにアカウントをお持ちですか? ログイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 계정이 있으신가요? 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Heb je al een account? Log in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已有账户?登录" + } + } + } + }, + "Animation Type": { + "comment": "A label above the picker for selecting an animation type.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de animación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type d'animation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Animationstyp" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de animação" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo di animazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アニメーションの種類" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "애니메이션 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Animatietype" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "动画类型" + } + } + } + }, + "app_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + } + } + }, + "app_tagline": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalten Sie Ihre Immobilien einfach" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Manage your properties with ease" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Administra tus propiedades con facilidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérez vos propriétés facilement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci le tue proprietà con facilità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロパティを簡単に管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산을 쉽게 관리하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheer uw eigendommen met gemak" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerencie suas propriedades com facilidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "轻松管理您的房产" + } + } + } + }, + "Archive": { + "comment": "The text of a button that archives a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archiver" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Archivieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Archiveren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档" + } + } + } + }, + "Archive task": { + "comment": "A label displayed as a button that archives a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archiver la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe archivieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak archiveren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档任务" + } + } + } + }, + "Archive Task": { + "comment": "A button that archives a task. The text \"Archive Task\" is a placeholder and should be replaced with the actual translation.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archiver la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe archivieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak archiveren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档任务" + } + } + } + }, + "Are you sure you want to archive \"%@\"? You can unarchive it later from archived tasks.": { + "comment": "A confirmation alert that appears when a user attempts to archive a task. The argument is the title of the task that is being archived.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres archivar \"%@\"? Podrás desarchivarla luego desde las tareas archivadas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voulez-vous vraiment archiver « %@ » ? Vous pourrez la désarchiver plus tard." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du \"%@\" wirklich archivieren? Du kannst sie später wiederherstellen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja arquivar \"%@\"? Você pode desarquivá-la depois." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi davvero archiviare \"%@\"? Potrai ripristinarla più tardi." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "「%@」をアーカイブしますか?後でアーカイブ済みタスクから戻せます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "\"%@\"을(를) 보관하시겠습니까? 나중에 복원할 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet je zeker dat je \"%@\" wilt archiveren? Je kunt het later herstellen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定要归档\"%@\"吗?之后可从已归档任务中取消归档。" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to archive \"%@\"? You can unarchive it later from archived tasks." + } + } + } + }, + "Are you sure you want to archive this task? You can unarchive it later from archived tasks.": { + "comment": "An alert message displayed when the user taps the \"Archive\" button on a task. It confirms that the user intends to archive the task and provides a hint that the task can be restored later.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres archivar esta tarea? Podrás desarchivarla más tarde desde las tareas archivadas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voulez-vous vraiment archiver cette tâche ? Vous pourrez la désarchiver plus tard depuis les tâches archivées." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du diese Aufgabe wirklich archivieren? Du kannst sie später wieder aus dem Archiv holen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja arquivar esta tarefa? Você pode desarquivá-la depois nas tarefas arquivadas." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi davvero archiviare questa attività? Potrai ripristinarla in seguito dalle attività archiviate." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクをアーカイブしますか? 後でアーカイブ済みタスクから戻せます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업을 보관하시겠어요? 나중에 보관된 작업에서 보관 해제할 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet je zeker dat je deze taak wilt archiveren? Je kunt het later terughalen uit gearchiveerde taken." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定要归档此任务吗?稍后可在已归档任务中取消归档。" + } + } + } + }, + "Are you sure you want to cancel this task? You can undo this later.": { + "comment": "An alert message displayed when a user taps the \"Cancel Task\" button in a task list. It confirms that the user intends to cancel the task and provides a way to undo the action.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres cancelar esta tarea? Podrás deshacerlo más tarde." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voulez-vous vraiment annuler cette tâche ? Vous pourrez annuler cette action plus tard." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du diese Aufgabe wirklich abbrechen? Du kannst das später rückgängig machen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja cancelar esta tarefa? Você pode desfazer isso depois." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi davvero annullare questa attività? Potrai annullare l'operazione in seguito." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクをキャンセルしますか? 後で元に戻せます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업을 취소하시겠어요? 나중에 되돌릴 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet je zeker dat je deze taak wilt annuleren? Je kunt dit later ongedaan maken." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定要取消此任务吗?稍后可撤销。" + } + } + } + }, + "Are you sure you want to remove %@ from this residence?": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres eliminar a %@ de esta residencia?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voulez-vous vraiment retirer %@ de ce logement ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du %@ wirklich aus diesem Zuhause entfernen?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja remover %@ desta residência?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi davvero rimuovere %@ da questa residenza?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ をこの住居から削除しますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@님을 이 거주지에서 제거하시겠어요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet je zeker dat je %@ uit deze woning wilt verwijderen?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定要将 %@ 从此住所移除吗?" + } + } + } + }, + "Attached photo": { + "comment": "A label for an attached photo.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto adjunta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo jointe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Angehängtes Foto" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto anexada" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto allegata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "添付された写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첨부된 사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijgevoegde foto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "附带照片" + } + } + } + }, + "auth_account_info": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kontoinformationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Account Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información de la cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations du compte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウント情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Accountinformatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações da conta" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "账户信息" + } + } + } + }, + "auth_already_have_account": { + "comment": "Text on the \"Already have an account?\" link in the auth register screen. Navigates to the auth login screen.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Already have an account?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Ya tienes una cuenta?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez déjà un compte ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Hast du schon ein Konto?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Já tem uma conta?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai già un account?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すでにアカウントをお持ちですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 계정이 있으신가요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Heb je al een account?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已有账户?" + } + } + } + }, + "auth_creating_account": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Creating Account..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Creando cuenta..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Création du compte..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto wird erstellt..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criando conta..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Creazione account..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウント作成中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만드는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在创建账户…" + } + } + } + }, + "auth_dont_have_account": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch kein Konto?" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Don't have an account?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿No tienes una cuenta?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pas encore de compte ?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai un account?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントをお持ちでないですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정이 없으신가요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen account?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não tem uma conta?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "还没有账户?" + } + } + } + }, + "auth_enter_email": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie Ihre E-Mail ein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter your email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresa tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez votre email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci la tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer uw e-mail in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的电子邮件" + } + } + } + }, + "auth_enter_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie Ihr Passwort ein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter your password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresa tu contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez votre mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci la tua password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer uw wachtwoord in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite sua senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的密码" + } + } + } + }, + "auth_forgot_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Code senden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Send Reset Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviar Código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoyer le code" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia codice di reset" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットコードを送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 코드 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Resetcode verzenden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviar Código" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "发送重置验证码" + } + } + } + }, + "auth_forgot_email_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo Electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件" + } + } + } + }, + "auth_forgot_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort vergessen?" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Forgot Password?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Olvidaste tu Contraseña?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe oublié ?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password dimenticata?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをお忘れですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호를 잊으셨나요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord vergeten?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esqueceu a Senha?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "忘记密码?" + } + } + } + }, + "auth_forgot_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie Ihre E-Mail ein, um einen Code zu erhalten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter your email to receive a reset code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresa tu correo para recibir un código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez votre email pour recevoir un code" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci la tua email per ricevere un codice di reset" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットコードを受信するにはメールアドレスを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 코드를 받으려면 이메일을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer uw e-mail in om een resetcode te ontvangen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu email para receber um código" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的电子邮件以接收重置验证码" + } + } + } + }, + "auth_forgot_success": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wenn ein Konto existiert, wurde ein Code gesendet" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "If an account exists, a reset code has been sent" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Si existe una cuenta, se envió un código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Si un compte existe, un code a été envoyé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Se esiste un account, è stato inviato un codice di reset" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントが存在する場合、リセットコードが送信されました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정이 존재하면 재설정 코드가 전송되었습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Als er een account bestaat, is er een resetcode verzonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Se uma conta existir, um código foi enviado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "如果账户存在,重置验证码已发送" + } + } + } + }, + "auth_forgot_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort vergessen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Forgot Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Olvidaste tu Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe oublié" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password dimenticata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをお忘れですか" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 찾기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord vergeten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esqueceu a Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "忘记密码" + } + } + } + }, + "auth_have_account": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bereits ein Konto? Anmelden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Already have an account? Sign In" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Ya tienes cuenta? Inicia Sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Déjà un compte ? Se connecter" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai già un account? Accedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すでにアカウントをお持ちですか?ログイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 계정이 있으신가요? 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Heeft u al een account? Inloggen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Já tem conta? Entrar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已有账户?登录" + } + } + } + }, + "auth_hide_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort verbergen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Hide password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ocultar contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Masquer le mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nascondi password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードを隠す" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 숨기기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord verbergen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocultar senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "隐藏密码" + } + } + } + }, + "auth_join_honeydue": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bei honeyDue anmelden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Join honeyDue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Únete a honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti a honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueに参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 가입" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Word lid van honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Junte-se à honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入honeyDue" + } + } + } + }, + "auth_login_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmelden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign In" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar Sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录" + } + } + } + }, + "auth_login_failed": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung fehlgeschlagen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Login Failed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de Inicio de Sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de connexion" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso fallito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログインに失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen mislukt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no Login" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录失败" + } + } + } + }, + "auth_login_password_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码" + } + } + } + }, + "auth_login_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalten Sie Ihre Immobilien einfach" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Manage your properties with ease" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Administra tus propiedades con facilidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérez vos propriétés facilement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci le tue proprietà con facilità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロパティを簡単に管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산을 쉽게 관리하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheer uw eigendommen met gemak" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerencie suas propriedades com facilidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "轻松管理您的房产" + } + } + } + }, + "auth_login_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + } + } + }, + "auth_login_username_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzername oder E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Username or Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario o Correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom d'utilisateur ou Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome utente o email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名またはメールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 이름 또는 이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikersnaam of e-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuário ou Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名或电子邮件" + } + } + } + }, + "auth_logout": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abmelden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Logout" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cerrar sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Déconnexion" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esci" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログアウト" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그아웃" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitloggen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sair" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "退出" + } + } + } + }, + "auth_no_account": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kein Konto? Registrieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Don't have an account? Register" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿No tienes cuenta? Regístrate" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pas de compte ? S'inscrire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai un account? Registrati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントをお持ちでないですか?登録" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정이 없으신가요? 가입하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen account? Registreren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não tem conta? Cadastre-se" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "没有账户?注册" + } + } + } + }, + "auth_or_divider": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "oder" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "or" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "o" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "ou" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "oppure" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "または" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "또는" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "of" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "ou" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "或" + } + } + } + }, + "auth_password_suggestion": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tippen Sie auf das Passwortfeld für einen starken Passwortvorschlag" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tap the password field for a strong password suggestion" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca el campo de contraseña para una sugerencia de contraseña segura" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appuyez sur le champ mot de passe pour une suggestion de mot de passe fort" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca il campo password per un suggerimento di password sicura" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "強力なパスワードの提案を得るにはパスワードフィールドをタップ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "강력한 비밀번호 제안을 받으려면 비밀번호 필드를 탭하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tik op het wachtwoordveld voor een sterk wachtwoordvoorstel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque no campo de senha para uma sugestão de senha forte" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "点击密码字段获取强密码建议" + } + } + } + }, + "auth_passwords_dont_match": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwörter stimmen nicht überein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Passwords don't match" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Las contraseñas no coinciden" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les mots de passe ne correspondent pas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le password non corrispondono" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードが一致しません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호가 일치하지 않습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoorden komen niet overeen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "As senhas não coincidem" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码不匹配" + } + } + } + }, + "auth_register_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto erstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Create Account" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear Cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un compte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criar Conta" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建账户" + } + } + } + }, + "auth_register_confirm_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Confirm Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Confirmar Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Confirmer le mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Conferma password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードを確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord bevestigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Confirmar Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确认密码" + } + } + } + }, + "auth_register_email": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo Electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件" + } + } + } + }, + "auth_register_first_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "First Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prénom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voornaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "名字" + } + } + } + }, + "auth_register_last_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nachname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Last Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Apellido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cognome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "姓" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Achternaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sobrenome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "姓氏" + } + } + } + }, + "auth_register_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码" + } + } + } + }, + "auth_register_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Registrieren Sie sich, um zu beginnen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign up to get started" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Regístrate para comenzar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inscrivez-vous pour commencer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Registrati per iniziare" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインアップして始めましょう" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가입하여 시작하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meld u aan om te beginnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cadastre-se para começar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "注册开始使用" + } + } + } + }, + "auth_register_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto erstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Create Account" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear Cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un compte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criar Conta" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建账户" + } + } + } + }, + "auth_register_username": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzername" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Username" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom d'utilisateur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome utente" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikersnaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuário" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名" + } + } + } + }, + "auth_reset_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort zurücksetzen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Reset Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Restablecer Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réinitialiser" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimposta password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセット" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 재설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord resetten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Redefinir Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置密码" + } + } + } + }, + "auth_reset_code_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Code" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Reset Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di reset" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットコード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Resetcode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置验证码" + } + } + } + }, + "auth_reset_confirm_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Passwort bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Confirm New Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Confirmar Nueva Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Confirmer le nouveau mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Conferma nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワードを確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호 확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bevestig nieuw wachtwoord" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Confirmar Nova Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确认新密码" + } + } + } + }, + "auth_reset_new_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Passwort" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "New Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nueva Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nouveau mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuw wachtwoord" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nova Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "新密码" + } + } + } + }, + "auth_reset_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie Ihr neues Passwort ein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter your new password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresa tu nueva contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez votre nouveau mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci la tua nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワードを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer uw nieuwe wachtwoord in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite sua nova senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的新密码" + } + } + } + }, + "auth_reset_success": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort erfolgreich zurückgesetzt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Password reset successfully" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contraseña restablecida correctamente" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe réinitialisé avec succès" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password reimpostata con successo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードが正常にリセットされました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호가 성공적으로 재설정되었습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord succesvol gereset" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha redefinida com sucesso" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码重置成功" + } + } + } + }, + "auth_reset_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort zurücksetzen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Reset Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Restablecer Contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réinitialiser le mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimposta password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセット" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 재설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord resetten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Redefinir Senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置密码" + } + } + } + }, + "auth_security": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sicherheit" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Security" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seguridad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sécurité" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sicurezza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "セキュリティ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보안" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beveiliging" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Segurança" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "安全" + } + } + } + }, + "auth_show_password": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort anzeigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Show password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher le mot de passe" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードを表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord tonen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar senha" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "显示密码" + } + } + } + }, + "auth_sign_in": { + "comment": "Button text that allows a user to sign in.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign In" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录" + } + } + } + }, + "auth_sign_in_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Melden Sie sich an, um Ihre Immobilien zu verwalten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign in to manage your properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Inicia sesión para administrar tus propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connectez-vous pour gérer vos propriétés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi per continuare con honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueを続けるにはログインしてください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue를 계속 사용하려면 로그인하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Log in om door te gaan met honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entre para gerenciar suas propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录以继续使用honeyDue" + } + } + } + }, + "auth_sign_up": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Registrieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign Up" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Registrarse" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "S'inscrire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Registrati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインアップ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가입하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Registreren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cadastrar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "注册" + } + } + } + }, + "auth_signing_in": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmelden..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Signing In..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciando sesión..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログイン中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在登录..." + } + } + } + }, + "auth_signing_in_with_apple": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Mit Apple anmelden..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Signing in with Apple..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciando sesión con Apple..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion avec Apple..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso con Apple in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでログイン中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple로 로그인 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando com Apple..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在使用Apple登录..." + } + } + } + }, + "auth_start_managing": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beginnen Sie noch heute mit der Verwaltung Ihrer Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Start managing your properties today" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Comienza a administrar tus propiedades hoy" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Commencez à gérer vos propriétés dès aujourd'hui" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inizia a gestire le tue proprietà oggi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今日からプロパティの管理を始めましょう" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오늘부터 부동산 관리를 시작하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Begin vandaag met het beheren van uw eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Comece a gerenciar suas propriedades hoje" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "今天开始管理您的房产" + } + } + } + }, + "auth_verify_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Verify" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verifiëren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证" + } + } + } + }, + "auth_verify_check_inbox": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail-Bestätigung erforderlich. Überprüfen Sie Ihr Postfach auf einen 6-stelligen Code." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email verification is required. Check your inbox for a 6-digit code." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Se requiere verificación de correo. Revisa tu bandeja de entrada para un código de 6 dígitos." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La vérification de l'email est requise. Vérifiez votre boîte de réception pour un code à 6 chiffres." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "È richiesta la verifica dell'email. Controlla la tua casella di posta" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メール認証が必要です。受信トレイを確認してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 인증이 필요합니다. 받은 편지함을 확인하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mailverificatie is vereist. Controleer uw inbox" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificação de email é necessária. Verifique sua caixa de entrada para um código de 6 dígitos." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "需要验证电子邮件。请检查您的收件箱" + } + } + } + }, + "auth_verify_code_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätigungscode" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Verification Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código de Verificación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de vérification" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di verifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証コード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatiecode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de Verificação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码" + } + } + } + }, + "auth_verify_code_must_be_6": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Code muss 6 Ziffern haben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Code must be 6 digits" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El código debe tener 6 dígitos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code doit contenir 6 chiffres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice deve essere di 6 cifre" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードは6桁である必要があります" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드는 6자리여야 합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code moet 6 cijfers zijn" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código deve ter 6 dígitos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码必须是6位数字" + } + } + } + }, + "auth_verify_email_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Verify Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificar correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifier l'email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールを確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 인증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail verifiëren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificar email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证邮箱" + } + } + } + }, + "auth_verify_help_text": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keinen Code erhalten? Überprüfen Sie Ihren Spam-Ordner oder kontaktieren Sie den Support." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Didn't receive the code? Check your spam folder or contact support." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿No recibiste el código? Revisa tu carpeta de spam o contacta soporte." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code non reçu ? Vérifiez votre dossier spam ou contactez le support." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai ricevuto il codice? Controlla la cartella spam o invia di nuovo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードが届きませんか?迷惑メールフォルダを確認するか、再送信してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드를 받지 못하셨나요? 스팸 폴더를 확인하거나 다시 보내세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code niet ontvangen? Controleer uw spammap of verstuur opnieuw" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não recebeu o código? Verifique sua pasta de spam ou entre em contato com o suporte." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "没有收到验证码?请检查垃圾邮件文件夹或重新发送" + } + } + } + }, + "auth_verify_must_verify": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sie müssen Ihre E-Mail-Adresse bestätigen, um fortzufahren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "You must verify your email address to continue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Debes verificar tu correo electrónico para continuar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous devez vérifier votre adresse email pour continuer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Devi verificare il tuo indirizzo email per continuare" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "続行するにはメールアドレスを確認する必要があります" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계속하려면 이메일 주소를 인증해야 합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "U moet uw e-mailadres verifiëren om door te gaan" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você deve verificar seu email para continuar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您必须验证您的电子邮件地址才能继续" + } + } + } + }, + "auth_verify_resend": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Code erneut senden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Resend Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Reenviar Código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Renvoyer le code" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia di nuovo il codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを再送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드 다시 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code opnieuw verzenden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Reenviar Código" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重新发送验证码" + } + } + } + }, + "auth_verify_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie den 6-stelligen Code ein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter the 6-digit code sent to your email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresa el código de 6 dígitos enviado a tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez le code à 6 chiffres envoyé à votre email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice a 6 cifre inviato alla tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールに送信された6桁のコードを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일로 전송된 6자리 코드를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de 6-cijferige code in die naar uw e-mail is verzonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de 6 dígitos enviado para seu email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入发送到您邮箱的6位验证码" + } + } + } + }, + "auth_verify_success": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail erfolgreich bestätigt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email verified successfully" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo verificado correctamente" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email vérifié avec succès" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email verificata con successo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールが正常に確認されました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일이 성공적으로 인증되었습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail succesvol geverifieerd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email verificado com sucesso" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮箱验证成功" + } + } + } + }, + "auth_verify_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Verify Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificar Correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifier l'email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールを確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 인증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail verifiëren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificar Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证邮箱" + } + } + } + }, + "auth_verify_your_email": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail bestätigen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Verify Your Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Verifica tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifiez votre email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica la tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールを確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 인증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verifieer uw e-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verifique seu email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证您的邮箱" + } + } + } + }, + "auth_welcome_back": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Willkommen zurück" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Welcome Back" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Bienvenido de nuevo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bon retour" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Bentornato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "おかえりなさい" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 오신 것을 환영합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Welkom terug" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Bem-vindo de volta" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "欢迎回来" + } + } + } + }, + "Back": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Atrás" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indietro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "뒤로" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回" + } + } + } + }, + "Back to all photos": { + "comment": "A button that dismisses a sheet and returns to the previous screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Volver a todas las fotos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour à toutes les photos" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück zu allen Fotos" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar a todas as fotos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Torna a tutte le foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての写真に戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 사진으로 돌아가기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug naar alle foto's" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回所有照片" + } + } + } + }, + "Back to Login": { + "comment": "A button label that takes the user back to the login screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Volver al inicio de sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour à la connexion" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück zur Anmeldung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar ao login" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Torna all'accesso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログインに戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인으로 돌아가기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug naar inloggen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回登录" + } + } + } + }, + "Browse Task Templates": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver plantillas de tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Parcourir les modèles de tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenvorlagen durchsuchen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver modelos de tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sfoglia i modelli di attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクテンプレートを見る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 템플릿 둘러보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taaksjablonen bekijken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "浏览任务模板" + } + } + } + }, + "By: %@": { + "comment": "A line in the checkout view displaying the name of the contractor who completed a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Por: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Par : %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Von: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Por: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Di: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "投稿者:%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작성자: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Door: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "由:%@" + } + } + } + }, + "Cancel": { + "comment": "The label of a button that dismisses an alert.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abbrechen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "キャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Annuleren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancel" + } + } + } + }, + "Cancel anytime in Settings • No commitment": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancela cuando quieras en Ajustes • Sin compromiso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annulez à tout moment dans les Réglages • Sans engagement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Jederzeit in den Einstellungen kündbar • Keine Bindung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancele quando quiser nos Ajustes • Sem compromisso" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla quando vuoi nelle Impostazioni • Nessun vincolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "いつでも設定からキャンセル可能 • 契約縛りなし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정에서 언제든 취소 가능 • 약정 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Altijd opzegbaar in Instellingen • Geen verplichting" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "随时可在设置中取消 • 无需承诺" + } + } + } + }, + "Cancel task": { + "comment": "A button that cancels a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abbrechen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをキャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak annuleren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消任务" + } + } + } + }, + "Cancel Task": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abbrechen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをキャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak annuleren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消任务" + } + } + } + }, + "Caption": { + "comment": "A label displayed above the caption of an image in the photo viewer.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Légende" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bildunterschrift" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Legenda" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Didascalia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "キャプション" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijschrift" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "说明" + } + } + } + }, + "Change": { + "comment": "A button that allows the user to change the time in a notification.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cambiar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ändern" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Alterar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "変更" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "변경" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wijzigen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "更改" + } + } + } + }, + "Check Your Email": { + "comment": "A heading that instructs the user to check their email for a verification code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Revisa tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifiez vos e-mails" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Prüfe deine E-Mails" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verifique seu e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Controlla la tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールをご確認ください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일을 확인하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Controleer je e-mail" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看您的邮箱" + } + } + } + }, + "Check your spam folder if you don't see it": { + "comment": "A description below the \"Send New Code\" button, instructing the user to check their spam folder if they haven't received the verification code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Revisa tu carpeta de spam si no lo ves" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifiez vos courriers indésirables si vous ne le voyez pas" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Schau im Spam-Ordner nach, falls du sie nicht findest" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verifique a pasta de spam se não encontrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Controlla la cartella spam se non la vedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "見つからない場合は迷惑メールフォルダもご確認ください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보이지 않으면 스팸함을 확인하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Controleer je spammap als je het niet ziet" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "若未收到,请检查垃圾邮件文件夹" + } + } + } + }, + "Choose from common home maintenance tasks or create your own below": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Elige entre tareas comunes de mantenimiento del hogar o crea la tuya abajo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisissez parmi les tâches d'entretien courantes ou créez la vôtre ci-dessous" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wähle aus gängigen Wartungsaufgaben oder erstelle unten eigene" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escolha tarefas comuns de manutenção ou crie a sua abaixo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scegli tra le attività comuni di manutenzione domestica o creane una qui sotto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "一般的な住宅メンテナンスタスクから選ぶか、下で独自に作成してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일반적인 집 관리 작업을 선택하거나 아래에서 직접 만드세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kies uit veelvoorkomende onderhoudstaken of maak hieronder je eigen taak" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "从常见家居维护任务中选择,或在下方自行创建" + } + } + } + }, + "Choose your plan": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Elige tu plan" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisissez votre forfait" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wähle deinen Tarif" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escolha seu plano" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scegli il tuo piano" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プランを選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "요금제 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kies je abonnement" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择您的套餐" + } + } + } + }, + "Choose Your Plan": { + "comment": "A heading displayed at the top of the feature comparison view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Elige tu plan" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisissez votre forfait" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wähle deinen Tarif" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escolha seu plano" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scegli il tuo piano" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プランを選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "요금제 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kies je abonnement" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择您的套餐" + } + } + } + }, + "Close": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cerrar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fermer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Schließen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fechar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Chiudi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "閉じる" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "닫기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sluiten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "关闭" + } + } + } + }, + "Code expires in 15 minutes": { + "comment": "A description of how long the verification code is valid for.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "El código caduca en 15 minutos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code expire dans 15 minutes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code läuft in 15 Minuten ab" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código expira em 15 minutos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice scade tra 15 minuti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードは15分で期限切れになります" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드는 15분 후 만료됩니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code verloopt over 15 minuten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码 15 分钟后失效" + } + } + } + }, + "common_add": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加" + } + } + } + }, + "common_back": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Back" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Atrás" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indietro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "뒤로" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回" + } + } + } + }, + "common_cancel": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abbrechen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancel" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "キャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Annuleren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消" + } + } + } + }, + "common_close": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Schließen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Close" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cerrar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fermer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Chiudi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "閉じる" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "닫기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sluiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fechar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "关闭" + } + } + } + }, + "common_delete": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除" + } + } + } + }, + "common_done": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fertig" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Done" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Listo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Fatto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Klaar" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pronto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成" + } + } + } + }, + "common_edit": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑" + } + } + } + }, + "common_error": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Error" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "错误" + } + } + } + }, + "common_import": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Import" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Importar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Importer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Importieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Importar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Importa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "インポート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가져오기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Importeren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "导入" + } + } + } + }, + "common_loading": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载中..." + } + } + } + }, + "common_no": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Non" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "No" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "いいえ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아니오" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nee" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "否" + } + } + } + }, + "common_ok": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定" + } + } + } + }, + "common_retry": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erneut versuchen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Retry" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Reintentar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "再試行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재시도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opnieuw proberen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tentar Novamente" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重试" + } + } + } + }, + "common_save": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Speichern" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Save" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Guardar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Enregistrer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salva" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保存" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opslaan" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Salvar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存" + } + } + } + }, + "common_share": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partager" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Teilen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享" + } + } + } + }, + "common_success": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erfolg" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Success" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Éxito" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Succès" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Successo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "成功" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "성공" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Succes" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sucesso" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "成功" + } + } + } + }, + "common_yes": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Ja" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Yes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sí" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Oui" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sì" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "はい" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ja" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sim" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "是" + } + } + } + }, + "Compare Free vs Pro": { + "comment": "A button label that links to a view comparing free and pro plans.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Comparar Gratis y Pro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Comparer Gratuit et Pro" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Free und Pro vergleichen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Comparar Grátis e Pro" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Confronta Free e Pro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料版とProを比較" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료와 프로 비교" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vergelijk Gratis met Pro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "比较免费版与专业版" + } + } + } + }, + "Complete": { + "comment": "A button label that indicates a task has been completed.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erledigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooien" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Complete" + } + } + } + }, + "Complete task": { + "comment": "A label displayed as a button that completes a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abschließen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak voltooien" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成任务" + } + } + } + }, + "Complete Task": { + "comment": "A button label that says \"Complete Task\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abschließen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak voltooien" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成任务" + } + } + } + }, + "Completion Animation": { + "comment": "The title of the view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Animación al completar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Animation de fin" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschluss-Animation" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Animação de conclusão" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Animazione di completamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了アニメーション" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 애니메이션" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsanimatie" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成动画" + } + } + } + }, + "Completion Animation, %@": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Animación al completar, %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Animation de fin, %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschluss-Animation, %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Animação de conclusão, %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Animazione di completamento, %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了アニメーション、%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 애니메이션, %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsanimatie, %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成动画,%@" + } + } + } + }, + "Completion history for %@": { + "comment": "A sheet that shows a user's completions history for a task. The argument is the name of the task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Historial de finalización de %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Historique de réalisation de %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlussverlauf für %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Histórico de conclusões de %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cronologia completamenti per %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ の完了履歴" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@의 완료 기록" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsgeschiedenis voor %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%@ 的完成记录" + } + } + } + }, + "Completion photo%@": { + "comment": "A label for the photo view. The argument is the caption of the photo.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto de finalización%@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo%@ de fin" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlussfoto%@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto de conclusão%@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto di completamento%@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了時の写真%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 사진%@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsfoto%@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成照片%@" + } + } + } + }, + "Completion Photos": { + "comment": "The title for the view that shows a user's photo submissions.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Fotos de finalización" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photos de fin" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlussfotos" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fotos de conclusão" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto di completamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了時の写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsfoto's" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成照片" + } + } + } + }, + "Completions (%lld)": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Finalizaciones (%lld)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réalisations (%lld)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlüsse (%lld)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conclusões (%lld)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completamenti (%lld)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了 (%lld)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 (%lld)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingen (%lld)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成记录 (%lld)" + } + } + } + }, + "completions at %@": { + "comment": "A subheading describing the content of the honeycomb view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "finalizaciones a las %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "réalisations à %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlüsse um %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "conclusões às %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "completamenti alle %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@の完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@에 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "voltooiingen om %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "于 %@ 完成" + } + } + } + }, + "CONFIRM PASSWORD": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "CONFIRMAR CONTRASEÑA" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "CONFIRMER LE MOT DE PASSE" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "PASSWORT BESTÄTIGEN" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "CONFIRMAR SENHA" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "CONFERMA PASSWORD" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードの確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "WACHTWOORD BEVESTIGEN" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确认密码" + } + } + } + }, + "Continue": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Continuar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Continuer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Weiter" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Continuar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Continua" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "続行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계속" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Doorgaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "继续" + } + } + } + }, + "Continue with Free": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Continuar con Gratis" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Continuer avec Gratuit" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Mit Free fortfahren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Continuar com o Grátis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Continua con Free" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料版で続行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료로 계속하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Doorgaan met Gratis" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "使用免费版继续" + } + } + } + }, + "Contractor actions": { + "comment": "A label for the menu button that appears in the navigation bar.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Acciones del contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actions du prestataire" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister-Aktionen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ações do prestador" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Azioni tecnico" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の操作" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemeracties" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商操作" + } + } + } + }, + "Contractor Imported": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista importado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire importé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister importiert" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador importado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tecnico importato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者をインポートしました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 가져옴" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer geïmporteerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已导入承包商" + } + } + } + }, + "Contractors": { + "comment": "A tab label for the contractors section.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Handwerker" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestadores" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tecnici" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vakmensen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractors" + } + } + } + }, + "contractors_add_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加承包商" + } + } + } + }, + "contractors_add_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加承包商" + } + } + } + }, + "contractors_add_to_favorites": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu Favoriten hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add to Favorites" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar a Favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter aux Favoris" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi ai preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入りに追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기에 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toevoegen aan favorieten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar aos Favoritos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加到收藏" + } + } + } + }, + "contractors_added_by_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Hinzugefügt von" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Added By" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregado Por" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouté Par" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiunto da" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가한 사람" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toegevoegd door" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionado Por" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加人" + } + } + } + }, + "contractors_address_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Address" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indirizzo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Adres" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "地址" + } + } + } + }, + "contractors_all_specialties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Fachgebiete" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "All Specialties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Todas las Especialidades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toutes les Spécialités" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutte le specialità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての専門" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 전문 분야" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle specialiteiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todas as Especialidades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有专业" + } + } + } + }, + "contractors_associated_property_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zugehörige Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Associated Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad Asociada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété Associée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà associata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "関連物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연관 부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gekoppeld eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade Associada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "关联房产" + } + } + } + }, + "contractors_average_rating_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Durchschnittsbewertung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Average Rating" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Calificación Promedio" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Note Moyenne" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutazione media" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "平均評価" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "평균 평점" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gemiddelde beoordeling" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliação Média" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "平均评分" + } + } + } + }, + "contractors_basic_info_footer": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich: Name" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required: Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido: Nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis : Nom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio: Nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須:名前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수: 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht: Naam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório: Nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填:名称" + } + } + } + }, + "contractors_basic_info_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Grundinformationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Basic Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información Básica" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations de Base" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni di base" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "基本情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Basisinformatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações Básicas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "基本信息" + } + } + } + }, + "contractors_call_action": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anrufen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Call" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Llamar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appeler" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Chiama" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "電話する" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전화하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ligar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "拨打电话" + } + } + } + }, + "contractors_city_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Stadt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "City" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ciudad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ville" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Città" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "市区町村" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "도시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stad" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "城市" + } + } + } + }, + "contractors_clear_action": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Clear" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Limpiar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Effacer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cancella" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クリア" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지우기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wissen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Limpar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "清除" + } + } + } + }, + "contractors_company_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Firma" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Company" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Empresa" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entreprise" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Azienda" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "会社" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "회사" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bedrijf" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Empresa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "公司" + } + } + } + }, + "contractors_completed_tasks": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "%d abgeschlossene Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "%d completed tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%d tareas completadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%d tâches terminées" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%d attività completate" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%d 件の完了タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료된 작업 %d개" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d voltooide taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%d tarefas concluídas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%d 个已完成任务" + } + } + } + }, + "contractors_contact_info_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kontaktinformationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contact Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información de Contacto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations de Contact" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni di contatto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "連絡先情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연락처 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contactgegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações de Contato" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "联系信息" + } + } + } + }, + "contractors_delete_confirm": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer le Prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir Prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除承包商" + } + } + } + }, + "contractors_delete_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchten Sie diesen Dienstleister wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to delete this contractor? This action cannot be undone." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Estás seguro de que quieres eliminar este contratista? Esta acción no se puede deshacer." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir supprimer ce prestataire ? Cette action ne peut pas être annulée." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sei sicuro di voler eliminare questo appaltatore? Questa azione non può essere annullata." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この業者を削除してもよろしいですか?この操作は取り消せません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 계약업체를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet u zeker dat u deze aannemer wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja excluir este prestador? Esta ação não pode ser desfeita." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您确定要删除此承包商吗?此操作无法撤销。" + } + } + } + }, + "contractors_directions_action": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wegbeschreibung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Directions" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Direcciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Itinéraire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indicazioni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "経路案内" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "길찾기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Routebeschrijving" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Direções" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "导航" + } + } + } + }, + "contractors_edit_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier le prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑承包商" + } + } + } + }, + "contractors_email_action": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールを送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail sturen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "发送邮件" + } + } + } + }, + "contractors_email_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件" + } + } + } + }, + "contractors_empty_filtered": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Dienstleister gefunden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No contractors found" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun prestataire trouvé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun appaltatore trovato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者が見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체를 찾을 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen aannemers gevonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum prestador encontrado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到承包商" + } + } + } + }, + "contractors_empty_no_filters": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie Ihren ersten Dienstleister hinzu, um zu beginnen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add your first contractor to get started" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega tu primer contratista para comenzar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez votre premier prestataire pour commencer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi il tuo primo appaltatore per iniziare" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初の業者を追加して始めましょう" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첫 번째 계약업체를 추가하여 시작하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg uw eerste aannemer toe om te beginnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione seu primeiro prestador para começar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加您的第一个承包商开始吧" + } + } + } + }, + "contractors_empty_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie vertrauenswürdige Dienstleister hinzu" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add trusted contractors for your property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega contratistas de confianza" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez des prestataires de confiance" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi appaltatori di fiducia per la tua proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件に信頼できる業者を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산에 신뢰할 수 있는 계약업체를 추가하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg betrouwbare aannemers toe voor uw eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione prestadores de confiança" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "为您的房产添加可信赖的承包商" + } + } + } + }, + "contractors_empty_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Dienstleister" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No contractors yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者がいません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen aannemers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem prestadores" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无承包商" + } + } + } + }, + "contractors_favorite_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Als Favorit markieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Mark as Favorite" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Marcar como Favorito" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Marquer comme Favori" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Segna come preferito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入りに登録" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기로 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Als favoriet markeren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Marcar como Favorito" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标记为收藏" + } + } + } + }, + "contractors_favorites": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Favoriten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Favorites" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Favoris" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入り" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Favorieten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Favoritos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "收藏" + } + } + } + }, + "contractors_info_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Info" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "信息" + } + } + } + }, + "contractors_location_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Standort" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Location" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ubicación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Emplacement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Posizione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "場所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "위치" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Locatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Localização" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "位置" + } + } + } + }, + "contractors_member_since_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Mitglied seit" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Member Since" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Miembro Desde" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Membre Depuis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Membro dal" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メンバー登録日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가입일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Lid sinds" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Membro Desde" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "会员自" + } + } + } + }, + "contractors_name_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Name" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Naam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "名称" + } + } + } + }, + "contractors_notes_footer": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Private Notizen zu diesem Dienstleister" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Private notes about this contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas privadas sobre este contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes privées sur ce prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note private su questo appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この業者についてのプライベートメモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 계약업체에 대한 개인 메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Privénotities over deze aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas privadas sobre este prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "关于此承包商的私人备注" + } + } + } + }, + "contractors_notes_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注" + } + } + } + }, + "contractors_notes_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注" + } + } + } + }, + "contractors_personal_no_residence": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Persönlich (Keine Immobilie)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Personal (No Residence)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Personal (Sin Propiedad)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Personnel (Sans Propriété)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Personale (nessuna proprietà)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "個人(物件なし)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인(부동산 없음)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Persoonlijk (geen eigendom)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pessoal (Sem Propriedade)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "个人(无房产)" + } + } + } + }, + "contractors_phone_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Telefon" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Phone" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Teléfono" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléphone" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Telefono" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "電話番号" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전화번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Telefoon" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telefone" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电话" + } + } + } + }, + "contractors_property_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "contractors_remove_from_favorites": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aus Favoriten entfernen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Remove from Favorites" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar de Favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retirer des Favoris" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi dai preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入りから削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기에서 제거" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uit favorieten verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover dos Favoritos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "从收藏中移除" + } + } + } + }, + "contractors_residence_footer_personal": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur Sie werden diesen Dienstleister sehen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Only you will see this contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Solo tú verás este contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Seul vous verrez ce prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Solo tu vedrai questo appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この業者はあなただけが見ることができます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 계약업체는 본인만 볼 수 있습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alleen u ziet deze aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Apenas você verá este prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "只有您能看到此承包商" + } + } + } + }, + "contractors_residence_footer_shared": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Benutzer von %@ werden diesen Dienstleister sehen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "All users of %@ will see this contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Todos los usuarios de %@ verán este contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tous les utilisateurs de %@ verront ce prestataire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutti gli utenti di %@ vedranno questo appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@のすべてのユーザーがこの業者を見ることができます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@의 모든 사용자가 이 계약업체를 볼 수 있습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle gebruikers van %@ zien deze aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todos os usuários de %@ verão este prestador" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "%@的所有用户都能看到此承包商" + } + } + } + }, + "contractors_residence_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie (Optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence (Optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad (Opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété (Optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade (Opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产(可选)" + } + } + } + }, + "contractors_search_placeholder": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister suchen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Search contractors..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar contratistas..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher des prestataires..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca appaltatori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を検索" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 검색" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemers zoeken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Buscar prestadores..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "搜索承包商" + } + } + } + }, + "contractors_select_residence": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择房产" + } + } + } + }, + "contractors_select_specialties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fachgebiete auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Specialties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Especialidades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner les Spécialités" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona specialità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "専門を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전문 분야 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer specialiteiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Especialidades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择专业" + } + } + } + }, + "contractors_select_specialties_placeholder": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fachgebiete auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Specialties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Especialidades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner les Spécialités" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona specialità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "専門を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전문 분야 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer specialiteiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Especialidades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择专业" + } + } + } + }, + "contractors_specialties_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fachgebiete" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Specialties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Especialidades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Spécialités" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Specialità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "専門" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전문 분야" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Specialiteiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Especialidades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "专业" + } + } + } + }, + "contractors_state_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bundesland" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "State" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "État" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato/Provincia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "都道府県" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시/도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Provincie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "省/州" + } + } + } + }, + "contractors_statistics_section": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Statistiken" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Statistics" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estadísticas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Statistiques" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Statistiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "統計" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "통계" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Statistieken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estatísticas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "统计" + } + } + } + }, + "contractors_street_address_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Straße" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Street Address" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Via" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "도로명 주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Straat" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "街道地址" + } + } + } + }, + "contractors_tasks_completed_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgeschlossene Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tasks Completed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tareas Completadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâches Terminées" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività completate" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료된 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooide taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefas Concluídas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已完成任务" + } + } + } + }, + "contractors_tasks_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "tâches" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务" + } + } + } + }, + "contractors_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractors" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataires" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Appaltatori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestadores" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商" + } + } + } + }, + "contractors_website_action": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Webseite" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Website" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sitio Web" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Site Web" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visita sito web" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ウェブサイトを開く" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "웹사이트 방문" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Website bezoeken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Site" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "访问网站" + } + } + } + }, + "contractors_website_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Webseite" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Website" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sitio Web" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Site Web" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sito web" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ウェブサイト" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "웹사이트" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Website" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Site" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "网站" + } + } + } + }, + "contractors_zip_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "PLZ" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "ZIP" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código Postal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code Postal" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "CAP" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "郵便番号" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우편번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Postcode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "CEP" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮编" + } + } + } + }, + "Copy share code": { + "comment": "A button that copies the share code to the user's clipboard.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Copiar código para compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Copier le code de partage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode kopieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Copiar código de compartilhamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Copia codice di condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードをコピー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드 복사" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelcode kopiëren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "复制共享码" + } + } + } + }, + "Cost: %@": { + "comment": "A label displaying the cost of a task completion. The argument is the cost of the completion.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Costo: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coût : %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kosten: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Custo: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Costo: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "費用:%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비용: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kosten: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "费用:%@" + } + } + } + }, + "Create a strong password to secure your account": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Crea una contraseña segura para proteger tu cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créez un mot de passe fort pour sécuriser votre compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erstelle ein sicheres Passwort für dein Konto" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Crie uma senha forte para proteger sua conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea una password sicura per proteggere il tuo account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントを保護する強力なパスワードを作成してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 보호를 위해 강력한 비밀번호를 만드세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Maak een sterk wachtwoord om je account te beveiligen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建一个强密码以保护您的账户" + } + } + } + }, + "Create Account": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto erstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criar conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウント作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建账户" + } + } + } + }, + "Create Account with Email": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear cuenta con correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un compte avec un e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto mit E-Mail erstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criar conta com e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea account con email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールでアカウント作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일로 계정 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken met e-mail" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "用邮箱创建账户" + } + } + } + }, + "Creating Account...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Creando cuenta..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Création du compte..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto wird erstellt..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criando conta..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Creazione account..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウント作成中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만드는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在创建账户…" + } + } + } + }, + "Delete property": { + "comment": "A button that deletes a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer le logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie löschen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning verwijderen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除房产" + } + } + } + }, + "Didn't receive a code? Check your spam folder or re-register": { + "comment": "A hint instructing the user to check their spam folder if they haven't received the verification code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿No recibiste un código? Revisa tu carpeta de spam o vuelve a registrarte" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas reçu de code ? Vérifiez vos courriers indésirables ou réinscrivez-vous" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keinen Code erhalten? Prüfe deinen Spam-Ordner oder registriere dich erneut" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não recebeu o código? Verifique o spam ou registre-se novamente" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai ricevuto il codice? Controlla lo spam o registrati di nuovo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードが届きませんか? 迷惑メールフォルダを確認するか、再登録してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드를 받지 못하셨나요? 스팸함을 확인하거나 다시 등록하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen code ontvangen? Controleer je spammap of registreer opnieuw" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未收到验证码?请检查垃圾邮件文件夹或重新注册" + } + } + } + }, + "Didn't receive the code?": { + "comment": "A question displayed below a button in the \"Verify Code\" view, instructing the user to request a new code if they haven't received one.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿No recibiste el código?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas reçu le code ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code nicht erhalten?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não recebeu o código?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai ricevuto il codice?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードが届きませんか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드를 받지 못하셨나요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen code ontvangen?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未收到验证码?" + } + } + } + }, + "Docs": { + "comment": "A label displayed above the documents tab in the main tab view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Documents" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Docs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Documenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档" + } + } + } + }, + "Document actions": { + "comment": "A label for the menu button that appears in the navigation bar.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Acciones del documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actions du document" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument-Aktionen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ações do documento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Azioni documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類の操作" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documentacties" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档操作" + } + } + } + }, + "documents_active": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktiv" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Active" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Activo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actif" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクティブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "활성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Actief" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ativo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "活跃" + } + } + } + }, + "documents_active_only": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur Aktive" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Active Only" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Solo Activos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actifs Uniquement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Solo attivi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクティブのみ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "활성만" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alleen actief" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Apenas Ativos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "仅活跃" + } + } + } + }, + "documents_active_status": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktiv" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Active" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Activo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actif" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクティブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "활성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Actief" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ativo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "活跃" + } + } + } + }, + "documents_add_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加文档" + } + } + } + }, + "documents_add_document": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument Hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un Document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加文档" + } + } + } + }, + "documents_add_warranty": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantie Hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Warranty" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantie toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加保修" + } + } + } + }, + "documents_additional_information": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zusätzliche Informationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Additional Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información Adicional" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations Supplémentaires" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni aggiuntive" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aanvullende informatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações Adicionais" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他信息" + } + } + } + }, + "documents_all_categories": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Kategorien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "All Categories" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Todas las Categorías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toutes les Catégories" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutte le categorie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべてのカテゴリー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 카테고리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle categorieën" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todas as Categorias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有类别" + } + } + } + }, + "documents_all_types": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Typen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "All Types" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Todos los Tipos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tous les Types" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutti i tipi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべてのタイプ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle types" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todos os Tipos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有类型" + } + } + } + }, + "documents_and_warranties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente & Garantien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Documents & Warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Documentos y Garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Documents et Garanties" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Documenti e garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントと保証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 및 보증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten en garanties" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documentos e Garantias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档和保修" + } + } + } + }, + "documents_associations": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuordnungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Associations" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Asociaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Associations" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Associazioni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "関連" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Koppelingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Associações" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "关联" + } + } + } + }, + "documents_attached_file": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Angehängte Datei" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Attached File" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivo Adjunto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fichier Joint" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "File allegato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "添付ファイル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첨부 파일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijgevoegd bestand" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivo Anexado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "附件" + } + } + } + }, + "documents_basic_information": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Grundinformationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Basic Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información Básica" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations de Base" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni di base" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "基本情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Basisinformatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações Básicas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "基本信息" + } + } + } + }, + "documents_category": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kategorie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Category" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Categoría" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Catégorie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Categoria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カテゴリー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "카테고리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Categorie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Categoria" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "类别" + } + } + } + }, + "documents_category_appliance": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Gerät" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Appliance" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Electrodoméstico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appareil" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elettrodomestico" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "家電" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가전제품" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Apparaat" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Eletrodoméstico" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "家电" + } + } + } + }, + "documents_category_electrical": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Elektrisch" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Electrical" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eléctrico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Électrique" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elettrico" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "電気" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Elektrisch" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Elétrico" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电气" + } + } + } + }, + "documents_category_hvac": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "HLK" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "HVAC" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "HVAC" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "CVC" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Climatizzazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "空調" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "냉난방" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "HVAC" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "AVAC" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暖通空调" + } + } + } + }, + "documents_category_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kategorie (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Category (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Categoría (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Catégorie (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Categoria (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カテゴリー(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "카테고리(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Categorie (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Categoria (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "类别(可选)" + } + } + } + }, + "documents_category_other": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Andere" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Other" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Otro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Autre" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Altro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "その他" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기타" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Overig" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Outro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他" + } + } + } + }, + "documents_category_plumbing": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sanitär" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Plumbing" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Plomería" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plomberie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Idraulica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "配管" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "배관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Loodgieterswerk" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Encanamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "水管" + } + } + } + }, + "documents_category_roofing": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dach" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Roofing" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Techado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toiture" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Coperture" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "屋根" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지붕" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dakwerk" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telhado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "屋顶" + } + } + } + }, + "documents_category_structural": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Strukturell" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Structural" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estructural" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Structurel" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Strutturale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "構造" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구조" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Constructie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estrutural" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "结构" + } + } + } + }, + "documents_category_unknown": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbekannt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Unknown" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Desconocido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inconnu" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sconosciuto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "不明" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알 수 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbekend" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desconhecido" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未知" + } + } + } + }, + "documents_claim_email": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchs-E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo de Reclamos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email de Réclamation" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email reclami" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレームメール" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim e-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email de Reclamação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔邮箱" + } + } + } + }, + "documents_claim_email_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchs-E-Mail (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Email (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo de Reclamos (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email de Réclamation (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email reclami (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレームメール(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 이메일(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim e-mail (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email de Reclamação (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔邮箱(可选)" + } + } + } + }, + "documents_claim_information": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchsinformationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información de Reclamos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations de Réclamation" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni reclamo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレーム情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claiminformatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações de Reclamação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔信息" + } + } + } + }, + "documents_claim_phone": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchstelefon" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Phone" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Teléfono de Reclamos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléphone de Réclamation" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Telefono reclami" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレーム電話" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 전화" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim telefoon" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telefone de Reclamação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔电话" + } + } + } + }, + "documents_claim_phone_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchstelefon (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Phone (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Teléfono de Reclamos (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléphone de Réclamation (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Telefono reclami (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレーム電話(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 전화(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim telefoon (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telefone de Reclamação (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔电话(可选)" + } + } + } + }, + "documents_claim_website": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchs-Website" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Website" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sitio Web de Reclamos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Site Web de Réclamation" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sito web reclami" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレームウェブサイト" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 웹사이트" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim website" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Site de Reclamação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔网站" + } + } + } + }, + "documents_claim_website_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anspruchs-Website (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Claim Website (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sitio Web de Reclamos (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Site Web de Réclamation (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sito web reclami (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クレームウェブサイト(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "청구 웹사이트(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Claim website (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Site de Reclamação (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "理赔网站(可选)" + } + } + } + }, + "documents_contractor": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrepreneur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contratante" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商" + } + } + } + }, + "documents_contractor_phone": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmertelefon" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor Phone" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Teléfono del Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléphone de l'Entrepreneur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Telefono appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者電話" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 전화" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer telefoon" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telefone do Contratante" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商电话" + } + } + } + }, + "documents_created": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erstellt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Created" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Creado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Creato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "作成日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "생성일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aangemaakt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建时间" + } + } + } + }, + "documents_days_remaining": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Verbleibende Tage" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Days Remaining" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Días Restantes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Jours Restants" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Giorni rimanenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "残り日数" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "남은 일수" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dagen resterend" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Dias Restantes" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "剩余天数" + } + } + } + }, + "documents_days_remaining_count": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "%d Tage verbleibend" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "%d days remaining" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%d días restantes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%d jours restants" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%d giorni rimanenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "残り%d日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%d일 남음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d dagen resterend" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%d dias restantes" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "剩余%d天" + } + } + } + }, + "documents_delete_confirm_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sind Sie sicher, dass Sie dieses Dokument löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to delete this document? This action cannot be undone." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Está seguro de que desea eliminar este documento? Esta acción no se puede deshacer." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir supprimer ce document? Cette action ne peut pas être annulée." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sei sicuro di voler eliminare questo documento? Questa azione non può essere annullata." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このドキュメントを削除してもよろしいですか?この操作は取り消せません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 문서를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet u zeker dat u dit document wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja excluir este documento? Esta ação não pode ser desfeita." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您确定要删除此文档吗?此操作无法撤销。" + } + } + } + }, + "documents_delete_document": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument Löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer le Document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除文档" + } + } + } + }, + "documents_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beschreibung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Description" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Description" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Descrizione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "説明" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beschrijving" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Descrição" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "描述" + } + } + } + }, + "documents_description_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beschreibung (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Description (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Description (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Descrizione (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "説明(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beschrijving (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Descrição (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "描述(可选)" + } + } + } + }, + "documents_document_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumentdetails" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Document Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles del Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails du Document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 상세정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documentgegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes do Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档详情" + } + } + } + }, + "documents_document_id_missing": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument-ID fehlt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Document ID is missing" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Falta el ID del documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'ID du document est manquant" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "ID documento mancante" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントIDがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 ID가 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document-ID ontbreekt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "ID do documento está faltando" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档ID缺失" + } + } + } + }, + "documents_document_type": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumenttyp" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Document Type" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type de Document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントタイプ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenttype" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档类型" + } + } + } + }, + "documents_document_type_cannot_change": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumenttyp kann nicht geändert werden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Document type cannot be changed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El tipo de documento no se puede cambiar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le type de document ne peut pas être modifié" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tipo di documento non può essere modificato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントタイプは変更できません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 유형을 변경할 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenttype kan niet worden gewijzigd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O tipo de documento não pode ser alterado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法更改文档类型" + } + } + } + }, + "documents_documents": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Documents" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Documents" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Documenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメント" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documentos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档" + } + } + } + }, + "documents_download_file": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Datei Herunterladen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Download File" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descargar Archivo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Télécharger le Fichier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scarica file" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルをダウンロード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일 다운로드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bestand downloaden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Baixar Arquivo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "下载文件" + } + } + } + }, + "documents_edit_document": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument Bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier le Document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑文档" + } + } + } + }, + "documents_edit_warranty": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantie Bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Warranty" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証を編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantie bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑保修" + } + } + } + }, + "documents_empty_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Speichern Sie wichtige Dokumente und Garantien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Store important documents and warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Guarda documentos importantes y garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Stockez vos documents importants et garanties" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salva documenti importanti come garanzie, manuali e ricevute" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証書、マニュアル、領収書などの重要なドキュメントを保存" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증서, 매뉴얼, 영수증 등 중요한 문서를 저장하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bewaar belangrijke documenten zoals garanties, handleidingen en bonnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Guarde documentos importantes e garantias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存重要文件,如保修、手册和收据" + } + } + } + }, + "documents_empty_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Dokumente" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No documents yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun documento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen documenten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem documentos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无文档" + } + } + } + }, + "documents_end_date": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantieende (JJJJ-MM-TT)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty End Date (YYYY-MM-DD)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fecha de Fin de Garantía (AAAA-MM-DD)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Date de Fin de Garantie (AAAA-MM-JJ)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Data fine garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証終了日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 종료일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Einddatum garantie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Data de Término da Garantia (AAAA-MM-DD)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修结束日期" + } + } + } + }, + "documents_existing_photos": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorhandene Fotos" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Existing Photos" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fotos Existentes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photos Existantes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto esistenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "既存の写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기존 사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bestaande foto's" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fotos Existentes" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "现有照片" + } + } + } + }, + "documents_expired": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgelaufen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Expired" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Vencido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Expiré" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scaduto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限切れ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verlopen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Expirado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已过期" + } + } + } + }, + "documents_expires": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Läuft Ab" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Expires" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Vence" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Expire" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scade" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verloopt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Expira" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "过期" + } + } + } + }, + "documents_expiring_soon": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Läuft Bald Ab" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Expiring Soon" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Vence Pronto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Expire Bientôt" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "In scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "まもなく期限切れ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "곧 만료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verloopt binnenkort" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Expirando em Breve" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "即将过期" + } + } + } + }, + "documents_failed_to_create": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler beim Erstellen des Dokuments" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al crear el documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Creazione documento fallita" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの作成に失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 생성 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document aanmaken mislukt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar o documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建文档失败" + } + } + } + }, + "documents_failed_to_update": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler beim Aktualisieren des Dokuments" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update document" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al actualizar el documento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour du document" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiornamento documento fallito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの更新に失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 업데이트 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document bijwerken mislukt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar o documento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新文档失败" + } + } + } + }, + "documents_file_size": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dateigröße" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "File Size" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tamaño del Archivo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Taille du Fichier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dimensione file" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルサイズ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일 크기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bestandsgrootte" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tamanho do Arquivo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文件大小" + } + } + } + }, + "documents_file_type": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dateityp" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "File Type" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Archivo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type de Fichier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo file" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルタイプ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bestandstype" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Arquivo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文件类型" + } + } + } + }, + "documents_fill_required_fields": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte füllen Sie alle erforderlichen Felder aus" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Please fill in all required fields" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Por favor complete todos los campos obligatorios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez remplir tous les champs requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Compila tutti i campi obbligatori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須項目をすべて入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 필수 필드를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vul alle verplichte velden in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Por favor, preencha todos os campos obrigatórios" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "请填写所有必填字段" + } + } + } + }, + "documents_images": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bilder" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Images" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Imágenes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Images" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immagini" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Afbeeldingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imagens" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "图片" + } + } + } + }, + "documents_important_dates": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wichtige Daten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Important Dates" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fechas Importantes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dates Importantes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Date importanti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "重要な日付" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "중요한 날짜" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Belangrijke datums" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Datas Importantes" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重要日期" + } + } + } + }, + "documents_inactive": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Inaktiv" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Inactive" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Inactivo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inactif" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inattivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "非アクティブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비활성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inactief" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Inativo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "非活跃" + } + } + } + }, + "documents_item_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Artikeldetails" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Item Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles del Artículo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails de l'Article" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli articolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アイテム詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "항목 상세정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Itemgegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes do Item" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "物品详情" + } + } + } + }, + "documents_item_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Artikelname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Item Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre del Artículo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom de l'Article" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome articolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アイテム名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "항목 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Itemnaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome do Item" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "物品名称" + } + } + } + }, + "documents_item_name_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Artikelname ist für Garantien erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Item name is required for warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El nombre del artículo es obligatorio para garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le nom de l'article est requis pour les garanties" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il nome articolo è obbligatorio per le garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証にはアイテム名が必要です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증에는 항목 이름이 필요합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Itemnaam is verplicht voor garanties" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O nome do item é obrigatório para garantias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修需要物品名称" + } + } + } + }, + "documents_loading_document": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument wird geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading document..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando documento..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement du document..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento documento..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando documento..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载文档中..." + } + } + } + }, + "documents_metadata": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Metadaten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Metadata" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Metadatos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Métadonnées" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Metadati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メタデータ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메타데이터" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Metadata" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Metadados" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "元数据" + } + } + } + }, + "documents_model_number": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Modellnummer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Model Number" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Número de Modelo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Numéro de Modèle" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Numero modello" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "型番" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모델 번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Modelnummer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Número do Modelo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "型号" + } + } + } + }, + "documents_model_number_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Modellnummer (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Model Number (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Número de Modelo (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Numéro de Modèle (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Numero modello (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "型番(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모델 번호(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Modelnummer (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Número do Modelo (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "型号(可选)" + } + } + } + }, + "documents_na": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "k.A." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "N/A" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "N/A" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "N/A" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "N/D" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "N/A" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "해당 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "N.v.t." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "N/D" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "N/A" + } + } + } + }, + "documents_no_documents_found": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Dokumente gefunden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No documents found" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun document trouvé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun documento trovato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントが見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 찾을 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen documenten gevonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum documento encontrado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到文档" + } + } + } + }, + "documents_no_documents_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie Dokumente zu Ihrer Residenz hinzu" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add documents related to your residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregue documentos relacionados con su residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez des documents liés à votre résidence" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi documenti relativi alla tua proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件に関連するドキュメントを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산과 관련된 문서를 추가하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg documenten toe gerelateerd aan uw eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione documentos relacionados à sua residência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加与您房产相关的文档" + } + } + } + }, + "documents_no_residence_selected": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Residenz ausgewählt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No residence selected" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se seleccionó ninguna residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune résidence sélectionnée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna proprietà selezionata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件が選択されていません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산이 선택되지 않았습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen eigendom geselecteerd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma residência selecionada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未选择房产" + } + } + } + }, + "documents_no_warranties_found": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Garantien gefunden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No warranties found" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune garantie trouvée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna garanzia trovata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証が見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증을 찾을 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen garanties gevonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma garantia encontrada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到保修" + } + } + } + }, + "documents_no_warranties_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie Garantien hinzu, um Deckungszeiträume zu verfolgen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add warranties to track coverage periods" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregue garantías para rastrear períodos de cobertura" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez des garanties pour suivre les périodes de couverture" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi garanzie per tracciare i periodi di copertura" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証を追加して保証期間を追跡" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 기간을 추적하려면 보증을 추가하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg garanties toe om dekkingsperiodes bij te houden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione garantias para rastrear períodos de cobertura" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加保修以跟踪保修期" + } + } + } + }, + "documents_none": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "None" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ninguno" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "なし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无" + } + } + } + }, + "documents_notes": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注" + } + } + } + }, + "documents_notes_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note (opzionali)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注(可选)" + } + } + } + }, + "documents_photos": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Photos" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto's" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片" + } + } + } + }, + "documents_photos_selected": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "%d Foto(s) ausgewählt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "%d photo(s) selected" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "%d foto(s) seleccionada(s)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "%d photo(s) sélectionnée(s)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "%d foto selezionate" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%d枚の写真を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 %d장 선택됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d foto('s) geselecteerd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "%d foto(s) selecionada(s)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已选择%d张照片" + } + } + } + }, + "documents_property": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "documents_property_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie ist erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property is required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad es obligatoria" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété est requise" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La proprietà è obbligatoria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件は必須です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산은 필수입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom is verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade é obrigatória" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产为必填项" + } + } + } + }, + "documents_provider": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anbieter" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Provider" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Proveedor" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fournisseur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Fornitore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロバイダー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Leverancier" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fornecedor" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "供应商" + } + } + } + }, + "documents_provider_company": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anbieter/Firma" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Provider/Company" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Proveedor/Empresa" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fournisseur/Entreprise" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Fornitore/Azienda" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロバイダー/会社" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공자/회사" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Leverancier/Bedrijf" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fornecedor/Empresa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "供应商/公司" + } + } + } + }, + "documents_provider_contact": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anbieterkontakt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Provider Contact" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contacto del Proveedor" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contact du Fournisseur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contatto fornitore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロバイダー連絡先" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공자 연락처" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contact leverancier" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contato do Fornecedor" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "供应商联系方式" + } + } + } + }, + "documents_provider_contact_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anbieterkontakt (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Provider Contact (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contacto del Proveedor (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contact du Fournisseur (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contatto fornitore (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロバイダー連絡先(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제공자 연락처(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contact leverancier (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contato do Fornecedor (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "供应商联系方式(可选)" + } + } + } + }, + "documents_provider_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Anbieter ist für Garantien erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Provider is required for warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El proveedor es obligatorio para garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le fournisseur est requis pour les garanties" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il fornitore è obbligatorio per le garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証にはプロバイダーが必要です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증에는 제공자가 필요합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Leverancier is verplicht voor garanties" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O fornecedor é obrigatório para garantias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修需要供应商" + } + } + } + }, + "documents_purchase_date": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kaufdatum (JJJJ-MM-TT)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase Date (YYYY-MM-DD)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fecha de Compra (AAAA-MM-DD)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Date d'Achat (AAAA-MM-JJ)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Data acquisto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankoopdatum" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Data de Compra (AAAA-MM-DD)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买日期" + } + } + } + }, + "documents_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填" + } + } + } + }, + "documents_required_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich: Titel" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required: Title" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido: Título" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis: Titre" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio: Titolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須:タイトル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수: 제목" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht: Titel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório: Título" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填:标题" + } + } + } + }, + "documents_required_warranty_fields": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich für Garantien: Artikelname und Anbieter" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required for warranties: Item Name and Provider" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido para garantías: Nombre del Artículo y Proveedor" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis pour les garanties: Nom de l'Article et Fournisseur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio per garanzie: Nome articolo e Fornitore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証に必須:アイテム名とプロバイダー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 필수: 항목 이름 및 제공자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht voor garanties: Itemnaam en Leverancier" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório para garantias: Nome do Item e Fornecedor" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修必填:物品名称和供应商" + } + } + } + }, + "documents_residence": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Residenz" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résidence" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "documents_search_placeholder": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Suchen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Search..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca documenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントを検索" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 검색" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten zoeken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pesquisar..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "搜索文档" + } + } + } + }, + "documents_select_from_library": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aus Bibliothek Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select from Library" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar de la Biblioteca" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner depuis la Bibliothèque" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona dalla libreria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ライブラリから選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "라이브러리에서 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer uit bibliotheek" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar da Biblioteca" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "从相册选择" + } + } + } + }, + "documents_select_property": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner une Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择房产" + } + } + } + }, + "documents_serial_number": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Seriennummer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Serial Number" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Número de Serie" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Numéro de Série" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Numero di serie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "シリアル番号" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일련 번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Serienummer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Número de Série" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "序列号" + } + } + } + }, + "documents_serial_number_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Seriennummer (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Serial Number (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Número de Serie (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Numéro de Série (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Numero di serie (opzionale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "シリアル番号(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일련 번호(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Serienummer (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Número de Série (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "序列号(可选)" + } + } + } + }, + "documents_start_date": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantiebeginn (JJJJ-MM-TT)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty Start Date (YYYY-MM-DD)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fecha de Inicio de Garantía (AAAA-MM-DD)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Date de Début de Garantie (AAAA-MM-JJ)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Data inizio garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証開始日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 시작일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Startdatum garantie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Data de Início da Garantia (AAAA-MM-DD)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修开始日期" + } + } + } + }, + "documents_status": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Statut" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ステータス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "状态" + } + } + } + }, + "documents_tags": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tags" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tags" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Etiquetas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Étiquettes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tag" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タグ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "태그" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tags" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Etiquetas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标签" + } + } + } + }, + "documents_tags_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tags (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tags (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Etiquetas (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Étiquettes (facultatif)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tag (opzionali)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タグ(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "태그(선택사항)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tags (optioneel)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Etiquetas (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标签(可选)" + } + } + } + }, + "documents_take_photo": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto Aufnehmen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Take Photo" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tomar Foto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prendre une Photo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scatta foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真を撮る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 찍기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto maken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tirar Foto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "拍照" + } + } + } + }, + "documents_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Documents" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Documents" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Documenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメント" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documentos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档" + } + } + } + }, + "documents_title_field": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Titel" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Title" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Título" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Titre" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Titolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Título" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题" + } + } + } + }, + "documents_title_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Titel ist erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Title is required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El título es obligatorio" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le titre est requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il titolo è obbligatorio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトルは必須です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목은 필수입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel is verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O título é obrigatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题为必填项" + } + } + } + }, + "documents_type_contract": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Vertrag" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contract" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contrato" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contrat" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contratto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "契約" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contract" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contrato" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "合同" + } + } + } + }, + "documents_type_deed": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Urkunde" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Deed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Escritura" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Acte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Atto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "証書" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "증서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Akte" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escritura" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "契约" + } + } + } + }, + "documents_type_inspection": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Inspektion" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Inspection" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Inspección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inspection" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ispezione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "検査" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "검사" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inspectie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Inspeção" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "检查" + } + } + } + }, + "documents_type_insurance": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Versicherung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Insurance" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seguro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Assurance" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Assicurazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保険" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보험" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verzekering" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seguro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保险" + } + } + } + }, + "documents_type_manual": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Handbuch" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Manual" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Manual" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Manuel" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Manuale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "マニュアル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "매뉴얼" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Handleiding" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Manual" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "手册" + } + } + } + }, + "documents_type_other": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Andere" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Other" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Otro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Autre" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Altro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "その他" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기타" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Overig" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Outro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他" + } + } + } + }, + "documents_type_permit": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Genehmigung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Permit" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Permiso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Permis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Permesso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "許可証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "허가서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vergunning" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Permissão" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "许可证" + } + } + } + }, + "documents_type_photo": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Photo" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片" + } + } + } + }, + "documents_type_receipt": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Quittung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Receipt" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Reçu" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevuta" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "領収書" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "영수증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bon" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recibo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "收据" + } + } + } + }, + "documents_type_unknown": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbekannt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Unknown" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Desconocido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inconnu" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sconosciuto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "不明" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알 수 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbekend" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desconhecido" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未知" + } + } + } + }, + "documents_type_warranty": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修" + } + } + } + }, + "documents_update": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktualisieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Update" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Actualizar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mettre à Jour" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiorna" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "更新" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업데이트" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijwerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atualizar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新" + } + } + } + }, + "documents_updated": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktualisiert" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Updated" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Actualizado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mis à Jour" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiornato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "更新済み" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업데이트됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bijgewerkt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atualizado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已更新" + } + } + } + }, + "documents_uploaded_by": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Hochgeladen Von" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Uploaded By" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Subido Por" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléchargé Par" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricato da" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップロード者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업로드한 사람" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geüpload door" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviado Por" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "上传者" + } + } + } + }, + "documents_warranties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Garanties" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garanties" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garantias" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修" + } + } + } + }, + "documents_warranty_claims": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantieansprüche" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty Claims" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Reclamos de Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réclamations de Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reclami garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証クレーム" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 청구" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantieclaims" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Reclamações de Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修理赔" + } + } + } + }, + "documents_warranty_dates": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantiedaten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty Dates" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fechas de Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dates de Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Date garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証日" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 날짜" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantiedata" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Datas de Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修日期" + } + } + } + }, + "documents_warranty_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantiedetails" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles de la Garantía" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails de la Garantie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli garanzia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証の詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 상세정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantiegegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes da Garantia" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修详情" + } + } + } + }, + "Don't worry, nothing's written in stone here.\nYou can always change it later in the app.": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "No te preocupes, aquí nada es definitivo.\nSiempre puedes cambiarlo más tarde en la app." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pas d'inquiétude, rien n'est définitif ici.\nVous pourrez toujours le modifier plus tard dans l'application." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Sorge, nichts ist in Stein gemeißelt.\nDu kannst es später jederzeit in der App ändern." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não se preocupe, nada é definitivo aqui.\nVocê pode mudar depois no app." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non preoccuparti, nulla è definitivo qui.\nPuoi sempre modificarlo in seguito nell'app." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ご安心ください、ここでの内容は確定ではありません。\nアプリ内で後からいつでも変更できます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "걱정 마세요, 확정된 건 없어요.\n나중에 앱에서 언제든 변경할 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Maak je geen zorgen, niets ligt hier vast.\nJe kunt het later altijd in de app wijzigen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "别担心,这些都不是一成不变的。\n稍后随时可在应用中更改。" + } + } + } + }, + "Done": { + "comment": "A button that dismisses an image viewer sheet.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Listo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fertig" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Fatto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Klaar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成" + } + } + } + }, + "Double tap to %@ completions": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para %@ finalizaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour %@ les réalisations" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um Abschlüsse zu %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para %@ conclusões" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per %@ i completamenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで完了を%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 완료 %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om voltooiingen te %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以 %@ 完成记录" + } + } + } + }, + "Double tap to archive this task": { + "comment": "A hint for the user to double tap a task to archive it.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para archivar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour archiver cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe zu archivieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para arquivar esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per archiviare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクをアーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak te archiveren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以归档此任务" + } + } + } + }, + "Double tap to cancel this task": { + "comment": "A hint for the user to double tap a task to cancel it.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para cancelar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour annuler cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe abzubrechen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para cancelar esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per annullare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクをキャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak te annuleren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以取消此任务" + } + } + } + }, + "Double tap to complete this task": { + "comment": "A hint for the user to double tap a task to complete it.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para completar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour terminer cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe abzuschließen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para concluir esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per completare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクを完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak te voltooien" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以完成此任务" + } + } + } + }, + "Double tap to continue to the next step": { + "comment": "A hint that describes the action to be taken.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para continuar al siguiente paso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour passer à l'étape suivante" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um zum nächsten Schritt zu gehen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para ir à próxima etapa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per passare al passaggio successivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで次のステップへ進む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 다음 단계로 이동" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om door te gaan naar de volgende stap" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以继续下一步" + } + } + } + }, + "Double tap to create account": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para crear una cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour créer un compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um ein Konto zu erstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para criar conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per creare un account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでアカウントを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 계정 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om een account aan te maken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以创建账户" + } + } + } + }, + "Double tap to edit this task": { + "comment": "A hint for the user to double tap a task to edit it.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para editar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour modifier cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe zu bearbeiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para editar esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per modificare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak te bewerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以编辑此任务" + } + } + } + }, + "Double tap to join an existing property with a share code": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para unirte a una propiedad existente con un código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour rejoindre un logement existant avec un code de partage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um mit einem Freigabecode einer Immobilie beizutreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para entrar em uma propriedade com um código de compartilhamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per unirti a un immobile esistente con un codice di condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで共有コードを使って既存の物件に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 공유 코드로 기존 자산에 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om met een deelcode aan een bestaande woning deel te nemen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以用共享码加入现有房产" + } + } + } + }, + "Double tap to log in to your existing account": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para iniciar sesión en tu cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour vous connecter à votre compte existant" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um dich bei deinem Konto anzumelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para entrar na sua conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per accedere al tuo account esistente" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで既存のアカウントにログイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 기존 계정에 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om in te loggen op je bestaande account" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以登录现有账户" + } + } + } + }, + "Double tap to mark this task as in progress": { + "comment": "A hint for the user to double tap a task to mark it as in progress.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para marcar esta tarea como en progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour marquer cette tâche comme en cours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe als in Bearbeitung zu markieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para marcar esta tarefa como em andamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per contrassegnare questa attività come in corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクを進行中にする" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업을 진행 중으로 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak als in uitvoering te markeren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以将此任务标记为进行中" + } + } + } + }, + "Double tap to restore this task": { + "comment": "A hint for the user to double tap a task to restore it.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para restaurar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour restaurer cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe wiederherzustellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para restaurar esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per ripristinare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクを復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak te herstellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以恢复此任务" + } + } + } + }, + "Double tap to send a verification code to your email": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para enviar un código de verificación a tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour envoyer un code de vérification à votre e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um einen Bestätigungscode an deine E-Mail zu senden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para enviar um código de verificação ao seu e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per inviare un codice di verifica alla tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで認証コードをメールに送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이메일로 인증 코드 전송" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om een verificatiecode naar je e-mail te sturen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以将验证码发送至您的邮箱" + } + } + } + }, + "Double tap to sign in": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para iniciar sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour vous connecter" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um dich anzumelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per accedere" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでサインイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om in te loggen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以登录" + } + } + } + }, + "Double tap to start setting up your property": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para empezar a configurar tu propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour commencer à configurer votre logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um deine Immobilie einzurichten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para começar a configurar sua propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per iniziare a configurare il tuo immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで物件の設定を開始" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 자산 설정 시작" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om je woning in te stellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以开始设置您的房产" + } + } + } + }, + "Double tap to unarchive this task": { + "comment": "A hint for unarchive task buttons.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para desarchivar esta tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour désarchiver cette tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Aufgabe aus dem Archiv zu holen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para desarquivar esta tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per ripristinare questa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのタスクをアーカイブ解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 작업 보관 해제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om deze taak terug te halen uit archief" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以取消归档此任务" + } + } + } + }, + "Double tap to use this template": { + "comment": "A hint for using a task template.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para usar esta plantilla" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez deux fois pour utiliser ce modèle" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um diese Vorlage zu verwenden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para usar este modelo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per usare questo modello" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップでこのテンプレートを使用" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 이 템플릿 사용" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om dit sjabloon te gebruiken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以使用此模板" + } + } + } + }, + "Downloading...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Descargando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Téléchargement..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird heruntergeladen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Baixando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Download in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダウンロード中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다운로드 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Downloaden..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在下载…" + } + } + } + }, + "Easy Share": { + "comment": "A section header for the \"Easy Share\" feature on the Share Code Card.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir fácil" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partage facile" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Einfaches Teilen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhamento fácil" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condivisione semplice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "かんたん共有" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "간편 공유" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eenvoudig delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "轻松共享" + } + } + } + }, + "Edit": { + "comment": "A label for an edit action.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bearbeiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bewerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑" + } + } + } + }, + "Edit property": { + "comment": "A label for the edit button in the residences list.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier le logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie bearbeiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning bewerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑房产" + } + } + } + }, + "Edit task": { + "comment": "A label for a button that edits a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe bearbeiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak bewerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑任务" + } + } + } + }, + "Edit Task": { + "comment": "A label for an \"Edit Task\" button.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe bearbeiten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak bewerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑任务" + } + } + } + }, + "EMAIL": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "CORREO" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "E-MAIL" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-MAIL" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "E-MAIL" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "EMAIL" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-MAIL" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮箱" + } + } + } + }, + "Email Address": { + "comment": "A label for the user to input their email address.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail-Adresse" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço de e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indirizzo email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mailadres" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮箱地址" + } + } + } + }, + "Enter 6-character share code": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de 6 caracteres" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code de partage à 6 caractères" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "6-stelligen Freigabecode eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de 6 caracteres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice di condivisione a 6 caratteri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6文字の共有コードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "6자리 공유 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer 6-cijferige deelcode in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入 6 位共享码" + } + } + } + }, + "Enter 6-digit code": { + "comment": "A placeholder text for a text field where a user can enter a 6-digit code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de 6 dígitos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code à 6 chiffres" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "6-stelligen Code eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de 6 dígitos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice a 6 cifre" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6桁のコードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "6자리 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer 6-cijferige code in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入 6 位验证码" + } + } + } + }, + "Enter 6-digit verification code": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de verificación de 6 dígitos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code de vérification à 6 chiffres" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "6-stelligen Bestätigungscode eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de verificação de 6 dígitos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice di verifica a 6 cifre" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6桁の認証コードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "6자리 인증 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer 6-cijferige verificatiecode in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入 6 位验证码" + } + } + } + }, + "Enter 6-digit verification code from your email": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de verificación de 6 dígitos de tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code de vérification à 6 chiffres reçu par e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "6-stelligen Bestätigungscode aus deiner E-Mail eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de verificação de 6 dígitos do seu e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice di verifica a 6 cifre dalla tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールに記載の6桁の認証コードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일의 6자리 인증 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de 6-cijferige verificatiecode uit je e-mail in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入邮箱中的 6 位验证码" + } + } + } + }, + "Enter a password with at least 8 characters": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce una contraseña de al menos 8 caracteres" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez un mot de passe d'au moins 8 caractères" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib ein Passwort mit mindestens 8 Zeichen ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite uma senha com pelo menos 8 caracteres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci una password di almeno 8 caratteri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "8文字以上のパスワードを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "8자 이상의 비밀번호를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer een wachtwoord van minimaal 8 tekens in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入至少 8 个字符的密码" + } + } + } + }, + "Enter a unique username": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce un nombre de usuario único" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez un nom d'utilisateur unique" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib einen eindeutigen Benutzernamen ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite um nome de usuário único" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci un nome utente univoco" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "一意のユーザー名を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "고유한 사용자 이름을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer een unieke gebruikersnaam in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入唯一的用户名" + } + } + } + }, + "Enter new password": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce la nueva contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le nouveau mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Passwort eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite a nova senha" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci la nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer nieuw wachtwoord in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入新密码" + } + } + } + }, + "Enter share code": { + "comment": "A placeholder text for the user to enter the share code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code de partage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de compartilhamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice di condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer deelcode in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入共享码" + } + } + } + }, + "Enter the 6-character code shared with you to join an existing home.": { + "comment": "A description under the code input field, instructing the user to enter the 6-character code shared with them to join a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de 6 caracteres que te compartieron para unirte a un hogar existente." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code à 6 caractères qui vous a été partagé pour rejoindre un logement existant." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib den 6-stelligen Code ein, der mit dir geteilt wurde, um einem Zuhause beizutreten." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de 6 caracteres compartilhado com você para entrar em uma casa existente." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice a 6 caratteri che ti è stato condiviso per unirti a una casa esistente." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有された6文字のコードを入力して既存の住居に参加します。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유받은 6자리 코드를 입력해 기존 집에 참여하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de 6-tekens code in die met je is gedeeld om aan een bestaande woning deel te nemen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入他人共享给您的 6 位代码以加入现有家庭。" + } + } + } + }, + "Enter the 6-digit code from your email": { + "comment": "A footer label explaining that users should enter the 6-digit code they received in their email.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el código de 6 dígitos de tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le code à 6 chiffres reçu par e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib den 6-stelligen Code aus deiner E-Mail ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o código de 6 dígitos do seu e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice a 6 cifre dalla tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールに記載の6桁のコードを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일의 6자리 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de 6-cijferige code uit je e-mail in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入邮箱中的 6 位代码" + } + } + } + }, + "Enter the name of your property": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el nombre de tu propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le nom de votre logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib den Namen deiner Immobilie ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o nome da sua propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il nome del tuo immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件の名前を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산 이름을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de naam van je woning in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您房产的名称" + } + } + } + }, + "Enter the number of days between each occurrence": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el número de días entre cada repetición" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez le nombre de jours entre chaque occurrence" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib die Anzahl der Tage zwischen den Wiederholungen ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o número de dias entre cada ocorrência" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il numero di giorni tra ogni ricorrenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "繰り返しの間隔(日数)を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "반복 간격(일수)을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer het aantal dagen tussen elke herhaling in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入每次间隔的天数" + } + } + } + }, + "Enter your account email address": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce el correo de tu cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez l'adresse e-mail de votre compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib die E-Mail-Adresse deines Kontos ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite o e-mail da sua conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci l'indirizzo email del tuo account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントのメールアドレスを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 이메일 주소를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer het e-mailadres van je account in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的账户邮箱地址" + } + } + } + }, + "Enter your email address": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tu correo electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre adresse e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deine E-Mail-Adresse ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu endereço de e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo indirizzo email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスを入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 주소를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je e-mailadres in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的邮箱地址" + } + } + } + }, + "Enter your email address and we'll send you a verification code": { + "comment": "A description below the email input field, instructing the user to enter their email address to receive a password reset code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tu correo y te enviaremos un código de verificación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre adresse e-mail et nous vous enverrons un code de vérification" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deine E-Mail-Adresse ein und wir senden dir einen Bestätigungscode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu e-mail e enviaremos um código de verificação" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo indirizzo email e ti invieremo un codice di verifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスを入力すると認証コードをお送りします" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 주소를 입력하시면 인증 코드를 보내드립니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je e-mailadres in en we sturen je een verificatiecode" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的邮箱地址,我们将发送验证码" + } + } + } + }, + "Enter your first name": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tu nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre prénom" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deinen Vornamen ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu nome" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je voornaam in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的名字" + } + } + } + }, + "Enter your last name": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tus apellidos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre nom" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deinen Nachnamen ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu sobrenome" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo cognome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "姓を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "성을 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je achternaam in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的姓氏" + } + } + } + }, + "Enter your ZIP code": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tu código postal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre code postal" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deine Postleitzahl ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu CEP" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo CAP" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "郵便番号を入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우편번호를 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je postcode in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的邮政编码" + } + } + } + }, + "Enter your ZIP code so we can suggest\nmaintenance tasks for your climate region.": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce tu código postal para sugerirte\ntareas de mantenimiento según tu clima." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Saisissez votre code postal pour que nous puissions suggérer\ndes tâches d'entretien adaptées à votre région." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deine Postleitzahl ein, damit wir\nWartungsaufgaben für deine Klimaregion vorschlagen können." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite seu CEP para sugerirmos\ntarefas de manutenção para o clima da sua região." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il tuo CAP così possiamo suggerire\nattività di manutenzione per la tua zona climatica." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お住まいの気候地域に合ったメンテナンスタスクを\n提案できるよう、郵便番号を入力してください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우편번호를 입력하시면 해당 지역 기후에 맞는\n관리 작업을 추천해 드립니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je postcode in zodat we onderhoudstaken\nvoor jouw klimaatregio kunnen voorstellen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入您的邮政编码,以便我们\n为您所在气候区推荐维护任务。" + } + } + } + }, + "Error": { + "comment": "The title of an alert that appears when there's an error.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "错误" + } + } + } + }, + "error_generic": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Something went wrong. Please try again." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Algo salió mal. Por favor intenta de nuevo." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur s'est produite. Veuillez réessayer." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore. Riprova." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラーが発生しました。もう一度お試しください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문제가 발생했습니다. 다시 시도해 주세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er is iets misgegaan. Probeer het opnieuw." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Algo deu errado. Por favor, tente novamente." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "出错了。请重试。" + } + } + } + }, + "error_network": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Netzwerkfehler. Überprüfen Sie Ihre Verbindung." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Network error. Please check your connection." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de red. Verifica tu conexión." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur réseau. Vérifiez votre connexion." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore di rete. Controlla la connessione." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ネットワークエラー。接続を確認してください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "네트워크 오류. 연결을 확인하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Netwerkfout. Controleer uw verbinding." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro de rede. Verifique sua conexão." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "网络错误。请检查您的连接。" + } + } + } + }, + "error_not_found": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nicht gefunden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Not found" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No encontrado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Non trouvé" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non trovato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "찾을 수 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Niet gevonden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não encontrado" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到" + } + } + } + }, + "error_required_field": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieses Feld ist erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "This field is required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Este campo es requerido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ce champ est requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo campo è obbligatorio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この項目は必須です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 필드는 필수입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dit veld is verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este campo é obrigatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "此字段为必填项" + } + } + } + }, + "error_unauthorized": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sitzung abgelaufen. Bitte melden Sie sich erneut an." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Session expired. Please log in again." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sesión expirada. Inicia sesión de nuevo." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Session expirée. Veuillez vous reconnecter." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non autorizzato. Effettua nuovamente l'accesso." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証されていません。再度ログインしてください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "권한이 없습니다. 다시 로그인하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Niet geautoriseerd. Log opnieuw in." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sessão expirada. Entre novamente." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未授权。请重新登录。" + } + } + } + }, + "Error: %@": { + "comment": "An error message displayed in the checkout view. The content of this message is determined by the `message` variable.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur : %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラー:%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "错误:%@" + } + } + } + }, + "Failed to load": { + "comment": "A message displayed when an image fails to load.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al cargar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Laden fehlgeschlagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento non riuscito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込みに失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "불러오지 못했습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden mislukt" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载失败" + } + } + } + }, + "Feature": { + "comment": "The header for a feature in the feature comparison table.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Función" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fonctionnalité" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Funktion" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recurso" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Funzione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "機能" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기능" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Functie" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "功能" + } + } + } + }, + "Filter by specialty": { + "comment": "A button that filters the list of contractors by specialty.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Filtrar por especialidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Filtrer par spécialité" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nach Fachgebiet filtern" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Filtrar por especialidade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Filtra per specializzazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "専門分野で絞り込む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "전문 분야로 필터" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Filter op specialiteit" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "按专长筛选" + } + } + } + }, + "Filter documents": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Filtrar documentos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Filtrer les documents" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente filtern" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Filtrar documentos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Filtra documenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類を絞り込む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 필터" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten filteren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "筛选文档" + } + } + } + }, + "Forgot Password?": { + "comment": "A title for the \"Forgot Password?\" screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Olvidaste tu contraseña?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe oublié ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort vergessen?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esqueceu a senha?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Password dimenticata?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをお忘れですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호를 잊으셨나요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord vergeten?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "忘记密码?" + } + } + } + }, + "Free": { + "comment": "A label indicating a free feature.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Gratis" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gratuit" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Free" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Grátis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Free" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gratis" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "免费版" + } + } + } + }, + "Free trial ends %@": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "La prueba gratis termina el %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'essai gratuit se termine le %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kostenlose Testphase endet %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Teste grátis termina em %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La prova gratuita termina il %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料トライアル終了日:%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료 체험 종료일 %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gratis proefperiode eindigt %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "免费试用于 %@ 结束" + } + } + } + }, + "Generate Code": { + "comment": "A button label that generates a new invitation code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer un code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code generieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを生成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드 생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code genereren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成代码" + } + } + } + }, + "Generate maintenance report": { + "comment": "A button that generates a maintenance report.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar informe de mantenimiento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer un rapport d'entretien" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wartungsbericht erstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar relatório de manutenção" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera rapporto di manutenzione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メンテナンスレポートを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "관리 보고서 생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onderhoudsrapport genereren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成维护报告" + } + } + } + }, + "Generate New Code": { + "comment": "A button label that appears when a user wants to generate a new invitation code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar código nuevo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer un nouveau code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neuen Code generieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar novo código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera nuovo codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいコードを生成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 코드 생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe code genereren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成新代码" + } + } + } + }, + "Generate new share code": { + "comment": "A button that generates a new share code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar código nuevo para compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer un nouveau code de partage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neuen Freigabecode generieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar novo código de compartilhamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera nuovo codice di condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しい共有コードを生成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 공유 코드 생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe deelcode genereren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成新共享码" + } + } + } + }, + "Get notified when someone joins your property": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando alguien se una a tu propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsqu'une personne rejoint votre logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn jemand deiner Immobilie beitritt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando alguém entrar na sua propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando qualcuno si unisce al tuo immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "誰かが物件に参加したときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "누군가 자산에 참여하면 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als iemand aan je woning deelneemt" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "有人加入您的房产时收到通知" + } + } + } + }, + "Get notified when tasks are assigned to you": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando se te asignen tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsque des tâches vous sont attribuées" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn dir Aufgaben zugewiesen werden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando tarefas forem atribuídas a você" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando ti vengono assegnate attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが自分に割り当てられたときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업이 배정되면 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als taken aan je worden toegewezen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务分配给您时收到通知" + } + } + } + }, + "Get notified when tasks are completed by others": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando otros completen tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsque des tâches sont terminées par d'autres" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn andere Aufgaben abschließen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando tarefas forem concluídas por outros" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando altri completano le attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "他の人がタスクを完了したときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 사람이 작업을 완료하면 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als taken door anderen worden voltooid" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "他人完成任务时收到通知" + } + } + } + }, + "Get notified when tasks are due soon": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando una tarea esté por vencer" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsque des tâches arrivent à échéance" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn Aufgaben bald fällig sind" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando tarefas estiverem perto do prazo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando le attività sono in scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの期限が近づいたときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 마감이 임박하면 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als taken binnenkort vervallen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务即将到期时收到通知" + } + } + } + }, + "Get notified when tasks are overdue": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando una tarea esté vencida" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsque des tâches sont en retard" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn Aufgaben überfällig sind" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando tarefas estiverem atrasadas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando le attività sono scadute" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが期限切れになったときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업이 기한을 넘기면 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als taken te laat zijn" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务逾期时收到通知" + } + } + } + }, + "Get notified when warranties are about to expire": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe avisos cuando una garantía esté por caducar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Soyez averti lorsque des garanties arrivent à expiration" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung, wenn Garantien bald ablaufen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba aviso quando garantias estiverem perto de expirar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi una notifica quando le garanzie stanno per scadere" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証の期限が近づいたときに通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증이 만료될 즈음 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een melding als garanties bijna verlopen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修即将到期时收到通知" + } + } + } + }, + "Go back": { + "comment": "A label for the back button.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Volver" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Torna indietro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "뒤로 가기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回" + } + } + } + }, + "Google Sign-In Error": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al iniciar sesión con Google" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur de connexion Google" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Google-Anmeldefehler" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro ao entrar com o Google" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore accesso con Google" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleサインインエラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google 로그인 오류" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout bij inloggen met Google" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "Google 登录错误" + } + } + } + }, + "Help improve honeyDue by sharing anonymous usage data": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ayuda a mejorar honeyDue compartiendo datos de uso anónimos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aidez à améliorer honeyDue en partageant des données d'utilisation anonymes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Hilf, honeyDue zu verbessern, indem du anonyme Nutzungsdaten teilst" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ajude a melhorar o honeyDue compartilhando dados de uso anônimos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aiuta a migliorare honeyDue condividendo dati di utilizzo anonimi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "匿名の利用データを共有してhoneyDueの改善にご協力ください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "익명 사용 데이터를 공유해 honeyDue 개선에 도움을 주세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Help honeyDue verbeteren door anonieme gebruiksgegevens te delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "分享匿名使用数据,助力改进 honeyDue" + } + } + } + }, + "Honeycomb Pattern": { + "comment": "A feature that adds a subtle hexagonal grid overlay to the app's interface.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Patrón de panal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Motif en nid d'abeille" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wabenmuster" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Padrão de favo de mel" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Motivo a nido d'ape" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ハニカム模様" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "벌집 패턴" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Honingraatpatroon" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "蜂巢图案" + } + } + } + }, + "honeyDue": { + "comment": "The name of the app.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + } + } + }, + "HONEYDUE PRO": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE 프로" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE PRO" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "HONEYDUE 专业版" + } + } + } + }, + "Hour": { + "comment": "A picker for selecting an hour.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Hora" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Heure" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Stunde" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Hora" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ora" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "時間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시간" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uur" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "小时" + } + } + } + }, + "I have a code to join": { + "comment": "A button label that instructs the user to join an existing honeyDue account.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tengo un código para unirme" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "J'ai un code pour rejoindre" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ich habe einen Code zum Beitreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tenho um código para entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ho un codice per unirmi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "参加用のコードを持っています" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "참여 코드가 있어요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ik heb een code om deel te nemen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我有加入代码" + } + } + } + }, + "I'm Ready!": { + "comment": "A button label that indicates the user is ready to use honeyDue.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Estoy listo!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Je suis prêt !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ich bin bereit!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estou pronto!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sono pronto!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "準備完了!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "준비됐어요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ik ben er klaar voor!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我准备好了!" + } + } + } + }, + "Image": { + "comment": "A label describing an image.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Imagen" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Image" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imagem" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immagine" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Afbeelding" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "图片" + } + } + } + }, + "Image %lld of %lld": { + "comment": "A navigation title that shows the current image index and the total number of images.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "new", + "value": "Image %1$lld of %2$lld" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Imagen %1$lld de %2$lld" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Image %1$lld sur %2$lld" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild %1$lld von %2$lld" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imagem %1$lld de %2$lld" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immagine %1$lld di %2$lld" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像 %1$lld / %2$lld" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지 %1$lld/%2$lld" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Afbeelding %1$lld van %2$lld" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "第 %1$lld 张,共 %2$lld 张" + } + } + } + }, + "Import": { + "comment": "The text on a button that triggers the import action.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Importar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Importer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Importieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Importar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Importa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "インポート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가져오기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Importeren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "导入" + } + } + } + }, + "Import Failed": { + "comment": "A dialog title when importing a contractor fails.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al importar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'importation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Import fehlgeschlagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na importação" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Importazione non riuscita" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "インポートに失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "가져오기 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Importeren mislukt" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "导入失败" + } + } + } + }, + "In Progress": { + "comment": "A label displayed next to an image of a play button, indicating that a task is currently in progress.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "En progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "En cours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "In Bearbeitung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Em andamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "In corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "進行中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "진행 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "In uitvoering" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "进行中" + } + } + } + }, + "Invite Others": { + "comment": "A header that suggests inviting others to join the app.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Invitar a otros" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Inviter d'autres personnes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Andere einladen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Convidar outros" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invita altri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "他の人を招待" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 사람 초대" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Anderen uitnodigen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邀请他人" + } + } + } + }, + "Join a property": { + "comment": "A button that opens a sheet for joining a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Unirse a una propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre un logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Einer Immobilie beitreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar em uma propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti a un immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산에 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen aan een woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入房产" + } + } + } + }, + "Join a Residence": { + "comment": "A button label that instructs the user to join an existing residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Unirse a una residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre un logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Einem Zuhause beitreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar em uma residência" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti a una residenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지에 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen aan een woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入住所" + } + } + } + }, + "Join Failed": { + "comment": "An alert title displayed when joining a residence fails.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al unirse" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'adhésion" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Beitritt fehlgeschlagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Adesione non riuscita" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "参加に失敗しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "참여 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen mislukt" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入失败" + } + } + } + }, + "Join honeyDue": { + "comment": "A title for the registration screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Únete a honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre honeyDue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue beitreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar no honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti a honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueに参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 가입" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Word lid van honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入 honeyDue" + } + } + } + }, + "Join Residence": { + "comment": "A button label that allows a user to join an existing residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Unirse a la residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre le logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuhause beitreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar na residência" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti alla residenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen aan woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入住所" + } + } + } + }, + "Joined Residence": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Te uniste a la residencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement rejoint" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuhause beigetreten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrou na residência" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unito alla residenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 참여 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelgenomen aan woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已加入住所" + } + } + } + }, + "Joining residence...": { + "comment": "A message displayed while waiting for the app to join a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Uniéndose a la residencia..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adhésion au logement..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuhause wird beigetreten..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando na residência..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Adesione alla residenza..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 참여 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen aan woning..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在加入住所…" + } + } + } + }, + "Joining...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Uniéndose..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adhésion..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Beitreten..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Adesione..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "参加中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "참여 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在加入…" + } + } + } + }, + "Let's get you started with some tasks.\nThe more you pick, the more we'll help you remember!": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Empecemos con algunas tareas.\n¡Cuantas más elijas, más te ayudaremos a recordar!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Commençons avec quelques tâches.\nPlus vous en choisissez, plus nous vous aiderons à vous en souvenir !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Starten wir mit ein paar Aufgaben.\nJe mehr du auswählst, desto besser erinnern wir dich!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Vamos começar com algumas tarefas.\nQuanto mais você escolher, mais ajudaremos você a lembrar!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Iniziamo con alcune attività.\nPiù ne scegli, più ti aiuteremo a ricordarle!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "いくつかのタスクから始めましょう。\n選ぶほど、リマインドのお手伝いができます!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "몇 가지 작업으로 시작해 봐요.\n많이 고를수록 더 잘 기억하도록 도와드려요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laten we je op weg helpen met enkele taken.\nHoe meer je kiest, hoe meer we je helpen herinneren!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们先从一些任务开始吧。\n选得越多,我们越能帮您记住!" + } + } + } + }, + "Let's give your place a name!": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Ponle un nombre a tu hogar!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Donnons un nom à votre logement !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib deinem Zuhause einen Namen!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Vamos dar um nome ao seu lugar!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Diamo un nome alla tua casa!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの住まいに名前を付けましょう!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집에 이름을 지어 봐요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laten we je woning een naam geven!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "给您的住所起个名字吧!" + } + } + } + }, + "Loading": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird geladen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込み中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "불러오는 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载中" + } + } + } + }, + "Loading...": { + "comment": "A placeholder text indicating that content is loading.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird geladen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "불러오는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载中…" + } + } + } + }, + "Log in": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录" + } + } + } + }, + "Logging in...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciando sesión..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung läuft..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログイン中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在登录…" + } + } + } + }, + "Manage at honeyDue.treytartt.com": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestiona en honeyDue.treytartt.com" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérez sur honeyDue.treytartt.com" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalten unter honeyDue.treytartt.com" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerencie em honeyDue.treytartt.com" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci su honeyDue.treytartt.com" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com で管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com에서 관리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheren op honeyDue.treytartt.com" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在 honeyDue.treytartt.com 管理" + } + } + } + }, + "Manage users": { + "comment": "A button that opens a sheet for managing users in a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestionar usuarios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérer les utilisateurs" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nutzer verwalten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerenciar usuários" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci utenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 관리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikers beheren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "管理用户" + } + } + } + }, + "Manage your subscription at honeyDue.treytartt.com": { + "comment": "A description of how to manage a subscription on a third-party platform.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestiona tu suscripción en honeyDue.treytartt.com" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérez votre abonnement sur honeyDue.treytartt.com" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalte dein Abo unter honeyDue.treytartt.com" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerencie sua assinatura em honeyDue.treytartt.com" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci il tuo abbonamento su honeyDue.treytartt.com" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com でサブスクリプションを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com에서 구독을 관리하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheer je abonnement op honeyDue.treytartt.com" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在 honeyDue.treytartt.com 管理您的订阅" + } + } + } + }, + "Manage your subscription on your Android device": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestiona tu suscripción en tu dispositivo Android" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérez votre abonnement sur votre appareil Android" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalte dein Abo auf deinem Android-Gerät" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerencie sua assinatura no seu dispositivo Android" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci il tuo abbonamento sul tuo dispositivo Android" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Androidデバイスでサブスクリプションを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Android 기기에서 구독을 관리하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheer je abonnement op je Android-apparaat" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在您的 Android 设备上管理订阅" + } + } + } + }, + "Mark as in progress": { + "comment": "A hint for the user to mark a task as in progress.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Marcar como en progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Marquer comme en cours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Als in Bearbeitung markieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Marcar como em andamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contrassegna come in corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "進行中にする" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "진행 중으로 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Als in uitvoering markeren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标记为进行中" + } + } + } + }, + "Mark Task In Progress": { + "comment": "A button label that says \"Mark Task In Progress\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Marcar tarea en progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Marquer la tâche en cours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe als in Bearbeitung markieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Marcar tarefa como em andamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contrassegna come in corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを進行中にする" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 진행 중으로 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak als in uitvoering markeren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将任务标记为进行中" + } + } + } + }, + "Need inspiration?": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Necesitas inspiración?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Besoin d'inspiration ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Brauchst du Inspiration?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Precisa de inspiração?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai bisogno di ispirazione?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アイデアが必要ですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "영감이 필요하세요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inspiratie nodig?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "需要灵感?" + } + } + } + }, + "NEW PASSWORD": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "NUEVA CONTRASEÑA" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "NOUVEAU MOT DE PASSE" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "NEUES PASSWORT" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "NOVA SENHA" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "NUOVA PASSWORD" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "NIEUW WACHTWOORD" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "新密码" + } + } + } + }, + "No active code": { + "comment": "A message indicating that a user does not have an active share code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin código activo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun code actif" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kein aktiver Code" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum código ativo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun codice attivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "有効なコードがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "활성 코드 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen actieve code" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无有效代码" + } + } + } + }, + "No personal data is collected. Analytics are fully anonymous.": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "No se recopilan datos personales. Las analíticas son totalmente anónimas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune donnée personnelle n'est collectée. Les statistiques sont entièrement anonymes." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Es werden keine personenbezogenen Daten erfasst. Die Analyse ist völlig anonym." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum dado pessoal é coletado. As análises são totalmente anônimas." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Non viene raccolto alcun dato personale. Le analisi sono completamente anonime." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "個人データは収集されません。分析は完全に匿名です。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인 데이터는 수집하지 않습니다. 분석은 완전히 익명입니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er worden geen persoonsgegevens verzameld. Analyses zijn volledig anoniem." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "不收集个人数据。分析完全匿名。" + } + } + } + }, + "No properties yet": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún no hay propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun logement pour l'instant" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch keine Immobilien" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma propriedade ainda" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ancora nessun immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "まだ物件がありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아직 자산이 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nog geen woningen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无房产" + } + } + } + }, + "No shared users": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin usuarios compartidos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun utilisateur partagé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine geteilten Nutzer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum usuário compartilhado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun utente condiviso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有ユーザーはいません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유된 사용자 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen gedeelde gebruikers" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无共享用户" + } + } + } + }, + "No Tasks": { + "comment": "A description displayed when there are no tasks to display in a column view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクなし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无任务" + } + } + } + }, + "No tasks yet": { + "comment": "A description displayed when a user has no tasks.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún no hay tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune tâche pour l'instant" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch keine Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma tarefa ainda" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ancora nessuna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "まだタスクがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아직 작업이 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nog geen taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无任务" + } + } + } + }, + "No Templates Available": { + "comment": "A message indicating that there are no task templates available.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay plantillas disponibles" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun modèle disponible" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Vorlagen verfügbar" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum modelo disponível" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun modello disponibile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "利用できるテンプレートがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용 가능한 템플릿 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen sjablonen beschikbaar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无可用模板" + } + } + } + }, + "No Templates Found": { + "comment": "A message displayed when no task templates match a search query.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron plantillas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun modèle trouvé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Vorlagen gefunden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum modelo encontrado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun modello trovato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートが見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿을 찾을 수 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen sjablonen gevonden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到模板" + } + } + } + }, + "None": { + "comment": "A button that clears the selection.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ninguno" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "なし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无" + } + } + } + }, + "not selected": { + "comment": "A label that describes the selection state of a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "no seleccionado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "non sélectionné" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "nicht ausgewählt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "não selecionado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "non selezionato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "未選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택 안 됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "niet geselecteerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未选择" + } + } + } + }, + "Notification Time": { + "comment": "The title of the sheet where a user can select the time for receiving notifications.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Hora de notificación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Heure de notification" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungszeit" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Horário das notificações" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Orario notifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知時刻" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 시간" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meldingstijd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "通知时间" + } + } + } + }, + "Notifications will be sent at %@ in your local timezone": { + "comment": "A label below the time picker, explaining that the notifications will be sent at the selected time in the user's local timezone.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Las notificaciones se enviarán a las %@ en tu zona horaria local." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les notifications seront envoyées à %@ dans votre fuseau horaire local." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungen werden um %@ in deiner lokalen Zeitzone gesendet." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "As notificações serão enviadas às %@ no seu fuso horário local." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le notifiche verranno inviate alle %@ nel tuo fuso orario locale." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知は現地時間の%@に送信されます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림은 현지 시간 %@에 전송됩니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meldingen worden om %@ in je lokale tijdzone verzonden." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "通知将按您当地时区在%@发送。" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notifications will be sent at %@ in your local timezone" + } + } + } + }, + "Notify at %@": { + "comment": "A row in the checkout view that lets the user change the time they want to be notified.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificar a las %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifier à %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigen um %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificar às %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifica alle %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@に通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@에 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Melden om %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在%@通知" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notify at %@" + } + } + } + }, + "OK": { + "comment": "A button that dismisses the success dialog.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "OK" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定" + } + } + } + }, + "Open %@ in Maps": { + "comment": "A label for the accessibility element that opens the address in Maps.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Abrir %@ en Mapas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ouvrir %@ dans Plans" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ in Karten öffnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Abrir %@ no Mapas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Apri %@ in Mappe" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ をマップで開く" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지도에서 %@ 열기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ openen in Kaarten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "在地图中打开 %@" + } + } + } + }, + "Open honeyDue.treytartt.com": { + "comment": "A button label that opens the user's subscription management page in a web browser.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Abrir honeyDue.treytartt.com" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ouvrir honeyDue.treytartt.com" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com öffnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Abrir honeyDue.treytartt.com" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Apri honeyDue.treytartt.com" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com を開く" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com 열기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue.treytartt.com openen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "打开 honeyDue.treytartt.com" + } + } + } + }, + "Opens email to contact support": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Abre el correo para contactar con soporte" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ouvre l'e-mail pour contacter le support" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Öffnet E-Mail, um den Support zu kontaktieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Abre o e-mail para contatar o suporte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Apre l'email per contattare l'assistenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サポートに連絡するメールを開きます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지원팀 연락 이메일 열기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opent e-mail om contact op te nemen met support" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "打开邮件以联系客服" + } + } + } + }, + "or": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "o" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "ou" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "oder" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "ou" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "oppure" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "または" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "또는" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "of" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "或" + } + } + } + }, + "Overview": { + "comment": "The title of the overview card.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Resumen" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aperçu" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Übersicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Visão geral" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Panoramica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "概要" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Overzicht" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "概览" + } + } + } + }, + "Owner": { + "comment": "A label indicating that a user is an owner of a residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Propietario" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriétaire" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Eigentümer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Proprietário" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietario" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "オーナー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "소유자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigenaar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有者" + } + } + } + }, + "PASSWORD REQUIREMENTS": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "REQUISITOS DE CONTRASEÑA" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "EXIGENCES DU MOT DE PASSE" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "PASSWORTANFORDERUNGEN" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "REQUISITOS DA SENHA" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "REQUISITI PASSWORD" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードの要件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 요건" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "WACHTWOORDVEREISTEN" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码要求" + } + } + } + }, + "Photo": { + "comment": "A title for a view that displays a single photo.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片" + } + } + } + }, + "Photo%@": { + "comment": "A label for a photo. The argument is the caption of the photo.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto%@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo%@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto%@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto%@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto%@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진%@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto%@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片%@" + } + } + } + }, + "Primary": { + "comment": "A label indicating that a residence is the user's primary residence.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Principal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Principal" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Primär" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Principal" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Principale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Primair" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "主要" + } + } + } + }, + "Primary property": { + "comment": "A label for the star icon.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad principal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement principal" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Primäre Immobilie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade principal" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immobile principale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メインの物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본 자산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Primaire woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "主要房产" + } + } + } + }, + "Privacy": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Privacidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Confidentialité" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Datenschutz" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Privacidade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Privacy" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プライバシー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Privacy" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "隐私" + } + } + } + }, + "Pro": { + "comment": "The title of the \"Pro\" plan in the feature comparison view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Pro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "专业版" + } + } + } + }, + "profile_account": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Account" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Compte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウント" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conta" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "账户" + } + } + } + }, + "profile_active_until": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aktiv bis" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Active until" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Activo hasta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actif jusqu'au" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attivo fino al" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "有効期限" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "유효 기간" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Actief tot" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ativo até" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "有效期至" + } + } + } + }, + "profile_app_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue" + } + } + } + }, + "profile_appearance": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erscheinungsbild" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Appearance" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Apariencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Apparence" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aspetto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "外観" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "외관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weergave" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aparência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "外观" + } + } + } + }, + "profile_benefit_actionable_notifications": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Actionable Notifications" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones accionables" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications interactives" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Umsetzbare Benachrichtigungen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações acionáveis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche interattive" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクション可能な通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 가능한 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bruikbare meldingen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "可操作通知" + } + } + } + }, + "profile_benefit_contractor_sharing": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor Sharing" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partage de prestataires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister teilen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhamento de prestadores" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condivisione tecnici" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の共有" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 공유" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemers delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商共享" + } + } + } + }, + "profile_benefit_document_vault": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Document & Warranty Storage" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Almacenamiento de documentos y garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Stockage de documents et garanties" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumenten- & Garantiespeicher" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Armazenamento de documentos e garantias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivio documenti e garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類・保証の保管" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 및 보증 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document- & garantieopslag" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档与保修存储" + } + } + } + }, + "profile_benefit_residence_sharing": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence Sharing" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir residencias" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partage de logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuhause teilen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhamento de residências" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condivisione residenze" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居の共有" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 공유" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woningen delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "住所共享" + } + } + } + }, + "profile_benefit_unlimited_properties": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlimited Properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedades ilimitadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logements illimités" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbegrenzte Immobilien" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedades ilimitadas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immobili illimitati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件数無制限" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한 자산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbeperkt woningen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无限房产" + } + } + } + }, + "profile_benefit_widgets": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Home Screen Widgets" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Widgets de pantalla de inicio" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Widgets d'écran d'accueil" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Homescreen-Widgets" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Widgets na tela inicial" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Widget per la schermata Home" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ホーム画面ウィジェット" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "홈 화면 위젯" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beginschermwidgets" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "主屏幕小组件" + } + } + } + }, + "profile_contact": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kontakt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contact" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contacto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contact" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contatto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "連絡先" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "연락처" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contact" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contato" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "联系方式" + } + } + } + }, + "profile_contact_support": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contact Support" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contactar con soporte" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contacter le support" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Support kontaktieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contatar suporte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contatta l'assistenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サポートに連絡" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지원팀 문의" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contact met support" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "联系客服" + } + } + } + }, + "profile_contact_support_subtitle": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Get help with your account" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Obtén ayuda con tu cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Obtenez de l'aide pour votre compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Hilfe zu deinem Konto erhalten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obtenha ajuda com sua conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi aiuto per il tuo account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントに関するサポートを受ける" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 관련 도움 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Krijg hulp met je account" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "获取账户帮助" + } + } + } + }, + "profile_daily_digest": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tägliche Zusammenfassung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Daily Summary" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Resumen diario" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résumé quotidien" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riepilogo giornaliero" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "デイリーサマリー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일일 요약" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dagelijkse samenvatting" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Resumo diário" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "每日摘要" + } + } + } + }, + "profile_daily_digest_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tägliche Übersicht über fällige und überfällige Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Daily overview of tasks due and overdue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Resumen diario de tareas pendientes y vencidas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aperçu quotidien des tâches à faire et en retard" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Panoramica giornaliera delle attività in scadenza e scadute" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限が近いタスクと期限切れのタスクの毎日の概要" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "마감 예정 및 지연된 작업의 일일 개요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dagelijks overzicht van taken die binnenkort verlopen en achterstallig zijn" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Resumo diário de tarefas a vencer e atrasadas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "即将到期和逾期任务的每日概览" + } + } + } + }, + "profile_edit_profile": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Profile" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Perfil" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier le Profil" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica profilo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Profiel bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Perfil" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑资料" + } + } + } + }, + "profile_email": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo Electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件" + } + } + } + }, + "profile_email_notifications": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Email Notifications" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones por correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications par e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail-Benachrichtigungen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações por e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メール通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mailmeldingen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮件通知" + } + } + } + }, + "profile_email_required_unique": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail ist erforderlich und muss eindeutig sein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Email is required and must be unique" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El correo electrónico es obligatorio y debe ser único" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'email est requis et doit être unique" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email obbligatoria e univoca" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールは必須で一意である必要があります" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일은 필수이며 고유해야 합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail is verplicht en moet uniek zijn" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O email é obrigatório e deve ser único" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件必填且唯一" + } + } + } + }, + "profile_email_task_completed": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Completed Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo de tarea completada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "E-mail de tâche terminée" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail bei abgeschlossener Aufgabe" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "E-mail de tarefa concluída" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email attività completata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク完了メール" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료 이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail bij voltooide taak" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务完成邮件" + } + } + } + }, + "profile_email_task_completed_description": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Receive email when a task is completed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe un correo cuando se complete una tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Recevez un e-mail lorsqu'une tâche est terminée" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail erhalten, wenn eine Aufgabe abgeschlossen wird" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba um e-mail quando uma tarefa for concluída" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi un'email al completamento di un'attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク完了時にメールを受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업이 완료되면 이메일 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een e-mail wanneer een taak is voltooid" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务完成时接收邮件" + } + } + } + }, + "profile_first_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "First Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prénom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voornaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Primeiro Nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "名字" + } + } + } + }, + "profile_free_plan": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kostenloser Plan" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Free Plan" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Plan Gratuito" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plan Gratuit" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Piano gratuito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料プラン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료 플랜" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gratis abonnement" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Plano Gratuito" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "免费版" + } + } + } + }, + "profile_last_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Nachname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Last Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Apellido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom de famille" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cognome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "姓" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Achternaam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sobrenome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "姓氏" + } + } + } + }, + "profile_limited_features": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Eingeschränkte Funktionen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Limited features" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Funciones limitadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fonctionnalités limitées" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Funzionalità limitate" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "機能制限あり" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제한된 기능" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beperkte functies" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recursos limitados" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "功能有限" + } + } + } + }, + "profile_loading_profile": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil wird geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading profile..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando perfil..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement du profil..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento profilo..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필 로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Profiel laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando perfil..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载资料中..." + } + } + } + }, + "profile_logout": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abmelden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Log Out" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cerrar Sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se déconnecter" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esci" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログアウト" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그아웃" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitloggen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sair" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "退出登录" + } + } + } + }, + "profile_logout_confirm": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchten Sie sich wirklich abmelden?" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to log out?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres cerrar sesión?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir vous déconnecter ?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sei sicuro di voler uscire?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "本当にログアウトしますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "정말 로그아웃하시겠습니까?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet u zeker dat u wilt uitloggen?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza que deseja sair?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您确定要退出登录吗?" + } + } + } + }, + "profile_manage_subscription": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abonnement verwalten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Manage Subscription" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Administrar Suscripción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérer l'Abonnement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci abbonamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サブスクリプションを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구독 관리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Abonnement beheren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerenciar Assinatura" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "管理订阅" + } + } + } + }, + "profile_notification_preferences": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungspräferenzen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notification Preferences" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Preferencias de Notificación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Préférences de Notification" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Preferenze notifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meldingsvoorkeuren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Preferências de Notificação" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "通知偏好设置" + } + } + } + }, + "profile_notification_preferences_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wählen Sie, welche Benachrichtigungen Sie erhalten möchten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Choose which notifications you'd like to receive" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Elige qué notificaciones te gustaría recibir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisissez les notifications que vous souhaitez recevoir" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scegli le notifiche da ricevere" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "受信する通知を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "받을 알림 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kies welke meldingen u wilt ontvangen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escolha quais notificações você gostaria de receber" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择您要接收的通知" + } + } + } + }, + "profile_notifications": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notifications" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meldingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "通知" + } + } + } + }, + "profile_other_notifications": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Andere Benachrichtigungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Other Notifications" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Otras Notificaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Autres Notifications" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Altre notifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "その他の通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기타 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Andere meldingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Outras Notificações" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他通知" + } + } + } + }, + "profile_personal_information": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Persönliche Informationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Personal Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información Personal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations Personnelles" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Informazioni personali" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "個人情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Persoonlijke informatie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações Pessoais" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "个人信息" + } + } + } + }, + "profile_privacy": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Datenschutz" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Privacy" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Privacidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Confidentialité" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Privacy" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プライバシー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "개인정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Privacy" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Privacidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "隐私" + } + } + } + }, + "profile_pro_plan": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Pro-Plan" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Pro Plan" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Plan Pro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plan Pro" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Piano Pro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロプラン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로 플랜" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Pro-abonnement" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Plano Pro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "专业版" + } + } + } + }, + "profile_profile_settings": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Profileinstellungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Profile Settings" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Configuración de Perfil" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Paramètres du Profil" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Impostazioni profilo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィール設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필 설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Profielinstellingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Configurações de Perfil" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "资料设置" + } + } + } + }, + "profile_property_shared": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie geteilt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Shared" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad Compartida" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété Partagée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà condivisa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件が共有されました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 공유됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom gedeeld" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade Compartilhada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产已共享" + } + } + } + }, + "profile_property_shared_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wenn jemand eine Immobilie mit Ihnen teilt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "When someone shares a property with you" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuando alguien comparte una propiedad contigo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Quand quelqu'un partage une propriété avec vous" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Quando qualcuno condivide una proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "誰かが物件を共有したとき" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "누군가 부동산을 공유할 때" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wanneer iemand een eigendom deelt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Quando alguém compartilha uma propriedade com você" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "当有人与您共享房产时" + } + } + } + }, + "profile_purchases_restored": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Käufe wiederhergestellt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchases Restored" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Compras Restauradas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Achats Restaurés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Acquisti ripristinati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入が復元されました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매 복원됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankopen hersteld" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compras Restauradas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买已恢复" + } + } + } + }, + "profile_purchases_restored_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Ihre Käufe wurden erfolgreich wiederhergestellt." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Your purchases have been restored successfully." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tus compras se han restaurado correctamente." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vos achats ont été restaurés avec succès." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Acquisti ripristinati con successo." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入が正常に復元されました。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매가 성공적으로 복원되었습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uw aankopen zijn succesvol hersteld." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Suas compras foram restauradas com sucesso." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的购买已成功恢复。" + } + } + } + }, + "profile_restore_purchases": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Käufe wiederherstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Restore Purchases" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar Compras" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer les Achats" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina acquisti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入を復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매 복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankopen herstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar Compras" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复购买" + } + } + } + }, + "profile_save_changes": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Änderungen speichern" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Save Changes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Guardar Cambios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Enregistrer les Modifications" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salva modifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "変更を保存" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "변경 사항 저장" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wijzigingen opslaan" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Salvar Alterações" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存更改" + } + } + } + }, + "profile_subscription": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abonnement" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Subscription" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Suscripción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Abonnement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Abbonamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サブスクリプション" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구독" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Abonnement" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Assinatura" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "订阅" + } + } + } + }, + "profile_support": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Support" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Soporte" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Support" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Support" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Suporte" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Assistenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サポート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Support" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "支持" + } + } + } + }, + "profile_task_assigned": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe zugewiesen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Assigned" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea Asignada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche Assignée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività assegnata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが割り当てられました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 할당됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak toegewezen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa Atribuída" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务已分配" + } + } + } + }, + "profile_task_assigned_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wenn Ihnen eine Aufgabe zugewiesen wird" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "When a task is assigned to you" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuando se te asigna una tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Quand une tâche vous est assignée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Quando ti viene assegnata un'attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが割り当てられたとき" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업이 할당될 때" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wanneer een taak aan u wordt toegewezen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Quando uma tarefa é atribuída a você" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "当任务被分配给您时" + } + } + } + }, + "profile_task_completed": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abgeschlossen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Completed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea Completada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche Terminée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività completata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが完了しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak voltooid" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa Concluída" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务已完成" + } + } + } + }, + "profile_task_completed_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wenn jemand eine Aufgabe abschließt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "When someone completes a task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuando alguien completa una tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Quand quelqu'un termine une tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Quando qualcuno completa un'attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "誰かがタスクを完了したとき" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "누군가 작업을 완료할 때" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wanneer iemand een taak voltooit" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Quando alguém conclui uma tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "当有人完成任务时" + } + } + } + }, + "profile_task_due_soon": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe bald fällig" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Due Soon" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea Vence Pronto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche Bientôt Due" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività in scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの期限が近い" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 마감 임박" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak nadert deadline" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa Vence em Breve" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务即将到期" + } + } + } + }, + "profile_task_due_soon_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erinnerungen an bevorstehende Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Reminders for upcoming tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Recordatorios para tareas próximas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rappels pour les tâches à venir" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Promemoria per attività in scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限が近いタスクのリマインダー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예정된 작업 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Herinneringen voor aankomende taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lembretes para tarefas próximas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "即将到期任务的提醒" + } + } + } + }, + "profile_task_notifications": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenbenachrichtigungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Notifications" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones de Tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications de Tâches" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク通知" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taakmeldingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações de Tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务通知" + } + } + } + }, + "profile_task_overdue": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe überfällig" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Overdue" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea Atrasada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche en Retard" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività in ritardo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの期限超過" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 기한 초과" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak achterstallig" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa Atrasada" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务已逾期" + } + } + } + }, + "profile_task_overdue_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Warnungen für überfällige Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Alerts for overdue tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Alertas para tareas atrasadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Alertes pour les tâches en retard" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Avvisi per attività in ritardo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限超過タスクのアラート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "기한 초과 작업 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Waarschuwingen voor achterstallige taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Alertas para tarefas atrasadas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "逾期任务的警告" + } + } + } + }, + "profile_theme": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Thema" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Theme" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tema" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Thème" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tema" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テーマ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "테마" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Thema" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tema" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "主题" + } + } + } + }, + "profile_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Profile" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Perfil" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Profil" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Profilo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィール" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Profiel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Perfil" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "个人资料" + } + } + } + }, + "profile_unlock_premium_features": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlock Premium Features" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Desbloquea funciones premium" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Débloquez les fonctionnalités premium" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Premium-Funktionen freischalten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desbloquear recursos premium" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sblocca le funzioni premium" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プレミアム機能を解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프리미엄 기능 잠금 해제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontgrendel premiumfuncties" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "解锁高级功能" + } + } + } + }, + "profile_upgrade_to_pro": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auf Pro upgraden" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Upgrade to Pro" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Actualizar a Pro" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Passer à Pro" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Passa a Pro" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロにアップグレード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로로 업그레이드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Upgraden naar Pro" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atualizar para Pro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "升级到专业版" + } + } + } + }, + "profile_version": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Version 1.0.0" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Version 1.0.0" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Versión 1.0.0" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Version 1.0.0" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Versione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "バージョン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "버전" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Versie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Versão 1.0.0" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "版本" + } + } + } + }, + "profile_warranty_expiring": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantie läuft ab" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty Expiring" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Garantía Venciendo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Garantie Expirant" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Garanzia in scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証の期限が近い" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증 만료 임박" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantie verloopt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garantia Expirando" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修即将过期" + } + } + } + }, + "profile_warranty_expiring_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erinnerungen an ablaufende Garantien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Reminders for expiring warranties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Recordatorios para garantías que vencen" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rappels pour les garanties expirant" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Promemoria per garanzie in scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限が近い保証のリマインダー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "만료 예정 보증 알림" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Herinneringen voor verlopende garanties" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lembretes para garantias expirando" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "即将过期保修的提醒" + } + } + } + }, + "properties_add_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加房产" + } + } + } + }, + "properties_add_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加房产" + } + } + } + }, + "properties_address_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Address" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indirizzo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Adres" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "地址" + } + } + } + }, + "properties_delete_confirm": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchten Sie diese Immobilie wirklich löschen?" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to delete this property?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres eliminar esta propiedad?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir supprimer cette propriété ?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Eliminare questa proprietà?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この物件を削除しますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 부동산을 삭제하시겠습니까?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dit eigendom verwijderen?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza que deseja excluir esta propriedade?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定删除此房产?" + } + } + } + }, + "properties_deleted": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie gelöscht" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property deleted" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad eliminada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété supprimée" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà eliminata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件が削除されました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 삭제됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom verwijderd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade excluída" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产已删除" + } + } + } + }, + "properties_edit_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑房产" + } + } + } + }, + "properties_empty_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie Ihre erste Immobilie hinzu!" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add your first property to get started!" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Agrega tu primera propiedad para comenzar!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez votre première propriété pour commencer !" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi la prima proprietà!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初の物件を追加して始めましょう!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첫 번째 부동산을 추가하여 시작하세요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg uw eerste eigendom toe!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione sua primeira propriedade para começar!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加您的第一个房产开始吧!" + } + } + } + }, + "properties_empty_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No properties yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件がありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无房产" + } + } + } + }, + "properties_name_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Name der Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre de la Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom de la propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Naam eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产名称" + } + } + } + }, + "properties_notes_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注" + } + } + } + }, + "properties_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Meine Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "My Properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Mis Propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mes Propriétés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le mie proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "マイ物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내 부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Mijn eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Minhas Propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我的房产" + } + } + } + }, + "properties_type_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilientyp" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Type" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type de propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件タイプ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Type eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产类型" + } + } + } + }, + "Property #%d": { + "comment": "A fallback text that appears when the associated residence ID is not found in the user's residences. The placeholder number is replaced with the actual residence ID.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad n.º %d" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement n° %d" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie #%d" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade nº %d" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Immobile n. %d" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件 #%d" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산 #%d" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning #%d" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产 #%d" + } + } + } + }, + "Quick Start": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Inicio rápido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Démarrage rapide" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Schnellstart" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Início rápido" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Avvio rapido" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "クイックスタート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "빠른 시작" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Snel starten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "快速开始" + } + } + } + }, + "Rated %@ out of 5": { + "comment": "A label that describes the rating of a task completion. The argument is the rating.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Valorado con %@ de 5" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Noté %@ sur 5" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bewertet mit %@ von 5" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliado em %@ de 5" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutato %@ su 5" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "5点中%@点の評価" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "5점 만점에 %@점" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beoordeeld met %@ van de 5" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "评分 %@ / 5" + } + } + } + }, + "Rated 4.9 stars by 10K+ homeowners": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Valorado con 4.9 estrellas por más de 10 mil propietarios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Noté 4,9 étoiles par plus de 10 000 propriétaires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "4,9 Sterne von über 10.000 Eigenheimbesitzern" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliado em 4,9 estrelas por mais de 10 mil proprietários" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutato 4,9 stelle da oltre 10.000 proprietari" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "1万人以上の住宅所有者が4.9つ星を評価" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "1만+ 집주인이 4.9점 평가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "4,9 sterren door 10K+ huiseigenaren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "超 1 万名房主评分 4.9 星" + } + } + } + }, + "Rating: %lld out of 5 stars": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Valoración: %lld de 5 estrellas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Note : %lld étoiles sur 5" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bewertung: %lld von 5 Sternen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliação: %lld de 5 estrelas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutazione: %lld stelle su 5" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "評価:5つ星中%lldつ星" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "평점: 별 5개 중 %lld개" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beoordeling: %lld van de 5 sterren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "评分:%lld / 5 星" + } + } + } + }, + "Re-enter new password": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Vuelve a introducir la nueva contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ressaisissez le nouveau mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Passwort erneut eingeben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite a nova senha novamente" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reinserisci la nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワードを再入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호 다시 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer nieuw wachtwoord opnieuw in" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "再次输入新密码" + } + } + } + }, + "Re-enter your password to confirm": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Vuelve a introducir tu contraseña para confirmar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ressaisissez votre mot de passe pour confirmer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Gib dein Passwort zur Bestätigung erneut ein" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Digite a senha novamente para confirmar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reinserisci la password per confermare" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "確認のためパスワードを再入力してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인을 위해 비밀번호를 다시 입력하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer je wachtwoord opnieuw in ter bevestiging" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "再次输入密码以确认" + } + } + } + }, + "Receive a daily summary of upcoming tasks": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe un resumen diario de las tareas próximas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Recevez un résumé quotidien des tâches à venir" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erhalte eine tägliche Zusammenfassung anstehender Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba um resumo diário das próximas tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi un riepilogo giornaliero delle attività imminenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今後のタスクの日次サマリーを受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예정된 작업의 일일 요약 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang een dagelijks overzicht van aankomende taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "每日接收即将到期任务的摘要" + } + } + } + }, + "Receive email notifications when tasks are completed": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe notificaciones por correo cuando se completen tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Recevez des e-mails lorsque des tâches sont terminées" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erhalte E-Mail-Benachrichtigungen, wenn Aufgaben abgeschlossen werden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba notificações por e-mail quando tarefas forem concluídas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi notifiche email al completamento delle attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク完了時にメール通知を受け取る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업이 완료되면 이메일 알림 받기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontvang e-mailmeldingen als taken zijn voltooid" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务完成时接收邮件通知" + } + } + } + }, + "Refresh tasks": { + "comment": "A button that refreshes the tasks.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Actualizar tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actualiser les tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben aktualisieren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atualizar tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiorna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを更新" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 새로고침" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taken vernieuwen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "刷新任务" + } + } + } + }, + "Remove": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retirer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Entfernen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제거" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verwijderen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "移除" + } + } + } + }, + "Remove %@ from favorites": { + "comment": "A label for the favorite button. The argument is the name of the contractor.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Quitar %@ de favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retirer %@ des favoris" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ aus Favoriten entfernen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover %@ dos favoritos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi %@ dai preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ をお気に入りから削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@ 즐겨찾기에서 제거" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ uit favorieten verwijderen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将 %@ 移出收藏" + } + } + } + }, + "Remove %@ from property": { + "comment": "A button that removes a user from a property. The argument is the username of the user to be removed.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar a %@ de la propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retirer %@ du logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ aus Immobilie entfernen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover %@ da propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi %@ dall'immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ を物件から削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@ 자산에서 제거" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ uit woning verwijderen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将 %@ 移出房产" + } + } + } + }, + "Remove User": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar usuario" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retirer l'utilisateur" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nutzer entfernen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover usuário" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi utente" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーを削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 제거" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruiker verwijderen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "移除用户" + } + } + } + }, + "Resend code": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Reenviar código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Renvoyer le code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code erneut senden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Reenviar código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reinvia codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを再送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드 다시 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code opnieuw verzenden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重新发送验证码" + } + } + } + }, + "Reset All Tasks": { + "comment": "A button label that resets all tasks.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restablecer todas las tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réinitialiser toutes les tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Aufgaben zurücksetzen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Redefinir todas as tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimposta tutte le attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべてのタスクをリセット" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 작업 초기화" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle taken resetten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置所有任务" + } + } + } + }, + "Reset Password": { + "comment": "The title of the screen where users can reset their passwords.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restablecer contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réinitialiser le mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort zurücksetzen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Redefinir senha" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimposta password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセット" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 재설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord resetten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置密码" + } + } + } + }, + "Resetting...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restableciendo..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réinitialisation..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird zurückgesetzt..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Redefinindo..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimpostazione..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセット中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Resetten..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在重置…" + } + } + } + }, + "Residences": { + "comment": "A label for the \"Residences\" tab in the main tab view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencias" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logements" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zuhause" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residências" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenze" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woningen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + } + } + }, + "residences_add_contractors_prompt": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmer aus der Registerkarte 'Auftragnehmer' hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add contractors from the Contractors tab" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar contratistas desde la pestaña Contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter des entrepreneurs depuis l'onglet Entrepreneurs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi dalla scheda Appaltatori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者タブから業者を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 탭에서 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toevoegen via Aannemers-tabblad" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar empreiteiros da aba Empreiteiros" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "从承包商选项卡添加承包商" + } + } + } + }, + "residences_add_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加房产" + } + } + } + }, + "residences_additional_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Zusätzliche Details" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Additional Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles Adicionales" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails Supplémentaires" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli aggiuntivi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加の詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가 상세정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aanvullende details" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes Adicionais" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他详情" + } + } + } + }, + "residences_address": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Address" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Indirizzo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Adres" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "地址" + } + } + } + }, + "residences_apartment_unit": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnung/Einheit (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Apartment/Unit (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Apartamento/Unidad (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appartement/Unité (optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Appartamento/Unità (opz.)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アパート/部屋番号(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아파트/호실(선택)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Appartement/Eenheid (opt.)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Apartamento/Unidade (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "公寓/单元(可选)" + } + } + } + }, + "residences_bathrooms": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Badezimmer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Bathrooms" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Baños" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Salles de bain" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Bagni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "バスルーム" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "욕실" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Badkamers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Banheiros" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "浴室" + } + } + } + }, + "residences_bedrooms": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Schlafzimmer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Bedrooms" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dormitorios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chambres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Camere" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "寝室" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "침실" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slaapkamers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Quartos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "卧室" + } + } + } + }, + "residences_city": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Stadt" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "City" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ciudad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ville" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Città" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "市区町村" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "도시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stad" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "城市" + } + } + } + }, + "residences_contractors": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractors" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrepreneurs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Appaltatori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Empreiteiros" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商" + } + } + } + }, + "residences_country": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Land" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Country" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "País" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pays" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Paese" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "国" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "국가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Land" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "País" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "国家" + } + } + } + }, + "residences_delete_confirm_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sind Sie sicher, dass Sie diese Immobilie löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden und löscht alle zugehörigen Aufgaben, Dokumente und Daten." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to delete this property? This action cannot be undone and will delete all associated tasks, documents, and data." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Está seguro de que desea eliminar esta propiedad? Esta acción no se puede deshacer y eliminará todas las tareas, documentos y datos asociados." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir supprimer cette propriété ? Cette action ne peut pas être annulée et supprimera toutes les tâches, documents et données associés." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Eliminare questa proprietà? Tutti i dati correlati verranno eliminati." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この物件を削除しますか?関連データもすべて削除されます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 부동산을 삭제하시겠습니까? 관련 데이터도 삭제됩니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dit eigendom verwijderen? Alle gerelateerde gegevens worden verwijderd." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja excluir esta propriedade? Esta ação não pode ser desfeita e excluirá todas as tarefas, documentos e dados associados." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定删除此房产?所有相关数据将被删除。" + } + } + } + }, + "residences_delete_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除房产" + } + } + } + }, + "residences_description": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beschreibung (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Description (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Description (optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Descrizione (opz.)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "説明(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명(선택)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beschrijving (opt.)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Descrição (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "描述(可选)" + } + } + } + }, + "residences_edit_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑房产" + } + } + } + }, + "residences_enter_share_code": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode eingeben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter Share Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Introducir Código de Compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrer le Code de Partage" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードを入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer code in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Inserir Código de Compartilhamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入分享码" + } + } + } + }, + "residences_error_loading_tasks": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler beim Laden der Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Error loading tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al cargar tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur lors du chargement des tâches" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore caricamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク読み込みエラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 로딩 오류" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout bij laden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro ao carregar tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载任务出错" + } + } + } + }, + "residences_generate": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Generate" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "生成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Genereren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成" + } + } + } + }, + "residences_generate_report": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bericht erstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Generate Report" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Generar Informe" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Générer un Rapport" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Genera rapporto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "レポートを生成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보고서 생성" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Rapport genereren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerar Relatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成报告" + } + } + } + }, + "residences_generate_report_message": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Dies erstellt einen umfassenden Bericht über Ihre Immobilie einschließlich aller Aufgaben, Dokumente und Auftragnehmer." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "This will generate a comprehensive report of your property including all tasks, documents, and contractors." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Esto generará un informe completo de su propiedad incluyendo todas las tareas, documentos y contratistas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cela générera un rapport complet de votre propriété incluant toutes les tâches, documents et entrepreneurs." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verrà generato un rapporto completo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件の包括的なレポートを生成します" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "종합 보고서가 생성됩니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er wordt een uitgebreid rapport gegenereerd" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Isso gerará um relatório abrangente da sua propriedade incluindo todas as tarefas, documentos e empreiteiros." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "这将生成房产的综合报告" + } + } + } + }, + "residences_join_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie beitreten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Join Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Unirse a Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Participar da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入房产" + } + } + } + }, + "residences_join_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie beitreten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Join Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Unirse a Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rejoindre la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Unisciti alla proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件に参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelnemen aan eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Participar da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入房产" + } + } + } + }, + "residences_loading_residence": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie wird geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading residence..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando propiedad..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement de la propriété..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando propriedade..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载房产中..." + } + } + } + }, + "residences_loading_tasks": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben werden geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading tasks..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando tareas..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement des tâches..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento attività..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taken laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando tarefas..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载任务中..." + } + } + } + }, + "residences_lot_size": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Grundstücksgröße (Hektar)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Lot Size (acres)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tamaño del Lote (acres)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Taille du Terrain (acres)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dimensione lotto (acri)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "敷地面積(エーカー)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부지 면적(에이커)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Perceelgrootte (acres)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tamanho do Lote (acres)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "地块面积(英亩)" + } + } + } + }, + "residences_maintenance_report": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wartungsbericht" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Maintenance Report" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Informe de Mantenimiento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rapport de Maintenance" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Rapporto manutenzione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メンテナンスレポート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "유지보수 보고서" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onderhoudsrapport" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Relatório de Manutenção" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "维护报告" + } + } + } + }, + "residences_manage_users": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzer verwalten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Manage Users" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Administrar Usuarios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gérer les Utilisateurs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestisci utenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーを管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 관리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikers beheren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gerenciar Usuários" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "管理用户" + } + } + } + }, + "residences_name_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Name ist erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Name is required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El nombre es obligatorio" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le nom est requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome obbligatorio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名前は必須です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름은 필수입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Naam is verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O nome é obrigatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "名称为必填项" + } + } + } + }, + "residences_no_contractors": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch keine Auftragnehmer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No contractors yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún no hay contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pas encore d'entrepreneurs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者がいません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen aannemers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ainda não há empreiteiros" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无承包商" + } + } + } + }, + "residences_postal_code": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Postleitzahl" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Postal Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código Postal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code Postal" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "CAP" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "郵便番号" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우편번호" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Postcode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código Postal" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮编" + } + } + } + }, + "residences_primary_residence": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Hauptwohnsitz" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Primary Residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencia Principal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résidence Principale" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenza principale" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "主な住居" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "주 거주지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Hoofdverblijf" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência Principal" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "主要住所" + } + } + } + }, + "residences_properties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "propriétés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "residences_property": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "residences_property_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobiliendetails" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles de la Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails de la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件の詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 상세" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendomsgegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产详情" + } + } + } + }, + "residences_property_features": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilienmerkmale" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Features" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Características de la Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Caractéristiques de la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caratteristiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件の特徴" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 특징" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kenmerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Características da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产特点" + } + } + } + }, + "residences_property_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilienname" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre de la Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom de la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件名" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Naam eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome da Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产名称" + } + } + } + }, + "residences_property_type": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilientyp" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property Type" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type de Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件タイプ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 유형" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Type eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产类型" + } + } + } + }, + "residences_required_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich: Name" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required: Name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido: Nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis : Nom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio: Nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須:名前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수: 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht: Naam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório: Nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填:名称" + } + } + } + }, + "residences_select_type": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Typ auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Type" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Tipo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner le Type" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona tipo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイプを選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "유형 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer type" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Tipo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择类型" + } + } + } + }, + "residences_share_code": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Share Code" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código de Compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de Partage" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelcode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de Compartilhamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "分享码" + } + } + } + }, + "residences_share_code_footer": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geben Sie den 6-stelligen Code ein, der mit Ihnen geteilt wurde, um einer Immobilie beizutreten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter the 6-character code shared with you to join a residence" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingrese el código de 6 caracteres compartido con usted para unirse a una propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrez le code à 6 caractères partagé avec vous pour rejoindre une propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci il codice di 6 caratteri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6文字の共有コードを入力して参加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "6자리 코드를 입력하여 참여" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer de 6-tekens code in" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Insira o código de 6 caracteres compartilhado com você para participar de uma propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "输入6位分享码以加入" + } + } + } + }, + "residences_share_code_must_6": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Freigabecode muss 6 Zeichen lang sein" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Share code must be 6 characters" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "El código de compartir debe tener 6 caracteres" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code de partage doit comporter 6 caractères" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice deve essere di 6 caratteri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードは6文字です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드는 6자여야 합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code moet 6 tekens zijn" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código de compartilhamento deve ter 6 caracteres" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "分享码必须是6个字符" + } + } + } + }, + "residences_square_footage": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Quadratmeter" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Square Footage" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Metros Cuadrados" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Surface en pieds carrés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Superficie (mq)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "面積(平方フィート)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "면적(평방피트)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Oppervlakte (m²)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Área em pés quadrados" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "面积(平方英尺)" + } + } + } + }, + "residences_state_province": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bundesland/Provinz" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "State/Province" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado/Provincia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "État/Province" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato/Provincia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "都道府県" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시/도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Provincie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estado/Província" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "省/州" + } + } + } + }, + "residences_street_address": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Straßenadresse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Street Address" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Adresse" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Via" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住所" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "도로명 주소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Straat" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Endereço" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "街道地址" + } + } + } + }, + "residences_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Meine Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "My Properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Mis Propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mes Propriétés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Minhas Propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "residences_users": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzer" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Users" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuarios" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisateurs" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Utenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikers" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuários" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户" + } + } + } + }, + "residences_year_built": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Baujahr" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Year Built" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Año de Construcción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Année de Construction" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Anno costruzione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "築年" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "건축 연도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bouwjaar" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ano de Construção" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "建造年份" + } + } + } + }, + "residences_your_properties": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Ihre Immobilien" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Your Properties" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tus Propiedades" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vos Propriétés" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Le tue proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내 부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uw eigendommen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Suas Propriedades" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的房产" + } + } + } + }, + "Restore": { + "comment": "A button that restores a cancelled task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wiederherstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Herstellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Restore" + } + } + } + }, + "Restore Purchases": { + "comment": "A button label that allows users to restore previous purchases.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar compras" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer les achats" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Käufe wiederherstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar compras" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina acquisti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入を復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매 복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankopen herstellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复购买" + } + } + } + }, + "Restore task": { + "comment": "A button that restores a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe wiederherstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak herstellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复任务" + } + } + } + }, + "Restore Task": { + "comment": "A button that restores a cancelled or archived task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe wiederherstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak herstellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复任务" + } + } + } + }, + "Retry": { + "comment": "A button label that says \"Retry\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Reintentar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erneut versuchen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tentar novamente" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "再試行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opnieuw proberen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重试" + } + } + } + }, + "Retry Loading Products": { + "comment": "A button label that appears when the app is unable to load in-app purchase products. It instructs the user to try again.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Reintentar cargar productos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer de charger les produits" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Produkte erneut laden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recarregar produtos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova a caricare i prodotti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "商品の読み込みを再試行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상품 다시 불러오기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Producten opnieuw laden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重新加载商品" + } + } + } + }, + "Return to Login": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Volver al inicio de sesión" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Retour à la connexion" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Zurück zur Anmeldung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Voltar ao login" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Torna all'accesso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ログインに戻る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인으로 돌아가기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Terug naar inloggen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "返回登录" + } + } + } + }, + "Save": { + "comment": "The text for a button that saves the selected time.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Guardar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Enregistrer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Speichern" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Salvar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salva" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "保存" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opslaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存" + } + } + } + }, + "Save your home to your account": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Guarda tu hogar en tu cuenta" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Enregistrez votre logement sur votre compte" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Speichere dein Zuhause in deinem Konto" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Salve sua casa na sua conta" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salva la tua casa nel tuo account" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住まいをアカウントに保存" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집을 계정에 저장하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bewaar je woning in je account" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将您的家保存到账户" + } + } + } + }, + "Search task templates by name": { + "comment": "A hint for the search bar in the task templates browser.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar plantillas de tareas por nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher des modèles de tâches par nom" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenvorlagen nach Namen suchen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Buscar modelos de tarefas por nome" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca i modelli di attività per nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "名前でタスクテンプレートを検索" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름으로 작업 템플릿 검색" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zoek taaksjablonen op naam" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "按名称搜索任务模板" + } + } + } + }, + "Search templates...": { + "comment": "A placeholder text for a search bar in the task templates browser.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar plantillas..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher des modèles..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen suchen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Buscar modelos..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca modelli..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートを検索..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿 검색..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sjablonen zoeken..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "搜索模板…" + } + } + } + }, + "Select Notification Time": { + "comment": "A label displayed above the picker for selecting the notification time.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar hora de notificación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Choisir l'heure de notification" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungszeit wählen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar horário das notificações" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona orario notifiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知時刻を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 시간 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Meldingstijd selecteren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择通知时间" + } + } + } + }, + "selected": { + "comment": "A label that describes the selection state of a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "seleccionado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "sélectionné" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "ausgewählt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "selecionado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "selezionato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "選択済み" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "geselecteerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已选择" + } + } + } + }, + "Selected": { + "comment": "A label that describes a selected option.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionné" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausgewählt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Selezionato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "選択済み" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geselecteerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已选择" + } + } + } + }, + "Send a .honeydue file via Messages, Email, or AirDrop. They just tap to join.": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Envía un archivo .honeydue por Mensajes, correo o AirDrop. Solo tienen que tocar para unirse." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoyez un fichier .honeydue via Messages, e-mail ou AirDrop. Il leur suffit de toucher pour rejoindre." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Sende eine .honeydue-Datei per Nachrichten, E-Mail oder AirDrop. Zum Beitreten einfach tippen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Envie um arquivo .honeydue por Mensagens, E-mail ou AirDrop. Basta tocar para entrar." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia un file .honeydue tramite Messaggi, Email o AirDrop. Basta toccare per unirsi." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メッセージ、メール、AirDropで.honeydueファイルを送信。タップするだけで参加できます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메시지, 이메일 또는 AirDrop으로 .honeydue 파일을 보내세요. 탭만 하면 참여합니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stuur een .honeydue-bestand via Berichten, E-mail of AirDrop. Ze tikken om deel te nemen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "通过信息、邮件或隔空投送发送 .honeydue 文件。对方轻点即可加入。" + } + } + } + }, + "Send Invite Link": { + "comment": "A button label for sending an invitation link to others.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviar enlace de invitación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoyer le lien d'invitation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Einladungslink senden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviar link de convite" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia link di invito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "招待リンクを送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "초대 링크 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uitnodigingslink verzenden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "发送邀请链接" + } + } + } + }, + "Send New Code": { + "comment": "A button label that allows a user to request a new verification code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviar código nuevo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoyer un nouveau code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neuen Code senden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviar novo código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia nuovo codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいコードを送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 코드 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe code verzenden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "发送新代码" + } + } + } + }, + "Send Reset Code": { + "comment": "A button label that says \"Send Reset Code\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviar código de restablecimiento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoyer le code de réinitialisation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Reset-Code senden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviar código de redefinição" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invia codice di reimpostazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットコードを送信" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 코드 보내기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Resetcode verzenden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "发送重置代码" + } + } + } + }, + "Sending...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Envoi..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird gesendet..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invio in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "送信中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보내는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verzenden..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在发送…" + } + } + } + }, + "Set Custom Time": { + "comment": "A button that allows a user to set a custom notification time.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Establecer hora personalizada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Définir une heure personnalisée" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Eigene Zeit festlegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Definir horário personalizado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Imposta orario personalizzato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カスタム時刻を設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 지정 시간 설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aangepaste tijd instellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "设置自定义时间" + } + } + } + }, + "Set New Password": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Establecer nueva contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Définir un nouveau mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Passwort festlegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Definir nova senha" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Imposta nuova password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "新しいパスワードを設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 비밀번호 설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuw wachtwoord instellen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "设置新密码" + } + } + } + }, + "Settings": { + "comment": "A button that opens a settings screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ajustes" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réglages" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Einstellungen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ajustes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Impostazioni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Instellingen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "设置" + } + } + } + }, + "settings_language": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Sprache" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Language" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Idioma" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Langue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Lingua" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "言語" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "언어" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taal" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Idioma" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "语言" + } + } + } + }, + "settings_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Einstellungen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Settings" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Configuración" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Paramètres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Impostazioni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設定" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Instellingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Configurações" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "设置" + } + } + } + }, + "Share Analytics": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir analíticas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partager les statistiques" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Analysedaten teilen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhar análises" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi analisi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "分析データを共有" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "분석 데이터 공유" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Analyses delen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享分析数据" + } + } + } + }, + "Share Code": { + "comment": "A label displayed above the share code section of the view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Código para compartir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de partage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de compartilhamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di condivisione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelcode" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享码" + } + } + } + }, + "Share code: %@": { + "comment": "A label for the share code, with the share code as the value.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Código para compartir: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de partage : %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de compartilhamento: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di condivisione: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コード:%@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deelcode: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享码:%@" + } + } + } + }, + "Share this 6-character code. They can enter it in the app to join.": { + "comment": "A description of how to share the invitation code with others.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Comparte este código de 6 caracteres. Pueden introducirlo en la app para unirse." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partagez ce code à 6 caractères. La personne pourra le saisir dans l'application pour rejoindre." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Teile diesen 6-stelligen Code. Er kann in der App zum Beitreten eingegeben werden." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhe este código de 6 caracteres. Eles podem digitá-lo no app para entrar." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi questo codice a 6 caratteri. Potranno inserirlo nell'app per unirsi." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この6文字のコードを共有してください。アプリで入力すると参加できます。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 6자리 코드를 공유하세요. 앱에서 입력하면 참여할 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deel deze 6-tekens code. Ze kunnen die in de app invoeren om deel te nemen." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "分享这个 6 位代码。对方在应用中输入即可加入。" + } + } + } + }, + "Shared Users (%lld)": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuarios compartidos (%lld)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisateurs partagés (%lld)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Geteilte Nutzer (%lld)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuários compartilhados (%lld)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Utenti condivisi (%lld)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有ユーザー (%lld)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유된 사용자 (%lld)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gedeelde gebruikers (%lld)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享用户 (%lld)" + } + } + } + }, + "Show active warranties only": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar solo garantías activas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher uniquement les garanties actives" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur aktive Garantien anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar apenas garantias ativas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra solo garanzie attive" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "有効な保証のみ表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "활성 보증만 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alleen actieve garanties tonen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "仅显示有效保修" + } + } + } + }, + "Show all contractors": { + "comment": "A label for a button that shows all contractors.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar todos los contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher tous les prestataires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Dienstleister anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar todos os prestadores" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra tutti i tecnici" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての業者を表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 업체 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle aannemers tonen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "显示所有承包商" + } + } + } + }, + "Show all warranties": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar todas las garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher toutes les garanties" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Garantien anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar todas as garantias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra tutte le garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての保証を表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 보증 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle garanties tonen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "显示所有保修" + } + } + } + }, + "Show favorites only": { + "comment": "A label for a button that filters contractors to show only the ones that the user has marked as favorites.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar solo favoritos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher uniquement les favoris" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur Favoriten anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar apenas favoritos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra solo i preferiti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入りのみ表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기만 표시" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alleen favorieten tonen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "仅显示收藏" + } + } + } + }, + "Sign in with Apple": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión con Apple" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter avec Apple" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Mit Apple anmelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar com a Apple" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi con Apple" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでサインイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple로 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "使用 Apple 登录" + } + } + } + }, + "Sign in with Google": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión con Google" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter avec Google" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Mit Google anmelden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar com o Google" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi con Google" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleでサインイン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google로 로그인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Google" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "使用 Google 登录" + } + } + } + }, + "Signing in with Apple...": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciando sesión con Apple..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion avec Apple..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung mit Apple..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrando com a Apple..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso con Apple..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでサインイン中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple로 로그인 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在使用 Apple 登录…" + } + } + } + }, + "Skip": { + "comment": "A button label that allows users to skip the current onboarding step.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Omitir" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ignorer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Überspringen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pular" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salta" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "スキップ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "건너뛰기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Overslaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "跳过" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Skip" + } + } + } + }, + "Skip for now": { + "comment": "A button label that skips onboarding.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Omitir por ahora" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Passer pour l'instant" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorerst überspringen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pular por enquanto" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Salta per ora" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今はスキップ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "나중에 하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voor nu overslaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂时跳过" + } + } + } + }, + "Skip for Now": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Omitir por ahora" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ignorer pour l'instant" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorerst überspringen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pular por enquanto" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ignora per ora" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "後でスキップ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "나중에" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nu overslaan" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂时跳过" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Skip for Now" + } + } + } + }, + "Something went wrong": { + "comment": "A description of an error that occurs during an asynchronous operation.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Algo salió mal" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur est survenue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Etwas ist schiefgelaufen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Algo deu errado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Qualcosa è andato storto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "問題が発生しました" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문제가 발생했습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er ging iets mis" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "出错了" + } + } + } + }, + "Start 7-Day Free Trial": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Empezar prueba gratis de 7 días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Démarrer l'essai gratuit de 7 jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "7 Tage kostenlos testen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Iniciar teste grátis de 7 dias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inizia la prova gratuita di 7 giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "7日間の無料トライアルを開始" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "7일 무료 체험 시작" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Start 7 dagen gratis proefperiode" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "开始 7 天免费试用" + } + } + } + }, + "Start Fresh": { + "comment": "A button label that says \"Start Fresh\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Empezar de cero" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Repartir de zéro" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Neu beginnen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Começar do zero" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricomincia da capo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初から始める" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "새로 시작" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opnieuw beginnen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "从头开始" + } + } + } + }, + "Start managing your properties today": { + "comment": "A description below the title of the screen.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Empieza a gestionar tus propiedades hoy" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Commencez à gérer vos logements dès aujourd'hui" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalte deine Immobilien noch heute" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Comece a gerenciar suas propriedades hoje" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inizia a gestire i tuoi immobili oggi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "今日から物件管理を始めましょう" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오늘부터 자산을 관리하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Begin vandaag met het beheren van je woningen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "立即开始管理您的房产" + } + } + } + }, + "Step %lld of 5": { + "comment": "A label that describes the current step in the onboarding flow. The argument is the step number.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Paso %lld de 5" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Étape %lld sur 5" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Schritt %lld von 5" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Etapa %lld de 5" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Passaggio %lld di 5" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ステップ %lld / 5" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "5단계 중 %lld단계" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stap %lld van 5" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "第 %lld 步,共 5 步" + } + } + } + }, + "Subscription Active": { + "comment": "The title of an alert that appears when a user successfully upgrades to a premium subscription.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Suscripción activa" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Abonnement actif" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abo aktiv" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Assinatura ativa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Abbonamento attivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サブスクリプション有効" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구독 활성화됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Abonnement actief" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "订阅已激活" + } + } + } + }, + "Swipe to see your tasks": { + "comment": "A hint displayed in the \"Tasks\" section of the app, encouraging users to swipe to view their tasks.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Desliza para ver tus tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Balayez pour voir vos tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wische, um deine Aufgaben zu sehen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Deslize para ver suas tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scorri per vedere le tue attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "スワイプしてタスクを表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "스와이프하여 작업 보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Veeg om je taken te zien" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "滑动查看您的任务" + } + } + } + }, + "Take your home management\nto the next level": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Lleva la gestión de tu hogar\nal siguiente nivel" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Faites passer la gestion de votre logement\nau niveau supérieur" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bring deine Hausverwaltung\nauf die nächste Stufe" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Leve o gerenciamento da sua casa\nao próximo nível" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Porta la gestione della tua casa\nal livello successivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "住まいの管理を\n次のレベルへ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집 관리를 한 단계\n더 끌어올리세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Til je woningbeheer\nnaar een hoger niveau" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "将您的家居管理\n提升到新层次" + } + } + } + }, + "Tap the + icon in the top right\nto add your first property": { + "comment": "A description of an action a user can take to add a property.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca el icono + arriba a la derecha\npara añadir tu primera propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Touchez l'icône + en haut à droite\npour ajouter votre premier logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Tippe oben rechts auf das +-Symbol,\num deine erste Immobilie hinzuzufügen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque no ícone + no canto superior direito\npara adicionar sua primeira propriedade" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca l'icona + in alto a destra\nper aggiungere il tuo primo immobile" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "右上の + アイコンをタップして\n最初の物件を追加してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오른쪽 상단의 + 아이콘을 탭해\n첫 자산을 추가하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tik op het +-pictogram rechtsboven\nom je eerste woning toe te voegen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "点击右上角的 + 图标\n添加您的第一处房产" + } + } + } + }, + "Task actions": { + "comment": "A label displayed as a button in the task card that opens a menu of task actions.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Acciones de la tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Actions de la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben-Aktionen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ações da tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Azioni attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの操作" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 동작" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taakacties" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务操作" + } + } + } + }, + "Task Templates": { + "comment": "The title of the view that lists all predefined task templates.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Plantillas de tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modèles de tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenvorlagen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Modelos de tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modelli di attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクテンプレート" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 템플릿" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taaksjablonen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务模板" + } + } + } + }, + "Tasks": { + "comment": "A label displayed above the list of task categories.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tasks" + } + } + } + }, + "tasks_actual_cost": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Tatsächliche Kosten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Actual Cost" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Costo Real" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coût Réel" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Costo effettivo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "実際の費用" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "실제 비용" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Werkelijke kosten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Custo Real" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "实际费用" + } + } + } + }, + "tasks_add_button": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加任务" + } + } + } + }, + "tasks_add_photos": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie bis zu 5 Fotos hinzu, die die abgeschlossene Arbeit dokumentieren." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add up to 5 photos documenting the completed work." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega hasta 5 fotos documentando el trabajo completado." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez jusqu'à 5 photos documentant le travail terminé." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi fino a 5 foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最大5枚の写真を追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "최대 5장의 사진 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg max 5 foto's toe" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione até 5 fotos documentando o trabalho concluído." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加最多5张照片" + } + } + } + }, + "tasks_add_property_first": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie zuerst eine Immobilie aus dem Tab Residenzen hinzu" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add a property first from the Residences tab" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega una propiedad primero desde la pestaña Residencias" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez d'abord une propriété depuis l'onglet Résidences" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi prima una proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "まず物件を追加してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "먼저 부동산을 추가하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg eerst een eigendom toe" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione uma propriedade primeiro na aba Residências" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "请先添加房产" + } + } + } + }, + "tasks_add_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe hinzufügen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agregar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter une tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを追加" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 추가" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak toevoegen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加任务" + } + } + } + }, + "tasks_all_tasks": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "All Tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Todas las Tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toutes les Tâches" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutte le attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべてのタスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alle taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todas as Tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有任务" + } + } + } + }, + "tasks_archive": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Archivieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Archive" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archiver" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Archiveren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档" + } + } + } + }, + "tasks_archive_confirm": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchten Sie diese Aufgabe wirklich archivieren? Sie können sie später aus archivierten Aufgaben wiederherstellen." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to archive this task? You can unarchive it later from archived tasks." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Estás seguro de que quieres archivar esta tarea? Puedes desarchivarla más tarde desde tareas archivadas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir archiver cette tâche ? Vous pouvez la désarchiver plus tard depuis les tâches archivées." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak archiveren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja arquivar esta tarefa? Você pode desarquivá-la mais tarde nas tarefas arquivadas." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档任务" + } + } + } + }, + "tasks_archive_task": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe Archivieren" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Archive Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archiver la Tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivia attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak archiveren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivar Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档任务" + } + } + } + }, + "tasks_both_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich: Priorität und Status" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required: Both Priority and Status" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido: Prioridad y Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis: Priorité et Statut" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatori: Priorità e Stato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須:優先度とステータス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수: 우선순위 및 상태" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht: Prioriteit en Status" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório: Prioridade e Status" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填:优先级和状态" + } + } + } + }, + "tasks_browse_templates": { + "comment": "Text for browsing task templates.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Browse Templates" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver plantillas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Parcourir les modèles" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen durchsuchen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver modelos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sfoglia modelli" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートを見る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿 둘러보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sjablonen bekijken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "浏览模板" + } + } + } + }, + "tasks_cancel": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abbrechen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancel" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "キャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Annuleren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消" + } + } + } + }, + "tasks_cancel_confirm": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to cancel this task?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres cancelar esta tarea?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voulez-vous vraiment annuler cette tâche ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du diese Aufgabe wirklich abbrechen?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza de que deseja cancelar esta tarefa?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi davvero annullare questa attività?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクをキャンセルしますか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업을 취소하시겠어요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Weet je zeker dat je deze taak wilt annuleren?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确定要取消此任务吗?" + } + } + } + }, + "tasks_cancel_task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancel Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuler la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe abbrechen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Annulla attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをキャンセル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak annuleren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消任务" + } + } + } + }, + "tasks_category": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kategorie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Category" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Categoría" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Catégorie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Categoria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カテゴリー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "카테고리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Categorie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Categoria" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "类别" + } + } + } + }, + "tasks_complete": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschließen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Complete" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooien" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成" + } + } + } + }, + "tasks_complete_task": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe Abschließen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Complete Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminer la Tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak voltooien" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluir Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成任务" + } + } + } + }, + "tasks_completed_by": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgeschlossen Von" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Completed By" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completado Por" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé Par" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completato da" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooid door" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído Por" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成者" + } + } + } + }, + "tasks_completed_by_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgeschlossen von" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Completed by" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completado por" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé par" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completato da" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了者" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료자" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooid door" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído por" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成者" + } + } + } + }, + "tasks_completion": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschluss" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "completion" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "completado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "achèvement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "completamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "voltooiing" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "conclusão" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成记录" + } + } + } + }, + "tasks_completion_history": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlussverlauf" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Completion History" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Historial de Completado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Historique d'Achèvement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cronologia completamenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了履歴" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 기록" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingsgeschiedenis" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Histórico de Conclusão" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成历史" + } + } + } + }, + "tasks_completions": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlüsse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "completions" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "completados" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "achèvements" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "completamenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了記録" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 기록" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "voltooiingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "conclusões" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成记录" + } + } + } + }, + "tasks_contractor_helper": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wählen Sie einen Auftragnehmer aus, wenn er diese Arbeit abgeschlossen hat, oder lassen Sie es für manuelle Eingabe leer." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select a contractor if they completed this work, or leave blank for manual entry." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Selecciona un contratista si completó este trabajo, o déjalo en blanco para entrada manual." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionnez un entrepreneur s'il a terminé ce travail, ou laissez vide pour une saisie manuelle." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona l'appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "作業を完了した業者を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 완료한 계약업체 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer de aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecione um empreiteiro se ele concluiu este trabalho, ou deixe em branco para entrada manual." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择完成工作的承包商" + } + } + } + }, + "tasks_contractor_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmer (Optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor (Optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista (Opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrepreneur (Optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Appaltatore (opz.)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체(선택)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer (opt.)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Empreiteiro (Opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商(可选)" + } + } + } + }, + "tasks_cost": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kosten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Cost" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Costo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coût" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Costo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "費用" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비용" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kosten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Custo" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "费用" + } + } + } + }, + "tasks_create_first": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erstellen Sie Ihre erste Aufgabe, um zu beginnen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Create your first task to get started" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Crea tu primera tarea para comenzar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créez votre première tâche pour commencer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea la prima attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "最初のタスクを作成" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "첫 번째 작업 만들기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Maak uw eerste taak" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Crie sua primeira tarefa para começar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建第一个任务" + } + } + } + }, + "tasks_custom_interval": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzerdefiniertes Intervall (Tage, optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Custom Interval (days, optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Intervalo Personalizado (días, opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Intervalle Personnalisé (jours, optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Intervallo personalizzato (giorni)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カスタム間隔(日)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 정의 간격(일)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aangepast interval (dagen)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Intervalo Personalizado (dias, opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "自定义间隔(天)" + } + } + } + }, + "tasks_delete_confirm": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchten Sie diese Aufgabe wirklich löschen?" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Are you sure you want to delete this task?" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Seguro que quieres eliminar esta tarea?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Êtes-vous sûr de vouloir supprimer cette tâche ?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tem certeza que deseja excluir esta tarefa?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除任务" + } + } + } + }, + "tasks_delete_task": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe Löschen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer la Tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを削除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 삭제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak verwijderen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除任务" + } + } + } + }, + "tasks_description_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beschreibung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Description" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Description" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Descrizione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "説明" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beschrijving" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Descrição" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "描述" + } + } + } + }, + "tasks_description_optional": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Beschreibung (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Description (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Descripción (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Description (optionnelle)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Descrizione (opz.)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "説明(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "설명(선택)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beschrijving (opt.)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Descrição (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "描述(可选)" + } + } + } + }, + "tasks_due_date": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fälligkeitsdatum" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Due Date" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fecha de Vencimiento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Date d'Échéance" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scadenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "마감일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deadline" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Data de Vencimento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "截止日期" + } + } + } + }, + "tasks_edit": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑" + } + } + } + }, + "tasks_edit_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe bearbeiten" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Edit Task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Editar Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modifier la tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Modifica attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを編集" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 편집" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak bewerken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Editar Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "编辑任务" + } + } + } + }, + "tasks_empty_subtitle": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie Ihre erste Wartungsaufgabe hinzu" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add your first maintenance task" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega tu primera tarea de mantenimiento" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez votre première tâche de maintenance" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tieni traccia delle attività di manutenzione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メンテナンスタスクを追跡" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "유지보수 작업을 추적하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Houd uw onderhoudstaken bij" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione sua primeira tarefa de manutenção" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "跟踪您的维护任务" + } + } + } + }, + "tasks_empty_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No tasks yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无任务" + } + } + } + }, + "tasks_enter_manually": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Name manuell eingeben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Enter name manually" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ingresar nombre manualmente" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Entrer le nom manuellement" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci manualmente" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "手動で入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "직접 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Handmatig invoeren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Inserir nome manualmente" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "手动输入" + } + } + } + }, + "tasks_error": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Error" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "错误" + } + } + } + }, + "tasks_estimated_cost": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Geschätzte Kosten (optional)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Estimated Cost (optional)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Costo Estimado (opcional)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coût Estimé (optionnel)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Costo stimato (opz.)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "見積もり費用(任意)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "예상 비용(선택)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geschatte kosten (opt.)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Custo Estimado (opcional)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "预计费用(可选)" + } + } + } + }, + "tasks_failed_to_load": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler beim Laden der Abschlüsse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load completions" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al cargar completados" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des achèvements" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento fallito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込みに失敗" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로딩 실패" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden mislukt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar conclusões" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载失败" + } + } + } + }, + "tasks_frequency": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Häufigkeit" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Frequency" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Frecuencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fréquence" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Frequenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "頻度" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "빈도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Frequentie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Frequência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "频率" + } + } + } + }, + "tasks_in_progress": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "In Bearbeitung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "In Progress" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "En Progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "En Cours" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "In corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "進行中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "진행 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "In behandeling" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Em Andamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "进行中" + } + } + } + }, + "tasks_in_progress_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "In Bearbeitung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "In Progress" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "En Progreso" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "En Cours" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "In corso" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "進行中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "진행 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "In behandeling" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Em Andamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "进行中" + } + } + } + }, + "tasks_library": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bibliothek" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Library" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Biblioteca" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bibliothèque" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Libreria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ライブラリ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "라이브러리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bibliotheek" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Biblioteca" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "库" + } + } + } + }, + "tasks_loading": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Laden..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "로딩 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载中..." + } + } + } + }, + "tasks_loading_completions": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Abschlüsse werden geladen..." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading completions..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando completados..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement des achèvements..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento completamenti..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了記録を読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 기록 로딩..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooiingen laden..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando conclusões..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载完成记录..." + } + } + } + }, + "tasks_no_completions_yet": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch Keine Abschlüsse" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No Completions Yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún No Hay Completados" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun Achèvement Pour le Moment" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun completamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了記録がありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 기록 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nog geen voltooiingen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ainda Não Há Conclusões" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无完成记录" + } + } + } + }, + "tasks_no_tasks": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクなし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无任务" + } + } + } + }, + "tasks_no_tasks_yet": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch keine Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "No tasks yet" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún no hay tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune tâche pour le moment" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクがありません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "아직 작업 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nog geen taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ainda não há tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无任务" + } + } + } + }, + "tasks_no_templates_found": { + "comment": "Text displayed when no task templates are found.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No templates found" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron plantillas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun modèle trouvé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Vorlagen gefunden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum modelo encontrado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun modello trovato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートが見つかりません" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿을 찾을 수 없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen sjablonen gevonden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到模板" + } + } + } + }, + "tasks_none": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "None" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ninguno" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "なし" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "없음" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无" + } + } + } + }, + "tasks_none_manual": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine (Manuelle Eingabe)" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "None (Manual Entry)" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ninguno (Entrada Manual)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun (Saisie Manuelle)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuno (manuale)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "なし(手動)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "없음(수동)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen (handmatig)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum (Entrada Manual)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无(手动)" + } + } + } + }, + "tasks_not_completed": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese Aufgabe wurde noch nicht abgeschlossen." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "This task has not been completed." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Esta tarea no ha sido completada." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette tâche n'a pas été terminée." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività non completata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクは未完了です" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업은 미완료입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak niet voltooid" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esta tarefa não foi concluída." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "此任务尚未完成" + } + } + } + }, + "tasks_notes": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Notizen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "备注" + } + } + } + }, + "tasks_optional_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fügen Sie beliebige zusätzliche Details zum Abschluss dieser Aufgabe hinzu." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Add any additional details about completing this task." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Agrega cualquier detalle adicional sobre completar esta tarea." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajoutez tous les détails supplémentaires sur l'achèvement de cette tâche." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi dettagli" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加の詳細を入力" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가 상세정보 입력" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voeg details toe" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicione quaisquer detalhes adicionais sobre a conclusão desta tarefa." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加其他详情" + } + } + } + }, + "tasks_optional_info": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Optionale Informationen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Optional Information" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Información Opcional" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Informations Optionnelles" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Info opzionali" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "オプション情報" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택 정보" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Optionele info" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informações Opcionais" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "可选信息" + } + } + } + }, + "tasks_optional_notes": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Optionale Notizen über die abgeschlossene Arbeit." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Optional notes about the work completed." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Notas opcionales sobre el trabajo completado." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notes optionnelles sur le travail effectué." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Note opzionali" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "オプションのメモ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택적 메모" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Optionele notities" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notas opcionais sobre o trabalho concluído." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "可选备注" + } + } + } + }, + "tasks_photos": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Photos" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto's" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fotos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片" + } + } + } + }, + "tasks_priority": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Priorität" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Priority" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Prioridad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Priorité" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Priorità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "優先度" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우선순위" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Prioriteit" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prioridade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "优先级" + } + } + } + }, + "tasks_priority_status": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Priorität & Status" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Priority & Status" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Prioridad y Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Priorité et Statut" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Priorità e Stato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "優先度とステータス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우선순위 및 상태" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Prioriteit en Status" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prioridade e Status" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "优先级和状态" + } + } + } + }, + "tasks_property": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" + } + } + } + }, + "tasks_quality_rating": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Qualitätsbewertung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Quality Rating" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Calificación de Calidad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Note de Qualité" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutazione qualità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "品質評価" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "품질 평점" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kwaliteitsbeoordeling" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliação de Qualidade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "质量评分" + } + } + } + }, + "tasks_rate_quality": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Bewerten Sie die Arbeitsqualität von 1 bis 5 Sternen." + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Rate the quality of work from 1 to 5 stars." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Califica la calidad del trabajo de 1 a 5 estrellas." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Évaluez la qualité du travail de 1 à 5 étoiles." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Valuta la qualità (1-5 stelle)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "品質を評価(1-5つ星)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "품질 평가(1-5점)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beoordeel kwaliteit (1-5 sterren)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avalie a qualidade do trabalho de 1 a 5 estrelas." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "评价工作质量(1-5星)" + } + } + } + }, + "tasks_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填" + } + } + } + }, + "tasks_restore": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wiederherstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Restore" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Restaurar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Restaurer" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "復元" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "복원" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Herstellen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Restaurar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复" + } + } + } + }, + "tasks_result": { + "comment": "A singular label for a result in a list. E.g. \"1 result\", \"2 results\".", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "result" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "resultado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "résultat" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ergebnis" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "resultado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "risultato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "결과" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "resultaat" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "条结果" + } + } + } + }, + "tasks_results": { + "comment": "Plural form of \"result\".", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "results" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "resultados" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "résultats" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ergebnisse" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "resultados" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "risultati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "件" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "결과" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "resultaten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "条结果" + } + } + } + }, + "tasks_scheduling": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Terminplanung" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Scheduling" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Programación" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Planification" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Pianificazione" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "スケジュール" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "일정" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Planning" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Agendamento" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "计划" + } + } + } + }, + "tasks_search_templates": { + "comment": "Title of a screen that allows users to search for task templates.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Search templates..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscar plantillas..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rechercher des modèles..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen suchen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Buscar modelos..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Cerca modelli..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートを検索..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿 검색..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sjablonen zoeken..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "搜索模板…" + } + } + } + }, + "tasks_select_category": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Kategorie Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Category" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Categoría" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner la Catégorie" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona categoria" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "カテゴリーを選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "카테고리 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer categorie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Categoria" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择类别" + } + } + } + }, + "tasks_select_contractor": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Auftragnehmer Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Contractor" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Contratista" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner l'Entrepreneur" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona appaltatore" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약업체 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer aannemer" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Empreiteiro" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择承包商" + } + } + } + }, + "tasks_select_frequency": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Häufigkeit Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Frequency" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Frecuencia" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner la Fréquence" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona frequenza" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "頻度を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "빈도 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer frequentie" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Frequência" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择频率" + } + } + } + }, + "tasks_select_priority": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Priorität Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Priority" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Prioridad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner la Priorité" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona priorità" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "優先度を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "우선순위 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer prioriteit" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Prioridade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择优先级" + } + } + } + }, + "tasks_select_property": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Property" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Propiedad" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner la Propriété" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona proprietà" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件を選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer eigendom" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Propriedade" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择房产" + } + } + } + }, + "tasks_select_status": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Status Auswählen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Select Status" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner le Statut" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona stato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ステータスを選択" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태 선택" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer status" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar Status" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择状态" + } + } + } + }, + "tasks_status": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Statut" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ステータス" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Status" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "状态" + } + } + } + }, + "tasks_take_photo": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto Aufnehmen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Take Photo" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tomar Foto" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prendre une Photo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Scatta foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真を撮る" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 찍기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto maken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tirar Foto" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "拍照" + } + } + } + }, + "tasks_task_details": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabendetails" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Details" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Detalles de la Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Détails de la Tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dettagli attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの詳細" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 상세" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taakgegevens" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Detalhes da Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务详情" + } + } + } + }, + "tasks_title": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Tasks" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâches" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefas" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务" + } + } + } + }, + "tasks_title_label": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabentitel" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Task Title" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Título de la Tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Titre de la tâche" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Titolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Título da Tarefa" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题" + } + } + } + }, + "tasks_title_required": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Erforderlich: Titel" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Required: Title" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Requerido: Título" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requis: Titre" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Obbligatorio: Titolo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "必須:タイトル" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "필수: 제목" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verplicht: Titel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Obrigatório: Título" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "必填:标题" + } + } + } + }, + "tasks_try_different_search": { + "comment": "Text to prompt the user to try a different search query when no task templates are found.", + "isCommentAutoGenerated": true, + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Try a different search term" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Prueba con otro término de búsqueda" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Essayez un autre terme de recherche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Versuche einen anderen Suchbegriff" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tente outro termo de busca" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Prova un altro termine di ricerca" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "別の検索ワードをお試しください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 검색어로 시도하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Probeer een andere zoekterm" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "尝试其他搜索词" + } + } + } + }, + "tasks_unarchive": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Wiederherstellen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Unarchive" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Desarchivar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Désarchiver" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アーカイブ解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보관 취소" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Archivering ongedaan" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desarquivar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消归档" + } + } + } + }, + "tasks_view_photos": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Fotos Ansehen" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "View Photos" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver Fotos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voir les Photos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真を表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto's bekijken" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver Fotos" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看照片" + } + } + } + }, + "tasks_your_name": { + "extractionState": "manual", + "localizations": { + "de": { + "stringUnit": { + "state": "translated", + "value": "Ihr Name" + } + }, + "en": { + "stringUnit": { + "state": "translated", + "value": "Your name" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu nombre" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre nom" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo nome" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの名前" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "당신의 이름" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uw naam" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seu nome" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的名字" + } + } + } + }, + "Tell us about your home": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Cuéntanos sobre tu hogar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Parlez-nous de votre logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erzähl uns von deinem Zuhause" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conte-nos sobre sua casa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Parlaci della tua casa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの住まいについて教えてください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집에 대해 알려주세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vertel ons over je woning" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "介绍一下您的家" + } + } + } + }, + "Templates will appear here once loaded": { + "comment": "A description text displayed when there are no task templates available.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Las plantillas aparecerán aquí una vez cargadas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les modèles apparaîtront ici une fois chargés" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen erscheinen hier, sobald sie geladen sind" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Os modelos aparecerão aqui após o carregamento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "I modelli appariranno qui una volta caricati" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "読み込まれるとテンプレートがここに表示されます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "불러오면 템플릿이 여기에 표시됩니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sjablonen verschijnen hier zodra ze geladen zijn" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "模板加载后将显示在此处" + } + } + } + }, + "That's Perfect!": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Perfecto!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "C'est parfait !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Perfekt!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Perfeito!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Perfetto!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完璧です!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완벽해요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dat is perfect!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "完美!" + } + } + } + }, + "The Smith Residence": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "La residencia Smith" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "La résidence Smith" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Familie Schmidt" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência Silva" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenza Rossi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "スミス邸" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "스미스 거주지" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "De woning van Smith" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "史密斯住所" + } + } + } + }, + "Toggle password visibility": { + "comment": "A button that toggles the visibility of a password.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Mostrar u ocultar contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Afficher/masquer le mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwortsichtbarkeit umschalten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mostrar/ocultar senha" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Mostra/nascondi password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードの表示を切り替え" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 표시 전환" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zichtbaarheid wachtwoord wisselen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "切换密码可见性" + } + } + } + }, + "Try a different search term": { + "comment": "A description below the \"No Templates Found\" message in the search results section of the task templates browser.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Prueba con otro término de búsqueda" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Essayez un autre terme de recherche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Versuche einen anderen Suchbegriff" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tente outro termo de busca" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Prova un altro termine di ricerca" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "別の検索ワードをお試しください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다른 검색어로 시도하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Probeer een andere zoekterm" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "尝试其他搜索词" + } + } + } + }, + "Try Again": { + "comment": "A button label that says \"Try Again\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Intentar de nuevo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Erneut versuchen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tentar novamente" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "もう一度試す" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opnieuw proberen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "重试" + } + } + } + }, + "Unarchive": { + "comment": "A button that unarchives a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Desarchivar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Désarchiver" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aus Archiv holen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desarquivar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "アーカイブ解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보관 해제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uit archief halen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消归档" + } + } + } + }, + "Unarchive task": { + "comment": "A button that unarchives a task.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Desarchivar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Désarchiver la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe aus Archiv holen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desarquivar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관 해제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak uit archief halen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消归档任务" + } + } + } + }, + "Unarchive Task": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Desarchivar tarea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Désarchiver la tâche" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe aus Archiv holen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desarquivar tarefa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ripristina attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブ解除" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관 해제" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak uit archief halen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消归档任务" + } + } + } + }, + "Upgrade to Pro for unlimited access": { + "comment": "A description of the benefit of upgrading to the Pro plan.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Pásate a Pro para acceso ilimitado" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Passez à Pro pour un accès illimité" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Upgrade auf Pro für unbegrenzten Zugriff" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Faça upgrade para o Pro e tenha acesso ilimitado" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Passa a Pro per un accesso illimitato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "Proにアップグレードして無制限に利用" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한 이용을 위해 프로로 업그레이드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Upgrade naar Pro voor onbeperkte toegang" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "升级专业版,无限畅享" + } + } + } + }, + "Use the share button to invite others": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Usa el botón de compartir para invitar a otros" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisez le bouton de partage pour inviter d'autres personnes" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Nutze den Teilen-Button, um andere einzuladen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Use o botão de compartilhar para convidar outros" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Usa il pulsante di condivisione per invitare altri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有ボタンを使って他の人を招待" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 버튼으로 다른 사람을 초대하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruik de deelknop om anderen uit te nodigen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "使用共享按钮邀请他人" + } + } + } + }, + "Using system default time": { + "comment": "A description of how a user can set a custom notification time.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Usando la hora predeterminada del sistema" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisation de l'heure par défaut du système" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Systemstandardzeit wird verwendet" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usando o horário padrão do sistema" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Uso dell'orario predefinito del sistema" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "システムの既定の時刻を使用中" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템 기본 시간 사용 중" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Standaardtijd van systeem gebruiken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "使用系统默认时间" + } + } + } + }, + "VERIFICATION CODE": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "CÓDIGO DE VERIFICACIÓN" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "CODE DE VÉRIFICATION" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "BESTÄTIGUNGSCODE" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "CÓDIGO DE VERIFICAÇÃO" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "CODICE DI VERIFICA" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証コード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "VERIFICATIECODE" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码" + } + } + } + }, + "Verify": { + "comment": "A button label that says \"Verify\".", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifier" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificar" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verifiëren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证" + } + } + } + }, + "Verify Code": { + "comment": "A button that verifies a user's reset code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificar código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifier le code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code bestätigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificar código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを認証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드 인증" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code verifiëren" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证代码" + } + } + } + }, + "Verify your email": { + "comment": "A title for a screen that asks users to verify their email address.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Verifica tu correo" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérifiez votre e-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätige deine E-Mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verifique seu e-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica la tua email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールを認証" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일을 인증하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verifieer je e-mail" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证您的邮箱" + } + } + } + }, + "Verifying...": { + "comment": "A message displayed while waiting for the email verification process to complete.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Verificando..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vérification..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wird bestätigt..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verificando..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica in corso..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verifiëren..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在验证…" + } + } + } + }, + "View %d completions": { + "comment": "A label that describes the action of viewing the completions of a task. The argument is the number of completions.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver %d finalizaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voir %d réalisations" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%d Abschlüsse anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver %d conclusões" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza %d completamenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%d件の完了を表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 %d건 보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%d voltooiingen bekijken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看 %d 条完成记录" + } + } + } + }, + "View %lld photos": { + "comment": "A button that opens a new screen showing a list of photos. The number in parentheses is replaced with the actual number of photos.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver %lld fotos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voir %lld photos" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld Fotos anzeigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver %lld fotos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza %lld foto" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld枚の写真を表示" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 %lld장 보기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld foto's bekijken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看 %lld 张照片" + } + } + } + }, + "View Photos (%lld)": { + "comment": "A button that, when tapped, opens a view displaying photos taken during a task completion. The number in parentheses is replaced with the actual number of photos.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver fotos (%lld)" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voir les photos (%lld)" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fotos anzeigen (%lld)" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver fotos (%lld)" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza foto (%lld)" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真を表示 (%lld)" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 보기 (%lld)" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto's bekijken (%lld)" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看照片 (%lld)" + } + } + } + }, + "We sent a 6-digit code to": { + "comment": "A message explaining that a verification code has been sent to their email.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviamos un código de 6 dígitos a" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nous avons envoyé un code à 6 chiffres à" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wir haben einen 6-stelligen Code gesendet an" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviamos um código de 6 dígitos para" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Abbiamo inviato un codice a 6 cifre a" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6桁のコードを次の宛先に送信しました:" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "6자리 코드를 다음으로 보냈습니다:" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "We hebben een 6-cijferige code gestuurd naar" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们已将 6 位验证码发送至" + } + } + } + }, + "We sent a 6-digit code to your email address. Enter it below to verify your account.": { + "comment": "A description below the email verification code field, instructing the user to enter the code they received.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviamos un código de 6 dígitos a tu correo. Introdúcelo abajo para verificar tu cuenta." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nous avons envoyé un code à 6 chiffres à votre adresse e-mail. Saisissez-le ci-dessous pour vérifier votre compte." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wir haben einen 6-stelligen Code an deine E-Mail-Adresse gesendet. Gib ihn unten ein, um dein Konto zu bestätigen." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviamos um código de 6 dígitos para o seu e-mail. Digite-o abaixo para verificar sua conta." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Abbiamo inviato un codice a 6 cifre al tuo indirizzo email. Inseriscilo qui sotto per verificare il tuo account." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "6桁のコードをメールアドレスに送信しました。以下に入力してアカウントを認証してください。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일 주소로 6자리 코드를 보냈습니다. 아래에 입력해 계정을 인증하세요." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "We hebben een 6-cijferige code naar je e-mailadres gestuurd. Voer die hieronder in om je account te verifiëren." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们已将 6 位验证码发送至您的邮箱。请在下方输入以验证您的账户。" + } + } + } + }, + "We'll send a 6-digit verification code to this address": { + "comment": "A footer label within the \"Forgot Password?\" view, instructing the user to check their email for a verification code.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Enviaremos un código de verificación de 6 dígitos a esta dirección" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nous enverrons un code de vérification à 6 chiffres à cette adresse" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wir senden einen 6-stelligen Bestätigungscode an diese Adresse" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Enviaremos um código de verificação de 6 dígitos para este endereço" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Invieremo un codice di verifica a 6 cifre a questo indirizzo" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "この宛先に6桁の認証コードを送信します" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 주소로 6자리 인증 코드를 보내드립니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "We sturen een 6-cijferige verificatiecode naar dit adres" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们将向此地址发送 6 位验证码" + } + } + } + }, + "Welcome to honeyDue": { + "comment": "The title of the welcome screen in the preview.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Bienvenido a honeyDue" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bienvenue sur honeyDue" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Willkommen bei honeyDue" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Bem-vindo ao honeyDue" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Benvenuto in honeyDue" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueへようこそ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue에 오신 것을 환영합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Welkom bij honeyDue" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "欢迎使用 honeyDue" + } + } + } + }, + "Welcome to Your Space": { + "comment": "A welcoming message displayed at the top of the \"Organic Empty Residences\" view.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Bienvenido a tu espacio" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bienvenue dans votre espace" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Willkommen in deinem Bereich" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Bem-vindo ao seu espaço" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Benvenuto nel tuo spazio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの空間へようこそ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내 공간에 오신 것을 환영합니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Welkom in je ruimte" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "欢迎来到您的空间" + } + } + } + }, + "Where's your home?": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Dónde está tu hogar?" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Où se trouve votre logement ?" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Wo ist dein Zuhause?" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Onde fica sua casa?" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Dov'è la tua casa?" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "お住まいはどちらですか?" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집은 어디인가요?" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Waar bevindt je woning zich?" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的家在哪里?" + } + } + } + }, + "You now have access to %@.": { + "comment": "A message displayed when a user successfully imports a residence, indicating that they now have access to it. The argument is the name of the residence that was imported.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ahora tienes acceso a %@." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez maintenant accès à %@." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast jetzt Zugriff auf %@." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Agora você tem acesso a %@." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ora hai accesso a %@." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@ を利用できるようになりました。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이제 %@을(를) 이용할 수 있습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt nu toegang tot %@." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您现在已可使用 %@。" + } + } + } + }, + "You now have full access to all Pro features!": { + "comment": "A message displayed to users after successfully upgrading to the Pro version of the app.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Ahora tienes acceso completo a todas las funciones Pro!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez désormais un accès complet à toutes les fonctionnalités Pro !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast jetzt vollen Zugriff auf alle Pro-Funktionen!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Agora você tem acesso total a todos os recursos Pro!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ora hai accesso completo a tutte le funzioni Pro!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべてのPro機能をご利用いただけるようになりました!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이제 모든 프로 기능을 이용할 수 있습니다!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt nu volledige toegang tot alle Pro-functies!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您现在已可完整使用所有专业版功能!" + } + } + } + }, + "You're all set up!": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Todo listo!" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tout est configuré !" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Alles eingerichtet!" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tudo pronto!" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutto pronto!" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設定が完了しました!" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 설정이 완료됐어요!" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je bent helemaal klaar!" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "全部设置完成!" + } + } + } + }, + "You're already subscribed": { + "comment": "A message displayed when a user is already subscribed to the app.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Ya estás suscrito" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous êtes déjà abonné" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Du bist bereits abonniert" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você já é assinante" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Sei già abbonato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "すでに登録済みです" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 구독 중입니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je bent al geabonneerd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您已订阅" + } + } + } + }, + "Your data will be synced across devices": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tus datos se sincronizarán entre dispositivos" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vos données seront synchronisées sur tous vos appareils" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Deine Daten werden geräteübergreifend synchronisiert" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seus dados serão sincronizados entre dispositivos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "I tuoi dati verranno sincronizzati tra i dispositivi" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "データは複数のデバイス間で同期されます" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "데이터가 여러 기기 간에 동기화됩니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je gegevens worden gesynchroniseerd tussen apparaten" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的数据将在多设备间同步" + } + } + } + }, + "Your Home Dashboard": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "El panel de tu hogar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre tableau de bord" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Zuhause-Dashboard" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seu painel da casa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "La tua dashboard di casa" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ホームダッシュボード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내 집 대시보드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je woningdashboard" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的家庭仪表板" + } + } + } + }, + "Your home maintenance companion": { + "comment": "The tagline for the app, describing its purpose.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu compañero para el mantenimiento del hogar" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre compagnon d'entretien du logement" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Begleiter für die Hauswartung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seu companheiro de manutenção da casa" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo assistente per la manutenzione domestica" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの住まいメンテナンスの相棒" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "당신의 집 관리 도우미" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je metgezel voor woningonderhoud" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的家居维护好帮手" + } + } + } + }, + "Your subscription is managed on another platform.": { + "comment": "A description of a user's subscription on an unspecified platform.", + "isCommentAutoGenerated": true, + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu suscripción se gestiona en otra plataforma." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre abonnement est géré sur une autre plateforme." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Abo wird auf einer anderen Plattform verwaltet." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sua assinatura é gerenciada em outra plataforma." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo abbonamento è gestito su un'altra piattaforma." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サブスクリプションは別のプラットフォームで管理されています。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구독은 다른 플랫폼에서 관리됩니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je abonnement wordt op een ander platform beheerd." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的订阅由其他平台管理。" + } + } + } + }, + "Your subscription is managed through Google Play on your Android device.": { + "localizations": { + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu suscripción se gestiona a través de Google Play en tu dispositivo Android." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre abonnement est géré via Google Play sur votre appareil Android." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Abo wird über Google Play auf deinem Android-Gerät verwaltet." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sua assinatura é gerenciada pelo Google Play no seu dispositivo Android." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo abbonamento è gestito tramite Google Play sul tuo dispositivo Android." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "サブスクリプションはAndroidデバイスのGoogle Playで管理されています。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구독은 Android 기기의 Google Play를 통해 관리됩니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je abonnement wordt beheerd via Google Play op je Android-apparaat." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的订阅通过您 Android 设备上的 Google Play 管理。" + } + } + } + }, + "30 Days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "30 Days" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "30 días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "30 jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "30 Tage" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "30 dias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "30 giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "30日間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "30일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "30 dagen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "30 天" + } + } + } + }, + "7 Days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "7 Days" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "7 días" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "7 jours" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "7 Tage" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "7 dias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "7 giorni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "7日間" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "7일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "7 dagen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "7 天" + } + } + } + }, + "At least 8 characters": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "At least 8 characters" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Al menos 8 caracteres" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Au moins 8 caractères" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Mindestens 8 Zeichen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pelo menos 8 caracteres" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Almeno 8 caratteri" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "8文字以上" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "8자 이상" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Minstens 8 tekens" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "至少 8 个字符" + } + } + } + }, + "Attic": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Attic" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Ático" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Grenier" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dachboden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sótão" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Soffitta" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "屋根裏" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "다락방" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zolder" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "阁楼" + } + } + } + }, + "Basement": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Basement" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Sótano" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sous-sol" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Keller" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Porão" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Seminterrato" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "地下室" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "지하실" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kelder" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "地下室" + } + } + } + }, + "Baths": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Baths" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Baños" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Salles de bain" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Bäder" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Banheiros" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Bagni" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "浴室数" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "욕실 수" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Badkamers" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "卫浴数" + } + } + } + }, + "Beds": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Beds" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Habitaciones" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chambres" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Betten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Quartos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Letti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ベッド数" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "침실 수" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slaapkamers" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "卧室数" + } + } + } + }, + "Built": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Built" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Construido" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Construit" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Baujahr" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Construído" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Costruito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "築年" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "건축 연도" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebouwd" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "建造年份" + } + } + } + }, + "Confirm Password": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Confirm Password" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Confirmar contraseña" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Confirmer le mot de passe" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort bestätigen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Confirmar senha" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Conferma password" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードの確認" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 확인" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord bevestigen" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "确认密码" + } + } + } + }, + "Contains a lowercase letter": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contains a lowercase letter" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contiene una letra minúscula" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contient une minuscule" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Enthält einen Kleinbuchstaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contém uma letra minúscula" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contiene una lettera minuscola" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "小文字を含む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "소문자 포함" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bevat een kleine letter" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "包含一个小写字母" + } + } + } + }, + "Contains a number": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contains a number" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contiene un número" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contient un chiffre" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Enthält eine Zahl" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contém um número" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contiene un numero" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "数字を含む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "숫자 포함" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bevat een cijfer" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "包含一个数字" + } + } + } + }, + "Contains an uppercase letter": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contains an uppercase letter" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Contiene una letra mayúscula" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contient une majuscule" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Enthält einen Großbuchstaben" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contém uma letra maiúscula" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Contiene una lettera maiuscola" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "大文字を含む" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "대문자 포함" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bevat een hoofdletter" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "包含一个大写字母" + } + } + } + }, + "Contractor management": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor management" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Gestión de contratistas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Gestion des prestataires" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Handwerkerverwaltung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gestão de prestadores" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Gestione dei fornitori" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の管理" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 관리" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beheer van aannemers" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商管理" + } + } + } + }, + "Cooling": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Cooling" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Refrigeración" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Climatisation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kühlung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Refrigeração" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Raffrescamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "冷房" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "냉방" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Koeling" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "制冷" + } + } + } + }, + "Couldn't load the task catalog": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't load the task catalog" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cargar el catálogo de tareas" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger le catalogue de tâches" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenkatalog konnte nicht geladen werden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar o catálogo de tarefas" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare il catalogo attività" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクカタログを読み込めませんでした" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 목록을 불러올 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan de takencatalogus niet laden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务目录" + } + } + } + }, + "Couldn't load your suggestions": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't load your suggestions" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar tus sugerencias" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger vos suggestions" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorschläge konnten nicht geladen werden" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar suas sugestões" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i suggerimenti" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "おすすめを読み込めませんでした" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "추천을 불러올 수 없습니다" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan je suggesties niet laden" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载推荐内容" + } + } + } + }, + "Document & warranty storage": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Document & warranty storage" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Almacenamiento de documentos y garantías" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Stockage des documents et garanties" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumenten- & Garantieablage" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Armazenamento de documentos e garantias" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivio documenti e garanzie" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類・保証書の保管" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 및 보증서 보관" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document- en garantieopslag" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档与保修存储" + } + } + } + }, + "Email": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Correo electrónico" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Email" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メール" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "邮箱" + } + } + } + }, + "Exterior": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Exterior" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Exterior" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Extérieur" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Außenbereich" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Exterior" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Esterno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "外装" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "외부" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Buitenkant" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "外部" + } + } + } + }, + "Features": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Features" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Características" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Caractéristiques" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausstattung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recursos" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caratteristiche" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "設備" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "특징" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kenmerken" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "特性" + } + } + } + }, + "Finding tasks for your home...": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Finding tasks for your home..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Buscando tareas para tu hogar..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Recherche de tâches pour votre logement..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben für dein Zuhause werden gesucht..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Buscando tarefas para sua casa..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricerca attività per la tua casa..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ご自宅のタスクを検索中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "집에 맞는 작업을 찾는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taken voor je woning zoeken..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在为您的住宅查找任务……" + } + } + } }, - "Already have an account?" : { - + "Fireplace": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Fireplace" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Chimenea" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cheminée" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kamin" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lareira" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Camino" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "暖炉" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "벽난로" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Open haard" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "壁炉" + } + } + } + }, + "Garage": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Garage" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Garaje" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Garage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Garage" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garagem" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Garage" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ガレージ" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "차고" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garage" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "车库" + } + } + } + }, + "Heating": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Heating" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Calefacción" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chauffage" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Heizung" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aquecimento" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Riscaldamento" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "暖房" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "난방" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verwarming" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "供暖" + } + } + } + }, + "Interior": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Interior" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Interior" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Intérieur" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Innenbereich" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Interior" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Interno" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "内装" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "내부" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Binnenkant" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "内部" + } + } + } }, - "Already have an account? Log in" : { - "comment" : "A link that directs users to log in if they already have an account.", - "isCommentAutoGenerated" : true + "Landscaping": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Landscaping" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Jardinería" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aménagement paysager" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Garten" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Paisagismo" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Giardinaggio" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "造園" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "조경" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tuinaanleg" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "庭院绿化" + } + } + } }, - "Animation Type" : { - "comment" : "A label above the picker for selecting an animation type.", - "isCommentAutoGenerated" : true + "Loading the task catalog...": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Loading the task catalog..." + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Cargando el catálogo de tareas..." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chargement du catalogue de tâches..." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenkatalog wird geladen..." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carregando o catálogo de tarefas..." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento del catalogo attività..." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクカタログを読み込み中..." + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 목록을 불러오는 중..." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Takencatalogus laden..." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "正在加载任务目录……" + } + } + } }, - "app_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "Next 30 Days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Next 30 Days" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Próximos 30 días" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "fr": { + "stringUnit": { + "state": "translated", + "value": "30 prochains jours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nächste 30 Tage" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Próximos 30 dias" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "it": { + "stringUnit": { + "state": "translated", + "value": "Prossimi 30 giorni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ja": { + "stringUnit": { + "state": "translated", + "value": "今後30日間" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ko": { + "stringUnit": { + "state": "translated", + "value": "향후 30일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Komende 30 dagen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未来 30 天" } } } }, - "app_tagline" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verwalten Sie Ihre Immobilien einfach" + "Next 7 Days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Next 7 Days" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage your properties with ease" + "es": { + "stringUnit": { + "state": "translated", + "value": "Próximos 7 días" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administra tus propiedades con facilidad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "7 prochains jours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gérez vos propriétés facilement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nächste 7 Tage" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gestisci le tue proprietà con facilità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Próximos 7 dias" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロパティを簡単に管理" + "it": { + "stringUnit": { + "state": "translated", + "value": "Prossimi 7 giorni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산을 쉽게 관리하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "今後7日間" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beheer uw eigendommen met gemak" + "ko": { + "stringUnit": { + "state": "translated", + "value": "향후 7일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerencie suas propriedades com facilidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Komende 7 dagen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "轻松管理您的房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未来 7 天" } } } }, - "Archive" : { - "comment" : "The text of a button that archives a task.", - "isCommentAutoGenerated" : true - }, - "Archive task" : { - "comment" : "A label displayed as a button that archives a task.", - "isCommentAutoGenerated" : true - }, - "Archive Task" : { - "comment" : "A button that archives a task. The text \"Archive Task\" is a placeholder and should be replaced with the actual translation.", - "isCommentAutoGenerated" : true - }, - "Are you sure you want to archive \"%@\"? You can unarchive it later from archived tasks." : { - "comment" : "A confirmation alert that appears when a user attempts to archive a task. The argument is the title of the task that is being archived.", - "isCommentAutoGenerated" : true - }, - "Are you sure you want to archive this task? You can unarchive it later from archived tasks." : { - "comment" : "An alert message displayed when the user taps the \"Archive\" button on a task. It confirms that the user intends to archive the task and provides a hint that the task can be restored later.", - "isCommentAutoGenerated" : true - }, - "Are you sure you want to cancel this task? You can undo this later." : { - "comment" : "An alert message displayed when a user taps the \"Cancel Task\" button in a task list. It confirms that the user intends to cancel the task and provides a way to undo the action.", - "isCommentAutoGenerated" : true - }, - "Are you sure you want to remove %@ from this residence?" : { - - }, - "Attached photo" : { - "comment" : "A label for an attached photo.", - "isCommentAutoGenerated" : true - }, - "auth_account_info" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontoinformationen" + "No personalised suggestions yet — browse the full catalog or skip this step.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No personalised suggestions yet — browse the full catalog or skip this step." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Aún no hay sugerencias personalizadas — explora el catálogo completo u omite este paso." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información de la cuenta" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune suggestion personnalisée pour le moment — parcourez le catalogue complet ou passez cette étape." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations du compte" + "de": { + "stringUnit": { + "state": "translated", + "value": "Noch keine persönlichen Vorschläge — durchstöbere den Katalog oder überspringe diesen Schritt." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni account" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ainda não há sugestões personalizadas — explore o catálogo completo ou pule esta etapa." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウント情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ancora nessun suggerimento personalizzato — sfoglia il catalogo completo o salta questo passaggio." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "おすすめはまだありません。全カタログを見るか、このステップをスキップしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accountinformatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "아직 맞춤 추천이 없습니다 — 전체 목록을 둘러보거나 이 단계를 건너뛰세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações da conta" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nog geen persoonlijke suggesties — blader door de volledige catalogus of sla deze stap over." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "账户信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无个性化推荐——浏览完整目录或跳过此步骤。" } } } }, - "auth_already_have_account" : { - "comment" : "Text on the \"Already have an account?\" link in the auth register screen. Navigates to the auth login screen.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Already have an account?" + "No templates available right now.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No templates available right now." } - } - } - }, - "auth_creating_account" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Creating Account..." + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay plantillas disponibles ahora mismo." + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun modèle disponible pour le moment." + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Derzeit keine Vorlagen verfügbar." + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum modelo disponível no momento." + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun modello disponibile al momento." + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "現在、利用できるテンプレートはありません。" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "현재 사용 가능한 템플릿이 없습니다." + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Momenteel geen sjablonen beschikbaar." + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "当前暂无可用模板。" } } } }, - "auth_dont_have_account" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noch kein Konto?" + "Overdue": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Overdue" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Don't have an account?" + "es": { + "stringUnit": { + "state": "translated", + "value": "Atrasado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿No tienes una cuenta?" + "fr": { + "stringUnit": { + "state": "translated", + "value": "En retard" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas encore de compte ?" + "de": { + "stringUnit": { + "state": "translated", + "value": "Überfällig" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non hai un account?" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Atrasado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントをお持ちでないですか?" + "it": { + "stringUnit": { + "state": "translated", + "value": "In ritardo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정이 없으신가요?" + "ja": { + "stringUnit": { + "state": "translated", + "value": "期限超過" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen account?" + "ko": { + "stringUnit": { + "state": "translated", + "value": "기한 초과" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não tem uma conta?" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te laat" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "还没有账户?" + "zh": { + "stringUnit": { + "state": "translated", + "value": "已逾期" } } } }, - "auth_enter_email" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie Ihre E-Mail ein" + "Password": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter your email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contraseña" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresa tu correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez votre email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci la tua email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールアドレスを入力" + "it": { + "stringUnit": { + "state": "translated", + "value": "Password" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일을 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワード" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer uw e-mail in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Digite seu email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入您的电子邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码" } } } }, - "auth_enter_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie Ihr Passwort ein" + "Passwords match": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Passwords match" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter your password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Las contraseñas coinciden" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresa tu contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les mots de passe correspondent" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez votre mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwörter stimmen überein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci la tua password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "As senhas coincidem" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードを入力" + "it": { + "stringUnit": { + "state": "translated", + "value": "Le password corrispondono" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호를 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードが一致しています" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer uw wachtwoord in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 일치" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Digite sua senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoorden komen overeen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入您的密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码一致" } } } }, - "auth_forgot_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code senden" + "Pending": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Pending" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Send Reset Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Pendiente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar Código" + "fr": { + "stringUnit": { + "state": "translated", + "value": "En attente" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoyer le code" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ausstehend" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invia codice di reset" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pendente" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "リセットコードを送信" + "it": { + "stringUnit": { + "state": "translated", + "value": "In attesa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "재설정 코드 보내기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "保留中" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resetcode verzenden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "대기 중" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar Código" + "nl": { + "stringUnit": { + "state": "translated", + "value": "In behandeling" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "发送重置验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "待处理" } } } }, - "auth_forgot_email_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail" + "Pool": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Pool" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Piscina" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo Electrónico" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Piscine" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Pool" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Piscina" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールアドレス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Piscina" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "プール" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "수영장" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zwembad" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电子邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "泳池" } } } }, - "auth_forgot_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort vergessen?" + "Primary Flooring": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Primary Flooring" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Forgot Password?" + "es": { + "stringUnit": { + "state": "translated", + "value": "Suelo principal" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Olvidaste tu Contraseña?" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Revêtement principal" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mot de passe oublié ?" + "de": { + "stringUnit": { + "state": "translated", + "value": "Hauptbodenbelag" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password dimenticata?" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Piso principal" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードをお忘れですか?" + "it": { + "stringUnit": { + "state": "translated", + "value": "Pavimento principale" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호를 잊으셨나요?" + "ja": { + "stringUnit": { + "state": "translated", + "value": "主な床材" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord vergeten?" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주요 바닥재" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esqueceu a Senha?" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Hoofdvloer" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "忘记密码?" + "zh": { + "stringUnit": { + "state": "translated", + "value": "主要地板" } } } }, - "auth_forgot_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie Ihre E-Mail ein, um einen Code zu erhalten" + "Properties": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Properties" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter your email to receive a reset code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedades" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresa tu correo para recibir un código" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriétés" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez votre email pour recevoir un code" + "de": { + "stringUnit": { + "state": "translated", + "value": "Objekte" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci la tua email per ricevere un codice di reset" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóveis" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "リセットコードを受信するにはメールアドレスを入力してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "재설정 코드를 받으려면 이메일을 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer uw e-mail in om een resetcode te ontvangen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Digite seu email para receber um código" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woningen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入您的电子邮件以接收重置验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产" } } } }, - "auth_forgot_success" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wenn ein Konto existiert, wurde ein Code gesendet" + "Roof Type": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Roof Type" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "If an account exists, a reset code has been sent" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tipo de techo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si existe una cuenta, se envió un código" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Type de toiture" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si un compte existe, un code a été envoyé" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dachtyp" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se esiste un account, è stato inviato un codice di reset" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tipo de telhado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントが存在する場合、リセットコードが送信されました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tipo di tetto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정이 존재하면 재설정 코드가 전송되었습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "屋根の種類" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Als er een account bestaat, is er een resetcode verzonden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "지붕 유형" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se uma conta existir, um código foi enviado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Daktype" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "如果账户存在,重置验证码已发送" + "zh": { + "stringUnit": { + "state": "translated", + "value": "屋顶类型" } } } }, - "auth_forgot_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort vergessen" + "Septic": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Septic" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Forgot Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Fosa séptica" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Olvidaste tu Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fosse septique" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mot de passe oublié" + "de": { + "stringUnit": { + "state": "translated", + "value": "Klärgrube" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password dimenticata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fossa séptica" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードをお忘れですか" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fossa settica" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 찾기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "浄化槽" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord vergeten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "정화조" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esqueceu a Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Septisch" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "忘记密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "化粪池" } } } }, - "auth_have_account" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bereits ein Konto? Anmelden" + "Sprinklers": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sprinklers" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Already have an account? Sign In" + "es": { + "stringUnit": { + "state": "translated", + "value": "Aspersores" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Ya tienes cuenta? Inicia Sesión" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Arroseurs" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Déjà un compte ? Se connecter" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sprinkler" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hai già un account? Accedi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aspersores" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すでにアカウントをお持ちですか?ログイン" + "it": { + "stringUnit": { + "state": "translated", + "value": "Irrigatori" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이미 계정이 있으신가요? 로그인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スプリンクラー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Heeft u al een account? Inloggen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "스프링클러" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Já tem conta? Entrar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sproeiers" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "已有账户?登录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "喷淋系统" } } } }, - "auth_hide_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort verbergen" + "Sq Ft": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sq Ft" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hide password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Pies²" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ocultar contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pieds carrés" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Masquer le mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Quadratfuß" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nascondi password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pés quadrados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードを隠す" + "it": { + "stringUnit": { + "state": "translated", + "value": "Piedi quadrati" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 숨기기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "平方フィート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord verbergen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "제곱피트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ocultar senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vierkante voet" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "隐藏密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "平方英尺" } } } }, - "auth_join_honeydue" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bei honeyDue anmelden" + "Systems": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Systems" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Join honeyDue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sistemas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Únete a honeyDue" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Systèmes" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rejoindre honeyDue" + "de": { + "stringUnit": { + "state": "translated", + "value": "Systeme" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unisciti a honeyDue" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sistemas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDueに参加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impianti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue 가입" + "ja": { + "stringUnit": { + "state": "translated", + "value": "設備" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Word lid van honeyDue" + "ko": { + "stringUnit": { + "state": "translated", + "value": "시스템" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Junte-se à honeyDue" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Systemen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加入honeyDue" + "zh": { + "stringUnit": { + "state": "translated", + "value": "系统" } } } }, - "auth_login_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anmelden" + "Total Tasks": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Total Tasks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign In" + "es": { + "stringUnit": { + "state": "translated", + "value": "Total de tareas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Iniciar Sesión" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Total des tâches" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se connecter" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben gesamt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accedi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Total de tarefas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ログイン" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività totali" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로그인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク合計" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inloggen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "전체 작업" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Totaal aantal taken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "登录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务总数" } } } }, - "auth_login_failed" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anmeldung fehlgeschlagen" + "Unlimited properties": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlimited properties" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Login Failed" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedades ilimitadas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error de Inicio de Sesión" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriétés illimitées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Échec de connexion" + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbegrenzte Immobilien" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accesso fallito" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóveis ilimitados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ログインに失敗しました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà illimitate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로그인 실패" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件数無制限" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inloggen mislukt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한 부동산" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha no Login" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbeperkt aantal woningen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "登录失败" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无限房产" } } } }, - "auth_login_password_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort" + "Unlimited tasks": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlimited tasks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tareas ilimitadas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâches illimitées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbegrenzte Aufgaben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefas ilimitadas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività illimitate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク数無制限" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord" + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한 작업" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbeperkt aantal taken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无限任务" } } } }, - "auth_login_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verwalten Sie Ihre Immobilien einfach" + "Username": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Username" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage your properties with ease" + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre de usuario" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administra tus propiedades con facilidad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom d'utilisateur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gérez vos propriétés facilement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzername" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gestisci le tue proprietà con facilità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome de usuário" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロパティを簡単に管理" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome utente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산을 쉽게 관리하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beheer uw eigendommen met gemak" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 이름" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerencie suas propriedades com facilidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikersnaam" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "轻松管理您的房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名" } } } }, - "auth_login_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "Water Heater": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Water Heater" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Calentador de agua" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chauffe-eau" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "de": { + "stringUnit": { + "state": "translated", + "value": "Warmwasserbereiter" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aquecedor de água" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "it": { + "stringUnit": { + "state": "translated", + "value": "Scaldabagno" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ja": { + "stringUnit": { + "state": "translated", + "value": "給湯器" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ko": { + "stringUnit": { + "state": "translated", + "value": "온수기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Boiler" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "zh": { + "stringUnit": { + "state": "translated", + "value": "热水器" } } } }, - "auth_login_username_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzername oder E-Mail" + "Never Forget Again": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Never Forget Again" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Username or Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Nunca más lo olvides" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuario o Correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ne rien oublier" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom d'utilisateur ou Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nie wieder vergessen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome utente o email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nunca mais esqueça" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザー名またはメールアドレス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non dimenticare più nulla" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자 이름 또는 이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "もう忘れない" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gebruikersnaam of e-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시는 잊지 마세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuário ou Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nooit meer vergeten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户名或电子邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "再也不会忘记" } } } }, - "auth_logout" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abmelden" + "Your memory just got an upgrade": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your memory just got an upgrade" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Logout" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu memoria acaba de mejorar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cerrar sesión" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre mémoire passe au niveau supérieur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Déconnexion" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Gedächtnis bekommt ein Upgrade" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esci" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sua memória ganhou um upgrade" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ログアウト" + "it": { + "stringUnit": { + "state": "translated", + "value": "La tua memoria ha appena ricevuto un upgrade" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로그아웃" + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたの記憶力がアップグレード" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uitloggen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "당신의 기억력이 한층 업그레이드됩니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sair" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je geheugen is zojuist geüpgraded" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "退出" + "zh": { + "stringUnit": { + "state": "translated", + "value": "为你的记忆力升级" } } } }, - "auth_no_account" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kein Konto? Registrieren" + "Warranties at Your Fingertips": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranties at Your Fingertips" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Don't have an account? Register" + "es": { + "stringUnit": { + "state": "translated", + "value": "Garantías al alcance de tu mano" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿No tienes cuenta? Regístrate" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vos garanties à portée de main" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas de compte ? S'inscrire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantien immer griffbereit" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non hai un account? Registrati" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garantias na palma da mão" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントをお持ちでないですか?登録" + "it": { + "stringUnit": { + "state": "translated", + "value": "Le garanzie a portata di mano" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정이 없으신가요? 가입하기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証書をすぐ手元に" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen account? Registreren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증서를 손끝에서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não tem conta? Cadastre-se" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garanties binnen handbereik" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "没有账户?注册" + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修信息触手可及" } } } }, - "auth_or_divider" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "oder" + "No more digging through drawers": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No more digging through drawers" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "or" + "es": { + "stringUnit": { + "state": "translated", + "value": "No más buscar entre cajones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "o" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fini de fouiller dans les tiroirs" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ou" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kein Wühlen in Schubladen mehr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "oppure" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Chega de vasculhar gavetas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "または" + "it": { + "stringUnit": { + "state": "translated", + "value": "Basta rovistare nei cassetti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "또는" + "ja": { + "stringUnit": { + "state": "translated", + "value": "もう引き出しを探さなくていい" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "of" + "ko": { + "stringUnit": { + "state": "translated", + "value": "더 이상 서랍을 뒤질 필요 없어요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "ou" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Niet meer in lades hoeven graven" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "或" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无需再翻找抽屉" } } } }, - "auth_password_suggestion" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tippen Sie auf das Passwortfeld für einen starken Passwortvorschlag" + "The Whole Family's In": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The Whole Family's In" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tap the password field for a strong password suggestion" + "es": { + "stringUnit": { + "state": "translated", + "value": "Toda la familia participa" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toca el campo de contraseña para una sugerencia de contraseña segura" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toute la famille y participe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appuyez sur le champ mot de passe pour une suggestion de mot de passe fort" + "de": { + "stringUnit": { + "state": "translated", + "value": "Die ganze Familie ist dabei" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tocca il campo password per un suggerimento di password sicura" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A família toda participa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "強力なパスワードの提案を得るにはパスワードフィールドをタップ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutta la famiglia partecipa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "강력한 비밀번호 제안을 받으려면 비밀번호 필드를 탭하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "家族みんなで管理" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tik op het wachtwoordveld voor een sterk wachtwoordvoorstel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "온 가족이 함께" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toque no campo de senha para uma sugestão de senha forte" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het hele gezin doet mee" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "点击密码字段获取强密码建议" + "zh": { + "stringUnit": { + "state": "translated", + "value": "全家齐参与" } } } }, - "auth_passwords_dont_match" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwörter stimmen nicht überein" + "Teamwork makes the dream work": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Teamwork makes the dream work" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwords don't match" + "es": { + "stringUnit": { + "state": "translated", + "value": "El trabajo en equipo lo hace todo más fácil" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Las contraseñas no coinciden" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'union fait la force" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les mots de passe ne correspondent pas" + "de": { + "stringUnit": { + "state": "translated", + "value": "Gemeinsam läuft's einfach besser" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le password non corrispondono" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Juntos a gente vai mais longe" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードが一致しません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il lavoro di squadra fa la differenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호가 일치하지 않습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "チームワークで夢を叶える" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoorden komen niet overeen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "함께하면 더 쉬워집니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "As senhas não coincidem" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Samen sta je sterker" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "密码不匹配" + "zh": { + "stringUnit": { + "state": "translated", + "value": "团队协作,事半功倍" } } } }, - "auth_register_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konto erstellen" + "Smart Notifications": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Smart Notifications" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Create Account" + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones inteligentes" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crear Cuenta" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications intelligentes" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Créer un compte" + "de": { + "stringUnit": { + "state": "translated", + "value": "Intelligente Benachrichtigungen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crea account" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações inteligentes" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントを作成" + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche intelligenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 만들기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スマート通知" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account aanmaken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "스마트 알림" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Criar Conta" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slimme meldingen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "创建账户" + "zh": { + "stringUnit": { + "state": "translated", + "value": "智能通知" } } } }, - "auth_register_confirm_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort bestätigen" + "Act right from your lock screen": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Act right from your lock screen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirm Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Actúa desde tu pantalla de bloqueo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmar Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Agissez depuis votre écran verrouillé" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmer le mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Direkt vom Sperrbildschirm aus handeln" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conferma password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aja direto da tela de bloqueio" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードを確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "Agisci direttamente dalla schermata di blocco" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 확인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ロック画面からすぐ操作" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord bevestigen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잠금 화면에서 바로 처리하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmar Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Reageer direct vanaf je vergrendelscherm" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "确认密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "在锁屏界面即可操作" } } } }, - "auth_register_email" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail" + "Home Screen Widgets": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Home Screen Widgets" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Widgets en la pantalla de inicio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo Electrónico" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Widgets d'écran d'accueil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Startbildschirm-Widgets" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Widgets na tela inicial" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールアドレス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Widget per la schermata Home" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ホーム画面ウィジェット" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "홈 화면 위젯" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Widgets op je beginscherm" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电子邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "主屏幕小组件" } } } }, - "auth_register_first_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vorname" + "Your tasks at a glance": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your tasks at a glance" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "First Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tus tareas de un vistazo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vos tâches en un coup d'œil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prénom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Deine Aufgaben auf einen Blick" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Suas tarefas em um relance" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Le tue attività in un colpo d'occhio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをひと目で確認" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voornaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "할 일을 한눈에" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je taken in één oogopslag" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "名字" + "zh": { + "stringUnit": { + "state": "translated", + "value": "一目了然查看任务" } } } }, - "auth_register_last_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachname" + "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \"when did I last...?\" moments.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \"when did I last...?\" moments." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Last Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Los recordatorios inteligentes te mantienen al día con los filtros de la calefacción, la limpieza de canaletas y todo lo demás. Se acabaron los momentos de \"¿cuándo fue la última vez que...?\"." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apellido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Des rappels intelligents vous gardent à jour sur les filtres de chaudière, le nettoyage des gouttières et tout le reste. Fini les « c'était quand la dernière fois… ? »." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Intelligente Erinnerungen halten dich bei Heizungsfiltern, Dachrinnenreinigung und allem dazwischen auf dem Laufenden. Keine \"Wann war das nochmal...?\"-Momente mehr." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cognome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lembretes inteligentes mantêm você em dia com filtros do aquecedor, limpeza de calhas e tudo o mais. Chega de momentos \"quando foi a última vez que...?\"." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "姓" + "it": { + "stringUnit": { + "state": "translated", + "value": "Promemoria intelligenti ti aiutano a non perdere di vista filtri della caldaia, pulizia delle grondaie e tutto il resto. Niente più momenti \"quando l'ho fatto l'ultima volta...?\"." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スマートリマインダーが、暖房フィルターや雨どい掃除など、あらゆるメンテナンスを忘れさせません。「前回いつやったっけ?」はもう不要です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Achternaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "스마트 알림으로 보일러 필터 교체부터 배수로 청소까지 빠짐없이 챙기세요. \"마지막으로 언제 했더라?\" 고민은 이제 끝입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sobrenome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slimme herinneringen houden je op de hoogte van cv-filters, dakgoten schoonmaken en alles daartussenin. Geen \"wanneer deed ik dat ook alweer...?\"-momenten meer." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "姓氏" + "zh": { + "stringUnit": { + "state": "translated", + "value": "智能提醒助你及时打理炉具滤网、清理排水沟等各项事务,再也不用纠结“上次是什么时候来着?”。" } } } }, - "auth_register_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort" + "Snap a photo of your receipts and warranties. When something breaks, you'll know exactly what's covered—instantly.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Snap a photo of your receipts and warranties. When something breaks, you'll know exactly what's covered—instantly." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Toma una foto de tus recibos y garantías. Cuando algo se rompa, sabrás al instante qué está cubierto." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prenez en photo vos reçus et vos garanties. En cas de panne, vous saurez instantanément ce qui est couvert." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Fotografiere deine Belege und Garantien. Wenn etwas kaputtgeht, weißt du sofort, was abgedeckt ist." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tire uma foto dos seus recibos e garantias. Quando algo quebrar, você saberá exatamente o que está coberto—na hora." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Scatta una foto di scontrini e garanzie. Quando qualcosa si rompe, saprai subito cosa è coperto." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "レシートや保証書を撮影するだけ。何かが壊れても、保証対象がすぐにわかります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord" + "ko": { + "stringUnit": { + "state": "translated", + "value": "영수증과 보증서를 사진으로 찍어 두세요. 고장이 나면 무엇이 보장되는지 바로 확인할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Maak een foto van je bonnetjes en garanties. Als er iets kapotgaat, weet je meteen precies wat er gedekt is." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "拍下你的收据和保修单。一旦东西坏了,你立刻就能知道哪些在保修范围内。" } } } }, - "auth_register_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registrieren Sie sich, um zu beginnen" + "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \"didn't know.\"": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \"didn't know.\"" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign up to get started" + "es": { + "stringUnit": { + "state": "translated", + "value": "Comparte tu hogar con tu familia. Todos ven lo que hay que hacer y nadie puede decir que \"no lo sabía\"." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Regístrate para comenzar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partagez votre maison avec votre famille. Chacun voit ce qu'il y a à faire et personne ne pourra dire qu'il « ne savait pas »." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inscrivez-vous pour commencer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Teile dein Zuhause mit der Familie. Jeder sieht, was zu tun ist – und niemand kann behaupten, er habe es \"nicht gewusst\"." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registrati per iniziare" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhe sua casa com a família. Todos veem o que precisa ser feito, e ninguém pode dizer que \"não sabia\"." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サインアップして始めましょう" + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi la tua casa con i familiari. Tutti vedono cosa c'è da fare e nessuno può dire \"non lo sapevo\"." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가입하여 시작하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "家族と家を共有しましょう。やるべきことが全員に見えるので、「知らなかった」とは言わせません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meld u aan om te beginnen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가족과 집을 공유하세요. 모두가 해야 할 일을 함께 보고, 누구도 \"몰랐다\"고 할 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cadastre-se para começar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deel je huis met gezinsleden. Iedereen ziet wat er moet gebeuren en niemand kan zeggen dat hij van niets wist." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "注册开始使用" + "zh": { + "stringUnit": { + "state": "translated", + "value": "与家人共享你的家。每个人都能看到要做的事,谁也别想说“我不知道”。" } } } }, - "auth_register_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konto erstellen" + "Get actionable reminders that let you complete tasks right from the notification. No need to even open the app.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Get actionable reminders that let you complete tasks right from the notification. No need to even open the app." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Create Account" + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibe recordatorios con los que completas tareas directamente desde la notificación. Ni siquiera tienes que abrir la app." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crear Cuenta" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Recevez des rappels interactifs pour accomplir vos tâches directement depuis la notification. Sans même ouvrir l'appli." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Créer un compte" + "de": { + "stringUnit": { + "state": "translated", + "value": "Erhalte Erinnerungen, mit denen du Aufgaben direkt aus der Benachrichtigung erledigst. Du musst die App nicht einmal öffnen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crea account" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Receba lembretes interativos que permitem concluir tarefas direto da notificação. Sem nem precisar abrir o app." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントを作成" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevi promemoria interattivi che ti permettono di completare le attività direttamente dalla notifica. Non serve nemmeno aprire l'app." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 만들기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知から直接タスクを完了できる、操作可能なリマインダー。アプリを開く必要もありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account aanmaken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림에서 바로 할 일을 완료할 수 있습니다. 앱을 열 필요도 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Criar Conta" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Krijg herinneringen waarmee je taken direct vanuit de melding afrondt. Je hoeft de app niet eens te openen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "创建账户" + "zh": { + "stringUnit": { + "state": "translated", + "value": "获取可直接操作的提醒,在通知中即可完成任务,连应用都不用打开。" } } } }, - "auth_register_username" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzername" + "Quick access to upcoming tasks and reminders directly from your home screen. Stay on top of maintenance without opening the app.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Quick access to upcoming tasks and reminders directly from your home screen. Stay on top of maintenance without opening the app." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Username" + "es": { + "stringUnit": { + "state": "translated", + "value": "Acceso rápido a tareas y recordatorios próximos directamente desde tu pantalla de inicio. Mantente al día con el mantenimiento sin abrir la app." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuario" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Accédez rapidement à vos tâches et rappels à venir depuis votre écran d'accueil. Gérez l'entretien sans ouvrir l'appli." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom d'utilisateur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Schneller Zugriff auf anstehende Aufgaben und Erinnerungen direkt vom Startbildschirm. Behalte die Wartung im Blick, ohne die App zu öffnen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome utente" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Acesso rápido a tarefas e lembretes diretamente da tela inicial. Fique em dia com a manutenção sem abrir o app." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザー名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso rapido alle attività e ai promemoria in arrivo direttamente dalla schermata Home. Resta al passo con la manutenzione senza aprire l'app." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ホーム画面から、今後のタスクやリマインダーにすばやくアクセス。アプリを開かずにメンテナンスを管理できます。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gebruikersnaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "홈 화면에서 예정된 할 일과 알림에 바로 접근하세요. 앱을 열지 않고도 관리 일정을 챙길 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuário" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Snel toegang tot komende taken en herinneringen direct vanaf je beginscherm. Houd onderhoud bij zonder de app te openen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户名" + "zh": { + "stringUnit": { + "state": "translated", + "value": "在主屏幕即可快速查看即将到来的任务和提醒。无需打开应用,轻松掌握维护进度。" } } } }, - "auth_reset_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort zurücksetzen" + "spent yearly on repairs that could've been prevented": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "spent yearly on repairs that could've been prevented" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reset Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "se gastan al año en reparaciones que se podrían haber evitado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restablecer Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "dépensés chaque année en réparations évitables" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Réinitialiser" + "de": { + "stringUnit": { + "state": "translated", + "value": "jährlich für vermeidbare Reparaturen ausgegeben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reimposta password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "gastos por ano em reparos que poderiam ter sido evitados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードをリセット" + "it": { + "stringUnit": { + "state": "translated", + "value": "spesi ogni anno in riparazioni che si potevano evitare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 재설정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "防げたはずの修理に毎年かかる費用" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord resetten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "예방할 수 있었던 수리에 매년 지출되는 비용" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Redefinir Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "per jaar uitgegeven aan reparaties die voorkomen hadden kunnen worden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重置密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "每年花在本可避免的维修上的费用" } } } }, - "auth_reset_code_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code" + "of homebuyers lack emergency funds for repairs": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "of homebuyers lack emergency funds for repairs" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reset Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "de los compradores de vivienda no tienen fondos de emergencia para reparaciones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código" + "fr": { + "stringUnit": { + "state": "translated", + "value": "des acheteurs n'ont pas de fonds d'urgence pour les réparations" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code" + "de": { + "stringUnit": { + "state": "translated", + "value": "der Hauskäufer haben keine Rücklagen für Reparaturen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Codice di reset" + "pt": { + "stringUnit": { + "state": "translated", + "value": "dos compradores de imóveis não têm reserva de emergência para reparos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "リセットコード" + "it": { + "stringUnit": { + "state": "translated", + "value": "degli acquirenti di case non ha fondi di emergenza per le riparazioni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "재설정 코드" + "ja": { + "stringUnit": { + "state": "translated", + "value": "の住宅購入者が修理用の緊急資金を持っていない" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resetcode" + "ko": { + "stringUnit": { + "state": "translated", + "value": "의 주택 구매자가 수리용 비상금이 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código" + "nl": { + "stringUnit": { + "state": "translated", + "value": "van de huizenkopers heeft geen noodfonds voor reparaties" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重置验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "的购房者缺乏维修应急资金" } } } }, - "auth_reset_confirm_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Neues Passwort bestätigen" + "say sharing chores is key to a happy home": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "say sharing chores is key to a happy home" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirm New Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "dicen que compartir las tareas es clave para un hogar feliz" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmar Nueva Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "estiment que partager les tâches est essentiel à un foyer heureux" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmer le nouveau mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "sagen, dass geteilte Aufgaben der Schlüssel zu einem glücklichen Zuhause sind" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conferma nuova password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "dizem que dividir as tarefas é essencial para um lar feliz" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "新しいパスワードを確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "dice che condividere le faccende è la chiave di una casa felice" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "새 비밀번호 확인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "が家事の分担は幸せな家庭の鍵だと回答" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bevestig nieuw wachtwoord" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 집안일 분담이 행복한 가정의 비결이라고 답했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confirmar Nova Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "zegt dat taken delen de sleutel is tot een gelukkig huis" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "确认新密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "认为分担家务是幸福家庭的关键" } } } }, - "auth_reset_new_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Neues Passwort" + "faster task completion with actionable notifications": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "faster task completion with actionable notifications" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "New Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "más rápido se completan las tareas con notificaciones accionables" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nueva Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "de tâches accomplies plus vite grâce aux notifications interactives" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nouveau mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "schnellere Aufgabenerledigung mit interaktiven Benachrichtigungen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nuova password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "mais rapidez na conclusão de tarefas com notificações interativas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "新しいパスワード" + "it": { + "stringUnit": { + "state": "translated", + "value": "completamento delle attività più rapido con le notifiche interattive" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "새 비밀번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "操作可能な通知でタスク完了がより速く" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nieuw wachtwoord" + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 가능한 알림으로 더 빠른 할 일 완료" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nova Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "snellere taakafronding met actiegerichte meldingen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "新密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "通过可操作通知更快完成任务" } } } }, - "auth_reset_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie Ihr neues Passwort ein" + "of widget users complete tasks on time": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "of widget users complete tasks on time" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter your new password" + "es": { + "stringUnit": { + "state": "translated", + "value": "de los usuarios de widgets completan sus tareas a tiempo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresa tu nueva contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "des utilisateurs de widgets accomplissent leurs tâches à temps" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez votre nouveau mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "der Widget-Nutzer erledigen Aufgaben pünktlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci la tua nuova password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "dos usuários de widgets concluem tarefas no prazo" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "新しいパスワードを入力してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "degli utenti dei widget completa le attività in tempo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "새 비밀번호를 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "のウィジェット利用者が期限内にタスクを完了" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer uw nieuwe wachtwoord in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "의 위젯 사용자가 제때 할 일을 완료합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Digite sua nova senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "van de widgetgebruikers rondt taken op tijd af" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入您的新密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "的小组件用户能按时完成任务" } } } }, - "auth_reset_success" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort erfolgreich zurückgesetzt" + "Unlimited Properties": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlimited Properties" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password reset successfully" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedades ilimitadas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contraseña restablecida correctamente" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Propriétés illimitées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mot de passe réinitialisé avec succès" + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbegrenzte Immobilien" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Password reimpostata con successo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóveis ilimitados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードが正常にリセットされました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà illimitate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호가 성공적으로 재설정되었습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無制限の物件登録" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord succesvol gereset" + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한 부동산" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Senha redefinida com sucesso" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbeperkt panden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "密码重置成功" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无限房产" } } } }, - "auth_reset_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort zurücksetzen" + "Document Vault": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Document Vault" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reset Password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Bóveda de documentos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restablecer Contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coffre-fort de documents" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Réinitialiser le mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumententresor" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reimposta password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cofre de documentos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードをリセット" + "it": { + "stringUnit": { + "state": "translated", + "value": "Archivio documenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 재설정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメント保管庫" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord resetten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 보관함" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Redefinir Senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documentenkluis" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重置密码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档保险库" } } } }, - "auth_security" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sicherheit" + "Family Sharing": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Family Sharing" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Security" + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir en familia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguridad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partage familial" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sécurité" + "de": { + "stringUnit": { + "state": "translated", + "value": "Familienfreigabe" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sicurezza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhamento familiar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "セキュリティ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Condivisione in famiglia" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보안" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファミリー共有" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beveiliging" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가족 공유" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Segurança" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Delen met gezin" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "安全" + "zh": { + "stringUnit": { + "state": "translated", + "value": "家庭共享" } } } }, - "auth_show_password" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passwort anzeigen" + "Contractor Sharing": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor Sharing" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show password" + "es": { + "stringUnit": { + "state": "translated", + "value": "Compartir con contratistas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mostrar contraseña" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partage avec les artisans" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afficher le mot de passe" + "de": { + "stringUnit": { + "state": "translated", + "value": "Handwerker-Freigabe" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mostra password" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhamento com prestadores" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "パスワードを表示" + "it": { + "stringUnit": { + "state": "translated", + "value": "Condivisione con i tecnici" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비밀번호 표시" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の共有" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wachtwoord tonen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 공유" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mostrar senha" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Delen met vakmensen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "显示密码" - } - } - } - }, - "auth_sign_in" : { - "comment" : "Button text that allows a user to sign in.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign In" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商共享" } } } }, - "auth_sign_in_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Melden Sie sich an, um Ihre Immobilien zu verwalten" + "Actionable Notifications": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Actionable Notifications" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign in to manage your properties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificaciones accionables" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inicia sesión para administrar tus propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notifications interactives" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connectez-vous pour gérer vos propriétés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Interaktive Benachrichtigungen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accedi per continuare con honeyDue" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificações interativas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDueを続けるにはログインしてください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifiche interattive" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue를 계속 사용하려면 로그인하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "操作可能な通知" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Log in om door te gaan met honeyDue" + "ko": { + "stringUnit": { + "state": "translated", + "value": "실행 가능한 알림" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entre para gerenciar suas propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Actiegerichte meldingen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "登录以继续使用honeyDue" + "zh": { + "stringUnit": { + "state": "translated", + "value": "可操作通知" } } } }, - "auth_sign_up" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registrieren" + "Track every home you own—vacation houses, rentals, you name it": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Track every home you own—vacation houses, rentals, you name it" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sign Up" + "es": { + "stringUnit": { + "state": "translated", + "value": "Lleva el control de cada casa que tengas: casas de vacaciones, alquileres, lo que sea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registrarse" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Suivez tous vos biens : résidences secondaires, locations, et plus encore" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "S'inscrire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Verwalte jedes deiner Häuser – Ferienhäuser, Mietobjekte, was auch immer" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registrati" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Acompanhe todos os seus imóveis—casas de férias, aluguéis, o que for" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サインアップ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tieni traccia di ogni casa che possiedi: case vacanza, affitti e altro ancora" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가입하기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "別荘や賃貸など、所有するすべての家を管理" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Registreren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "별장, 임대 주택 등 소유한 모든 집을 관리하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cadastrar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Houd al je woningen bij—vakantiehuizen, huurwoningen, noem maar op" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "注册" + "zh": { + "stringUnit": { + "state": "translated", + "value": "追踪你名下的每一处房产——度假屋、出租房,应有尽有" } } } }, - "auth_signing_in" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anmelden..." + "All your warranties, receipts, and manuals in one searchable place": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "All your warranties, receipts, and manuals in one searchable place" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signing In..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Todas tus garantías, recibos y manuales en un solo lugar con búsqueda" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Iniciando sesión..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toutes vos garanties, reçus et manuels au même endroit, faciles à retrouver" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connexion..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle Garantien, Belege und Anleitungen durchsuchbar an einem Ort" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accesso in corso..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Todas as suas garantias, recibos e manuais em um só lugar pesquisável" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ログイン中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Tutte le tue garanzie, scontrini e manuali in un unico posto consultabile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로그인 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証書、レシート、マニュアルをすべて検索可能な一箇所に" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inloggen..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증서, 영수증, 설명서를 한곳에서 검색하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrando..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Al je garanties, bonnetjes en handleidingen op één doorzoekbare plek" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "正在登录..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "所有保修单、收据和说明书集中存放,一搜即得" } } } }, - "auth_signing_in_with_apple" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mit Apple anmelden..." + "Get everyone on the same page—literally": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Get everyone on the same page—literally" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signing in with Apple..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Pon a todos en sintonía, literalmente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Iniciando sesión con Apple..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mettez tout le monde sur la même longueur d'onde" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Connexion avec Apple..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Bring alle auf denselben Stand – wortwörtlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Accesso con Apple in corso..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Deixe todo mundo na mesma página—literalmente" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appleでログイン中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Mettete tutti d'accordo, letteralmente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apple로 로그인 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "全員が同じ情報を共有" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inloggen met Apple..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "모두가 같은 정보를 공유하게 하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrando com Apple..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Krijg iedereen op één lijn—letterlijk" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "正在使用Apple登录..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "让每个人都步调一致" } } } }, - "auth_start_managing" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beginnen Sie noch heute mit der Verwaltung Ihrer Immobilien" + "Share your trusted contractors with family and friends": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share your trusted contractors with family and friends" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Start managing your properties today" + "es": { + "stringUnit": { + "state": "translated", + "value": "Comparte tus contratistas de confianza con familia y amigos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comienza a administrar tus propiedades hoy" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partagez vos artisans de confiance avec votre famille et vos amis" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Commencez à gérer vos propriétés dès aujourd'hui" + "de": { + "stringUnit": { + "state": "translated", + "value": "Teile deine vertrauten Handwerker mit Familie und Freunden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inizia a gestire le tue proprietà oggi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhe seus prestadores de confiança com família e amigos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "今日からプロパティの管理を始めましょう" + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi i tuoi tecnici di fiducia con familiari e amici" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "오늘부터 부동산 관리를 시작하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "信頼できる業者を家族や友人と共有" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Begin vandaag met het beheren van uw eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "믿을 수 있는 업체를 가족 및 친구와 공유하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comece a gerenciar suas propriedades hoje" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deel je vertrouwde vakmensen met familie en vrienden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "今天开始管理您的房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "与亲友分享你信赖的承包商" } } } }, - "auth_verify_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestätigen" + "Complete tasks directly from notifications—no app opening needed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Complete tasks directly from notifications—no app opening needed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verify" + "es": { + "stringUnit": { + "state": "translated", + "value": "Completa tareas directamente desde las notificaciones, sin abrir la app" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Accomplissez vos tâches directement depuis les notifications, sans ouvrir l'appli" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vérifier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Erledige Aufgaben direkt aus Benachrichtigungen – ohne die App zu öffnen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifica" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conclua tarefas direto das notificações—sem precisar abrir o app" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "Completa le attività direttamente dalle notifiche, senza aprire l'app" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "확인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知から直接タスクを完了—アプリを開く必要なし" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifiëren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림에서 바로 할 일을 완료하세요. 앱을 열 필요가 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Rond taken direct vanuit meldingen af—geen app openen nodig" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证" + "zh": { + "stringUnit": { + "state": "translated", + "value": "直接在通知中完成任务——无需打开应用" } } } }, - "auth_verify_check_inbox" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail-Bestätigung erforderlich. Überprüfen Sie Ihr Postfach auf einen 6-stelligen Code." + "Quick actions right from your home screen": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Quick actions right from your home screen" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email verification is required. Check your inbox for a 6-digit code." + "es": { + "stringUnit": { + "state": "translated", + "value": "Acciones rápidas desde tu pantalla de inicio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se requiere verificación de correo. Revisa tu bandeja de entrada para un código de 6 dígitos." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Des actions rapides depuis votre écran d'accueil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La vérification de l'email est requise. Vérifiez votre boîte de réception pour un code à 6 chiffres." + "de": { + "stringUnit": { + "state": "translated", + "value": "Schnellaktionen direkt vom Startbildschirm" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "È richiesta la verifica dell'email. Controlla la tua casella di posta" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ações rápidas direto da tela inicial" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メール認証が必要です。受信トレイを確認してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Azioni rapide direttamente dalla schermata Home" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일 인증이 필요합니다. 받은 편지함을 확인하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ホーム画面からすばやく操作" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mailverificatie is vereist. Controleer uw inbox" + "ko": { + "stringUnit": { + "state": "translated", + "value": "홈 화면에서 바로 빠른 작업을" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificação de email é necessária. Verifique sua caixa de entrada para um código de 6 dígitos." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Snelle acties direct vanaf je beginscherm" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "需要验证电子邮件。请检查您的收件箱" + "zh": { + "stringUnit": { + "state": "translated", + "value": "在主屏幕即可快速操作" } } } }, - "auth_verify_code_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestätigungscode" + "Monthly": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Monthly" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verification Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Mensual" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Verificación" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mensuel" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code de vérification" + "de": { + "stringUnit": { + "state": "translated", + "value": "Monatlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Codice di verifica" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Mensal" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "認証コード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Mensile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "인증 코드" + "ja": { + "stringUnit": { + "state": "translated", + "value": "月額" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificatiecode" + "ko": { + "stringUnit": { + "state": "translated", + "value": "월간" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Verificação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Maandelijks" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "按月" } } } }, - "auth_verify_code_must_be_6" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Der Code muss 6 Ziffern haben" + "Yearly": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Yearly" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code must be 6 digits" + "es": { + "stringUnit": { + "state": "translated", + "value": "Anual" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El código debe tener 6 dígitos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annuel" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le code doit contenir 6 chiffres" + "de": { + "stringUnit": { + "state": "translated", + "value": "Jährlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il codice deve essere di 6 cifre" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Anual" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "コードは6桁である必要があります" + "it": { + "stringUnit": { + "state": "translated", + "value": "Annuale" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "코드는 6자리여야 합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "年額" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code moet 6 cijfers zijn" + "ko": { + "stringUnit": { + "state": "translated", + "value": "연간" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O código deve ter 6 dígitos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Jaarlijks" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证码必须是6位数字" + "zh": { + "stringUnit": { + "state": "translated", + "value": "按年" } } } }, - "auth_verify_email_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail bestätigen" + "Just $1.99/month": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Just $1.99/month" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verify Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solo $1.99/mes" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Seulement 1,99 $/mois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vérifier l'email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur 1,99 $/Monat" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifica email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Apenas $1.99/mês" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールを確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "Solo 1,99 $/mese" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일 인증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "月額$1.99" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail verifiëren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "월 $1.99" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slechts $1,99/maand" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证邮箱" + "zh": { + "stringUnit": { + "state": "translated", + "value": "仅需 $1.99/月" } } } }, - "auth_verify_help_text" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keinen Code erhalten? Überprüfen Sie Ihren Spam-Ordner oder kontaktieren Sie den Support." + "Save 30%": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Save 30%" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Didn't receive the code? Check your spam folder or contact support." + "es": { + "stringUnit": { + "state": "translated", + "value": "Ahorra 30%" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿No recibiste el código? Revisa tu carpeta de spam o contacta soporte." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Économisez 30 %" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code non reçu ? Vérifiez votre dossier spam ou contactez le support." + "de": { + "stringUnit": { + "state": "translated", + "value": "30 % sparen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non hai ricevuto il codice? Controlla la cartella spam o invia di nuovo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Economize 30%" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "コードが届きませんか?迷惑メールフォルダを確認するか、再送信してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Risparmia il 30%" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "코드를 받지 못하셨나요? 스팸 폴더를 확인하거나 다시 보내세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "30%お得" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code niet ontvangen? Controleer uw spammap of verstuur opnieuw" + "ko": { + "stringUnit": { + "state": "translated", + "value": "30% 할인" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não recebeu o código? Verifique sua pasta de spam ou entre em contato com o suporte." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bespaar 30%" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "没有收到验证码?请检查垃圾邮件文件夹或重新发送" + "zh": { + "stringUnit": { + "state": "translated", + "value": "立省 30%" } } } }, - "auth_verify_must_verify" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sie müssen Ihre E-Mail-Adresse bestätigen, um fortzufahren" + "For You": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "For You" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "You must verify your email address to continue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Para ti" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Debes verificar tu correo electrónico para continuar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pour vous" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous devez vérifier votre adresse email pour continuer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Für dich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Devi verificare il tuo indirizzo email per continuare" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Para você" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続行するにはメールアドレスを確認する必要があります" + "it": { + "stringUnit": { + "state": "translated", + "value": "Per te" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속하려면 이메일 주소를 인증해야 합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "あなたへのおすすめ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "U moet uw e-mailadres verifiëren om door te gaan" + "ko": { + "stringUnit": { + "state": "translated", + "value": "추천" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Você deve verificar seu email para continuar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voor jou" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您必须验证您的电子邮件地址才能继续" + "zh": { + "stringUnit": { + "state": "translated", + "value": "为你推荐" } } } }, - "auth_verify_resend" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code erneut senden" + "Browse All": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Browse All" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resend Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver todo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reenviar Código" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tout parcourir" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Renvoyer le code" + "de": { + "stringUnit": { + "state": "translated", + "value": "Alle ansehen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invia di nuovo il codice" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver tudo" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "コードを再送信" + "it": { + "stringUnit": { + "state": "translated", + "value": "Sfoglia tutto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "코드 다시 보내기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべて見る" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code opnieuw verzenden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "전체 보기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reenviar Código" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alles bekijken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重新发送验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "浏览全部" } } } }, - "auth_verify_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie den 6-stelligen Code ein" + "%1$@ %2$@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter the 6-digit code sent to your email" + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresa el código de 6 dígitos enviado a tu correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez le code à 6 chiffres envoyé à votre email" + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci il codice a 6 cifre inviato alla tua email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールに送信された6桁のコードを入力してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일로 전송된 6자리 코드를 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer de 6-cijferige code in die naar uw e-mail is verzonden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Digite o código de 6 dígitos enviado para seu email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入发送到您邮箱的6位验证码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@ %2$@" } } } }, - "auth_verify_success" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail erfolgreich bestätigt" + "%1$@, %2$@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email verified successfully" + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo verificado correctamente" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email vérifié avec succès" + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email verificata con successo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールが正常に確認されました" + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일이 성공적으로 인증되었습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、%2$@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail succesvol geverifieerd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email verificado com sucesso" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "邮箱验证成功" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$@" } } } }, - "auth_verify_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail bestätigen" + "%1$@, %2$@ priority, due %3$@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$@ priority, due %3$@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verify Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, prioridad %2$@, vence %3$@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar Correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, priorité %2$@, échéance %3$@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vérifier l'email" + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, Priorität %2$@, fällig am %3$@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifica email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, prioridade %2$@, vence em %3$@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールを確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, priorità %2$@, scadenza %3$@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일 인증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、優先度%2$@、期限%3$@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail verifiëren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, 우선순위 %2$@, 기한 %3$@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verificar Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, prioriteit %2$@, vervalt %3$@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证邮箱" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$@优先级,截止 %3$@" } } } }, - "auth_verify_your_email" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail bestätigen" + "%1$@, %2$lld tasks, %3$lld overdue": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld tasks, %3$lld overdue" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verify Your Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld tareas, %3$lld atrasadas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifica tu correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld tâches, %3$lld en retard" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vérifiez votre email" + "de": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld Aufgaben, %3$lld überfällig" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifica la tua email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld tarefas, %3$lld atrasadas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールを確認" + "it": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld attività, %3$lld in ritardo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일 인증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%1$@、タスク%2$lld件、期限切れ%3$lld件" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifieer uw e-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%1$@, 작업 %2$lld개, 기한 초과 %3$lld개" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verifique seu email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%1$@, %2$lld taken, %3$lld te laat" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "验证您的邮箱" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%1$@,%2$lld 项任务,%3$lld 项逾期" } } } }, - "auth_welcome_back" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Willkommen zurück" + "%@ is required": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%@ is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Welcome Back" + "es": { + "stringUnit": { + "state": "translated", + "value": "%@ es obligatorio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bienvenido de nuevo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%@ est requis" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bon retour" + "de": { + "stringUnit": { + "state": "translated", + "value": "%@ ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bentornato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%@ é obrigatório" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "おかえりなさい" + "it": { + "stringUnit": { + "state": "translated", + "value": "%@ è obbligatorio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "다시 오신 것을 환영합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@は必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Welkom terug" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@은(는) 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bem-vindo de volta" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@ is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "欢迎回来" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%@为必填项" } } } }, - "Back" : { - - }, - "Back to all photos" : { - "comment" : "A button that dismisses a sheet and returns to the previous screen.", - "isCommentAutoGenerated" : true - }, - "Back to Login" : { - "comment" : "A button label that takes the user back to the login screen.", - "isCommentAutoGenerated" : true - }, - "Browse Task Templates" : { - - }, - "By: %@" : { - "comment" : "A line in the checkout view displaying the name of the contractor who completed a task.", - "isCommentAutoGenerated" : true - }, - "Cancel" : { - "comment" : "The label of a button that dismisses an alert.", - "isCommentAutoGenerated" : true - }, - "Cancel anytime in Settings • No commitment" : { - - }, - "Cancel task" : { - "comment" : "A button that cancels a task.", - "isCommentAutoGenerated" : true - }, - "Cancel Task" : { - - }, - "Caption" : { - "comment" : "A label displayed above the caption of an image in the photo viewer.", - "isCommentAutoGenerated" : true - }, - "Change" : { - "comment" : "A button that allows the user to change the time in a notification.", - "isCommentAutoGenerated" : true - }, - "Check Your Email" : { - "comment" : "A heading that instructs the user to check their email for a verification code.", - "isCommentAutoGenerated" : true - }, - "Check your spam folder if you don't see it" : { - "comment" : "A description below the \"Send New Code\" button, instructing the user to check their spam folder if they haven't received the verification code.", - "isCommentAutoGenerated" : true - }, - "Choose from common home maintenance tasks or create your own below" : { - - }, - "Choose your plan" : { - - }, - "Choose Your Plan" : { - "comment" : "A heading displayed at the top of the feature comparison view.", - "isCommentAutoGenerated" : true - }, - "Close" : { - - }, - "Code expires in 15 minutes" : { - "comment" : "A description of how long the verification code is valid for.", - "isCommentAutoGenerated" : true - }, - "common_add" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hinzufügen" + "Add": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add" + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter" + "de": { + "stringUnit": { + "state": "translated", + "value": "Hinzufügen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "追加" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "추가" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toevoegen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加" + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加" } } } }, - "common_back" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zurück" + "Add new contractor": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add new contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Back" + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir nuevo contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atrás" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Retour" + "de": { + "stringUnit": { + "state": "translated", + "value": "Neuen Dienstleister hinzufügen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indietro" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar novo prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "戻る" + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi nuovo professionista" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "뒤로" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を追加" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terug" + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 업체 추가" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuwe vakman toevoegen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "返回" + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加新承包商" } } } }, - "common_cancel" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abbrechen" + "Add new document": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add new document" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancel" + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir nuevo documento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter un document" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler" + "de": { + "stringUnit": { + "state": "translated", + "value": "Neues Dokument hinzufügen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annulla" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar novo documento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キャンセル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi nuovo documento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "취소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類を追加" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuleren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "새 문서 추가" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Nieuw document toevoegen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消" + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加新文档" } } } }, - "common_close" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Schließen" + "An error occurred while importing the contractor.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An error occurred while importing the contractor." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Close" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ocurrió un error al importar el contratista." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cerrar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur est survenue lors de l'import du prestataire." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fermer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Beim Importieren des Dienstleisters ist ein Fehler aufgetreten." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chiudi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocorreu um erro ao importar o prestador." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "閉じる" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore durante l'importazione del professionista." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "닫기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者のインポート中にエラーが発生しました。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sluiten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 가져오는 중 오류가 발생했습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fechar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er ging iets mis bij het importeren van de vakman." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "关闭" + "zh": { + "stringUnit": { + "state": "translated", + "value": "导入承包商时出错。" } } } }, - "common_delete" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Löschen" + "An error occurred while joining the residence.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An error occurred while joining the residence." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ocurrió un error al unirte a la residencia." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur est survenue lors de l'adhésion au logement." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Beim Beitritt zur Wohnung ist ein Fehler aufgetreten." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocorreu um erro ao entrar na residência." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore durante l'accesso alla residenza." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居への参加中にエラーが発生しました。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주거지에 참여하는 중 오류가 발생했습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Excluir" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er ging iets mis bij het deelnemen aan de woning." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入住所时出错。" } } } }, - "common_done" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fertig" + "An error occurred. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An error occurred. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Done" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ocurrió un error. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Listo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur est survenue. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminé" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ein Fehler ist aufgetreten. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fatto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocorreu um erro. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラーが発生しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klaar" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류가 발생했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pronto" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er ging iets mis. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成" + "zh": { + "stringUnit": { + "state": "translated", + "value": "发生错误,请重试。" } } } }, - "common_edit" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bearbeiten" + "Apple Sign In failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Apple Sign In failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló el inicio de sesión con Apple. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion Apple a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Apple-Anmeldung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no login com a Apple. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso con Apple non riuscito. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleサインインに失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple 로그인에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 登录失败,请重试。" } } } }, - "common_error" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler" + "Apple Sign In is not available. Please use email login.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Apple Sign In is not available. Please use email login." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error" + "es": { + "stringUnit": { + "state": "translated", + "value": "El inicio de sesión con Apple no está disponible. Usa el correo electrónico." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion Apple n'est pas disponible. Veuillez utiliser la connexion par e-mail." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Apple-Anmeldung ist nicht verfügbar. Bitte melde dich per E-Mail an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Errore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O login com a Apple não está disponível. Use o login por e-mail." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "エラー" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'accesso con Apple non è disponibile. Usa l'accesso via email." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "오류" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleサインインは利用できません。メールでログインしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fout" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple 로그인을 사용할 수 없습니다. 이메일 로그인을 이용해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple is niet beschikbaar. Log in met e-mail." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "错误" - } - } - } - }, - "common_import" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Import" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 登录不可用,请使用邮箱登录。" } } } }, - "common_loading" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wird geladen..." + "Archived": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Archived" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivada" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Archivé" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Archiviert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Archiviata" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "アーカイブ済み" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "보관됨" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gearchiveerd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "已归档" } } } }, - "common_no" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nein" + "Blue-green with warm accents": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Blue-green with warm accents" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No" + "es": { + "stringUnit": { + "state": "translated", + "value": "Verde azulado con acentos cálidos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bleu-vert aux accents chauds" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non" + "de": { + "stringUnit": { + "state": "translated", + "value": "Blaugrün mit warmen Akzenten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "No" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Azul-esverdeado com tons quentes" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "いいえ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Blu-verde con accenti caldi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "아니오" + "ja": { + "stringUnit": { + "state": "translated", + "value": "青緑に温かみのあるアクセント" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nee" + "ko": { + "stringUnit": { + "state": "translated", + "value": "청록색과 따뜻한 포인트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Blauwgroen met warme accenten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "否" + "zh": { + "stringUnit": { + "state": "translated", + "value": "蓝绿配暖色点缀" } } } }, - "common_ok" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "Bold red with warm highlights": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Bold red with warm highlights" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "es": { + "stringUnit": { + "state": "translated", + "value": "Rojo intenso con toques cálidos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rouge vif aux touches chaudes" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kräftiges Rot mit warmen Highlights" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Vermelho intenso com destaques quentes" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "it": { + "stringUnit": { + "state": "translated", + "value": "Rosso intenso con tocchi caldi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "확인" + "ja": { + "stringUnit": { + "state": "translated", + "value": "鮮やかな赤に温かいハイライト" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "ko": { + "stringUnit": { + "state": "translated", + "value": "강렬한 빨강과 따뜻한 하이라이트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "OK" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fel rood met warme tinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "确定" + "zh": { + "stringUnit": { + "state": "translated", + "value": "醒目红配暖色高光" } } } }, - "common_retry" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erneut versuchen" + "Cancelled": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Cancelled" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Retry" + "es": { + "stringUnit": { + "state": "translated", + "value": "Cancelada" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reintentar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Annulé" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Réessayer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgebrochen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Riprova" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cancelado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "再試行" + "it": { + "stringUnit": { + "state": "translated", + "value": "Annullata" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "재시도" + "ja": { + "stringUnit": { + "state": "translated", + "value": "キャンセル済み" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opnieuw proberen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "취소됨" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tentar Novamente" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geannuleerd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重试" + "zh": { + "stringUnit": { + "state": "translated", + "value": "已取消" } } } }, - "common_save" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Speichern" + "Code must be %lld digits": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Code must be %lld digits" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Save" + "es": { + "stringUnit": { + "state": "translated", + "value": "El código debe tener %lld dígitos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guardar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code doit comporter %lld chiffres" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enregistrer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Code muss %lld Ziffern haben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salva" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código deve ter %lld dígitos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice deve avere %lld cifre" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "저장" + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードは%lld桁である必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Opslaan" + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드는 %lld자리여야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code moet %lld cijfers bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码须为 %lld 位数字" } } } }, - "common_share" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share" + "Completed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Completed" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Completada" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Abgeschlossen" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Completata" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료됨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooid" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "已完成" } } } }, - "common_success" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erfolg" + "Contractor": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Success" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Éxito" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Succès" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Successo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "成功" + "it": { + "stringUnit": { + "state": "translated", + "value": "Professionista" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "성공" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Succes" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sucesso" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vakman" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "成功" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商" } } } }, - "common_yes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ja" + "Contractor not found. It may have been deleted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor not found. It may have been deleted." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yes" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista no encontrado. Es posible que se haya eliminado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sí" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire introuvable. Il a peut-être été supprimé." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Oui" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister nicht gefunden. Möglicherweise wurde er gelöscht." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sì" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador não encontrado. Pode ter sido excluído." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "はい" + "it": { + "stringUnit": { + "state": "translated", + "value": "Professionista non trovato. Potrebbe essere stato eliminato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "예" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者が見つかりません。削除された可能性があります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ja" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 찾을 수 없습니다. 삭제되었을 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sim" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vakman niet gevonden. Mogelijk verwijderd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "是" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到承包商,可能已被删除。" } } } }, - "Compare Free vs Pro" : { - "comment" : "A button label that links to a view comparing free and pro plans.", - "isCommentAutoGenerated" : true - }, - "Complete" : { - "comment" : "A button label that indicates a task has been completed.", - "isCommentAutoGenerated" : true - }, - "Complete task" : { - "comment" : "A label displayed as a button that completes a task.", - "isCommentAutoGenerated" : true - }, - "Complete Task" : { - "comment" : "A button label that says \"Complete Task\".", - "isCommentAutoGenerated" : true - }, - "Completion Animation" : { - "comment" : "The title of the view.", - "isCommentAutoGenerated" : true - }, - "Completion Animation, %@" : { - - }, - "Completion history for %@" : { - "comment" : "A sheet that shows a user's completions history for a task. The argument is the name of the task.", - "isCommentAutoGenerated" : true - }, - "Completion photo%@" : { - "comment" : "A label for the photo view. The argument is the caption of the photo.", - "isCommentAutoGenerated" : true - }, - "Completion Photos" : { - "comment" : "The title for the view that shows a user's photo submissions.", - "isCommentAutoGenerated" : true - }, - "Completions (%lld)" : { - - }, - "completions at %@" : { - "comment" : "A subheading describing the content of the honeycomb view.", - "isCommentAutoGenerated" : true - }, - "CONFIRM PASSWORD" : { - - }, - "Continue" : { - - }, - "Continue with Free" : { - - }, - "Contractor actions" : { - "comment" : "A label for the menu button that appears in the navigation bar.", - "isCommentAutoGenerated" : true - }, - "Contractor Imported" : { - - }, - "Contractors" : { - "comment" : "A tab label for the contractors section.", - "isCommentAutoGenerated" : true - }, - "contractors_add_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister hinzufügen" + "Couldn't start upload (server returned %lld).": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Couldn't start upload (server returned %lld)." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo iniciar la subida (el servidor devolvió %lld)." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de démarrer l'envoi (le serveur a renvoyé %lld)." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter un prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Upload konnte nicht gestartet werden (Server gab %lld zurück)." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível iniciar o envio (o servidor retornou %lld)." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile avviare il caricamento (il server ha restituito %lld)." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップロードを開始できませんでした(サーバー応答%lld)。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업로드를 시작할 수 없습니다 (서버 응답 %lld)." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uploaden kon niet starten (server gaf %lld terug)." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法开始上传(服务器返回 %lld)。" } } } }, - "contractors_add_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister hinzufügen" + "Create account": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Create account" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "Crear cuenta" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Créer un compte" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter un prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto erstellen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Criar conta" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Crea account" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントを作成" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정 만들기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Account aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建账户" } } } }, - "contractors_add_to_favorites" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zu Favoriten hinzufügen" + "Deep blues and coral tones": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Deep blues and coral tones" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add to Favorites" + "es": { + "stringUnit": { + "state": "translated", + "value": "Azules profundos y tonos coral" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar a Favoritos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bleus profonds et tons corail" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter aux Favoris" + "de": { + "stringUnit": { + "state": "translated", + "value": "Tiefe Blautöne und Korall" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi ai preferiti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Azuis profundos e tons de coral" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お気に入りに追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Blu intenso e toni corallo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "즐겨찾기에 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "深い青とコーラルの色調" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toevoegen aan favorieten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "짙은 파랑과 코랄 톤" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar aos Favoritos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Diepblauw met koraaltinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加到收藏" + "zh": { + "stringUnit": { + "state": "translated", + "value": "深蓝配珊瑚色调" } } } }, - "contractors_added_by_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hinzugefügt von" + "Deep navy with sky blue": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Deep navy with sky blue" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Added By" + "es": { + "stringUnit": { + "state": "translated", + "value": "Azul marino con azul cielo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregado Por" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bleu marine profond et bleu ciel" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouté Par" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dunkles Marineblau mit Himmelblau" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiunto da" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Azul-marinho profundo com azul-celeste" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "追加者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Blu navy intenso con azzurro cielo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "추가한 사람" + "ja": { + "stringUnit": { + "state": "translated", + "value": "深いネイビーにスカイブルー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toegevoegd door" + "ko": { + "stringUnit": { + "state": "translated", + "value": "짙은 네이비와 하늘색" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionado Por" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Diep marineblauw met hemelsblauw" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加人" + "zh": { + "stringUnit": { + "state": "translated", + "value": "深藏青配天蓝" } } } }, - "contractors_address_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "Delete": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Delete" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Address" + "es": { + "stringUnit": { + "state": "translated", + "value": "Eliminar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dirección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "de": { + "stringUnit": { + "state": "translated", + "value": "Löschen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indirizzo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Excluir" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "住所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Elimina" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "주소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "削除" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adres" + "ko": { + "stringUnit": { + "state": "translated", + "value": "삭제" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verwijderen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "地址" + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除" } } } }, - "contractors_all_specialties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle Fachgebiete" + "Dismiss error": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Dismiss error" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "All Specialties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Descartar error" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas las Especialidades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ignorer l'erreur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toutes les Spécialités" + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler schließen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tutte le specialità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Dispensar erro" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべての専門" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ignora errore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모든 전문 분야" + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラーを閉じる" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle specialiteiten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류 닫기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas as Especialidades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout sluiten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "所有专业" + "zh": { + "stringUnit": { + "state": "translated", + "value": "关闭错误提示" } } } }, - "contractors_associated_property_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zugehörige Immobilie" + "Document not found. It may have been deleted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Document not found. It may have been deleted." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Associated Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Documento no encontrado. Es posible que se haya eliminado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad Asociada" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Document introuvable. Il a peut-être été supprimé." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété Associée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument nicht gefunden. Möglicherweise wurde es gelöscht." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà associata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documento não encontrado. Pode ter sido excluído." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "関連物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Documento non trovato. Potrebbe essere stato eliminato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "연관 부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類が見つかりません。削除された可能性があります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gekoppeld eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 찾을 수 없습니다. 삭제되었을 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade Associada" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document niet gevonden. Mogelijk verwijderd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "关联房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到文档,可能已被删除。" } } } }, - "contractors_average_rating_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Durchschnittsbewertung" + "Documents": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Documents" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Average Rating" + "es": { + "stringUnit": { + "state": "translated", + "value": "Documentos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Calificación Promedio" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Documents" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note Moyenne" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Valutazione media" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documentos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "平均評価" + "it": { + "stringUnit": { + "state": "translated", + "value": "Documenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "평균 평점" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメント" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gemiddelde beoordeling" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avaliação Média" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "平均评分" + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档" } } } }, - "contractors_basic_info_footer" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich: Name" + "Earth greens and golden hues": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Earth greens and golden hues" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required: Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Verdes terrosos y tonos dorados" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido: Nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Verts terreux et teintes dorées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis : Nom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Erdige Grüntöne und Goldnuancen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio: Nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verdes terrosos e tons dourados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須:名前" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verdi terra e tonalità dorate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수: 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アースグリーンと黄金色" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht: Naam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "어스 그린과 골든 색조" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório: Nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aardse groentinten en goudtinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填:名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "大地绿配金黄色调" } } } }, - "contractors_basic_info_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grundinformationen" + "Elegant grayscale": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Elegant grayscale" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Basic Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Escala de grises elegante" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información Básica" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Niveaux de gris élégants" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations de Base" + "de": { + "stringUnit": { + "state": "translated", + "value": "Elegante Graustufen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni di base" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tons de cinza elegantes" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "基本情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Scala di grigi elegante" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기본 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "上品なグレースケール" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Basisinformatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "우아한 그레이스케일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações Básicas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Elegant grijstinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "基本信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "雅致灰阶" } } } }, - "contractors_call_action" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anrufen" + "Feature not available.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Feature not available." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Call" + "es": { + "stringUnit": { + "state": "translated", + "value": "Función no disponible." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Llamar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fonctionnalité non disponible." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appeler" + "de": { + "stringUnit": { + "state": "translated", + "value": "Funktion nicht verfügbar." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chiama" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recurso indisponível." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "電話する" + "it": { + "stringUnit": { + "state": "translated", + "value": "Funzione non disponibile." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전화하기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この機能は利用できません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bellen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용할 수 없는 기능입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ligar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Functie niet beschikbaar." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "拨打电话" + "zh": { + "stringUnit": { + "state": "translated", + "value": "功能不可用。" } } } }, - "contractors_city_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stadt" + "File not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "File not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "City" + "es": { + "stringUnit": { + "state": "translated", + "value": "Archivo no encontrado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ciudad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fichier introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ville" + "de": { + "stringUnit": { + "state": "translated", + "value": "Datei nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Città" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Arquivo não encontrado." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "市区町村" + "it": { + "stringUnit": { + "state": "translated", + "value": "File non trovato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "도시" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルが見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stad" + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일을 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bestand niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "城市" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到文件。" } } } }, - "contractors_clear_action" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Löschen" + "Forgot password": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Forgot password" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Clear" + "es": { + "stringUnit": { + "state": "translated", + "value": "Olvidé mi contraseña" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limpiar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe oublié" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Effacer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort vergessen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancella" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esqueci a senha" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クリア" + "it": { + "stringUnit": { + "state": "translated", + "value": "Password dimenticata" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "지우기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをお忘れですか" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wissen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 찾기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limpar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord vergeten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "清除" + "zh": { + "stringUnit": { + "state": "translated", + "value": "忘记密码" } } } }, - "contractors_company_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Firma" + "Fresh green with turquoise": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Fresh green with turquoise" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Company" + "es": { + "stringUnit": { + "state": "translated", + "value": "Verde fresco con turquesa" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Empresa" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vert frais et turquoise" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entreprise" + "de": { + "stringUnit": { + "state": "translated", + "value": "Frisches Grün mit Türkis" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Azienda" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verde vivo com turquesa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "会社" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verde fresco con turchese" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "회사" + "ja": { + "stringUnit": { + "state": "translated", + "value": "爽やかなグリーンにターコイズ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bedrijf" + "ko": { + "stringUnit": { + "state": "translated", + "value": "산뜻한 초록과 청록" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Empresa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fris groen met turquoise" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "公司" + "zh": { + "stringUnit": { + "state": "translated", + "value": "清新绿配青绿" } } } }, - "contractors_completed_tasks" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d abgeschlossene Aufgaben" + "Google Sign In failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Google Sign In failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d completed tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló el inicio de sesión con Google. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d tareas completadas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion Google a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d tâches terminées" + "de": { + "stringUnit": { + "state": "translated", + "value": "Google-Anmeldung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d attività completate" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no login com o Google. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d 件の完了タスク" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso con Google non riuscito. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료된 작업 %d개" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleサインインに失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d voltooide taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google 로그인에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d tarefas concluídas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Google is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d 个已完成任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Google 登录失败,请重试。" } } } }, - "contractors_contact_info_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontaktinformationen" + "Google Sign In is not available. Please use email login.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Google Sign In is not available. Please use email login." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "El inicio de sesión con Google no está disponible. Usa el correo electrónico." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información de Contacto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion Google n'est pas disponible. Veuillez utiliser la connexion par e-mail." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations de Contact" + "de": { + "stringUnit": { + "state": "translated", + "value": "Google-Anmeldung ist nicht verfügbar. Bitte melde dich per E-Mail an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni di contatto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O login com o Google não está disponível. Use o login por e-mail." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "連絡先情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'accesso con Google non è disponibile. Usa l'accesso via email." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "연락처 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleサインインは利用できません。メールでログインしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactgegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google 로그인을 사용할 수 없습니다. 이메일 로그인을 이용해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações de Contato" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Google is niet beschikbaar. Log in met e-mail." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "联系信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Google 登录不可用,请使用邮箱登录。" } } } }, - "contractors_delete_confirm" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister löschen" + "High": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "High" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "Alta" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Élevée" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer le Prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Hoch" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Alta" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Alta" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "高" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "높음" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Excluir Prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Hoog" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "高" } } } }, - "contractors_delete_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Möchten Sie diesen Dienstleister wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden." + "Image not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Image not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to delete this contractor? This action cannot be undone." + "es": { + "stringUnit": { + "state": "translated", + "value": "Imagen no encontrada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Estás seguro de que quieres eliminar este contratista? Esta acción no se puede deshacer." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Image introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer ce prestataire ? Cette action ne peut pas être annulée." + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sei sicuro di voler eliminare questo appaltatore? Questa azione non può essere annullata." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imagem não encontrada." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この業者を削除してもよろしいですか?この操作は取り消せません。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Immagine non trovata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 계약업체를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像が見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Weet u zeker dat u deze aannemer wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt." + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지를 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza de que deseja excluir este prestador? Esta ação não pode ser desfeita." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Afbeelding niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您确定要删除此承包商吗?此操作无法撤销。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到图片。" } } } }, - "contractors_directions_action" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wegbeschreibung" + "Import Contractor": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Import Contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Directions" + "es": { + "stringUnit": { + "state": "translated", + "value": "Importar contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direcciones" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Importer le prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Itinéraire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister importieren" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indicazioni" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Importar prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "経路案内" + "it": { + "stringUnit": { + "state": "translated", + "value": "Importa professionista" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "길찾기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者をインポート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Routebeschrijving" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 가져오기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Direções" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vakman importeren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "导航" + "zh": { + "stringUnit": { + "state": "translated", + "value": "导入承包商" } } } }, - "contractors_edit_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister bearbeiten" + "Invalid ID.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid ID." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "ID no válido." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "ID invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige ID." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "ID inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "ID non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なIDです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 ID입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige ID." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "ID 无效。" } } } }, - "contractors_email_action" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail" + "Invalid contractor.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid contractor." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista no válido." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Dienstleister." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invia email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールを送信" + "it": { + "stringUnit": { + "state": "translated", + "value": "Professionista non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일 보내기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な業者です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail sturen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 업체입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige vakman." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "发送邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商无效。" } } } }, - "contractors_email_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail" + "Invalid device.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid device." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Dispositivo no válido." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appareil invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiges Gerät." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Dispositivo inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールアドレス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Dispositivo non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なデバイスです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 기기입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig apparaat." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电子邮件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "设备无效。" } } } }, - "contractors_empty_filtered" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Dienstleister gefunden" + "Invalid document.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid document." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No contractors found" + "es": { + "stringUnit": { + "state": "translated", + "value": "Documento no válido." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No se encontraron contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Document invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun prestataire trouvé" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiges Dokument." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun appaltatore trovato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documento inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者が見つかりません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Documento non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체를 찾을 수 없습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な書類です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen aannemers gevonden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 문서입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum prestador encontrado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig document." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "文档无效。" } } } }, - "contractors_empty_no_filters" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie Ihren ersten Dienstleister hinzu, um zu beginnen" + "Invalid notification.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid notification." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add your first contractor to get started" + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificación no válida." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega tu primer contratista para comenzar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notification invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez votre premier prestataire pour commencer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Benachrichtigung." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi il tuo primo appaltatore per iniziare" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificação inválida." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最初の業者を追加して始めましょう" + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifica non valida." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "첫 번째 계약업체를 추가하여 시작하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な通知です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg uw eerste aannemer toe om te beginnen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 알림입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione seu primeiro prestador para começar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige melding." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加您的第一个承包商开始吧" + "zh": { + "stringUnit": { + "state": "translated", + "value": "通知无效。" } } } }, - "contractors_empty_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie vertrauenswürdige Dienstleister hinzu" + "Invalid platform.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid platform." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add trusted contractors for your property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Plataforma no válida." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega contratistas de confianza" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plateforme invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez des prestataires de confiance" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Plattform." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi appaltatori di fiducia per la tua proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Plataforma inválida." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件に信頼できる業者を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Piattaforma non valida." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산에 신뢰할 수 있는 계약업체를 추가하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なプラットフォームです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg betrouwbare aannemers toe voor uw eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 플랫폼입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione prestadores de confiança" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig platform." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "为您的房产添加可信赖的承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "平台无效。" } } } }, - "contractors_empty_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Dienstleister" + "Invalid property.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid property." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No contractors yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad no válida." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sin contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Immobilie." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóvel inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者がいません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà non valida." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な物件です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen aannemers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 주택입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem prestadores" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige woning." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产无效。" } } } }, - "contractors_favorite_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Als Favorit markieren" + "Invalid request. Please check your input.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid request. Please check your input." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mark as Favorite" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solicitud no válida. Revisa los datos ingresados." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Marcar como Favorito" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requête invalide. Veuillez vérifier votre saisie." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Marquer comme Favori" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Anfrage. Bitte überprüfe deine Eingabe." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Segna come preferito" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Solicitação inválida. Verifique os dados informados." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お気に入りに登録" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta non valida. Controlla i dati inseriti." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "즐겨찾기로 표시" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なリクエストです。入力内容をご確認ください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Als favoriet markeren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 요청입니다. 입력 내용을 확인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Marcar como Favorito" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig verzoek. Controleer je invoer." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标记为收藏" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求无效,请检查输入内容。" } } } }, - "contractors_favorites" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favoriten" + "Invalid request. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid request. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favorites" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solicitud no válida. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favoritos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Requête invalide. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favoris" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Anfrage. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferiti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Solicitação inválida. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お気に入り" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta non valida. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "즐겨찾기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なリクエストです。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favorieten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 요청입니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Favoritos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig verzoek. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "收藏" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求无效,请重试。" } } } }, - "contractors_info_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "Invalid share code. Please check and try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid share code. Please check and try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "es": { + "stringUnit": { + "state": "translated", + "value": "Código para compartir no válido. Revísalo e inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de partage invalide. Veuillez vérifier et réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Freigabecode. Bitte überprüfe ihn und versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de compartilhamento inválido. Verifique e tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di condivisione non valido. Controlla e riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な共有コードです。確認してもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 공유 코드입니다. 확인 후 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige deelcode. Controleer en probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享码无效,请检查后重试。" } } } }, - "contractors_location_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Standort" + "Invalid task completion.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid task completion." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Location" + "es": { + "stringUnit": { + "state": "translated", + "value": "Finalización de tarea no válida." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ubicación" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réalisation de tâche invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emplacement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Aufgabenabschluss." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Posizione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conclusão de tarefa inválida." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "場所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Completamento attività non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "위치" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なタスク完了です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Locatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 작업 완료입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Localização" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige taakvoltooiing." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "位置" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务完成记录无效。" } } } }, - "contractors_member_since_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mitglied seit" + "Invalid task.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid task." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Member Since" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea no válida." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Miembro Desde" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Membre Depuis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Aufgabe." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Membro dal" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa inválida." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メンバー登録日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività non valida." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가입일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なタスクです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lid sinds" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 작업입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Membro Desde" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige taak." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "会员自" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务无效。" } } } }, - "contractors_name_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name" + "Invalid user.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid user." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario no válido." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisateur invalide." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Benutzer." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuário inválido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "名前" + "it": { + "stringUnit": { + "state": "translated", + "value": "Utente non valido." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なユーザーです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Naam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 사용자입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige gebruiker." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户无效。" } } } }, - "contractors_notes_footer" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Private Notizen zu diesem Dienstleister" + "Invalid username or password. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid username or password. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Private notes about this contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario o contraseña incorrectos. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas privadas sobre este contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom d'utilisateur ou mot de passe incorrect. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes privées sur ce prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Benutzername oder Passwort. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note private su questo appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuário ou senha inválidos. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この業者についてのプライベートメモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome utente o password non validi. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 계약업체에 대한 개인 메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名またはパスワードが正しくありません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privénotities over deze aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "아이디 또는 비밀번호가 올바르지 않습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas privadas sobre este prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige gebruikersnaam of wachtwoord. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "关于此承包商的私人备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名或密码错误,请重试。" } } } }, - "contractors_notes_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen" + "Invalid verification code. Please check and try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid verification code. Please check and try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "es": { + "stringUnit": { + "state": "translated", + "value": "Código de verificación no válido. Revísalo e inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code de vérification invalide. Veuillez vérifier et réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Bestätigungscode. Bitte überprüfe ihn und versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código de verificação inválido. Verifique e tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice di verifica non valido. Controlla e riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効な認証コードです。確認してもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 인증 코드입니다. 확인 후 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige verificatiecode. Controleer en probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码无效,请检查后重试。" } } } }, - "contractors_notes_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen" + "Low": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Low" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "es": { + "stringUnit": { + "state": "translated", + "value": "Baja" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Faible" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Niedrig" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Baixa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Bassa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "低" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "낮음" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laag" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "低" } } } }, - "contractors_personal_no_residence" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Persönlich (Keine Immobilie)" + "Medium": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Medium" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personal (No Residence)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Media" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personal (Sin Propiedad)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Moyenne" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personnel (Sans Propriété)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Mittel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personale (nessuna proprietà)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Média" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "個人(物件なし)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Media" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "개인(부동산 없음)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "中" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Persoonlijk (geen eigendom)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보통" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pessoal (Sem Propriedade)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gemiddeld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "个人(无房产)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "中" } } } }, - "contractors_phone_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefon" + "Notification not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Notification not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phone" + "es": { + "stringUnit": { + "state": "translated", + "value": "Notificación no encontrada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teléfono" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Notification introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Téléphone" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigung nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefono" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Notificação não encontrada." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "電話番号" + "it": { + "stringUnit": { + "state": "translated", + "value": "Notifica non trovata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전화번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知が見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefoon" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림을 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefone" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Melding niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电话" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到通知。" } } } }, - "contractors_property_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie" + "Only the property owner can do this.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Only the property owner can do this." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solo el propietario puede hacer esto." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Seul le propriétaire du logement peut effectuer cette action." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nur der Immobilieneigentümer kann dies tun." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Apenas o proprietário do imóvel pode fazer isso." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Solo il proprietario può eseguire questa operazione." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件のオーナーのみが実行できます。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택 소유자만 이 작업을 할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Alleen de eigenaar van de woning kan dit doen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "仅房产所有者可执行此操作。" } } } }, - "contractors_remove_from_favorites" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aus Favoriten entfernen" + "Password must be at least %lld characters": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password must be at least %lld characters" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Remove from Favorites" + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña debe tener al menos %lld caracteres" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar de Favoritos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe doit comporter au moins %lld caractères" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Retirer des Favoris" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort muss mindestens %lld Zeichen lang sein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rimuovi dai preferiti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha deve ter pelo menos %lld caracteres" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お気に入りから削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password deve avere almeno %lld caratteri" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "즐겨찾기에서 제거" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードは%lld文字以上である必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uit favorieten verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호는 최소 %lld자 이상이어야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Remover dos Favoritos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord moet minstens %lld tekens bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "从收藏中移除" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码至少需 %lld 个字符" } } } }, - "contractors_residence_footer_personal" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nur Sie werden diesen Dienstleister sehen" + "Password must contain at least one letter": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password must contain at least one letter" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Only you will see this contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña debe contener al menos una letra" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solo tú verás este contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe doit contenir au moins une lettre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seul vous verrez ce prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort muss mindestens einen Buchstaben enthalten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solo tu vedrai questo appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha deve conter pelo menos uma letra" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この業者はあなただけが見ることができます" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password deve contenere almeno una lettera" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 계약업체는 본인만 볼 수 있습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードには英字を1文字以上含める必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alleen u ziet deze aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호에 문자가 하나 이상 포함되어야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apenas você verá este prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord moet minstens één letter bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "只有您能看到此承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码须至少包含一个字母" } } } }, - "contractors_residence_footer_shared" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle Benutzer von %@ werden diesen Dienstleister sehen" + "Password must contain at least one lowercase letter": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password must contain at least one lowercase letter" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "All users of %@ will see this contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña debe contener al menos una letra minúscula" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todos los usuarios de %@ verán este contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe doit contenir au moins une minuscule" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tous les utilisateurs de %@ verront ce prestataire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort muss mindestens einen Kleinbuchstaben enthalten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tutti gli utenti di %@ vedranno questo appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha deve conter pelo menos uma letra minúscula" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@のすべてのユーザーがこの業者を見ることができます" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password deve contenere almeno una lettera minuscola" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@의 모든 사용자가 이 계약업체를 볼 수 있습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードには小文字を1文字以上含める必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle gebruikers van %@ zien deze aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호에 소문자가 하나 이상 포함되어야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todos os usuários de %@ verão este prestador" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord moet minstens één kleine letter bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@的所有用户都能看到此承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码须至少包含一个小写字母" } } } }, - "contractors_residence_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie (Optional)" + "Password must contain at least one number": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password must contain at least one number" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residence (Optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña debe contener al menos un número" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad (Opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe doit contenir au moins un chiffre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété (Optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort muss mindestens eine Zahl enthalten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha deve conter pelo menos um número" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password deve contenere almeno un numero" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードには数字を1文字以上含める必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호에 숫자가 하나 이상 포함되어야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade (Opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord moet minstens één cijfer bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码须至少包含一个数字" } } } }, - "contractors_search_placeholder" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister suchen..." + "Password must contain at least one uppercase letter": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password must contain at least one uppercase letter" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Search contractors..." + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña debe contener al menos una letra mayúscula" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Buscar contratistas..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe doit contenir au moins une majuscule" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rechercher des prestataires..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort muss mindestens einen Großbuchstaben enthalten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cerca appaltatori" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha deve conter pelo menos uma letra maiúscula" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を検索" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password deve contenere almeno una lettera maiuscola" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 검색" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードには大文字を1文字以上含める必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemers zoeken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호에 대문자가 하나 이상 포함되어야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Buscar prestadores..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord moet minstens één hoofdletter bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "搜索承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码须至少包含一个大写字母" } } } }, - "contractors_select_residence" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie auswählen" + "Password reset failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password reset failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo restablecer la contraseña. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La réinitialisation du mot de passe a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort zurücksetzen fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao redefinir a senha. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Reimpostazione della password non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードのリセットに失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 재설정에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord opnieuw instellen is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码重置失败,请重试。" } } } }, - "contractors_select_specialties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fachgebiete auswählen" + "Passwords do not match": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Passwords do not match" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Specialties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Las contraseñas no coinciden" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Especialidades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les mots de passe ne correspondent pas" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner les Spécialités" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwörter stimmen nicht überein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona specialità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "As senhas não coincidem" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "専門を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Le password non corrispondono" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전문 분야 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードが一致しません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer specialiteiten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호가 일치하지 않습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Especialidades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoorden komen niet overeen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择专业" + "zh": { + "stringUnit": { + "state": "translated", + "value": "两次密码不一致" } } } }, - "contractors_select_specialties_placeholder" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fachgebiete auswählen" + "Photo %lld": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Photo %lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Specialties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Foto %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Especialidades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Photo %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner les Spécialités" + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto %lld" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona specialità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Foto %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "専門を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Foto %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전문 분야 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真%lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer specialiteiten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 %lld" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Especialidades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto %lld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择专业" + "zh": { + "stringUnit": { + "state": "translated", + "value": "照片 %lld" } } } }, - "contractors_specialties_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fachgebiete" + "Please enter a valid email address": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please enter a valid email address" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Specialties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Introduce una dirección de correo válida" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Especialidades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez saisir une adresse e-mail valide" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spécialités" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte gib eine gültige E-Mail-Adresse ein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Specialità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Informe um endereço de e-mail válido" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "専門" + "it": { + "stringUnit": { + "state": "translated", + "value": "Inserisci un indirizzo email valido" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전문 분야" + "ja": { + "stringUnit": { + "state": "translated", + "value": "有効なメールアドレスを入力してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Specialiteiten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "유효한 이메일 주소를 입력해 주세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Especialidades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voer een geldig e-mailadres in" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "专业" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请输入有效的邮箱地址" } } } }, - "contractors_state_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bundesland" + "Please log in to continue.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please log in to continue." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "State" + "es": { + "stringUnit": { + "state": "translated", + "value": "Inicia sesión para continuar." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez vous connecter pour continuer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "État" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte melde dich an, um fortzufahren." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stato/Provincia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Faça login para continuar." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "都道府県" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi per continuare." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "시/도" + "ja": { + "stringUnit": { + "state": "translated", + "value": "続行するにはログインしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provincie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "계속하려면 로그인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Log in om door te gaan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "省/州" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请登录以继续。" } } } }, - "contractors_statistics_section" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statistiken" + "Please select a file to upload.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please select a file to upload." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statistics" + "es": { + "stringUnit": { + "state": "translated", + "value": "Selecciona un archivo para subir." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estadísticas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez sélectionner un fichier à envoyer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statistiques" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte wähle eine Datei zum Hochladen aus." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statistiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecione um arquivo para enviar." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "統計" + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona un file da caricare." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "통계" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップロードするファイルを選択してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statistieken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업로드할 파일을 선택해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estatísticas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer een bestand om te uploaden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "统计" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请选择要上传的文件。" } } } }, - "contractors_street_address_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Straße" + "Priority: %@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Priority: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Street Address" + "es": { + "stringUnit": { + "state": "translated", + "value": "Prioridad: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dirección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Priorité : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "de": { + "stringUnit": { + "state": "translated", + "value": "Priorität: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Via" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prioridade: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "住所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Priorità: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "도로명 주소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "優先度:%@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Straat" + "ko": { + "stringUnit": { + "state": "translated", + "value": "우선순위: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Prioriteit: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "街道地址" + "zh": { + "stringUnit": { + "state": "translated", + "value": "优先级:%@" } } } }, - "contractors_tasks_completed_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abgeschlossene Aufgaben" + "Property ID is required.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Property ID is required." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tasks Completed" + "es": { + "stringUnit": { + "state": "translated", + "value": "El ID de la propiedad es obligatorio." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tareas Completadas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'ID du logement est requis." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâches Terminées" + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilien-ID ist erforderlich." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività completate" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O ID do imóvel é obrigatório." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了タスク" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'ID della proprietà è obbligatorio." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료된 작업" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件IDは必須です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooide taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택 ID는 필수입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefas Concluídas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning-ID is verplicht." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "已完成任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产 ID 为必填项。" } } } }, - "contractors_tasks_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgaben" + "Property not found. It may have been deleted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Property not found. It may have been deleted." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad no encontrada. Es posible que se haya eliminado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement introuvable. Il a peut-être été supprimé." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "tâches" + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie nicht gefunden. Möglicherweise wurde sie gelöscht." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóvel não encontrado. Pode ter sido excluído." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスク" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà non trovata. Potrebbe essere stata eliminata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件が見つかりません。削除された可能性があります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택을 찾을 수 없습니다. 삭제되었을 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning niet gevonden. Mogelijk verwijderd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到房产,可能已被删除。" } } } }, - "contractors_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dienstleister" + "Purchase verification failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase verification failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractors" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la verificación de la compra. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La vérification de l'achat a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prestataires" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kaufbestätigung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appaltatori" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na verificação da compra. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica dell'acquisto non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체" + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入の確認に失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매 확인에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prestadores" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatie van aankoop is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买验证失败,请重试。" } } } }, - "contractors_website_action" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Webseite" + "Rated %lld out of 5": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Rated %lld out of 5" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Website" + "es": { + "stringUnit": { + "state": "translated", + "value": "Valorado con %lld de 5" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sitio Web" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Noté %lld sur 5" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site Web" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld von 5 bewertet" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Visita sito web" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Avaliado %lld de 5" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ウェブサイトを開く" + "it": { + "stringUnit": { + "state": "translated", + "value": "Valutata %lld su 5" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "웹사이트 방문" + "ja": { + "stringUnit": { + "state": "translated", + "value": "5段階中%lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Website bezoeken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "5점 중 %lld점" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld van 5 sterren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "访问网站" + "zh": { + "stringUnit": { + "state": "translated", + "value": "评分 %lld(满分 5)" } } } }, - "contractors_website_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Webseite" + "Registration failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Registration failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Website" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló el registro. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sitio Web" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'inscription a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site Web" + "de": { + "stringUnit": { + "state": "translated", + "value": "Registrierung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sito web" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no cadastro. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ウェブサイト" + "it": { + "stringUnit": { + "state": "translated", + "value": "Registrazione non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "웹사이트" + "ja": { + "stringUnit": { + "state": "translated", + "value": "登録に失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Website" + "ko": { + "stringUnit": { + "state": "translated", + "value": "등록에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Registratie is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "网站" + "zh": { + "stringUnit": { + "state": "translated", + "value": "注册失败,请重试。" } } } }, - "contractors_zip_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "PLZ" + "Remove photo": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Remove photo" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "ZIP" + "es": { + "stringUnit": { + "state": "translated", + "value": "Quitar foto" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código Postal" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Supprimer la photo" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code Postal" + "de": { + "stringUnit": { + "state": "translated", + "value": "Foto entfernen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "CAP" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Remover foto" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "郵便番号" + "it": { + "stringUnit": { + "state": "translated", + "value": "Rimuovi foto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "우편번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "写真を削除" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Postcode" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진 삭제" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "CEP" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Foto verwijderen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "邮编" + "zh": { + "stringUnit": { + "state": "translated", + "value": "移除照片" } } } }, - "Copy share code" : { - "comment" : "A button that copies the share code to the user's clipboard.", - "isCommentAutoGenerated" : true - }, - "Cost: %@" : { - "comment" : "A label displaying the cost of a task completion. The argument is the cost of the completion.", - "isCommentAutoGenerated" : true - }, - "Create a strong password to secure your account" : { - - }, - "Create Account" : { - - }, - "Create Account with Email" : { - - }, - "Creating Account..." : { - - }, - "Delete property" : { - "comment" : "A button that deletes a residence.", - "isCommentAutoGenerated" : true - }, - "Didn't receive a code? Check your spam folder or re-register" : { - "comment" : "A hint instructing the user to check their spam folder if they haven't received the verification code.", - "isCommentAutoGenerated" : true - }, - "Didn't receive the code?" : { - "comment" : "A question displayed below a button in the \"Verify Code\" view, instructing the user to request a new code if they haven't received one.", - "isCommentAutoGenerated" : true - }, - "Docs" : { - "comment" : "A label displayed above the documents tab in the main tab view.", - "isCommentAutoGenerated" : true - }, - "Document actions" : { - "comment" : "A label for the menu button that appears in the navigation bar.", - "isCommentAutoGenerated" : true - }, - "documents_active" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiv" + "Request failed. Please check your input and try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Request failed. Please check your input and try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la solicitud. Revisa los datos e inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête a échoué. Veuillez vérifier votre saisie et réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actif" + "de": { + "stringUnit": { + "state": "translated", + "value": "Anfrage fehlgeschlagen. Bitte überprüfe deine Eingabe und versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attivo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na solicitação. Verifique os dados e tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アクティブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta non riuscita. Controlla i dati inseriti e riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "활성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リクエストに失敗しました。入力内容を確認してもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actief" + "ko": { + "stringUnit": { + "state": "translated", + "value": "요청에 실패했습니다. 입력 내용을 확인하고 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verzoek mislukt. Controleer je invoer en probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "活跃" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求失败,请检查输入后重试。" } } } }, - "documents_active_only" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nur Aktive" + "Search query is required.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Search query is required." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active Only" + "es": { + "stringUnit": { + "state": "translated", + "value": "El término de búsqueda es obligatorio." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solo Activos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une requête de recherche est requise." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actifs Uniquement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Suchbegriff ist erforderlich." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Solo attivi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O termo de busca é obrigatório." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アクティブのみ" + "it": { + "stringUnit": { + "state": "translated", + "value": "La ricerca è obbligatoria." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "활성만" + "ja": { + "stringUnit": { + "state": "translated", + "value": "検索キーワードは必須です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alleen actief" + "ko": { + "stringUnit": { + "state": "translated", + "value": "검색어는 필수입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apenas Ativos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zoekopdracht is verplicht." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "仅活跃" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请输入搜索内容。" } } } }, - "documents_active_status" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiv" + "Search query is too short.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Search query is too short." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active" + "es": { + "stringUnit": { + "state": "translated", + "value": "El término de búsqueda es demasiado corto." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La requête de recherche est trop courte." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actif" + "de": { + "stringUnit": { + "state": "translated", + "value": "Suchbegriff ist zu kurz." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attivo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O termo de busca é muito curto." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アクティブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "La ricerca è troppo breve." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "활성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "検索キーワードが短すぎます。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actief" + "ko": { + "stringUnit": { + "state": "translated", + "value": "검색어가 너무 짧습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zoekopdracht is te kort." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "活跃" + "zh": { + "stringUnit": { + "state": "translated", + "value": "搜索内容过短。" } } } }, - "documents_add_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument hinzufügen" + "Sign in": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign in" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Document" + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se connecter" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter un document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmelden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Entrar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインイン" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录" } } } }, - "documents_add_document" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument Hinzufügen" + "Soft purple with pink accents": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Soft purple with pink accents" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Document" + "es": { + "stringUnit": { + "state": "translated", + "value": "Morado suave con acentos rosados" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Violet doux aux accents roses" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter un Document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sanftes Lila mit Rosa-Akzenten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Roxo suave com toques de rosa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Viola tenue con accenti rosa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "柔らかな紫にピンクのアクセント" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "부드러운 보라와 핑크 포인트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zacht paars met roze accenten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "柔紫配粉色点缀" } } } }, - "documents_add_warranty" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie Hinzufügen" + "Something went wrong. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Something went wrong. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Warranty" + "es": { + "stringUnit": { + "state": "translated", + "value": "Algo salió mal. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Un problème est survenu. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Etwas ist schiefgelaufen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Algo deu errado. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Qualcosa è andato storto. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "問題が発生しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문제가 발생했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er ging iets mis. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "出了点问题,请重试。" } } } }, - "documents_additional_information" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zusätzliche Informationen" + "Status: %@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Status: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Additional Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información Adicional" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Statut : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations Supplémentaires" + "de": { + "stringUnit": { + "state": "translated", + "value": "Status: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni aggiuntive" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Status: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "追加情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "추가 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "状態:%@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aanvullende informatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "상태: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações Adicionais" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Status: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "其他信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "状态:%@" } } } }, - "documents_all_categories" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle Kategorien" + "Task ID is required.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task ID is required." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "All Categories" + "es": { + "stringUnit": { + "state": "translated", + "value": "El ID de la tarea es obligatorio." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas las Categorías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'ID de la tâche est requis." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toutes les Catégories" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben-ID ist erforderlich." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tutte le categorie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O ID da tarefa é obrigatório." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべてのカテゴリー" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'ID dell'attività è obbligatorio." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모든 카테고리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクIDは必須です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle categorieën" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 ID는 필수입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas as Categorias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak-ID is verplicht." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "所有类别" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务 ID 为必填项。" } } } }, - "documents_all_types" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle Typen" + "Task completion not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task completion not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "All Types" + "es": { + "stringUnit": { + "state": "translated", + "value": "Finalización de tarea no encontrada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todos los Tipos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réalisation de tâche introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tous les Types" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenabschluss nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tutti i tipi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conclusão de tarefa não encontrada." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべてのタイプ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Completamento attività non trovato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모든 유형" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク完了が見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle types" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 완료 기록을 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todos os Tipos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taakvoltooiing niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "所有类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到任务完成记录。" } } } }, - "documents_and_warranties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumente & Garantien" + "Task not found. It may have been deleted.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task not found. It may have been deleted." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents & Warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea no encontrada. Es posible que se haya eliminado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos y Garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche introuvable. Elle a peut-être été supprimée." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents et Garanties" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe nicht gefunden. Möglicherweise wurde sie gelöscht." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenti e garanzie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa não encontrada. Pode ter sido excluída." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントと保証" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività non trovata. Potrebbe essere stata eliminata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 및 보증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクが見つかりません。削除された可能性があります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenten en garanties" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 찾을 수 없습니다. 삭제되었을 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos e Garantias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak niet gevonden. Mogelijk verwijderd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档和保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到任务,可能已被删除。" } } } }, - "documents_associations" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zuordnungen" + "Task template not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task template not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Associations" + "es": { + "stringUnit": { + "state": "translated", + "value": "Plantilla de tarea no encontrada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Asociaciones" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Modèle de tâche introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Associations" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenvorlage nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Associazioni" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Modelo de tarefa não encontrado." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "関連" + "it": { + "stringUnit": { + "state": "translated", + "value": "Modello di attività non trovato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "연결" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクテンプレートが見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Koppelingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 템플릿을 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Associações" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taaksjabloon niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "关联" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到任务模板。" } } } }, - "documents_attached_file" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Angehängte Datei" + "That image format isn't supported.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "That image format isn't supported." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attached File" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ese formato de imagen no es compatible." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivo Adjunto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ce format d'image n'est pas pris en charge." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fichier Joint" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieses Bildformat wird nicht unterstützt." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "File allegato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esse formato de imagem não é compatível." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "添付ファイル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo formato di immagine non è supportato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "첨부 파일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "その画像形式はサポートされていません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bijgevoegd bestand" + "ko": { + "stringUnit": { + "state": "translated", + "value": "지원되지 않는 이미지 형식입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Arquivo Anexado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dat afbeeldingsformaat wordt niet ondersteund." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "附件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "不支持该图片格式。" } } } }, - "documents_basic_information" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grundinformationen" + "That photo is too large after resizing. Try a different one.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "That photo is too large after resizing. Try a different one." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Basic Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Esa foto es demasiado grande tras redimensionarla. Prueba con otra." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información Básica" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette photo est trop volumineuse après redimensionnement. Essayez-en une autre." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations de Base" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieses Foto ist nach der Skalierung zu groß. Versuche ein anderes." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni di base" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Essa foto ficou grande demais após o redimensionamento. Tente outra." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "基本情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "La foto è troppo grande dopo il ridimensionamento. Provane un'altra." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기본 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リサイズ後も写真が大きすぎます。別の写真をお試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Basisinformatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "크기를 조정한 후에도 사진이 너무 큽니다. 다른 사진을 사용해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações Básicas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Die foto is na verkleinen te groot. Probeer een andere." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "基本信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该照片缩放后仍过大,请换一张。" } } } }, - "documents_category" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kategorie" + "The property owner cannot be removed.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The property owner cannot be removed." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se puede eliminar al propietario." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoría" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le propriétaire du logement ne peut pas être retiré." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Catégorie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Immobilieneigentümer kann nicht entfernt werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O proprietário do imóvel não pode ser removido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "カテゴリー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il proprietario non può essere rimosso." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "카테고리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件のオーナーは削除できません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categorie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택 소유자는 삭제할 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria" + "nl": { + "stringUnit": { + "state": "translated", + "value": "De eigenaar van de woning kan niet worden verwijderd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "类别" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法移除房产所有者。" } } } }, - "documents_category_appliance" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerät" + "This email is already in use.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This email is already in use." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appliance" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este correo ya está en uso." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Electrodoméstico" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette adresse e-mail est déjà utilisée." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appareil" + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese E-Mail-Adresse wird bereits verwendet." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elettrodomestico" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este e-mail já está em uso." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "家電" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa email è già in uso." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가전제품" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このメールアドレスは既に使用されています。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apparaat" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 사용 중인 이메일입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eletrodoméstico" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dit e-mailadres is al in gebruik." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "家电" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该邮箱已被使用。" } } } }, - "documents_category_electrical" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elektrisch" + "This email is already registered. Try logging in instead.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This email is already registered. Try logging in instead." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Electrical" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este correo ya está registrado. Mejor inicia sesión." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eléctrico" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette adresse e-mail est déjà enregistrée. Essayez plutôt de vous connecter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Électrique" + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese E-Mail-Adresse ist bereits registriert. Versuche stattdessen, dich anzumelden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elettrico" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este e-mail já está cadastrado. Tente fazer login." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "電気" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa email è già registrata. Prova ad accedere." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このメールアドレスは既に登録されています。ログインをお試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elektrisch" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 등록된 이메일입니다. 로그인을 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elétrico" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dit e-mailadres is al geregistreerd. Probeer in te loggen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电气" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该邮箱已注册,请尝试登录。" } } } }, - "documents_category_hvac" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "HLK" + "This reset link has expired. Please request a new one.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This reset link has expired. Please request a new one." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "HVAC" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este enlace de restablecimiento ha caducado. Solicita uno nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "HVAC" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ce lien de réinitialisation a expiré. Veuillez en demander un nouveau." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "CVC" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieser Reset-Link ist abgelaufen. Bitte fordere einen neuen an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Climatizzazione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este link de redefinição expirou. Solicite um novo." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "空調" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo link di reimpostazione è scaduto. Richiedine uno nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "냉난방" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このリセットリンクは有効期限が切れています。新しいリンクをリクエストしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "HVAC" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 재설정 링크가 만료되었습니다. 새로 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "AVAC" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze herstellink is verlopen. Vraag een nieuwe aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暖通空调" + "zh": { + "stringUnit": { + "state": "translated", + "value": "此重置链接已过期,请重新申请。" } } } }, - "documents_category_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kategorie (optional)" + "This share code has expired. Please request a new one.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This share code has expired. Please request a new one." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este código para compartir ha caducado. Solicita uno nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoría (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ce code de partage a expiré. Veuillez en demander un nouveau." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Catégorie (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieser Freigabecode ist abgelaufen. Bitte fordere einen neuen an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este código de compartilhamento expirou. Solicite um novo." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "カテゴリー(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo codice di condivisione è scaduto. Richiedine uno nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "카테고리(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この共有コードは有効期限が切れています。新しいコードをリクエストしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categorie (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 공유 코드가 만료되었습니다. 새로 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze deelcode is verlopen. Vraag een nieuwe aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "类别(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "此共享码已过期,请重新申请。" } } } }, - "documents_category_other" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Andere" + "This task has already been archived.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This task has already been archived." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Other" + "es": { + "stringUnit": { + "state": "translated", + "value": "Esta tarea ya ha sido archivada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otro" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette tâche a déjà été archivée." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autre" + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese Aufgabe wurde bereits archiviert." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Altro" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esta tarefa já foi arquivada." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa attività è già stata archiviata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기타" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクは既にアーカイブされています。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Overig" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 보관된 작업입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Outro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze taak is al gearchiveerd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "其他" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该任务已归档。" } } } }, - "documents_category_plumbing" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sanitär" + "This task has already been cancelled.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This task has already been cancelled." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plumbing" + "es": { + "stringUnit": { + "state": "translated", + "value": "Esta tarea ya ha sido cancelada." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plomería" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette tâche a déjà été annulée." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plomberie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese Aufgabe wurde bereits abgebrochen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idraulica" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Esta tarefa já foi cancelada." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "配管" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa attività è già stata annullata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "배관" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクは既にキャンセルされています。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loodgieterswerk" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 취소된 작업입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Encanamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze taak is al geannuleerd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "水管" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该任务已取消。" } } } }, - "documents_category_roofing" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dach" + "This user is already a member of this property.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This user is already a member of this property." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Roofing" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este usuario ya es miembro de esta propiedad." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Techado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cet utilisateur est déjà membre de ce logement." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toiture" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieser Benutzer ist bereits Mitglied dieser Immobilie." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coperture" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este usuário já é membro deste imóvel." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "屋根" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo utente è già membro di questa proprietà." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "지붕" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このユーザーは既にこの物件のメンバーです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dakwerk" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 사용자는 이미 이 주택의 멤버입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telhado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze gebruiker is al lid van deze woning." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "屋顶" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该用户已是此房产的成员。" } } } }, - "documents_category_structural" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strukturell" + "This username is already taken. Please choose another.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This username is already taken. Please choose another." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Structural" + "es": { + "stringUnit": { + "state": "translated", + "value": "Este nombre de usuario ya está en uso. Elige otro." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estructural" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ce nom d'utilisateur est déjà pris. Veuillez en choisir un autre." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Structurel" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dieser Benutzername ist bereits vergeben. Bitte wähle einen anderen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Strutturale" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este nome de usuário já está em uso. Escolha outro." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "構造" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questo nome utente è già in uso. Scegline un altro." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구조" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このユーザー名は既に使用されています。別の名前を選択してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Constructie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미 사용 중인 아이디입니다. 다른 아이디를 선택해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estrutural" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze gebruikersnaam is al in gebruik. Kies een andere." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "结构" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该用户名已被占用,请另选一个。" } } } }, - "documents_category_unknown" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unbekannt" + "Title is required.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Title is required." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unknown" + "es": { + "stringUnit": { + "state": "translated", + "value": "El título es obligatorio." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconocido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le titre est requis." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inconnu" + "de": { + "stringUnit": { + "state": "translated", + "value": "Titel ist erforderlich." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sconosciuto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O título é obrigatório." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "不明" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il titolo è obbligatorio." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "알 수 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトルは必須です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Onbekend" + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목은 필수입니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconhecido" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel is verplicht." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题为必填项。" } } } }, - "documents_claim_email" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchs-E-Mail" + "Too many attempts. Please request a new code.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Too many attempts. Please request a new code." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Demasiados intentos. Solicita un código nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo de Reclamos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Trop de tentatives. Veuillez demander un nouveau code." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email de Réclamation" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu viele Versuche. Bitte fordere einen neuen Code an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email reclami" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Muitas tentativas. Solicite um novo código." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレームメール" + "it": { + "stringUnit": { + "state": "translated", + "value": "Troppi tentativi. Richiedi un nuovo codice." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "試行回数が多すぎます。新しいコードをリクエストしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim e-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "시도 횟수가 너무 많습니다. 새 코드를 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email de Reclamação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te veel pogingen. Vraag een nieuwe code aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔邮箱" + "zh": { + "stringUnit": { + "state": "translated", + "value": "尝试次数过多,请重新获取验证码。" } } } }, - "documents_claim_email_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchs-E-Mail (optional)" + "Too many attempts. Please wait a few minutes and try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Too many attempts. Please wait a few minutes and try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Email (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Demasiados intentos. Espera unos minutos e inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo de Reclamos (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Trop de tentatives. Veuillez patienter quelques minutes et réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email de Réclamation (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu viele Versuche. Bitte warte ein paar Minuten und versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email reclami (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Muitas tentativas. Aguarde alguns minutos e tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレームメール(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Troppi tentativi. Attendi qualche minuto e riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 이메일(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "試行回数が多すぎます。数分待ってからもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim e-mail (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email de Reclamação (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te veel pogingen. Wacht enkele minuten en probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔邮箱(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "尝试次数过多,请稍等几分钟后重试。" } } } }, - "documents_claim_information" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchsinformationen" + "Too many requests. Please try again later.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Too many requests. Please try again later." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Demasiadas solicitudes. Inténtalo de nuevo más tarde." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información de Reclamos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Trop de requêtes. Veuillez réessayer plus tard." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations de Réclamation" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu viele Anfragen. Bitte versuche es später erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni reclamo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Muitas solicitações. Tente novamente mais tarde." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレーム情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Troppe richieste. Riprova più tardi." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リクエストが多すぎます。後でもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claiminformatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "요청이 너무 많습니다. 나중에 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações de Reclamação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te veel verzoeken. Probeer het later opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求过于频繁,请稍后重试。" } } } }, - "documents_claim_phone" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchstelefon" + "Try again": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Try again" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Phone" + "es": { + "stringUnit": { + "state": "translated", + "value": "Intentar de nuevo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teléfono de Reclamos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réessayer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Téléphone de Réclamation" + "de": { + "stringUnit": { + "state": "translated", + "value": "Erneut versuchen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefono reclami" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tentar novamente" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレーム電話" + "it": { + "stringUnit": { + "state": "translated", + "value": "Riprova" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 전화" + "ja": { + "stringUnit": { + "state": "translated", + "value": "もう一度試す" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim telefoon" + "ko": { + "stringUnit": { + "state": "translated", + "value": "다시 시도" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefone de Reclamação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Opnieuw proberen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔电话" + "zh": { + "stringUnit": { + "state": "translated", + "value": "重试" } } } }, - "documents_claim_phone_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchstelefon (optional)" + "Unable to load contractor specialties. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load contractor specialties. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Phone (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las especialidades del contratista. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teléfono de Reclamos (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les spécialités des prestataires. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Téléphone de Réclamation (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister-Fachgebiete konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefono reclami (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar as especialidades dos prestadores. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレーム電話(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le specializzazioni dei professionisti. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 전화(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の専門分野を読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim telefoon (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 전문 분야를 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefone de Reclamação (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan vakgebieden niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔电话(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载承包商专长,请重试。" } } } }, - "documents_claim_website" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchs-Website" + "Unable to load property types. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load property types. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Website" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los tipos de propiedad. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sitio Web de Reclamos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les types de logement. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site Web de Réclamation" + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilientypen konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sito web reclami" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar os tipos de imóvel. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレームウェブサイト" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i tipi di proprietà. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 웹사이트" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件タイプを読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim website" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택 유형을 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site de Reclamação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan woningtypes niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔网站" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载房产类型,请重试。" } } } }, - "documents_claim_website_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anspruchs-Website (optional)" + "Unable to load task categories. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load task categories. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim Website (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las categorías de tareas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sitio Web de Reclamos (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les catégories de tâches. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site Web de Réclamation (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenkategorien konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sito web reclami (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar as categorias de tarefas. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "クレームウェブサイト(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le categorie delle attività. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "청구 웹사이트(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクカテゴリを読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Claim website (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 카테고리를 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Site de Reclamação (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taakcategorieën niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "理赔网站(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务分类,请重试。" } } } }, - "documents_contractor" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmer" + "Unable to load task frequencies. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load task frequencies. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las frecuencias de tareas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les fréquences des tâches. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrepreneur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenhäufigkeiten konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar as frequências de tarefas. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le frequenze delle attività. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの頻度を読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 주기를 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratante" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taakfrequenties niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务频率,请重试。" } } } }, - "documents_contractor_phone" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmertelefon" + "Unable to load task priorities. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load task priorities. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractor Phone" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las prioridades de tareas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Teléfono del Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les priorités des tâches. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Téléphone de l'Entrepreneur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenprioritäten konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefono appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar as prioridades de tarefas. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者電話" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le priorità delle attività. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 전화" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの優先度を読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer telefoon" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 우선순위를 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Telefone do Contratante" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taakprioriteiten niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "承包商电话" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务优先级,请重试。" } } } }, - "documents_created" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erstellt" + "Unable to load task statuses. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load task statuses. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Created" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los estados de tareas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Creado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les statuts des tâches. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Créé" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenstatus konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Creato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar os status de tarefas. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "作成日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare gli stati delle attività. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "생성일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの状態を読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aangemaakt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 상태를 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Criado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taakstatussen niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "创建时间" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务状态,请重试。" } } } }, - "documents_days_remaining" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verbleibende Tage" + "Unable to load task templates. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load task templates. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Days Remaining" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las plantillas de tareas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Días Restantes" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les modèles de tâches. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jours Restants" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabenvorlagen konnten nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Giorni rimanenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar os modelos de tarefas. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "残り日数" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i modelli di attività. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "남은 일수" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクテンプレートを読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dagen resterend" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 템플릿을 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dias Restantes" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taaksjablonen niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "剩余天数" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载任务模板,请重试。" } } } }, - "documents_days_remaining_count" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d Tage verbleibend" + "Unable to load your profile. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to load your profile. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d days remaining" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cargar tu perfil. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d días restantes" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger votre profil. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d jours restants" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Profil konnte nicht geladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d giorni rimanenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar seu perfil. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "残り%d日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare il tuo profilo. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d일 남음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを読み込めません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d dagen resterend" + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필을 불러올 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d dias restantes" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan je profiel niet laden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "剩余%d天" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载您的资料,请重试。" } } } }, - "documents_delete_confirm_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sind Sie sicher, dass Sie dieses Dokument löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden." + "Unable to process the form. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to process the form. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to delete this document? This action cannot be undone." + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo procesar el formulario. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Está seguro de que desea eliminar este documento? Esta acción no se puede deshacer." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de traiter le formulaire. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer ce document? Cette action ne peut pas être annulée." + "de": { + "stringUnit": { + "state": "translated", + "value": "Das Formular konnte nicht verarbeitet werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sei sicuro di voler eliminare questo documento? Questa azione non può essere annullata." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível processar o formulário. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "このドキュメントを削除してもよろしいですか?この操作は取り消せません。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile elaborare il modulo. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 문서를 삭제하시겠습니까? 이 작업은 취소할 수 없습니다." + "ja": { + "stringUnit": { + "state": "translated", + "value": "フォームを処理できません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Weet u zeker dat u dit document wilt verwijderen? Deze actie kan niet ongedaan worden gemaakt." + "ko": { + "stringUnit": { + "state": "translated", + "value": "양식을 처리할 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza de que deseja excluir este documento? Esta ação não pode ser desfeita." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan het formulier niet verwerken. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您确定要删除此文档吗?此操作无法撤销。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法处理表单,请重试。" } } } }, - "documents_delete_document" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument Löschen" + "Unable to search templates. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to search templates. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Document" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron buscar las plantillas. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de rechercher les modèles. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer le Document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen konnten nicht durchsucht werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível buscar os modelos. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile cercare i modelli. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートを検索できません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿을 검색할 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Excluir Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan sjablonen niet doorzoeken. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法搜索模板,请重试。" } } } }, - "documents_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung" + "Unable to send verification code. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to send verification code. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo enviar el código de verificación. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descripción" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible d'envoyer le code de vérification. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätigungscode konnte nicht gesendet werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrizione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível enviar o código de verificação. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "説明" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile inviare il codice di verifica. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설명" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証コードを送信できません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschrijving" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 코드를 보낼 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrição" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan verificatiecode niet verzenden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "描述" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法发送验证码,请重试。" } } } }, - "documents_description_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung (optional)" + "Unable to update your profile. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to update your profile. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar tu perfil. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descripción (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de mettre à jour votre profil. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Profil konnte nicht aktualisiert werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrizione (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível atualizar seu perfil. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "説明(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare il tuo profilo. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설명(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを更新できません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschrijving (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필을 업데이트할 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrição (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan je profiel niet bijwerken. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "描述(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法更新您的资料,请重试。" } } } }, - "documents_document_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumentdetails" + "Unable to upload file. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to upload file. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo subir el archivo. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles del Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible d'envoyer le fichier. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails du Document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Datei konnte nicht hochgeladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível enviar o arquivo. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントの詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare il file. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 상세정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルをアップロードできません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentgegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일을 업로드할 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes do Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan bestand niet uploaden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法上传文件,请重试。" } } } }, - "documents_document_id_missing" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument-ID fehlt" + "Unable to upload image. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to upload image. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document ID is missing" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo subir la imagen. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falta el ID del documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible d'envoyer l'image. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'ID du document est manquant" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild konnte nicht hochgeladen werden. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "ID documento mancante" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível enviar a imagem. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントIDがありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare l'immagine. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 ID가 없습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像をアップロードできません。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document-ID ontbreekt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지를 업로드할 수 없습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "ID do documento está faltando" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan afbeelding niet uploaden. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档ID缺失" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法上传图片,请重试。" } } } }, - "documents_document_type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumenttyp" + "Upload failed (storage returned %lld).": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Upload failed (storage returned %lld)." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document Type" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la subida (el almacenamiento devolvió %lld)." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'envoi a échoué (le stockage a renvoyé %lld)." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de Document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Upload fehlgeschlagen (Speicher gab %lld zurück)." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no envio (o armazenamento retornou %lld)." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントタイプ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Caricamento non riuscito (lo storage ha restituito %lld)." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 유형" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップロードに失敗しました(ストレージ応答%lld)。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenttype" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업로드에 실패했습니다 (저장소 응답 %lld)." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Uploaden mislukt (opslag gaf %lld terug)." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "上传失败(存储返回 %lld)。" } } } }, - "documents_document_type_cannot_change" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumenttyp kann nicht geändert werden" + "Urgent": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Urgent" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document type cannot be changed" + "es": { + "stringUnit": { + "state": "translated", + "value": "Urgente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El tipo de documento no se puede cambiar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Urgente" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le type de document ne peut pas être modifié" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dringend" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il tipo di documento non può essere modificato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Urgente" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントタイプは変更できません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Urgente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 유형을 변경할 수 없습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "緊急" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenttype kan niet worden gewijzigd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "긴급" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O tipo de documento não pode ser alterado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Urgent" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "无法更改文档类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "紧急" } } } }, - "documents_documents" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumente" + "User not found.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "User not found." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents" + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario no encontrado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Utilisateur introuvable." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzer nicht gefunden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Usuário não encontrado." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメント" + "it": { + "stringUnit": { + "state": "translated", + "value": "Utente non trovato." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーが見つかりません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자를 찾을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruiker niet gevonden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到用户。" } } } }, - "documents_download_file" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Datei Herunterladen" + "Username can only contain letters, numbers, and underscores": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Username can only contain letters, numbers, and underscores" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Download File" + "es": { + "stringUnit": { + "state": "translated", + "value": "El nombre de usuario solo puede contener letras, números y guiones bajos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descargar Archivo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le nom d'utilisateur ne peut contenir que des lettres, des chiffres et des tirets bas" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Télécharger le Fichier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzername darf nur Buchstaben, Zahlen und Unterstriche enthalten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scarica file" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O nome de usuário só pode conter letras, números e sublinhados" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ファイルをダウンロード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il nome utente può contenere solo lettere, numeri e trattini bassi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "파일 다운로드" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名には英字、数字、アンダースコアのみ使用できます" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestand downloaden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "아이디는 문자, 숫자, 밑줄만 사용할 수 있습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Baixar Arquivo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikersnaam mag alleen letters, cijfers en underscores bevatten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "下载文件" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名只能包含字母、数字和下划线" } } } }, - "documents_edit_document" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument Bearbeiten" + "Verification failed. Please try again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Verification failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Document" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la verificación. Inténtalo de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La vérification a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le Document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bestätigung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na verificação. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証に失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatie is mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证失败,请重试。" } } } }, - "documents_edit_warranty" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie Bearbeiten" + "Vibrant iOS system colors": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Vibrant iOS system colors" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Warranty" + "es": { + "stringUnit": { + "state": "translated", + "value": "Colores vibrantes del sistema iOS" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Couleurs système iOS vives" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier la Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Lebendige iOS-Systemfarben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cores vibrantes do sistema iOS" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証を編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Colori di sistema iOS vivaci" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "鮮やかなiOSシステムカラー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "선명한 iOS 시스템 색상" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Levendige iOS-systeemkleuren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "鲜艳的 iOS 系统配色" } } } }, - "documents_empty_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Speichern Sie wichtige Dokumente und Garantien" + "View %lld completions": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "View %lld completions" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Store important documents and warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ver %lld finalizaciones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guarda documentos importantes y garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Voir %lld réalisations" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stockez vos documents importants et garanties" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld Abschlüsse anzeigen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salva documenti importanti come garanzie, manuali e ricevute" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ver %lld conclusões" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証書、マニュアル、領収書などの重要なドキュメントを保存" + "it": { + "stringUnit": { + "state": "translated", + "value": "Visualizza %lld completamenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증서, 매뉴얼, 영수증 등 중요한 문서를 저장하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld件の完了を表示" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bewaar belangrijke documenten zoals garanties, handleidingen en bonnen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료 기록 %lld개 보기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guarde documentos importantes e garantias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bekijk %lld voltooiingen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存重要文件,如保修、手册和收据" + "zh": { + "stringUnit": { + "state": "translated", + "value": "查看 %lld 条完成记录" } } } }, - "documents_empty_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Dokumente" + "Warm oranges and reds": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Warm oranges and reds" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No documents yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "Naranjas y rojos cálidos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sin documentos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Oranges et rouges chaleureux" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Warme Orange- und Rottöne" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun documento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Laranjas e vermelhos quentes" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントがありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Arancioni e rossi caldi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "温かいオレンジと赤" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen documenten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "따뜻한 주황과 빨강" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem documentos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Warme oranje- en roodtinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "暖橙与红色" } } } }, - "documents_end_date" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantieende (JJJJ-MM-TT)" + "Warm terracotta and sand tones": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Warm terracotta and sand tones" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty End Date (YYYY-MM-DD)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tonos cálidos de terracota y arena" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fecha de Fin de Garantía (AAAA-MM-DD)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tons terracotta et sable chaleureux" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date de Fin de Garantie (AAAA-MM-JJ)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Warme Terrakotta- und Sandtöne" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data fine garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tons quentes de terracota e areia" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証終了日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Toni caldi terracotta e sabbia" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 종료일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "温かいテラコッタとサンドの色調" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Einddatum garantie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "따뜻한 테라코타와 샌드 톤" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data de Término da Garantia (AAAA-MM-DD)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Warme terracotta- en zandtinten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修结束日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "暖陶土与沙色调" } } } }, - "documents_existing_photos" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vorhandene Fotos" + "Would you like to import this contractor to your contacts?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Would you like to import this contractor to your contacts?" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Existing Photos" + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Quieres importar este contratista a tus contactos?" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos Existentes" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Souhaitez-vous importer ce prestataire dans vos contacts ?" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photos Existantes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du diesen Dienstleister zu deinen Kontakten importieren?" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto esistenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Deseja importar este prestador para seus contatos?" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "既存の写真" + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi importare questo professionista tra i tuoi contatti?" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기존 사진" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この業者を連絡先にインポートしますか?" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestaande foto's" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 업체를 연락처에 추가하시겠어요?" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos Existentes" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wil je deze vakman aan je contacten toevoegen?" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "现有照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "要将此承包商导入您的联系人吗?" } } } }, - "documents_expired" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abgelaufen" + "Would you like to join this shared residence?": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Would you like to join this shared residence?" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expired" + "es": { + "stringUnit": { + "state": "translated", + "value": "¿Quieres unirte a esta residencia compartida?" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vencido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Souhaitez-vous rejoindre ce logement partagé ?" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expiré" + "de": { + "stringUnit": { + "state": "translated", + "value": "Möchtest du dieser geteilten Wohnung beitreten?" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scaduto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Deseja entrar nesta residência compartilhada?" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限切れ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Vuoi entrare in questa residenza condivisa?" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "만료됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この共有住居に参加しますか?" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verlopen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 공유 주거지에 참여하시겠어요?" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expirado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wil je deelnemen aan deze gedeelde woning?" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "已过期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "要加入此共享住所吗?" } } } }, - "documents_expires" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Läuft Ab" + "You don't have permission for this action.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You don't have permission for this action." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expires" + "es": { + "stringUnit": { + "state": "translated", + "value": "No tienes permiso para esta acción." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vence" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas l'autorisation d'effectuer cette action." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expire" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast keine Berechtigung für diese Aktion." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scade" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não tem permissão para esta ação." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai i permessi per questa azione." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "만료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この操作を行う権限がありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verloopt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업에 대한 권한이 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expira" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt geen toestemming voor deze actie." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "过期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您无权执行此操作。" } } } }, - "documents_expiring_soon" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Läuft Bald Ab" + "You don't have permission to view this contractor.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You don't have permission to view this contractor." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expiring Soon" + "es": { + "stringUnit": { + "state": "translated", + "value": "No tienes permiso para ver este contratista." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vence Pronto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas l'autorisation de voir ce prestataire." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expire Bientôt" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast keine Berechtigung, diesen Dienstleister anzuzeigen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "In scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não tem permissão para ver este prestador." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "まもなく期限切れ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai i permessi per visualizzare questo professionista." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "곧 만료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この業者を表示する権限がありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verloopt binnenkort" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 업체를 볼 권한이 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Expirando em Breve" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt geen toestemming om deze vakman te bekijken." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "即将过期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您无权查看此承包商。" } } } }, - "documents_failed_to_create" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler beim Erstellen des Dokuments" + "You don't have permission to view this document.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You don't have permission to view this document." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Failed to create document" + "es": { + "stringUnit": { + "state": "translated", + "value": "No tienes permiso para ver este documento." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error al crear el documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas l'autorisation de voir ce document." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Échec de la création du document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast keine Berechtigung, dieses Dokument anzuzeigen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Creazione documento fallita" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não tem permissão para ver este documento." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントの作成に失敗しました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai i permessi per visualizzare questo documento." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 생성 실패" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この書類を表示する権限がありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document aanmaken mislukt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 문서를 볼 권한이 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha ao criar o documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt geen toestemming om dit document te bekijken." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "创建文档失败" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您无权查看此文档。" } } } }, - "documents_failed_to_update" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler beim Aktualisieren des Dokuments" + "You don't have permission to view this property.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You don't have permission to view this property." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Failed to update document" + "es": { + "stringUnit": { + "state": "translated", + "value": "No tienes permiso para ver esta propiedad." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error al actualizar el documento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas l'autorisation de voir ce logement." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Échec de la mise à jour du document" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast keine Berechtigung, diese Immobilie anzuzeigen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiornamento documento fallito" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não tem permissão para ver este imóvel." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントの更新に失敗しました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai i permessi per visualizzare questa proprietà." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 업데이트 실패" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この物件を表示する権限がありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document bijwerken mislukt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 주택을 볼 권한이 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha ao atualizar o documento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt geen toestemming om deze woning te bekijken." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新文档失败" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您无权查看此房产。" } } } }, - "documents_file_size" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dateigröße" + "You don't have permission to view this task.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You don't have permission to view this task." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "File Size" + "es": { + "stringUnit": { + "state": "translated", + "value": "No tienes permiso para ver esta tarea." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tamaño del Archivo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'avez pas l'autorisation de voir cette tâche." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taille du Fichier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast keine Berechtigung, diese Aufgabe anzuzeigen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dimensione file" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não tem permissão para ver esta tarefa." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ファイルサイズ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai i permessi per visualizzare questa attività." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "파일 크기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "このタスクを表示する権限がありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestandsgrootte" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 작업을 볼 권한이 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tamanho do Arquivo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt geen toestemming om deze taak te bekijken." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文件大小" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您无权查看此任务。" } } } }, - "documents_file_type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dateityp" + "You're not signed in.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You're not signed in." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "File Type" + "es": { + "stringUnit": { + "state": "translated", + "value": "No has iniciado sesión." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Archivo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous n'êtes pas connecté." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de Fichier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du bist nicht angemeldet." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo file" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você não está conectado." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ファイルタイプ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non hai effettuato l'accesso." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "파일 유형" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインインしていません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bestandstype" + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인되어 있지 않습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Arquivo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je bent niet ingelogd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文件类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您尚未登录。" } } } }, - "documents_fill_required_fields" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bitte füllen Sie alle erforderlichen Felder aus" + "You're uploading too many photos. Try again in a few minutes.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You're uploading too many photos. Try again in a few minutes." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Please fill in all required fields" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estás subiendo demasiadas fotos. Inténtalo de nuevo en unos minutos." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor complete todos los campos obligatorios" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous envoyez trop de photos. Réessayez dans quelques minutes." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Veuillez remplir tous les champs requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du lädst zu viele Fotos hoch. Versuche es in ein paar Minuten erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compila tutti i campi obbligatori" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você está enviando fotos demais. Tente novamente em alguns minutos." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須項目をすべて入力してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Stai caricando troppe foto. Riprova tra qualche minuto." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모든 필수 필드를 입력하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップロードする写真が多すぎます。数分後にもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vul alle verplichte velden in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사진을 너무 많이 업로드하고 있습니다. 잠시 후 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor, preencha todos os campos obrigatórios" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je uploadt te veel foto's. Probeer het over enkele minuten opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "请填写所有必填字段" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您上传的照片过多,请几分钟后重试。" } } } }, - "documents_images" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bilder" + "You've reached your contractor limit. Upgrade to add more.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You've reached your contractor limit. Upgrade to add more." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Images" + "es": { + "stringUnit": { + "state": "translated", + "value": "Has alcanzado tu límite de contratistas. Mejora tu plan para añadir más." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Imágenes" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez atteint votre limite de prestataires. Passez à l'offre supérieure pour en ajouter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Images" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast dein Dienstleister-Limit erreicht. Führe ein Upgrade durch, um mehr hinzuzufügen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immagini" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você atingiu seu limite de prestadores. Faça upgrade para adicionar mais." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "画像" + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai raggiunto il limite di professionisti. Esegui l'upgrade per aggiungerne altri." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이미지" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の上限に達しました。追加するにはアップグレードしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Afbeeldingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 등록 한도에 도달했습니다. 더 추가하려면 업그레이드하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Imagens" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt je limiet voor vakmensen bereikt. Upgrade om meer toe te voegen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "图片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您已达到承包商数量上限,请升级以添加更多。" } } } }, - "documents_important_dates" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wichtige Daten" + "You've reached your document limit. Upgrade to add more.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You've reached your document limit. Upgrade to add more." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Important Dates" + "es": { + "stringUnit": { + "state": "translated", + "value": "Has alcanzado tu límite de documentos. Mejora tu plan para añadir más." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fechas Importantes" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez atteint votre limite de documents. Passez à l'offre supérieure pour en ajouter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dates Importantes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast dein Dokument-Limit erreicht. Führe ein Upgrade durch, um mehr hinzuzufügen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date importanti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você atingiu seu limite de documentos. Faça upgrade para adicionar mais." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "重要な日付" + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai raggiunto il limite di documenti. Esegui l'upgrade per aggiungerne altri." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "중요한 날짜" + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類の上限に達しました。追加するにはアップグレードしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Belangrijke datums" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서 한도에 도달했습니다. 더 추가하려면 업그레이드하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Datas Importantes" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt je documentlimiet bereikt. Upgrade om meer toe te voegen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "重要日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您已达到文档数量上限,请升级以添加更多。" } } } }, - "documents_inactive" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inaktiv" + "You've reached your property limit. Upgrade to add more.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You've reached your property limit. Upgrade to add more." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactive" + "es": { + "stringUnit": { + "state": "translated", + "value": "Has alcanzado tu límite de propiedades. Mejora tu plan para añadir más." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactivo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez atteint votre limite de logements. Passez à l'offre supérieure pour en ajouter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactif" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast dein Immobilien-Limit erreicht. Führe ein Upgrade durch, um mehr hinzuzufügen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inattivo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você atingiu seu limite de imóveis. Faça upgrade para adicionar mais." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "非アクティブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai raggiunto il limite di proprietà. Esegui l'upgrade per aggiungerne altre." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비활성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件の上限に達しました。追加するにはアップグレードしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inactief" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주택 한도에 도달했습니다. 더 추가하려면 업그레이드하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inativo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt je woninglimiet bereikt. Upgrade om meer toe te voegen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "非活跃" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您已达到房产数量上限,请升级以添加更多。" } } } }, - "documents_item_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Artikeldetails" + "You've reached your task limit. Upgrade to add more.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You've reached your task limit. Upgrade to add more." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Item Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "Has alcanzado tu límite de tareas. Mejora tu plan para añadir más." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles del Artículo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous avez atteint votre limite de tâches. Passez à l'offre supérieure pour en ajouter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails de l'Article" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du hast dein Aufgaben-Limit erreicht. Führe ein Upgrade durch, um mehr hinzuzufügen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli articolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você atingiu seu limite de tarefas. Faça upgrade para adicionar mais." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アイテム詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Hai raggiunto il limite di attività. Esegui l'upgrade per aggiungerne altre." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "항목 상세정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクの上限に達しました。追加するにはアップグレードしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Itemgegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 한도에 도달했습니다. 더 추가하려면 업그레이드하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes do Item" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je hebt je taaklimiet bereikt. Upgrade om meer toe te voegen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "物品详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您已达到任务数量上限,请升级以添加更多。" } } } }, - "documents_item_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Artikelname" + "Your account is inactive. Please contact support.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your account is inactive. Please contact support." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Item Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu cuenta está inactiva. Contacta con soporte." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre del Artículo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre compte est inactif. Veuillez contacter le support." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom de l'Article" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Konto ist inaktiv. Bitte wende dich an den Support." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome articolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sua conta está inativa. Entre em contato com o suporte." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アイテム名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo account non è attivo. Contatta l'assistenza." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "항목 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントが無効です。サポートにお問い合わせください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Itemnaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정이 비활성 상태입니다. 고객지원에 문의해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome do Item" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je account is inactief. Neem contact op met support." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "物品名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的账户已停用,请联系客服。" } } } }, - "documents_item_name_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Artikelname ist für Garantien erforderlich" + "Your email is already verified.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your email is already verified." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Item name is required for warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu correo ya está verificado." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El nombre del artículo es obligatorio para garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre adresse e-mail est déjà vérifiée." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le nom de l'article est requis pour les garanties" + "de": { + "stringUnit": { + "state": "translated", + "value": "Deine E-Mail-Adresse ist bereits bestätigt." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il nome articolo è obbligatorio per le garanzie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seu e-mail já está verificado." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証にはアイテム名が必要です" + "it": { + "stringUnit": { + "state": "translated", + "value": "La tua email è già verificata." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증에는 항목 이름이 필요합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスは既に認証済みです。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Itemnaam is verplicht voor garanties" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일이 이미 인증되었습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O nome do item é obrigatório para garantias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je e-mailadres is al geverifieerd." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修需要物品名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的邮箱已通过验证。" } } } }, - "documents_loading_document" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokument wird geladen..." + "Your session has expired. Please log in again.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your session has expired. Please log in again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading document..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu sesión ha caducado. Inicia sesión de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando documento..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre session a expiré. Veuillez vous reconnecter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement du document..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Deine Sitzung ist abgelaufen. Bitte melde dich erneut an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento documento..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sua sessão expirou. Faça login novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "La tua sessione è scaduta. Accedi di nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "セッションの有効期限が切れました。もう一度ログインしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "세션이 만료되었습니다. 다시 로그인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando documento..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je sessie is verlopen. Log opnieuw in." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载文档中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的会话已过期,请重新登录。" } } } }, - "documents_metadata" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadaten" + "Your verification code has expired. Please request a new one.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Your verification code has expired. Please request a new one." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadata" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tu código de verificación ha caducado. Solicita uno nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadatos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Votre code de vérification a expiré. Veuillez en demander un nouveau." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Métadonnées" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dein Bestätigungscode ist abgelaufen. Bitte fordere einen neuen an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadati" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seu código de verificação expirou. Solicite um novo." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メタデータ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il tuo codice di verifica è scaduto. Richiedine uno nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메타데이터" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証コードの有効期限が切れました。新しいコードをリクエストしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadata" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 코드가 만료되었습니다. 새로 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metadados" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je verificatiecode is verlopen. Vraag een nieuwe aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "元数据" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您的验证码已过期,请重新申请。" } } } }, - "documents_model_number" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modellnummer" + "honeyDue app logo": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue app logo" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Model Number" + "es": { + "stringUnit": { + "state": "translated", + "value": "Logo de la app honeyDue" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Modelo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logo de l'application honeyDue" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numéro de Modèle" + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue App-Logo" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numero modello" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Logotipo do app honeyDue" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "型番" + "it": { + "stringUnit": { + "state": "translated", + "value": "Logo dell'app honeyDue" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모델 번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDueアプリのロゴ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modelnummer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 앱 로고" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número do Modelo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-app-logo" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "型号" + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 应用徽标" } } } }, - "documents_model_number_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modellnummer (optional)" + "the residence": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "the residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Model Number (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "la residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Modelo (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "le logement" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numéro de Modèle (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "die Wohnung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numero modello (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "a residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "型番(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "la residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모델 번호(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modelnummer (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "주거지" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número do Modelo (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "de woning" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "型号(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "该住所" } } } }, - "documents_na" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "k.A." + "Property #%lld": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Property #%lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/A" + "es": { + "stringUnit": { + "state": "translated", + "value": "Propiedad n.º %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/A" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Logement n° %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/A" + "de": { + "stringUnit": { + "state": "translated", + "value": "Immobilie Nr. %lld" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/D" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Imóvel nº %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/A" + "it": { + "stringUnit": { + "state": "translated", + "value": "Proprietà n. %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "해당 없음" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning #%lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "N.v.t." + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件番号%lld" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/D" + "ko": { + "stringUnit": { + "state": "translated", + "value": "건물 #%lld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "N/A" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产 #%lld" } } } }, - "documents_no_documents_found" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Dokumente gefunden" + "%lld in the last 12 months": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld in the last 12 months" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No documents found" + "es": { + "stringUnit": { + "state": "translated", + "value": "%lld en los últimos 12 meses" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No se encontraron documentos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%lld au cours des 12 derniers mois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun document trouvé" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld in den letzten 12 Monaten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun documento trovato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%lld nos últimos 12 meses" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントが見つかりません" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld negli ultimi 12 mesi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서를 찾을 수 없습니다" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld in de afgelopen 12 maanden" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen documenten gevonden" + "ja": { + "stringUnit": { + "state": "translated", + "value": "過去12か月で%lld件" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum documento encontrado" + "ko": { + "stringUnit": { + "state": "translated", + "value": "지난 12개월간 %lld건" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "过去12个月%lld次" } } } }, - "documents_no_documents_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie Dokumente zu Ihrer Residenz hinzu" + "Today": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Today" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add documents related to your residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "Hoy" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregue documentos relacionados con su residencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aujourd'hui" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez des documents liés à votre résidence" + "de": { + "stringUnit": { + "state": "translated", + "value": "Heute" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi documenti relativi alla tua proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Hoje" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件に関連するドキュメントを追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Oggi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산과 관련된 문서를 추가하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "今日" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg documenten toe gerelateerd aan uw eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오늘" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione documentos relacionados à sua residência" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vandaag" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加与您房产相关的文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "今天" } } } }, - "documents_no_residence_selected" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Residenz ausgewählt" + "Tomorrow": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tomorrow" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No residence selected" + "es": { + "stringUnit": { + "state": "translated", + "value": "Mañana" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No se seleccionó ninguna residencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Demain" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune résidence sélectionnée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Morgen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna proprietà selezionata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Amanhã" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件が選択されていません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Domani" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산이 선택되지 않았습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "明日" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen eigendom geselecteerd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "내일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhuma residência selecionada" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Morgen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未选择房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "明天" } } } }, - "documents_no_warranties_found" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Garantien gefunden" + "Yesterday": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Yesterday" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No warranties found" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ayer" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No se encontraron garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Hier" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune garantie trouvée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Gestern" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna garanzia trovata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ontem" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証が見つかりません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ieri" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증을 찾을 수 없습니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "昨日" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen garanties gevonden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "어제" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhuma garantia encontrada" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gisteren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "昨天" } } } }, - "documents_no_warranties_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie Garantien hinzu, um Deckungszeiträume zu verfolgen" + "in %lld days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "in %lld days" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add warranties to track coverage periods" + "es": { + "stringUnit": { + "state": "translated", + "value": "en %lld días" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregue garantías para rastrear períodos de cobertura" + "fr": { + "stringUnit": { + "state": "translated", + "value": "dans %lld jours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez des garanties pour suivre les périodes de couverture" + "de": { + "stringUnit": { + "state": "translated", + "value": "in %lld Tagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi garanzie per tracciare i periodi di copertura" + "pt": { + "stringUnit": { + "state": "translated", + "value": "em %lld dias" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証を追加して保証期間を追跡" + "it": { + "stringUnit": { + "state": "translated", + "value": "tra %lld giorni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 기간을 추적하려면 보증을 추가하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日後" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg garanties toe om dekkingsperiodes bij te houden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 후" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione garantias para rastrear períodos de cobertura" + "nl": { + "stringUnit": { + "state": "translated", + "value": "over %lld dagen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加保修以跟踪保修期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天后" } } } }, - "documents_none" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine" + "%lld days ago": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld days ago" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" + "es": { + "stringUnit": { + "state": "translated", + "value": "hace %lld días" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ninguno" + "fr": { + "stringUnit": { + "state": "translated", + "value": "il y a %lld jours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun" + "de": { + "stringUnit": { + "state": "translated", + "value": "vor %lld Tagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno" + "pt": { + "stringUnit": { + "state": "translated", + "value": "há %lld dias" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "なし" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld giorni fa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日前" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 전" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld dagen geleden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "无" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天前" } } } }, - "documents_notes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen" + "12:00 AM": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "12:00 AM" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "es": { + "stringUnit": { + "state": "translated", + "value": "12:00 AM" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "00:00" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "de": { + "stringUnit": { + "state": "translated", + "value": "00:00 Uhr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note" + "pt": { + "stringUnit": { + "state": "translated", + "value": "00:00" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "00:00" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "午前0時" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오전 12:00" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "00:00" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "上午 12:00" } } } }, - "documents_notes_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen (optional)" + "%lld:00 AM": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 AM" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 AM" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 Uhr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note (opzionali)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "午前%lld時" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오전 %lld:00" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "上午 %lld:00" } } } }, - "documents_photos" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "12:00 PM": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "12:00 PM" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photos" + "es": { + "stringUnit": { + "state": "translated", + "value": "12:00 PM" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "12:00" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photos" + "de": { + "stringUnit": { + "state": "translated", + "value": "12:00 Uhr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "12:00" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真" + "it": { + "stringUnit": { + "state": "translated", + "value": "12:00" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진" + "ja": { + "stringUnit": { + "state": "translated", + "value": "正午" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto's" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오후 12:00" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "12:00" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "下午 12:00" } } } }, - "documents_photos_selected" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d Foto(s) ausgewählt" + "%lld:00 PM": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 PM" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d photo(s) selected" + "es": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 PM" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d foto(s) seleccionada(s)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d photo(s) sélectionnée(s)" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld:00 Uhr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d foto selezionate" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d枚の写真を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진 %d장 선택됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "午後%lld時" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d foto('s) geselecteerd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오후 %lld:00" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "%d foto(s) selecionada(s)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld:00" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "已选择%d张照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "下午 %lld:00" } } } }, - "documents_property" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie" + "In %lld day": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "In %lld day" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "En %lld día" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dans %lld jour" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "In %lld Tag" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Em %lld dia" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tra %lld giorno" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日後" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 후" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Over %lld dag" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天后" } } } }, - "documents_property_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie ist erforderlich" + "In %lld days": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "In %lld days" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property is required" + "es": { + "stringUnit": { + "state": "translated", + "value": "En %lld días" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propiedad es obligatoria" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Dans %lld jours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "La propriété est requise" + "de": { + "stringUnit": { + "state": "translated", + "value": "In %lld Tagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "La proprietà è obbligatoria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Em %lld dias" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件は必須です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tra %lld giorni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산은 필수입니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日後" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom is verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 후" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "A propriedade é obrigatória" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Over %lld dagen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产为必填项" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天后" } } } }, - "documents_provider" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anbieter" + "%lld day ago": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld day ago" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provider" + "es": { + "stringUnit": { + "state": "translated", + "value": "hace %lld día" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proveedor" + "fr": { + "stringUnit": { + "state": "translated", + "value": "il y a %lld jour" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fournisseur" + "de": { + "stringUnit": { + "state": "translated", + "value": "vor %lld Tag" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fornitore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "há %lld dia" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロバイダー" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld giorno fa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공자" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld日前" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Leverancier" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld일 전" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fornecedor" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld dag geleden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "供应商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 天前" } } } }, - "documents_provider_company" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anbieter/Firma" + "Start": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Start" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provider/Company" + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proveedor/Empresa" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Commencer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fournisseur/Entreprise" + "de": { + "stringUnit": { + "state": "translated", + "value": "Starten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fornitore/Azienda" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Iniciar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロバイダー/会社" + "it": { + "stringUnit": { + "state": "translated", + "value": "Avvia" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공자/회사" + "ja": { + "stringUnit": { + "state": "translated", + "value": "開始" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Leverancier/Bedrijf" + "ko": { + "stringUnit": { + "state": "translated", + "value": "시작" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fornecedor/Empresa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Starten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "供应商/公司" + "zh": { + "stringUnit": { + "state": "translated", + "value": "开始" } } } }, - "documents_provider_contact" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anbieterkontakt" + "1 property": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "1 property" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provider Contact" + "es": { + "stringUnit": { + "state": "translated", + "value": "1 propiedad" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacto del Proveedor" + "fr": { + "stringUnit": { + "state": "translated", + "value": "1 propriété" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact du Fournisseur" + "de": { + "stringUnit": { + "state": "translated", + "value": "1 Objekt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contatto fornitore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "1 imóvel" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロバイダー連絡先" + "it": { + "stringUnit": { + "state": "translated", + "value": "1 proprietà" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공자 연락처" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件1件" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact leverancier" + "ko": { + "stringUnit": { + "state": "translated", + "value": "자산 1개" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contato do Fornecedor" + "nl": { + "stringUnit": { + "state": "translated", + "value": "1 woning" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "供应商联系方式" + "zh": { + "stringUnit": { + "state": "translated", + "value": "1 处房产" } } } }, - "documents_provider_contact_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anbieterkontakt (optional)" + "Unlimited": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlimited" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provider Contact (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ilimitado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacto del Proveedor (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Illimité" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact du Fournisseur (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Unbegrenzt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contatto fornitore (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ilimitado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロバイダー連絡先(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Illimitato" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제공자 연락처(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無制限" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact leverancier (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "무제한" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contato do Fornecedor (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Onbeperkt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "供应商联系方式(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无限制" } } } }, - "documents_provider_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anbieter ist für Garantien erforderlich" + "10 tasks": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "10 tasks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provider is required for warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "10 tareas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El proveedor es obligatorio para garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "10 tâches" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le fournisseur est requis pour les garanties" + "de": { + "stringUnit": { + "state": "translated", + "value": "10 Aufgaben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il fornitore è obbligatorio per le garanzie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "10 tarefas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証にはプロバイダーが必要です" + "it": { + "stringUnit": { + "state": "translated", + "value": "10 attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증에는 제공자가 필요합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク10件" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Leverancier is verplicht voor garanties" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 10개" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O fornecedor é obrigatório para garantias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "10 taken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修需要供应商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "10 个任务" } } } }, - "documents_purchase_date" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kaufdatum (JJJJ-MM-TT)" + "Not available": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Not available" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Purchase Date (YYYY-MM-DD)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No disponible" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fecha de Compra (AAAA-MM-DD)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Non disponible" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date d'Achat (AAAA-MM-JJ)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nicht verfügbar" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data acquisto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Indisponível" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "購入日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non disponibile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구매일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "利用不可" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aankoopdatum" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용 불가" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data de Compra (AAAA-MM-DD)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Niet beschikbaar" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "购买日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "不可用" } } } }, - "documents_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich" + "Save %lld%%": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Save %lld%%" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ahorra %lld%%" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Économisez %lld%%" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Spare %lld%%" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Economize %lld%%" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須" + "it": { + "stringUnit": { + "state": "translated", + "value": "Risparmia %lld%%" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld%%お得" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%lld%% 절약" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bespaar %lld%%" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填" + "zh": { + "stringUnit": { + "state": "translated", + "value": "省 %lld%%" } } } }, - "documents_required_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich: Titel" + "Upgrade Required": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Upgrade Required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required: Title" + "es": { + "stringUnit": { + "state": "translated", + "value": "Mejora requerida" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido: Título" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mise à niveau requise" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis: Titre" + "de": { + "stringUnit": { + "state": "translated", + "value": "Upgrade erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio: Titolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Upgrade necessário" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須:タイトル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Upgrade necessario" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수: 제목" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アップグレードが必要" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht: Titel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업그레이드 필요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório: Título" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Upgrade vereist" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填:标题" + "zh": { + "stringUnit": { + "state": "translated", + "value": "需要升级" } } } }, - "documents_required_warranty_fields" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich für Garantien: Artikelname und Anbieter" + "This feature is available with a Pro subscription.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "This feature is available with a Pro subscription." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required for warranties: Item Name and Provider" + "es": { + "stringUnit": { + "state": "translated", + "value": "Esta función está disponible con una suscripción Pro." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido para garantías: Nombre del Artículo y Proveedor" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cette fonctionnalité est disponible avec un abonnement Pro." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis pour les garanties: Nom de l'Article et Fournisseur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Diese Funktion ist mit einem Pro-Abo verfügbar." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio per garanzie: Nome articolo e Fornitore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Este recurso está disponível com a assinatura Pro." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証に必須:アイテム名とプロバイダー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Questa funzione è disponibile con un abbonamento Pro." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 필수: 항목 이름 및 제공자" + "ja": { + "stringUnit": { + "state": "translated", + "value": "この機能はProプランでご利用いただけます。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht voor garanties: Itemnaam en Leverancier" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이 기능은 Pro 구독에서 사용할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório para garantias: Nome do Item e Fornecedor" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deze functie is beschikbaar met een Pro-abonnement." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修必填:物品名称和供应商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "此功能需订阅 Pro 才能使用。" } } } }, - "documents_residence" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residenz" + "Upgrade to Pro": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Upgrade to Pro" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "Mejora a Pro" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Passer à Pro" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Résidence" + "de": { + "stringUnit": { + "state": "translated", + "value": "Auf Pro upgraden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fazer upgrade para o Pro" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Passa a Pro" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Proにアップグレード" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Pro로 업그레이드" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residência" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Upgraden naar Pro" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "升级到 Pro" } } } }, - "documents_search_placeholder" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suchen..." + "Unlock unlimited access to all features": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unlock unlimited access to all features" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Search..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Desbloquea acceso ilimitado a todas las funciones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Buscar..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Débloquez un accès illimité à toutes les fonctionnalités" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rechercher..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Schalte unbegrenzten Zugriff auf alle Funktionen frei" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cerca documenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Desbloqueie acesso ilimitado a todos os recursos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメントを検索" + "it": { + "stringUnit": { + "state": "translated", + "value": "Sblocca l'accesso illimitato a tutte le funzioni" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서 검색" + "ja": { + "stringUnit": { + "state": "translated", + "value": "すべての機能を無制限に利用" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenten zoeken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "모든 기능을 무제한으로 이용하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pesquisar..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ontgrendel onbeperkte toegang tot alle functies" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "搜索文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "解锁所有功能的无限使用权" } } } }, - "documents_select_from_library" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aus Bibliothek Auswählen" + "$2.99": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select from Library" + "es": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar de la Biblioteca" + "fr": { + "stringUnit": { + "state": "translated", + "value": "2,99 $" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner depuis la Bibliothèque" + "de": { + "stringUnit": { + "state": "translated", + "value": "2,99 $" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona dalla libreria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ライブラリから選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "2,99 $" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "라이브러리에서 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer uit bibliotheek" + "ko": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar da Biblioteca" + "nl": { + "stringUnit": { + "state": "translated", + "value": "$2,99" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "从相册选择" + "zh": { + "stringUnit": { + "state": "translated", + "value": "$2.99" } } } }, - "documents_select_property" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie Auswählen" + "$23.99": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "23,99 $" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner une Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "23,99 $" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "23,99 $" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "$23,99" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "$23.99" } } } }, - "documents_serial_number" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seriennummer" + "/month": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "/month" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial Number" + "es": { + "stringUnit": { + "state": "translated", + "value": "/mes" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Serie" + "fr": { + "stringUnit": { + "state": "translated", + "value": "/mois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numéro de Série" + "de": { + "stringUnit": { + "state": "translated", + "value": "/Monat" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numero di serie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "/mês" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "シリアル番号" + "it": { + "stringUnit": { + "state": "translated", + "value": "/mese" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "일련 번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "/月" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serienummer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "/월" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Série" + "nl": { + "stringUnit": { + "state": "translated", + "value": "/maand" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "序列号" + "zh": { + "stringUnit": { + "state": "translated", + "value": "/月" } } } }, - "documents_serial_number_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seriennummer (optional)" + "/year": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "/year" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serial Number (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "/año" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Serie (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "/an" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numéro de Série (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "/Jahr" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Numero di serie (opzionale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "/ano" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "シリアル番号(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "/anno" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "일련 번호(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "/年" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serienummer (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "/년" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Número de Série (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "/jaar" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "序列号(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "/年" } } } }, - "documents_start_date" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantiebeginn (JJJJ-MM-TT)" + "Add %lld Tasks & Continue": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Add %lld Tasks & Continue" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty Start Date (YYYY-MM-DD)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Añadir %lld tareas y continuar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fecha de Inicio de Garantía (AAAA-MM-DD)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ajouter %lld tâches et continuer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date de Début de Garantie (AAAA-MM-JJ)" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld Aufgaben hinzufügen & weiter" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data inizio garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Adicionar %lld tarefas e continuar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証開始日" + "it": { + "stringUnit": { + "state": "translated", + "value": "Aggiungi %lld attività e continua" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 시작일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld件のタスクを追加して続行" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Startdatum garantie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 %lld개 추가 후 계속" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data de Início da Garantia (AAAA-MM-DD)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld taken toevoegen & doorgaan" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修开始日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "添加 %lld 个任务并继续" } } } }, - "documents_status" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "Suggested": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Suggested" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sugerido" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Suggéré" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statut" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sugeridas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ステータス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Suggerite" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상태" + "ja": { + "stringUnit": { + "state": "translated", + "value": "おすすめ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "ko": { + "stringUnit": { + "state": "translated", + "value": "추천" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voorgesteld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "状态" + "zh": { + "stringUnit": { + "state": "translated", + "value": "推荐" } } } }, - "documents_tags" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags" + "One time": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "One time" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags" + "es": { + "stringUnit": { + "state": "translated", + "value": "Una vez" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Etiquetas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une fois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Étiquettes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Einmalig" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tag" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Uma vez" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タグ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Una tantum" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "태그" + "ja": { + "stringUnit": { + "state": "translated", + "value": "1回のみ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags" + "ko": { + "stringUnit": { + "state": "translated", + "value": "일회성" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Etiquetas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Eenmalig" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标签" + "zh": { + "stringUnit": { + "state": "translated", + "value": "一次性" } } } }, - "documents_tags_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags (optional)" + "Transaction verification failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Transaction verification failed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la verificación de la transacción" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Etiquetas (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la vérification de la transaction" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Étiquettes (facultatif)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Transaktionsprüfung fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tag (opzionali)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na verificação da transação" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タグ(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica della transazione non riuscita" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "태그(선택사항)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "取引の確認に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tags (optioneel)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거래 확인에 실패했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Etiquetas (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatie van transactie mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标签(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "交易验证失败" } } } }, - "documents_take_photo" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto Aufnehmen" + "No products available": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No products available" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Take Photo" + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay productos disponibles" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tomar Foto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun produit disponible" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prendre une Photo" + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Produkte verfügbar" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scatta foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhum produto disponível" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真を撮る" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun prodotto disponibile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진 찍기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "利用可能な商品がありません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto maken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용 가능한 상품이 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tirar Foto" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen producten beschikbaar" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "拍照" + "zh": { + "stringUnit": { + "state": "translated", + "value": "暂无可用商品" } } } }, - "documents_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dokumente" + "Purchase failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase failed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la compra" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'achat" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documents" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kauf fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na compra" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ドキュメント" + "it": { + "stringUnit": { + "state": "translated", + "value": "Acquisto non riuscito" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문서" + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documenten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매에 실패했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Documentos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankoop mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "文档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买失败" } } } }, - "documents_title_field" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titel" + "Backend verification failed: %@": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Backend verification failed: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Title" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la verificación del servidor: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Título" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la vérification côté serveur : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titre" + "de": { + "stringUnit": { + "state": "translated", + "value": "Backend-Prüfung fehlgeschlagen: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na verificação do servidor: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タイトル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica backend non riuscita: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제목" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サーバー確認に失敗しました:%@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "서버 확인 실패: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Título" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Backend-verificatie mislukt: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标题" + "zh": { + "stringUnit": { + "state": "translated", + "value": "后端验证失败:%@" } } } }, - "documents_title_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titel ist erforderlich" + "Invalid Apple ID credential": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid Apple ID credential" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Title is required" + "es": { + "stringUnit": { + "state": "translated", + "value": "Credencial de Apple ID no válida" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El título es obligatorio" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Identifiant Apple non valide" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le titre est requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Apple-ID-Anmeldedaten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il titolo è obbligatorio" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Credencial do Apple ID inválida" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タイトルは必須です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Credenziale Apple ID non valida" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제목은 필수입니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Apple IDの認証情報が無効です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titel is verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 Apple ID 자격 증명" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O título é obrigatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige Apple ID-inloggegevens" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标题为必填项" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple ID 凭证无效" } } } }, - "documents_type_contract" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vertrag" + "Missing identity token from Apple": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Missing identity token from Apple" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contract" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falta el token de identidad de Apple" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contrato" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Jeton d'identité manquant d'Apple" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contrat" + "de": { + "stringUnit": { + "state": "translated", + "value": "Identitätstoken von Apple fehlt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Token de identidade da Apple ausente" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "契約" + "it": { + "stringUnit": { + "state": "translated", + "value": "Token di identità di Apple mancante" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약" + "ja": { + "stringUnit": { + "state": "translated", + "value": "AppleのIDトークンがありません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contract" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple에서 인증 토큰을 받지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contrato" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Identiteitstoken van Apple ontbreekt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "合同" + "zh": { + "stringUnit": { + "state": "translated", + "value": "缺少 Apple 的身份令牌" } } } }, - "documents_type_deed" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Urkunde" + "Apple Sign In authorization failed": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Apple Sign In authorization failed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deed" + "es": { + "stringUnit": { + "state": "translated", + "value": "Falló la autorización de Iniciar sesión con Apple" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escritura" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'autorisation Connexion avec Apple" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acte" + "de": { + "stringUnit": { + "state": "translated", + "value": "Apple-Anmeldung-Autorisierung fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na autorização do Login com a Apple" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "証書" + "it": { + "stringUnit": { + "state": "translated", + "value": "Autorizzazione Accedi con Apple non riuscita" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "증서" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでのサインイン認証に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Akte" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple 로그인 인증에 실패했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escritura" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Autorisatie voor inloggen met Apple mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "契约" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 登录授权失败" } } } }, - "documents_type_inspection" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspektion" + "Invalid response from Apple": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid response from Apple" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspection" + "es": { + "stringUnit": { + "state": "translated", + "value": "Respuesta no válida de Apple" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Réponse non valide d'Apple" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspection" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige Antwort von Apple" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ispezione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Resposta inválida da Apple" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "検査" + "it": { + "stringUnit": { + "state": "translated", + "value": "Risposta non valida da Apple" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "검사" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleからの応答が無効です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspectie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple에서 잘못된 응답을 받았습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inspeção" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig antwoord van Apple" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "检查" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 返回的响应无效" } } } }, - "documents_type_insurance" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versicherung" + "Apple Sign In request was not handled": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Apple Sign In request was not handled" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insurance" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se procesó la solicitud de Iniciar sesión con Apple" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguro" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La demande Connexion avec Apple n'a pas été traitée" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Assurance" + "de": { + "stringUnit": { + "state": "translated", + "value": "Apple-Anmeldungsanfrage wurde nicht verarbeitet" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Assicurazione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A solicitação de Login com a Apple não foi processada" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保険" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta Accedi con Apple non gestita" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보험" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでのサインイン要求が処理されませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verzekering" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple 로그인 요청이 처리되지 않았습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seguro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verzoek voor inloggen met Apple is niet verwerkt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保险" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 登录请求未处理" } } } }, - "documents_type_manual" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Handbuch" + "Apple Sign In requires user interaction": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Apple Sign In requires user interaction" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manual" + "es": { + "stringUnit": { + "state": "translated", + "value": "Iniciar sesión con Apple requiere interacción del usuario" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manual" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion avec Apple nécessite une interaction de l'utilisateur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manuel" + "de": { + "stringUnit": { + "state": "translated", + "value": "Apple-Anmeldung erfordert eine Interaktion" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manuale" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O Login com a Apple requer interação do usuário" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マニュアル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accedi con Apple richiede l'interazione dell'utente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "매뉴얼" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Appleでのサインインには操作が必要です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Handleiding" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Apple 로그인에 사용자 작업이 필요합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manual" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen met Apple vereist gebruikersinteractie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "手册" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Apple 登录需要用户操作" } } } }, - "documents_type_other" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Andere" + "Failed to load documents": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load documents" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Other" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los documentos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otro" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des documents" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autre" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokumente konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Altro" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar os documentos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i documenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기타" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの読み込みに失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Overig" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Outro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Documenten laden mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "其他" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载文档失败" } } } }, - "documents_type_permit" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Genehmigung" + "Failed to load document": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load document" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permit" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cargar el documento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permiso" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement du document" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument konnte nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permesso" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar o documento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "許可証" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare il documento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "허가서" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの読み込みに失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vergunning" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Permissão" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document laden mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "许可证" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载文档失败" } } } }, - "documents_type_photo" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "Failed to update document": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update document" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photo" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar el documento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour du document" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photo" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument konnte nicht aktualisiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar o documento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare il documento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの更新に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 업데이트하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document bijwerken mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新文档失败" } } } }, - "documents_type_receipt" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quittung" + "Failed to delete document": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to delete document" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Receipt" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo eliminar el documento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recibo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la suppression du document" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reçu" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument konnte nicht gelöscht werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ricevuta" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao excluir o documento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "領収書" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile eliminare il documento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "영수증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ドキュメントの削除に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bon" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 삭제하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recibo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document verwijderen mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "收据" + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除文档失败" } } } }, - "documents_type_unknown" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unbekannt" + "Failed to delete image": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to delete image" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unknown" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo eliminar la imagen" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconocido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la suppression de l'image" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inconnu" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild konnte nicht gelöscht werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sconosciuto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao excluir a imagem" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "不明" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile eliminare l'immagine" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "알 수 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像の削除に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Onbekend" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지를 삭제하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desconhecido" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Afbeelding verwijderen mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除图片失败" } } } }, - "documents_type_warranty" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie" + "Network Error": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Network Error" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de red" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur réseau" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Netzwerkfehler" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro de rede" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証" + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore di rete" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ネットワークエラー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "네트워크 오류" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Netwerkfout" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "网络错误" } } } }, - "documents_update" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktualisieren" + "An error occurred.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "An error occurred." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Update" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ocurrió un error." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualizar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur s'est produite." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mettre à Jour" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ein Fehler ist aufgetreten." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiorna" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocorreu um erro." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업데이트" + "ja": { + "stringUnit": { + "state": "translated", + "value": "エラーが発生しました。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bijwerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오류가 발생했습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualizar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er is een fout opgetreden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新" + "zh": { + "stringUnit": { + "state": "translated", + "value": "发生错误。" } } } }, - "documents_updated" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktualisiert" + "Failed to create share link.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create share link." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Updated" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear el enlace para compartir." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualizado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du lien de partage." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mis à Jour" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabelink konnte nicht erstellt werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiornato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar o link de compartilhamento." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "更新済み" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare il link di condivisione." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업데이트됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有リンクの作成に失敗しました。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bijgewerkt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 링크를 생성하지 못했습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualizado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deellink maken mislukt." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "已更新" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建分享链接失败。" } } } }, - "documents_uploaded_by" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hochgeladen Von" + "Report generated, but no message returned.": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Report generated, but no message returned." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uploaded By" + "es": { + "stringUnit": { + "state": "translated", + "value": "Se generó el informe, pero no se devolvió ningún mensaje." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subido Por" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rapport généré, mais aucun message renvoyé." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Téléchargé Par" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bericht erstellt, aber keine Nachricht erhalten." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricato da" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Relatório gerado, mas nenhuma mensagem retornou." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アップロード者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Report generato, ma nessun messaggio restituito." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업로드한 사람" + "ja": { + "stringUnit": { + "state": "translated", + "value": "レポートは生成されましたが、メッセージが返されませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geüpload door" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보고서가 생성되었지만 메시지가 반환되지 않았습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviado Por" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Rapport gegenereerd, maar geen bericht ontvangen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "上传者" + "zh": { + "stringUnit": { + "state": "translated", + "value": "报告已生成,但未返回消息。" } } } }, - "documents_warranties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantien" + "Task": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantías" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garanties" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garanzie" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garanties" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantias" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务" + } + } + } + }, + "%lld results": { + "extractionState": "manual", + "localizations": { + "en": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld result" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld results" + } + } + } + } + }, + "es": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld resultado" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld resultados" + } + } + } + } + }, + "fr": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld résultat" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld résultats" + } + } + } + } + }, + "de": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld Ergebnis" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld Ergebnisse" + } + } + } + } + }, + "it": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld risultato" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld risultati" + } + } + } + } + }, + "ja": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld件の結果" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld件の結果" + } + } + } + } + }, + "ko": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld개 결과" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld개 결과" + } + } + } + } + }, + "nl": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld resultaat" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld resultaten" + } + } + } + } + }, + "pt": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld resultado" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld resultados" + } + } + } + } + }, + "zh": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld 项结果" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld 项结果" + } + } + } + } + } + } + }, + "%lld tasks selected": { + "extractionState": "manual", + "localizations": { + "en": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld task selected" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld tasks selected" + } + } + } + } + }, + "es": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld tarea seleccionada" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld tareas seleccionadas" + } + } + } + } + }, + "fr": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld tâche sélectionnée" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld tâches sélectionnées" + } + } + } + } + }, + "de": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld Aufgabe ausgewählt" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld Aufgaben ausgewählt" + } + } + } + } + }, + "it": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld attività selezionata" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld attività selezionate" + } + } + } + } + }, + "ja": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld件のタスクを選択" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld件のタスクを選択" + } + } + } + } + }, + "ko": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld개 작업 선택됨" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld개 작업 선택됨" + } + } + } + } + }, + "nl": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld taak geselecteerd" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld taken geselecteerd" + } + } + } + } + }, + "pt": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "%lld tarefa selecionada" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "%lld tarefas selecionadas" + } + } + } + } + }, + "zh": { + "variations": { + "plural": { + "one": { + "stringUnit": { + "state": "translated", + "value": "已选择 %lld 项任务" + } + }, + "other": { + "stringUnit": { + "state": "translated", + "value": "已选择 %lld 项任务" + } + } + } } } } }, - "documents_warranty_claims" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantieansprüche" + "%@. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%@. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty Claims" + "es": { + "stringUnit": { + "state": "translated", + "value": "%@. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reclamos de Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%@. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Réclamations de Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "%@. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reclami garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%@. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証クレーム" + "it": { + "stringUnit": { + "state": "translated", + "value": "%@. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 청구" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%@。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantieclaims" + "ko": { + "stringUnit": { + "state": "translated", + "value": "%@. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reclamações de Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%@. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修理赔" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%@。请重试。" } } } }, - "documents_warranty_dates" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantiedaten" + "%lld tasks": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "%lld tasks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty Dates" + "es": { + "stringUnit": { + "state": "translated", + "value": "%lld tareas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fechas de Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "%lld tâches" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dates de Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "%lld Aufgaben" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "%lld tarefas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証日" + "it": { + "stringUnit": { + "state": "translated", + "value": "%lld attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 날짜" + "ja": { + "stringUnit": { + "state": "translated", + "value": "%lld 件のタスク" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantiedata" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 %lld개" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Datas de Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "%lld taken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "%lld 项任务" } } } }, - "documents_warranty_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantiedetails" + "7-day free trial, then %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "7-day free trial, then %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "Prueba gratis de 7 días, luego %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles de la Garantía" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Essai gratuit de 7 jours, puis %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails de la Garantie" + "de": { + "stringUnit": { + "state": "translated", + "value": "7 Tage kostenlos testen, danach %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli garanzia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Teste grátis de 7 dias, depois %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証の詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Prova gratuita di 7 giorni, poi %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 상세정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "7日間の無料トライアル、その後 %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantiegegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "7일 무료 체험 후 %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes da Garantia" + "nl": { + "stringUnit": { + "state": "translated", + "value": "7 dagen gratis proberen, daarna %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "7 天免费试用,之后 %@" } } } }, - "Don't worry, nothing's written in stone here.\nYou can always change it later in the app." : { - - }, - "Done" : { - "comment" : "A button that dismisses an image viewer sheet.", - "isCommentAutoGenerated" : true - }, - "Double tap to %@ completions" : { - - }, - "Double tap to archive this task" : { - "comment" : "A hint for the user to double tap a task to archive it.", - "isCommentAutoGenerated" : true - }, - "Double tap to cancel this task" : { - "comment" : "A hint for the user to double tap a task to cancel it.", - "isCommentAutoGenerated" : true - }, - "Double tap to complete this task" : { - "comment" : "A hint for the user to double tap a task to complete it.", - "isCommentAutoGenerated" : true - }, - "Double tap to continue to the next step" : { - "comment" : "A hint that describes the action to be taken.", - "isCommentAutoGenerated" : true - }, - "Double tap to create account" : { - - }, - "Double tap to edit this task" : { - "comment" : "A hint for the user to double tap a task to edit it.", - "isCommentAutoGenerated" : true - }, - "Double tap to join an existing property with a share code" : { - - }, - "Double tap to log in to your existing account" : { - - }, - "Double tap to mark this task as in progress" : { - "comment" : "A hint for the user to double tap a task to mark it as in progress.", - "isCommentAutoGenerated" : true - }, - "Double tap to restore this task" : { - "comment" : "A hint for the user to double tap a task to restore it.", - "isCommentAutoGenerated" : true - }, - "Double tap to send a verification code to your email" : { - - }, - "Double tap to sign in" : { - - }, - "Double tap to start setting up your property" : { - - }, - "Double tap to unarchive this task" : { - "comment" : "A hint for unarchive task buttons.", - "isCommentAutoGenerated" : true - }, - "Double tap to use this template" : { - "comment" : "A hint for using a task template.", - "isCommentAutoGenerated" : true - }, - "Downloading..." : { - - }, - "Easy Share" : { - "comment" : "A section header for the \"Easy Share\" feature on the Share Code Card.", - "isCommentAutoGenerated" : true - }, - "Edit" : { - "comment" : "A label for an edit action.", - "isCommentAutoGenerated" : true - }, - "Edit property" : { - "comment" : "A label for the edit button in the residences list.", - "isCommentAutoGenerated" : true - }, - "Edit task" : { - "comment" : "A label for a button that edits a task.", - "isCommentAutoGenerated" : true - }, - "Edit Task" : { - "comment" : "A label for an \"Edit Task\" button.", - "isCommentAutoGenerated" : true - }, - "EMAIL" : { - - }, - "Email Address" : { - "comment" : "A label for the user to input their email address.", - "isCommentAutoGenerated" : true - }, - "Enter 6-character share code" : { - - }, - "Enter 6-digit code" : { - "comment" : "A placeholder text for a text field where a user can enter a 6-digit code.", - "isCommentAutoGenerated" : true - }, - "Enter 6-digit verification code" : { - - }, - "Enter 6-digit verification code from your email" : { - - }, - "Enter a password with at least 8 characters" : { - - }, - "Enter a unique username" : { - - }, - "Enter new password" : { - - }, - "Enter share code" : { - "comment" : "A placeholder text for the user to enter the share code.", - "isCommentAutoGenerated" : true - }, - "Enter the 6-character code shared with you to join an existing home." : { - "comment" : "A description under the code input field, instructing the user to enter the 6-character code shared with them to join a residence.", - "isCommentAutoGenerated" : true - }, - "Enter the 6-digit code from your email" : { - "comment" : "A footer label explaining that users should enter the 6-digit code they received in their email.", - "isCommentAutoGenerated" : true - }, - "Enter the name of your property" : { - - }, - "Enter the number of days between each occurrence" : { - - }, - "Enter your account email address" : { - - }, - "Enter your email address" : { - - }, - "Enter your email address and we'll send you a verification code" : { - "comment" : "A description below the email input field, instructing the user to enter their email address to receive a password reset code.", - "isCommentAutoGenerated" : true - }, - "Enter your first name" : { - - }, - "Enter your last name" : { - - }, - "Enter your ZIP code" : { - - }, - "Enter your ZIP code so we can suggest\nmaintenance tasks for your climate region." : { - - }, - "Error" : { - "comment" : "The title of an alert that appears when there's an error.", - "isCommentAutoGenerated" : true - }, - "error_generic" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Etwas ist schiefgelaufen. Bitte versuchen Sie es erneut." + "Access denied": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Access denied" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Something went wrong. Please try again." + "es": { + "stringUnit": { + "state": "translated", + "value": "Acceso denegado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Algo salió mal. Por favor intenta de nuevo." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Accès refusé" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une erreur s'est produite. Veuillez réessayer." + "de": { + "stringUnit": { + "state": "translated", + "value": "Zugriff verweigert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si è verificato un errore. Riprova." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Acesso negado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "エラーが発生しました。もう一度お試しください。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso negato" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문제가 발생했습니다. 다시 시도해 주세요." + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクセスが拒否されました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Er is iets misgegaan. Probeer het opnieuw." + "ko": { + "stringUnit": { + "state": "translated", + "value": "접근이 거부되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Algo deu errado. Por favor, tente novamente." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toegang geweigerd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "出错了。请重试。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "访问被拒绝" } } } }, - "error_network" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Netzwerkfehler. Überprüfen Sie Ihre Verbindung." + "Access denied. Please check your credentials.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Access denied. Please check your credentials." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Network error. Please check your connection." + "es": { + "stringUnit": { + "state": "translated", + "value": "Acceso denegado. Comprueba tus credenciales." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error de red. Verifica tu conexión." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Accès refusé. Vérifiez vos identifiants." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur réseau. Vérifiez votre connexion." + "de": { + "stringUnit": { + "state": "translated", + "value": "Zugriff verweigert. Bitte überprüfe deine Anmeldedaten." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Errore di rete. Controlla la connessione." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Acesso negado. Verifique suas credenciais." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ネットワークエラー。接続を確認してください。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso negato. Controlla le tue credenziali." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "네트워크 오류. 연결을 확인하세요." + "ja": { + "stringUnit": { + "state": "translated", + "value": "アクセスが拒否されました。認証情報を確認してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Netwerkfout. Controleer uw verbinding." + "ko": { + "stringUnit": { + "state": "translated", + "value": "접근이 거부되었습니다. 인증 정보를 확인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erro de rede. Verifique sua conexão." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Toegang geweigerd. Controleer je inloggegevens." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "网络错误。请检查您的连接。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "访问被拒绝。请检查您的凭据。" } } } }, - "error_not_found" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nicht gefunden" + "Appliance": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Appliance" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Not found" + "es": { + "stringUnit": { + "state": "translated", + "value": "Electrodoméstico" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No encontrado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appareil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non trouvé" + "de": { + "stringUnit": { + "state": "translated", + "value": "Gerät" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non trovato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Eletrodoméstico" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "見つかりません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Elettrodomestico" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "찾을 수 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "家電" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Niet gevonden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가전제품" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Não encontrado" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Apparaat" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未找到" + "zh": { + "stringUnit": { + "state": "translated", + "value": "电器" } } } }, - "error_required_field" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dieses Feld ist erforderlich" + "Asphalt Shingle": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Asphalt Shingle" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "This field is required" + "es": { + "stringUnit": { + "state": "translated", + "value": "Teja asfáltica" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Este campo es requerido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bardeau d'asphalte" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ce champ est requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Asphaltschindel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Questo campo è obbligatorio" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telha asfáltica" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この項目は必須です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tegola bituminosa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 필드는 필수입니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アスファルトシングル" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dit veld is verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "아스팔트 슁글" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Este campo é obrigatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Asfaltshingle" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "此字段为必填项" + "zh": { + "stringUnit": { + "state": "translated", + "value": "沥青瓦" } } } }, - "error_unauthorized" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sitzung abgelaufen. Bitte melden Sie sich erneut an." + "Authentication failed. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Authentication failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Session expired. Please log in again." + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de autenticación. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sesión expirada. Inicia sesión de nuevo." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'authentification. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Session expirée. Veuillez vous reconnecter." + "de": { + "stringUnit": { + "state": "translated", + "value": "Authentifizierung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non autorizzato. Effettua nuovamente l'accesso." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na autenticação. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "認証されていません。再度ログインしてください。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Autenticazione non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "권한이 없습니다. 다시 로그인하세요." + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証に失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Niet geautoriseerd. Log opnieuw in." + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sessão expirada. Entre novamente." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatie mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "未授权。请重新登录。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "身份验证失败。请重试。" } } } }, - "Error: %@" : { - "comment" : "An error message displayed in the checkout view. The content of this message is determined by the `message` variable.", - "isCommentAutoGenerated" : true - }, - "Failed to load" : { - "comment" : "A message displayed when an image fails to load.", - "isCommentAutoGenerated" : true - }, - "Feature" : { - "comment" : "The header for a feature in the feature comparison table.", - "isCommentAutoGenerated" : true - }, - "Filter by specialty" : { - "comment" : "A button that filters the list of contractors by specialty.", - "isCommentAutoGenerated" : true - }, - "Filter documents" : { - - }, - "Forgot Password?" : { - "comment" : "A title for the \"Forgot Password?\" screen.", - "isCommentAutoGenerated" : true - }, - "Free" : { - "comment" : "A label indicating a free feature.", - "isCommentAutoGenerated" : true - }, - "Free trial ends %@" : { - - }, - "Generate Code" : { - "comment" : "A button label that generates a new invitation code.", - "isCommentAutoGenerated" : true - }, - "Generate maintenance report" : { - "comment" : "A button that generates a maintenance report.", - "isCommentAutoGenerated" : true - }, - "Generate New Code" : { - "comment" : "A button label that appears when a user wants to generate a new invitation code.", - "isCommentAutoGenerated" : true - }, - "Generate new share code" : { - "comment" : "A button that generates a new share code.", - "isCommentAutoGenerated" : true - }, - "Get notified when someone joins your property" : { - - }, - "Get notified when tasks are assigned to you" : { - - }, - "Get notified when tasks are completed by others" : { - - }, - "Get notified when tasks are due soon" : { - - }, - "Get notified when tasks are overdue" : { - - }, - "Get notified when warranties are about to expire" : { - - }, - "Go back" : { - "comment" : "A label for the back button.", - "isCommentAutoGenerated" : true - }, - "Google Sign-In Error" : { - - }, - "Help improve honeyDue by sharing anonymous usage data" : { - - }, - "Honeycomb Pattern" : { - "comment" : "A feature that adds a subtle hexagonal grid overlay to the app's interface.", - "isCommentAutoGenerated" : true - }, - "honeyDue" : { - "comment" : "The name of the app.", - "isCommentAutoGenerated" : true - }, - "HONEYDUE PRO" : { - - }, - "Hour" : { - "comment" : "A picker for selecting an hour.", - "isCommentAutoGenerated" : true - }, - "I have a code to join" : { - "comment" : "A button label that instructs the user to join an existing honeyDue account.", - "isCommentAutoGenerated" : true - }, - "I'm Ready!" : { - "comment" : "A button label that indicates the user is ready to use honeyDue.", - "isCommentAutoGenerated" : true - }, - "Image" : { - "comment" : "A label describing an image.", - "isCommentAutoGenerated" : true - }, - "Image %lld of %lld" : { - "comment" : "A navigation title that shows the current image index and the total number of images.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Image %1$lld of %2$lld" + "Boiler": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Boiler" } - } - } - }, - "Import" : { - "comment" : "The text on a button that triggers the import action.", - "isCommentAutoGenerated" : true - }, - "Import Failed" : { - "comment" : "A dialog title when importing a contractor fails.", - "isCommentAutoGenerated" : true - }, - "In Progress" : { - "comment" : "A label displayed next to an image of a play button, indicating that a task is currently in progress.", - "isCommentAutoGenerated" : true - }, - "Invite Others" : { - "comment" : "A header that suggests inviting others to join the app.", - "isCommentAutoGenerated" : true - }, - "Join a property" : { - "comment" : "A button that opens a sheet for joining a residence.", - "isCommentAutoGenerated" : true - }, - "Join a Residence" : { - "comment" : "A button label that instructs the user to join an existing residence.", - "isCommentAutoGenerated" : true - }, - "Join Failed" : { - "comment" : "An alert title displayed when joining a residence fails.", - "isCommentAutoGenerated" : true - }, - "Join honeyDue" : { - "comment" : "A title for the registration screen.", - "isCommentAutoGenerated" : true - }, - "Join Residence" : { - "comment" : "A button label that allows a user to join an existing residence.", - "isCommentAutoGenerated" : true - }, - "Joined Residence" : { - - }, - "Joining residence..." : { - "comment" : "A message displayed while waiting for the app to join a residence.", - "isCommentAutoGenerated" : true - }, - "Joining..." : { - - }, - "Let's get you started with some tasks.\nThe more you pick, the more we'll help you remember!" : { - - }, - "Let's give your place a name!" : { - - }, - "Loading" : { - - }, - "Loading..." : { - "comment" : "A placeholder text indicating that content is loading.", - "isCommentAutoGenerated" : true - }, - "Log in" : { - - }, - "Logging in..." : { - - }, - "Manage at honeyDue.treytartt.com" : { - - }, - "Manage users" : { - "comment" : "A button that opens a sheet for managing users in a residence.", - "isCommentAutoGenerated" : true - }, - "Manage your subscription at honeyDue.treytartt.com" : { - "comment" : "A description of how to manage a subscription on a third-party platform.", - "isCommentAutoGenerated" : true - }, - "Manage your subscription on your Android device" : { - - }, - "Mark as in progress" : { - "comment" : "A hint for the user to mark a task as in progress.", - "isCommentAutoGenerated" : true - }, - "Mark Task In Progress" : { - "comment" : "A button label that says \"Mark Task In Progress\".", - "isCommentAutoGenerated" : true - }, - "Need inspiration?" : { - - }, - "NEW PASSWORD" : { - - }, - "No active code" : { - "comment" : "A message indicating that a user does not have an active share code.", - "isCommentAutoGenerated" : true - }, - "No personal data is collected. Analytics are fully anonymous." : { - - }, - "No properties yet" : { - - }, - "No shared users" : { - - }, - "No Tasks" : { - "comment" : "A description displayed when there are no tasks to display in a column view.", - "isCommentAutoGenerated" : true - }, - "No tasks yet" : { - "comment" : "A description displayed when a user has no tasks.", - "isCommentAutoGenerated" : true - }, - "No Templates Available" : { - "comment" : "A message indicating that there are no task templates available.", - "isCommentAutoGenerated" : true - }, - "No Templates Found" : { - "comment" : "A message displayed when no task templates match a search query.", - "isCommentAutoGenerated" : true - }, - "None" : { - "comment" : "A button that clears the selection.", - "isCommentAutoGenerated" : true - }, - "not selected" : { - "comment" : "A label that describes the selection state of a task.", - "isCommentAutoGenerated" : true - }, - "Notification Time" : { - "comment" : "The title of the sheet where a user can select the time for receiving notifications.", - "isCommentAutoGenerated" : true - }, - "Notifications will be sent at %@ in your local timezone" : { - "comment" : "A label below the time picker, explaining that the notifications will be sent at the selected time in the user's local timezone.", - "isCommentAutoGenerated" : true - }, - "Notify at %@" : { - "comment" : "A row in the checkout view that lets the user change the time they want to be notified.", - "isCommentAutoGenerated" : true - }, - "OK" : { - "comment" : "A button that dismisses the success dialog.", - "isCommentAutoGenerated" : true - }, - "Open %@ in Maps" : { - "comment" : "A label for the accessibility element that opens the address in Maps.", - "isCommentAutoGenerated" : true - }, - "Open honeyDue.treytartt.com" : { - "comment" : "A button label that opens the user's subscription management page in a web browser.", - "isCommentAutoGenerated" : true - }, - "Opens email to contact support" : { - - }, - "or" : { - - }, - "Overview" : { - "comment" : "The title of the overview card.", - "isCommentAutoGenerated" : true - }, - "Owner" : { - "comment" : "A label indicating that a user is an owner of a residence.", - "isCommentAutoGenerated" : true - }, - "PASSWORD REQUIREMENTS" : { - - }, - "Photo" : { - "comment" : "A title for a view that displays a single photo.", - "isCommentAutoGenerated" : true - }, - "Photo%@" : { - "comment" : "A label for a photo. The argument is the caption of the photo.", - "isCommentAutoGenerated" : true - }, - "Primary" : { - "comment" : "A label indicating that a residence is the user's primary residence.", - "isCommentAutoGenerated" : true - }, - "Primary property" : { - "comment" : "A label for the star icon.", - "isCommentAutoGenerated" : true - }, - "Privacy" : { - - }, - "Pro" : { - "comment" : "The title of the \"Pro\" plan in the feature comparison view.", - "isCommentAutoGenerated" : true + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Caldera" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chaudière" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Heizkessel" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Caldeira" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Caldaia" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "ボイラー" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "보일러" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ketel" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "锅炉" + } + } + } }, - "profile_account" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Konto" + "Brick": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Brick" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account" + "es": { + "stringUnit": { + "state": "translated", + "value": "Ladrillo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuenta" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Brique" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compte" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ziegel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tijolo" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウント" + "it": { + "stringUnit": { + "state": "translated", + "value": "Mattone" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "レンガ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Account" + "ko": { + "stringUnit": { + "state": "translated", + "value": "벽돌" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conta" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Baksteen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "账户" + "zh": { + "stringUnit": { + "state": "translated", + "value": "砖" } } } }, - "profile_active_until" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktiv bis" + "Carpet": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Carpet" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Active until" + "es": { + "stringUnit": { + "state": "translated", + "value": "Moqueta" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activo hasta" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Moquette" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actif jusqu'au" + "de": { + "stringUnit": { + "state": "translated", + "value": "Teppich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attivo fino al" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carpete" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "有効期限" + "it": { + "stringUnit": { + "state": "translated", + "value": "Moquette" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "유효 기간" + "ja": { + "stringUnit": { + "state": "translated", + "value": "カーペット" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actief tot" + "ko": { + "stringUnit": { + "state": "translated", + "value": "카펫" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ativo até" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tapijt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "有效期至" + "zh": { + "stringUnit": { + "state": "translated", + "value": "地毯" } } } }, - "profile_app_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "Casa de [Your Name]": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Casa de [Your Name]" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Casa de [Your Name]" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Maison de [Your Name]" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "de": { + "stringUnit": { + "state": "translated", + "value": "Haus von [Your Name]" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Casa de [Your Name]" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "it": { + "stringUnit": { + "state": "translated", + "value": "Casa di [Your Name]" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ja": { + "stringUnit": { + "state": "translated", + "value": "[Your Name] の家" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "ko": { + "stringUnit": { + "state": "translated", + "value": "[Your Name]의 집" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Huis van [Your Name]" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "honeyDue" + "zh": { + "stringUnit": { + "state": "translated", + "value": "[Your Name] 的家" } } } }, - "profile_appearance" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erscheinungsbild" + "Central AC": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Central AC" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appearance" + "es": { + "stringUnit": { + "state": "translated", + "value": "Aire central" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apariencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Clim centrale" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apparence" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zentrale Klimaanlage" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aspetto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ar-condicionado central" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "外観" + "it": { + "stringUnit": { + "state": "translated", + "value": "Climatizzazione centralizzata" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "외관" + "ja": { + "stringUnit": { + "state": "translated", + "value": "セントラルエアコン" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Weergave" + "ko": { + "stringUnit": { + "state": "translated", + "value": "중앙 냉방" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aparência" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Centrale airco" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "外观" + "zh": { + "stringUnit": { + "state": "translated", + "value": "中央空调" } } } }, - "profile_benefit_actionable_notifications" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actionable Notifications" + "Check your email for a 6-digit verification code": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Check your email for a 6-digit verification code" } - } - } - }, - "profile_benefit_contractor_sharing" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractor Sharing" + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Revisa tu correo para ver el código de verificación de 6 dígitos" } - } - } - }, - "profile_benefit_document_vault" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Document & Warranty Storage" + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Consultez votre e-mail pour le code de vérification à 6 chiffres" } - } - } - }, - "profile_benefit_residence_sharing" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residence Sharing" + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Prüfe deine E-Mail auf den 6-stelligen Bestätigungscode" } - } - } - }, - "profile_benefit_unlimited_properties" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unlimited Properties" + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Verifique seu e-mail para o código de verificação de 6 dígitos" } - } - } - }, - "profile_benefit_widgets" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Home Screen Widgets" + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Controlla la tua email per il codice di verifica a 6 cifre" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールで6桁の確認コードを確認してください" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일에서 6자리 인증 코드를 확인하세요" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Controleer je e-mail voor de 6-cijferige verificatiecode" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "请查收邮件中的 6 位验证码" } } } }, - "profile_contact" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontakt" + "Château Us": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Château Us" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact" + "es": { + "stringUnit": { + "state": "translated", + "value": "Château Nuestro" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contacto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Château Chez Nous" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact" + "de": { + "stringUnit": { + "state": "translated", + "value": "Château bei uns" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contatto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Château Nosso" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "連絡先" + "it": { + "stringUnit": { + "state": "translated", + "value": "Château Nostro" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "연락처" + "ja": { + "stringUnit": { + "state": "translated", + "value": "私たちの邸宅" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact" + "ko": { + "stringUnit": { + "state": "translated", + "value": "우리들의 저택" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contato" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Château Ons" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "联系方式" + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们的城堡" } } } }, - "profile_contact_support" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contact Support" + "Code": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Code" } - } - } - }, - "profile_contact_support_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Get help with your account" + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Código" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Code" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "コード" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码" } } } }, - "profile_daily_digest" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tägliche Zusammenfassung" + "Code verified! Now set your new password": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Code verified! Now set your new password" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Daily Summary" + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Código verificado! Ahora establece tu nueva contraseña" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resumen diario" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Code vérifié ! Définissez votre nouveau mot de passe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Résumé quotidien" + "de": { + "stringUnit": { + "state": "translated", + "value": "Code bestätigt! Lege jetzt dein neues Passwort fest" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Riepilogo giornaliero" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Código verificado! Agora defina sua nova senha" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "デイリーサマリー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Codice verificato! Ora imposta la nuova password" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "일일 요약" + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを確認しました。新しいパスワードを設定してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dagelijkse samenvatting" + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드가 확인되었습니다! 이제 새 비밀번호를 설정하세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resumo diário" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Code geverifieerd! Stel nu je nieuwe wachtwoord in" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "每日摘要" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码已验证!现在设置新密码" } } } }, - "profile_daily_digest_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tägliche Übersicht über fällige und überfällige Aufgaben" + "Completed By": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Completed By" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Daily overview of tasks due and overdue" + "es": { + "stringUnit": { + "state": "translated", + "value": "Completado por" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resumen diario de tareas pendientes y vencidas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé par" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aperçu quotidien des tâches à faire et en retard" + "de": { + "stringUnit": { + "state": "translated", + "value": "Erledigt von" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Panoramica giornaliera delle attività in scadenza e scadute" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído por" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限が近いタスクと期限切れのタスクの毎日の概要" + "it": { + "stringUnit": { + "state": "translated", + "value": "Completato da" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "마감 예정 및 지연된 작업의 일일 개요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "完了者" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dagelijks overzicht van taken die binnenkort verlopen en achterstallig zijn" + "ko": { + "stringUnit": { + "state": "translated", + "value": "완료한 사람" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Resumo diário de tarefas a vencer e atrasadas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooid door" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "即将到期和逾期任务的每日概览" + "zh": { + "stringUnit": { + "state": "translated", + "value": "完成人" } } } }, - "profile_edit_profile" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profil bearbeiten" + "Completed from widget": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Completed from widget" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Profile" + "es": { + "stringUnit": { + "state": "translated", + "value": "Completado desde el widget" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Perfil" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Terminé depuis le widget" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le Profil" + "de": { + "stringUnit": { + "state": "translated", + "value": "Über Widget erledigt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica profilo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concluído pelo widget" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィールを編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Completato dal widget" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ウィジェットから完了" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profiel bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "위젯에서 완료됨" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Perfil" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Voltooid via widget" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑资料" + "zh": { + "stringUnit": { + "state": "translated", + "value": "通过小组件完成" } } } }, - "profile_email" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail" + "Concrete": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Concrete" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "es": { + "stringUnit": { + "state": "translated", + "value": "Hormigón" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo Electrónico" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Béton" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "de": { + "stringUnit": { + "state": "translated", + "value": "Beton" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Concreto" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールアドレス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Cemento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "コンクリート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail" + "ko": { + "stringUnit": { + "state": "translated", + "value": "콘크리트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beton" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电子邮件" - } - } - } - }, - "profile_email_notifications" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email Notifications" + "zh": { + "stringUnit": { + "state": "translated", + "value": "混凝土" } } } }, - "profile_email_required_unique" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-Mail ist erforderlich und muss eindeutig sein" + "Connection lost. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Connection lost. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email is required and must be unique" + "es": { + "stringUnit": { + "state": "translated", + "value": "Conexión perdida. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El correo electrónico es obligatorio y debe ser único" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion perdue. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'email est requis et doit être unique" + "de": { + "stringUnit": { + "state": "translated", + "value": "Verbindung verloren. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Email obbligatoria e univoca" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Conexão perdida. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メールは必須で一意である必要があります" + "it": { + "stringUnit": { + "state": "translated", + "value": "Connessione persa. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이메일은 필수이며 고유해야 합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "接続が切れました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "E-mail is verplicht en moet uniek zijn" + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결이 끊어졌습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O email é obrigatório e deve ser único" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verbinding verbroken. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "电子邮件必填且唯一" + "zh": { + "stringUnit": { + "state": "translated", + "value": "连接已断开。请重试。" } } } }, - "profile_email_task_completed" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Completed Email" + "Continue with free plan": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Continue with free plan" } - } - } - }, - "profile_email_task_completed_description" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Receive email when a task is completed" + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Continuar con el plan gratuito" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Continuer avec le forfait gratuit" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Mit kostenlosem Tarif fortfahren" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Continuar com o plano gratuito" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Continua con il piano gratuito" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料プランで続行" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료 요금제로 계속하기" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Doorgaan met gratis abonnement" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "继续使用免费方案" } } } }, - "profile_first_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vorname" + "Contract": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contract" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "First Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contrato" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Contrat" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prénom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vertrag" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contrato" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Contratto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "契約書" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voornaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "계약서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primeiro Nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Contract" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "名字" + "zh": { + "stringUnit": { + "state": "translated", + "value": "合同" } } } }, - "profile_free_plan" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kostenloser Plan" + "Contractor added successfully": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor added successfully" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Free Plan" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista añadido correctamente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Gratuito" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire ajouté avec succès" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Gratuit" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister erfolgreich hinzugefügt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Piano gratuito" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador adicionado com sucesso" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "無料プラン" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fornitore aggiunto correttamente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "무료 플랜" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を追加しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gratis abonnement" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체가 추가되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plano Gratuito" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer toegevoegd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "免费版" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商添加成功" } } } }, - "profile_last_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nachname" + "Contractor deleted successfully": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor deleted successfully" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Last Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista eliminado correctamente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apellido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire supprimé avec succès" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom de famille" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister erfolgreich gelöscht" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cognome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador excluído com sucesso" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "姓" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fornitore eliminato correttamente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を削除しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Achternaam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체가 삭제되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sobrenome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer verwijderd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "姓氏" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商删除成功" } } } }, - "profile_limited_features" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eingeschränkte Funktionen" + "Contractor updated successfully": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Contractor updated successfully" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limited features" + "es": { + "stringUnit": { + "state": "translated", + "value": "Contratista actualizado correctamente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Funciones limitadas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Prestataire mis à jour avec succès" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fonctionnalités limitées" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister erfolgreich aktualisiert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Funzionalità limitate" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Prestador atualizado com sucesso" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "機能制限あり" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fornitore aggiornato correttamente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제한된 기능" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を更新しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beperkte functies" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체가 업데이트되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recursos limitados" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aannemer bijgewerkt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "功能有限" + "zh": { + "stringUnit": { + "state": "translated", + "value": "承包商更新成功" } } } }, - "profile_loading_profile" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profil wird geladen..." + "Could not create tasks.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Could not create tasks." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading profile..." + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron crear las tareas." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando perfil..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de créer les tâches." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement du profil..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben konnten nicht erstellt werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento profilo..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível criar as tarefas." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィールを読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare le attività." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを作成できませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profiel laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 생성할 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando perfil..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan geen taken aanmaken." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载资料中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法创建任务。" } } } }, - "profile_logout" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abmelden" + "Could not load suggestions.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Could not load suggestions." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Log Out" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las sugerencias." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cerrar Sesión" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les suggestions." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se déconnecter" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorschläge konnten nicht geladen werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esci" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar as sugestões." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ログアウト" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i suggerimenti." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로그아웃" + "ja": { + "stringUnit": { + "state": "translated", + "value": "提案を読み込めませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uitloggen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "추천 항목을 불러올 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sair" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan suggesties niet laden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "退出登录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载建议。" } } } }, - "profile_logout_confirm" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Möchten Sie sich wirklich abmelden?" + "Could not load templates.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Could not load templates." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to log out?" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las plantillas." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Seguro que quieres cerrar sesión?" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de charger les modèles." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir vous déconnecter ?" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vorlagen konnten nicht geladen werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sei sicuro di voler uscire?" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível carregar os modelos." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "本当にログアウトしますか?" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i modelli." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정말 로그아웃하시겠습니까?" + "ja": { + "stringUnit": { + "state": "translated", + "value": "テンプレートを読み込めませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Weet u zeker dat u wilt uitloggen?" + "ko": { + "stringUnit": { + "state": "translated", + "value": "템플릿을 불러올 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza que deseja sair?" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan sjablonen niet laden." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您确定要退出登录吗?" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法加载模板。" } } } }, - "profile_manage_subscription" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abonnement verwalten" + "Crimson": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Crimson" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Subscription" + "es": { + "stringUnit": { + "state": "translated", + "value": "Carmesí" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administrar Suscripción" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cramoisi" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gérer l'Abonnement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Karmesinrot" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gestisci abbonamento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Carmesim" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サブスクリプションを管理" + "it": { + "stringUnit": { + "state": "translated", + "value": "Cremisi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구독 관리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "クリムゾン" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abonnement beheren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "크림슨" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerenciar Assinatura" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Karmozijn" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理订阅" + "zh": { + "stringUnit": { + "state": "translated", + "value": "绯红" } } } }, - "profile_notification_preferences" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benachrichtigungspräferenzen" + "Custom interval must be a valid number": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Custom interval must be a valid number" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notification Preferences" + "es": { + "stringUnit": { + "state": "translated", + "value": "El intervalo personalizado debe ser un número válido" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferencias de Notificación" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'intervalle personnalisé doit être un nombre valide" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Préférences de Notification" + "de": { + "stringUnit": { + "state": "translated", + "value": "Das benutzerdefinierte Intervall muss eine gültige Zahl sein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferenze notifiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O intervalo personalizado deve ser um número válido" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通知設定" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'intervallo personalizzato deve essere un numero valido" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "알림 설정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "カスタム間隔には有効な数値を入力してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meldingsvoorkeuren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 지정 간격은 유효한 숫자여야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferências de Notificação" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het aangepaste interval moet een geldig getal zijn" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "通知偏好设置" + "zh": { + "stringUnit": { + "state": "translated", + "value": "自定义间隔必须是有效的数字" } } } }, - "profile_notification_preferences_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wählen Sie, welche Benachrichtigungen Sie erhalten möchten" + "Deed/Title": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Deed/Title" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Choose which notifications you'd like to receive" + "es": { + "stringUnit": { + "state": "translated", + "value": "Escritura/Título" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elige qué notificaciones te gustaría recibir" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Acte/Titre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Choisissez les notifications que vous souhaitez recevoir" + "de": { + "stringUnit": { + "state": "translated", + "value": "Urkunde/Titel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scegli le notifiche da ricevere" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Escritura/Título" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "受信する通知を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Atto/Titolo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "받을 알림 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "権利証/登記" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kies welke meldingen u wilt ontvangen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "권리증/등기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Escolha quais notificações você gostaria de receber" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Akte/Eigendomsbewijs" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择您要接收的通知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房契/产权" } } } }, - "profile_notifications" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benachrichtigungen" + "Default": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Default" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications" + "es": { + "stringUnit": { + "state": "translated", + "value": "Predeterminado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificaciones" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Par défaut" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications" + "de": { + "stringUnit": { + "state": "translated", + "value": "Standard" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Padrão" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通知" + "it": { + "stringUnit": { + "state": "translated", + "value": "Predefinito" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "デフォルト" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meldingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "기본" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificações" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Standaard" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "通知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "默认" } } } }, - "profile_other_notifications" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Andere Benachrichtigungen" + "Desert": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Desert" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Other Notifications" + "es": { + "stringUnit": { + "state": "translated", + "value": "Desierto" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otras Notificaciones" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Désert" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autres Notifications" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wüste" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Altre notifiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Deserto" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他の通知" + "it": { + "stringUnit": { + "state": "translated", + "value": "Deserto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기타 알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "デザート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Andere meldingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사막" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Outras Notificações" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woestijn" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "其他通知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "沙漠" } } } }, - "profile_personal_information" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Persönliche Informationen" + "Document created with incomplete data — images were not uploaded": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Document created with incomplete data — images were not uploaded" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Personal Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "Documento creado con datos incompletos: las imágenes no se subieron" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información Personal" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Document créé avec des données incomplètes — les images n'ont pas été envoyées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations Personnelles" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument mit unvollständigen Daten erstellt – Bilder wurden nicht hochgeladen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informazioni personali" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Documento criado com dados incompletos — as imagens não foram enviadas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "個人情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Documento creato con dati incompleti — le immagini non sono state caricate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "개인 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "不完全なデータで書類を作成しました — 画像はアップロードされませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Persoonlijke informatie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "불완전한 데이터로 문서가 생성되었습니다 — 이미지가 업로드되지 않았습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações Pessoais" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Document aangemaakt met onvolledige gegevens — afbeeldingen zijn niet geüpload" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "个人信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "已使用不完整的数据创建文档 — 图片未上传" } } } }, - "profile_privacy" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Datenschutz" + "Double tap to collapse completions": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Double tap to collapse completions" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy" + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para contraer las finalizaciones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacidad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appuyez deux fois pour réduire les achèvements" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confidentialité" + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um Erledigungen einzuklappen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para recolher as conclusões" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プライバシー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per comprimere i completamenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "개인정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで完了項目を折りたたむ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacy" + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 완료 항목 접기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Privacidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om voltooiingen samen te vouwen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "隐私" + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以收起已完成项" } } } }, - "profile_pro_plan" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pro-Plan" + "Double tap to expand completions": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Double tap to expand completions" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pro Plan" + "es": { + "stringUnit": { + "state": "translated", + "value": "Toca dos veces para expandir las finalizaciones" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Pro" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Appuyez deux fois pour développer les achèvements" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Pro" + "de": { + "stringUnit": { + "state": "translated", + "value": "Doppeltippen, um Erledigungen auszuklappen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Piano Pro" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Toque duas vezes para expandir as conclusões" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロプラン" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tocca due volte per espandere i completamenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로 플랜" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダブルタップで完了項目を展開する" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pro-abonnement" + "ko": { + "stringUnit": { + "state": "translated", + "value": "두 번 탭하여 완료 항목 펼치기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plano Pro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dubbeltik om voltooiingen uit te vouwen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "专业版" + "zh": { + "stringUnit": { + "state": "translated", + "value": "双击以展开已完成项" } } } }, - "profile_profile_settings" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profileinstellungen" + "Download failed: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Download failed: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profile Settings" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de descarga: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuración de Perfil" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du téléchargement : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paramètres du Profil" + "de": { + "stringUnit": { + "state": "translated", + "value": "Download fehlgeschlagen: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Impostazioni profilo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no download: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール設定" + "it": { + "stringUnit": { + "state": "translated", + "value": "Download non riuscito: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 설정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダウンロードに失敗しました: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profielinstellingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "다운로드 실패: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurações de Perfil" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Download mislukt: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "资料设置" + "zh": { + "stringUnit": { + "state": "translated", + "value": "下载失败:%@" } } } }, - "profile_property_shared" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie geteilt" + "Download failed: HTTP %lld": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Download failed: HTTP %lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Shared" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de descarga: HTTP %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad Compartida" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du téléchargement : HTTP %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété Partagée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Download fehlgeschlagen: HTTP %lld" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà condivisa" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha no download: HTTP %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件が共有されました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Download non riuscito: HTTP %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 공유됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ダウンロードに失敗しました: HTTP %lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom gedeeld" + "ko": { + "stringUnit": { + "state": "translated", + "value": "다운로드 실패: HTTP %lld" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade Compartilhada" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Download mislukt: HTTP %lld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产已共享" + "zh": { + "stringUnit": { + "state": "translated", + "value": "下载失败:HTTP %lld" } } } }, - "profile_property_shared_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wenn jemand eine Immobilie mit Ihnen teilt" + "Electric Furnace": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Electric Furnace" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "When someone shares a property with you" + "es": { + "stringUnit": { + "state": "translated", + "value": "Calefactor eléctrico" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuando alguien comparte una propiedad contigo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chauffage électrique" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quand quelqu'un partage une propriété avec vous" + "de": { + "stringUnit": { + "state": "translated", + "value": "Elektroheizung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando qualcuno condivide una proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aquecedor elétrico" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "誰かが物件を共有したとき" + "it": { + "stringUnit": { + "state": "translated", + "value": "Caldaia elettrica" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누군가 부동산을 공유할 때" + "ja": { + "stringUnit": { + "state": "translated", + "value": "電気ヒーター" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wanneer iemand een eigendom deelt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "전기 히터" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando alguém compartilha uma propriedade com você" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Elektrische verwarming" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "当有人与您共享房产时" + "zh": { + "stringUnit": { + "state": "translated", + "value": "电暖炉" } } } }, - "profile_purchases_restored" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Käufe wiederhergestellt" + "Electrical": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Electrical" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Purchases Restored" + "es": { + "stringUnit": { + "state": "translated", + "value": "Electricidad" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compras Restauradas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Électricité" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Achats Restaurés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Elektrik" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acquisti ripristinati" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Elétrica" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "購入が復元されました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impianto elettrico" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구매 복원됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "電気" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aankopen hersteld" + "ko": { + "stringUnit": { + "state": "translated", + "value": "전기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compras Restauradas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Elektra" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "购买已恢复" + "zh": { + "stringUnit": { + "state": "translated", + "value": "电气" } } } }, - "profile_purchases_restored_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ihre Käufe wurden erfolgreich wiederhergestellt." + "Email is required": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Email is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Your purchases have been restored successfully." + "es": { + "stringUnit": { + "state": "translated", + "value": "El correo es obligatorio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tus compras se han restaurado correctamente." + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'e-mail est obligatoire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vos achats ont été restaurés avec succès." + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acquisti ripristinati con successo." + "pt": { + "stringUnit": { + "state": "translated", + "value": "O e-mail é obrigatório" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "購入が正常に復元されました。" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'email è obbligatoria" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구매가 성공적으로 복원되었습니다." + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスは必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uw aankopen zijn succesvol hersteld." + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일은 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suas compras foram restauradas com sucesso." + "nl": { + "stringUnit": { + "state": "translated", + "value": "E-mail is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您的购买已成功恢复。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "电子邮件为必填项" } } } }, - "profile_restore_purchases" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Käufe wiederherstellen" + "Evaporative": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Evaporative" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restore Purchases" + "es": { + "stringUnit": { + "state": "translated", + "value": "Evaporativo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurar Compras" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Évaporatif" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurer les Achats" + "de": { + "stringUnit": { + "state": "translated", + "value": "Verdunstung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ripristina acquisti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Evaporativo" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "購入を復元" + "it": { + "stringUnit": { + "state": "translated", + "value": "Evaporativo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구매 복원" + "ja": { + "stringUnit": { + "state": "translated", + "value": "気化式" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aankopen herstellen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "증발식" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurar Compras" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verdampend" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "恢复购买" + "zh": { + "stringUnit": { + "state": "translated", + "value": "蒸发式" } } } }, - "profile_save_changes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Änderungen speichern" + "Failed to archive task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to archive task" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Save Changes" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo archivar la tarea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guardar Cambios" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'archivage de la tâche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enregistrer les Modifications" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe konnte nicht archiviert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salva modifiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao arquivar a tarefa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "変更を保存" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile archiviare l'attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "변경 사항 저장" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをアーカイブできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wijzigingen opslaan" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 보관하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salvar Alterações" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taak niet archiveren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存更改" + "zh": { + "stringUnit": { + "state": "translated", + "value": "归档任务失败" } } } }, - "profile_subscription" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abonnement" + "Failed to build authentication URL": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to build authentication URL" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subscription" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear la URL de autenticación" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suscripción" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création de l'URL d'authentification" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abonnement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Authentifizierungs-URL konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abbonamento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar a URL de autenticação" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サブスクリプション" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare l'URL di autenticazione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구독" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証URLを作成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abonnement" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 URL을 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Assinatura" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan verificatie-URL niet aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "订阅" - } - } - } - }, - "profile_support" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Support" + "zh": { + "stringUnit": { + "state": "translated", + "value": "构建身份验证 URL 失败" } } } }, - "profile_task_assigned" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe zugewiesen" + "Failed to cancel task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to cancel task" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Assigned" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cancelar la tarea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarea Asignada" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'annulation de la tâche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâche Assignée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe konnte nicht abgebrochen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività assegnata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao cancelar a tarefa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクが割り当てられました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile annullare l'attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 할당됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクをキャンセルできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak toegewezen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 취소하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefa Atribuída" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taak niet annuleren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务已分配" + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消任务失败" } } } }, - "profile_task_assigned_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wenn Ihnen eine Aufgabe zugewiesen wird" + "Failed to create account": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create account" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "When a task is assigned to you" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear la cuenta" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuando se te asigna una tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du compte" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quand une tâche vous est assignée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Konto konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando ti viene assegnata un'attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar a conta" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクが割り当てられたとき" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare l'account" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업이 할당될 때" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アカウントを作成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wanneer een taak aan u wordt toegewezen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "계정을 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando uma tarefa é atribuída a você" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan account niet aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "当任务被分配给您时" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建账户失败" } } } }, - "profile_task_completed" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe abgeschlossen" + "Failed to create contractor": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Completed" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear el contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarea Completada" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâche Terminée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività completata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar o prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクが完了しました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare il fornitore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 완료됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を作成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak voltooid" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefa Concluída" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemer niet aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务已完成" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建承包商失败" } } } }, - "profile_task_completed_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wenn jemand eine Aufgabe abschließt" + "Failed to create document": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create document" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "When someone completes a task" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear el documento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuando alguien completa una tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du document" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quand quelqu'un termine une tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dokument konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando qualcuno completa un'attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar o documento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "誰かがタスクを完了したとき" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare il documento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누군가 작업을 완료할 때" + "ja": { + "stringUnit": { + "state": "translated", + "value": "書類を作成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wanneer iemand een taak voltooit" + "ko": { + "stringUnit": { + "state": "translated", + "value": "문서를 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quando alguém conclui uma tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan document niet aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "当有人完成任务时" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建文档失败" } } } }, - "profile_task_due_soon" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe bald fällig" + "Failed to create share file": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to create share file" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Due Soon" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo crear el archivo para compartir" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarea Vence Pronto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la création du fichier de partage" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâche Bientôt Due" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabedatei konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività in scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao criar o arquivo de compartilhamento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクの期限が近い" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile creare il file di condivisione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 마감 임박" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有ファイルを作成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak nadert deadline" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 파일을 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefa Vence em Breve" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan deelbestand niet aanmaken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务即将到期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "创建共享文件失败" } } } }, - "profile_task_due_soon_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erinnerungen an bevorstehende Aufgaben" + "Failed to delete contractor": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to delete contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reminders for upcoming tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo eliminar el contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recordatorios para tareas próximas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la suppression du prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rappels pour les tâches à venir" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister konnte nicht gelöscht werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Promemoria per attività in scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao excluir o prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限が近いタスクのリマインダー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile eliminare il fornitore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "예정된 작업 알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を削除できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herinneringen voor aankomende taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 삭제하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lembretes para tarefas próximas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemer niet verwijderen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "即将到期任务的提醒" + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除承包商失败" } } } }, - "profile_task_notifications" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabenbenachrichtigungen" + "Failed to delete residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to delete residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Notifications" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo eliminar la residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificaciones de Tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la suppression de la résidence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications de Tâches" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnsitz konnte nicht gelöscht werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifiche attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao excluir a residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスク通知" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile eliminare la residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居を削除できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taakmeldingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지를 삭제하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notificações de Tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan woning niet verwijderen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务通知" + "zh": { + "stringUnit": { + "state": "translated", + "value": "删除住所失败" } } } }, - "profile_task_overdue" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe überfällig" + "Failed to exchange authorization code": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to exchange authorization code" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Overdue" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo canjear el código de autorización" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarea Atrasada" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'échange du code d'autorisation" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâche en Retard" + "de": { + "stringUnit": { + "state": "translated", + "value": "Autorisierungscode konnte nicht eingelöst werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività in ritardo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao trocar o código de autorização" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクの期限超過" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile scambiare il codice di autorizzazione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 기한 초과" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証コードを交換できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak achterstallig" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증 코드를 교환하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefa Atrasada" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan autorisatiecode niet uitwisselen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务已逾期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "交换授权码失败" } } } }, - "profile_task_overdue_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warnungen für überfällige Aufgaben" + "Failed to generate report": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to generate report" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alerts for overdue tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo generar el informe" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alertas para tareas atrasadas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la génération du rapport" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alertes pour les tâches en retard" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bericht konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avvisi per attività in ritardo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao gerar o relatório" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限超過タスクのアラート" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile generare il report" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기한 초과 작업 알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "レポートを生成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Waarschuwingen voor achterstallige taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보고서를 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alertas para tarefas atrasadas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan rapport niet genereren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "逾期任务的警告" + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成报告失败" } } } }, - "profile_theme" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thema" + "Failed to generate share code": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to generate share code" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Theme" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo generar el código para compartir" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tema" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la génération du code de partage" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thème" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode konnte nicht erstellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tema" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao gerar o código de compartilhamento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "テーマ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile generare il codice di condivisione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "테마" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードを生成できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thema" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드를 생성하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tema" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan deelcode niet genereren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "主题" + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成共享码失败" } } } }, - "profile_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profil" + "Failed to generate share code: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to generate share code: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profile" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo generar el código para compartir: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Perfil" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la génération du code de partage : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profil" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabecode konnte nicht erstellt werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profilo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao gerar o código de compartilhamento: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile generare il codice di condivisione: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードを生成できませんでした: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Profiel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드를 생성하지 못했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Perfil" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan deelcode niet genereren: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "个人资料" - } - } - } - }, - "profile_unlock_premium_features" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unlock Premium Features" + "zh": { + "stringUnit": { + "state": "translated", + "value": "生成共享码失败:%@" } } } }, - "profile_upgrade_to_pro" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auf Pro upgraden" + "Failed to get ID token from Google": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to get ID token from Google" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Upgrade to Pro" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo obtener el token de ID de Google" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualizar a Pro" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'obtention du jeton d'ID de Google" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passer à Pro" + "de": { + "stringUnit": { + "state": "translated", + "value": "ID-Token konnte nicht von Google abgerufen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passa a Pro" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao obter o token de ID do Google" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロにアップグレード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile ottenere il token ID da Google" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로로 업그레이드" + "ja": { + "stringUnit": { + "state": "translated", + "value": "GoogleからIDトークンを取得できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Upgraden naar Pro" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google에서 ID 토큰을 가져오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Atualizar para Pro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan ID-token niet ophalen van Google" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "升级到专业版" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法从 Google 获取 ID 令牌" } } } }, - "profile_version" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version 1.0.0" + "Failed to get authorization code from Google": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to get authorization code from Google" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version 1.0.0" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo obtener el código de autorización de Google" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versión 1.0.0" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'obtention du code d'autorisation de Google" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version 1.0.0" + "de": { + "stringUnit": { + "state": "translated", + "value": "Autorisierungscode konnte nicht von Google abgerufen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao obter o código de autorização do Google" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "バージョン" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile ottenere il codice di autorizzazione da Google" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "버전" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleから認証コードを取得できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google에서 인증 코드를 가져오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versão 1.0.0" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan autorisatiecode niet ophalen van Google" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "版本" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法从 Google 获取授权码" } } } }, - "profile_warranty_expiring" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie läuft ab" + "Failed to join residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to join residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Warranty Expiring" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo unir a la residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantía Venciendo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'accès à la résidence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie Expirant" + "de": { + "stringUnit": { + "state": "translated", + "value": "Beitritt zum Wohnsitz fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garanzia in scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao entrar na residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保証の期限が近い" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile accedere alla residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보증 만료 임박" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantie verloopt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지에 참여하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Garantia Expirando" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan niet deelnemen aan woning" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "保修即将过期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加入住所失败" } } } }, - "profile_warranty_expiring_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erinnerungen an ablaufende Garantien" + "Failed to load contractor details": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load contractor details" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reminders for expiring warranties" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los detalles del contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Recordatorios para garantías que vencen" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des détails du prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rappels pour les garanties expirant" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleisterdetails konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Promemoria per garanzie in scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar os detalhes do prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限が近い保証のリマインダー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i dettagli del fornitore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "만료 예정 보증 알림" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者の詳細を読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herinneringen voor verlopende garanties" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 세부 정보를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lembretes para garantias expirando" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemergegevens niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "即将过期保修的提醒" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载承包商详情失败" } } } }, - "properties_add_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie hinzufügen" + "Failed to load contractors": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load contractors" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los contratistas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des prestataires" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar os prestadores" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i fornitori" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemers niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载承包商失败" } } } }, - "properties_add_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie hinzufügen" + "Failed to load notification preferences": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load notification preferences" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las preferencias de notificación" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des préférences de notification" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungseinstellungen konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar as preferências de notificação" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le preferenze di notifica" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知設定を読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 설정을 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan meldingsvoorkeuren niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载通知偏好设置失败" } } } }, - "properties_address_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "Failed to load products: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load products: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Address" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los productos: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dirección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des produits : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "de": { + "stringUnit": { + "state": "translated", + "value": "Produkte konnten nicht geladen werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indirizzo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar os produtos: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "住所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare i prodotti: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "주소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "製品を読み込めませんでした: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adres" + "ko": { + "stringUnit": { + "state": "translated", + "value": "제품을 불러오지 못했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan producten niet laden: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "地址" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载产品失败:%@" } } } }, - "properties_delete_confirm" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Möchten Sie diese Immobilie wirklich löschen?" + "Failed to load profile": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load profile" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to delete this property?" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cargar el perfil" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Seguro que quieres eliminar esta propiedad?" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement du profil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer cette propriété ?" + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil konnte nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminare questa proprietà?" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar o perfil" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この物件を削除しますか?" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare il profilo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 부동산을 삭제하시겠습니까?" + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dit eigendom verwijderen?" + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필을 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza que deseja excluir esta propriedade?" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan profiel niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "确定删除此房产?" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载个人资料失败" } } } }, - "properties_deleted" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie gelöscht" + "Failed to load residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property deleted" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo cargar la residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad eliminada" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement de la résidence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété supprimée" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnsitz konnte nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà eliminata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar a residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件が削除されました" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare la residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 삭제됨" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居を読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom verwijderd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade excluída" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan woning niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产已删除" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载住所失败" } } } }, - "properties_edit_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie bearbeiten" + "Failed to load tasks": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load tasks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar las tareas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des tâches" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier la propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgaben konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar as tarefas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare le attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taken niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载任务失败" } } } }, - "properties_empty_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie Ihre erste Immobilie hinzu!" + "Failed to load users": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to load users" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add your first property to get started!" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron cargar los usuarios" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Agrega tu primera propiedad para comenzar!" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du chargement des utilisateurs" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez votre première propriété pour commencer !" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzer konnten nicht geladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi la prima proprietà!" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao carregar os usuários" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最初の物件を追加して始めましょう!" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare gli utenti" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "첫 번째 부동산을 추가하여 시작하세요!" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーを読み込めませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg uw eerste eigendom toe!" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자를 불러오지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione sua primeira propriedade para começar!" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan gebruikers niet laden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加您的第一个房产开始吧!" + "zh": { + "stringUnit": { + "state": "translated", + "value": "加载用户失败" } } } }, - "properties_empty_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Immobilien" + "Failed to mark task in progress": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to mark task in progress" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No properties yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo marcar la tarea en curso" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sin propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de marquer la tâche en cours" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe konnte nicht als „in Bearbeitung“ markiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao marcar a tarefa como em andamento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件がありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile contrassegnare l'attività come in corso" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを進行中にできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 진행 중으로 표시하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taak niet markeren als in uitvoering" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法将任务标记为进行中" } } } }, - "properties_name_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name der Immobilie" + "Failed to process image %lld": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to process image %lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo procesar la imagen %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de la Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du traitement de l'image %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom de la propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild %lld konnte nicht verarbeitet werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao processar a imagem %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile elaborare l'immagine %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像 %lld を処理できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Naam eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지 %lld을(를) 처리하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan afbeelding %lld niet verwerken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "处理图片 %lld 失败" } } } }, - "properties_notes_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen" + "Failed to read contractor file: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to read contractor file: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo leer el archivo del contratista: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la lecture du fichier du prestataire : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleisterdatei konnte nicht gelesen werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao ler o arquivo do prestador: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile leggere il file del fornitore: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者ファイルを読み込めませんでした: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체 파일을 읽지 못했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemerbestand niet lezen: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "读取承包商文件失败:%@" } } } }, - "properties_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meine Immobilien" + "Failed to read residence share file: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to read residence share file: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "My Properties" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo leer el archivo de la residencia: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mis Propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la lecture du fichier de partage de la résidence : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mes Propriétés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabedatei des Wohnsitzes konnte nicht gelesen werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le mie proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao ler o arquivo de compartilhamento da residência: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マイ物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile leggere il file di condivisione della residenza: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "내 부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居の共有ファイルを読み込めませんでした: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mijn eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 공유 파일을 읽지 못했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minhas Propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan deelbestand van woning niet lezen: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "我的房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "读取住所共享文件失败:%@" } } } }, - "properties_type_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilientyp" + "Failed to remove user": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to remove user" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Type" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo eliminar el usuario" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la suppression de l'utilisateur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzer konnte nicht entfernt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao remover o usuário" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件タイプ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile rimuovere l'utente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 유형" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザーを削除できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자를 제거하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan gebruiker niet verwijderen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "移除用户失败" } } } }, - "Property #%d" : { - "comment" : "A fallback text that appears when the associated residence ID is not found in the user's residences. The placeholder number is replaced with the actual residence ID.", - "isCommentAutoGenerated" : true - }, - "Quick Start" : { - - }, - "Rated %@ out of 5" : { - "comment" : "A label that describes the rating of a task completion. The argument is the rating.", - "isCommentAutoGenerated" : true - }, - "Rated 4.9 stars by 10K+ homeowners" : { - - }, - "Rating: %lld out of 5 stars" : { - - }, - "Re-enter new password" : { - - }, - "Re-enter your password to confirm" : { - - }, - "Receive a daily summary of upcoming tasks" : { - - }, - "Receive email notifications when tasks are completed" : { - - }, - "Refresh tasks" : { - "comment" : "A button that refreshes the tasks.", - "isCommentAutoGenerated" : true - }, - "Remove" : { - - }, - "Remove %@ from favorites" : { - "comment" : "A label for the favorite button. The argument is the name of the contractor.", - "isCommentAutoGenerated" : true - }, - "Remove %@ from property" : { - "comment" : "A button that removes a user from a property. The argument is the username of the user to be removed.", - "isCommentAutoGenerated" : true - }, - "Remove User" : { - - }, - "Resend code" : { - - }, - "Reset All Tasks" : { - "comment" : "A button label that resets all tasks.", - "isCommentAutoGenerated" : true - }, - "Reset Password" : { - "comment" : "The title of the screen where users can reset their passwords.", - "isCommentAutoGenerated" : true - }, - "Resetting..." : { - - }, - "Residences" : { - "comment" : "A label for the \"Residences\" tab in the main tab view.", - "isCommentAutoGenerated" : true - }, - "residences_add_contractors_prompt" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmer aus der Registerkarte 'Auftragnehmer' hinzufügen" + "Failed to request password reset": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to request password reset" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add contractors from the Contractors tab" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo solicitar el restablecimiento de la contraseña" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar contratistas desde la pestaña Contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la demande de réinitialisation du mot de passe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter des entrepreneurs depuis l'onglet Entrepreneurs" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort-Zurücksetzung konnte nicht angefordert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi dalla scheda Appaltatori" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao solicitar a redefinição da senha" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者タブから業者を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile richiedere la reimpostazione della password" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 탭에서 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードのリセットを要求できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toevoegen via Aannemers-tabblad" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호 재설정을 요청하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar empreiteiros da aba Empreiteiros" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan wachtwoordherstel niet aanvragen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "从承包商选项卡添加承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求重置密码失败" } } } }, - "residences_add_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie hinzufügen" + "Failed to reset password": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to reset password" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo restablecer la contraseña" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la réinitialisation du mot de passe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort konnte nicht zurückgesetzt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao redefinir a senha" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile reimpostare la password" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセットできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호를 재설정하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan wachtwoord niet opnieuw instellen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置密码失败" } } } }, - "residences_additional_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zusätzliche Details" + "Failed to restore purchases: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to restore purchases: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Additional Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron restaurar las compras: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles Adicionales" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la restauration des achats : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails Supplémentaires" + "de": { + "stringUnit": { + "state": "translated", + "value": "Käufe konnten nicht wiederhergestellt werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli aggiuntivi" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao restaurar as compras: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "追加の詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile ripristinare gli acquisti: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "추가 상세정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入を復元できませんでした: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aanvullende details" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매를 복원하지 못했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes Adicionais" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aankopen niet herstellen: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "其他详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复购买失败:%@" } } } }, - "residences_address" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "Failed to restore task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to restore task" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Address" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo restaurar la tarea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dirección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la restauration de la tâche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe konnte nicht wiederhergestellt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Indirizzo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao restaurar a tarefa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "住所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile ripristinare l'attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "주소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクを復元できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adres" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업을 복원하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan taak niet herstellen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "地址" + "zh": { + "stringUnit": { + "state": "translated", + "value": "恢复任务失败" } } } }, - "residences_apartment_unit" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wohnung/Einheit (optional)" + "Failed to save notification preferences": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to save notification preferences" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apartment/Unit (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron guardar las preferencias de notificación" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apartamento/Unidad (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'enregistrement des préférences de notification" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appartement/Unité (optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benachrichtigungseinstellungen konnten nicht gespeichert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appartamento/Unità (opz.)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao salvar as preferências de notificação" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アパート/部屋番号(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile salvare le preferenze di notifica" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "아파트/호실(선택)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "通知設定を保存できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appartement/Eenheid (opt.)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알림 설정을 저장하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apartamento/Unidade (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan meldingsvoorkeuren niet opslaan" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "公寓/单元(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存通知偏好设置失败" } } } }, - "residences_bathrooms" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Badezimmer" + "Failed to save share file": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to save share file" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bathrooms" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo guardar el archivo para compartir" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Baños" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'enregistrement du fichier de partage" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Salles de bain" + "de": { + "stringUnit": { + "state": "translated", + "value": "Freigabedatei konnte nicht gespeichert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bagni" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao salvar o arquivo de compartilhamento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "バスルーム" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile salvare il file di condivisione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "욕실" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有ファイルを保存できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Badkamers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 파일을 저장하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Banheiros" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan deelbestand niet opslaan" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "浴室" + "zh": { + "stringUnit": { + "state": "translated", + "value": "保存共享文件失败" } } } }, - "residences_bedrooms" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Schlafzimmer" + "Failed to sign in": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to sign in" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bedrooms" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo iniciar sesión" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dormitorios" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la connexion" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chambres" + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Camere" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao entrar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "寝室" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso non riuscito" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "침실" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインインできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Slaapkamers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quartos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "卧室" + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录失败" } } } }, - "residences_city" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stadt" + "Failed to unarchive task": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to unarchive task" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "City" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo desarchivar la tarea" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ciudad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec du désarchivage de la tâche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ville" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe konnte nicht aus dem Archiv geholt werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Città" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao desarquivar a tarefa" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "市区町村" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile annullare l'archiviazione dell'attività" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "도시" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスクのアーカイブを解除できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stad" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 보관을 해제하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan archivering van taak niet ongedaan maken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "城市" + "zh": { + "stringUnit": { + "state": "translated", + "value": "取消归档任务失败" } } } }, - "residences_contractors" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmer" + "Failed to update contractor": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractors" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar el contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour du prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrepreneurs" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienstleister konnte nicht aktualisiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appaltatori" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar o prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare il fornitore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者を更新できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 업데이트하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Empreiteiros" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan aannemer niet bijwerken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新承包商失败" } } } }, - "residences_country" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Land" + "Failed to update favorite status": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update favorite status" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Country" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar el estado de favorito" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "País" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour du statut favori" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pays" + "de": { + "stringUnit": { + "state": "translated", + "value": "Favoritenstatus konnte nicht aktualisiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paese" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar o status de favorito" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "国" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare lo stato preferito" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "국가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "お気に入りの状態を更新できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Land" + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐겨찾기 상태를 업데이트하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "País" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan favorietstatus niet bijwerken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "国家" + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新收藏状态失败" } } } }, - "residences_delete_confirm_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sind Sie sicher, dass Sie diese Immobilie löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden und löscht alle zugehörigen Aufgaben, Dokumente und Daten." + "Failed to update profile": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update profile" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to delete this property? This action cannot be undone and will delete all associated tasks, documents, and data." + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar el perfil" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Está seguro de que desea eliminar esta propiedad? Esta acción no se puede deshacer y eliminará todas las tareas, documentos y datos asociados." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour du profil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer cette propriété ? Cette action ne peut pas être annulée et supprimera toutes les tâches, documents et données associés." + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil konnte nicht aktualisiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminare questa proprietà? Tutti i dati correlati verranno eliminati." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar o perfil" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "この物件を削除しますか?関連データもすべて削除されます。" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare il profilo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 부동산을 삭제하시겠습니까? 관련 데이터도 삭제됩니다." + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを更新できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dit eigendom verwijderen? Alle gerelateerde gegevens worden verwijderd." + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필을 업데이트하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza de que deseja excluir esta propriedade? Esta ação não pode ser desfeita e excluirá todas as tarefas, documentos e dados associados." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan profiel niet bijwerken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "确定删除此房产?所有相关数据将被删除。" + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新个人资料失败" } } } }, - "residences_delete_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie löschen" + "Failed to update residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to update residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo actualizar la residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la mise à jour de la résidence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnsitz konnte nicht aktualisiert werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao atualizar a residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile aggiornare la residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居を更新できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지를 업데이트하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Excluir Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan woning niet bijwerken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "更新住所失败" } } } }, - "residences_description" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung (optional)" + "Failed to upload image %lld": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to upload image %lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo subir la imagen %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descripción (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'envoi de l'image %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bild %lld konnte nicht hochgeladen werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrizione (opz.)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao enviar a imagem %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "説明(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile caricare l'immagine %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설명(선택)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "画像 %lld をアップロードできませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschrijving (opt.)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이미지 %lld을(를) 업로드하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrição (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan afbeelding %lld niet uploaden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "描述(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "上传图片 %lld 失败" } } } }, - "residences_edit_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie bearbeiten" + "Failed to verify code": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to verify code" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo verificar el código" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la vérification du code" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Code konnte nicht überprüft werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao verificar o código" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile verificare il codice" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "コードを確認できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "코드를 확인하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan code niet verifiëren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证码验证失败" } } } }, - "residences_enter_share_code" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Freigabecode eingeben" + "Failed to verify email": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Failed to verify email" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter Share Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo verificar el correo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Introducir Código de Compartir" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la vérification de l'e-mail" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrer le Code de Partage" + "de": { + "stringUnit": { + "state": "translated", + "value": "E-Mail konnte nicht überprüft werden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci codice" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao verificar o e-mail" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "共有コードを入力" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile verificare l'email" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "공유 코드 입력" + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスを確認できませんでした" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer code in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일을 확인하지 못했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserir Código de Compartilhamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan e-mail niet verifiëren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入分享码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证电子邮件失败" } } } }, - "residences_error_loading_tasks" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler beim Laden der Aufgaben" + "Fiber Cement": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Fiber Cement" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error loading tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "Fibrocemento" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error al cargar tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Fibrociment" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur lors du chargement des tâches" + "de": { + "stringUnit": { + "state": "translated", + "value": "Faserzement" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Errore caricamento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fibrocimento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスク読み込みエラー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fibrocemento" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 로딩 오류" + "ja": { + "stringUnit": { + "state": "translated", + "value": "繊維強化セメント" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fout bij laden" + "ko": { + "stringUnit": { + "state": "translated", + "value": "섬유 시멘트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erro ao carregar tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vezelcement" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载任务出错" + "zh": { + "stringUnit": { + "state": "translated", + "value": "纤维水泥" } } } }, - "residences_generate" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erstellen" + "Flat": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Flat" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Generate" + "es": { + "stringUnit": { + "state": "translated", + "value": "Plana" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Generar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plat" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Générer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Flach" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Genera" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Plano" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "生成" + "it": { + "stringUnit": { + "state": "translated", + "value": "Piano" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "생성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "陸屋根" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Genereren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "평지붕" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Plat" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "生成" + "zh": { + "stringUnit": { + "state": "translated", + "value": "平顶" } } } }, - "residences_generate_report" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bericht erstellen" + "Forest": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Forest" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Generate Report" + "es": { + "stringUnit": { + "state": "translated", + "value": "Bosque" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Generar Informe" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Forêt" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Générer un Rapport" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wald" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Genera rapporto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Floresta" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "レポートを生成" + "it": { + "stringUnit": { + "state": "translated", + "value": "Foresta" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보고서 생성" + "ja": { + "stringUnit": { + "state": "translated", + "value": "フォレスト" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rapport genereren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "포레스트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerar Relatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bos" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "生成报告" + "zh": { + "stringUnit": { + "state": "translated", + "value": "森林" } } } }, - "residences_generate_report_message" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dies erstellt einen umfassenden Bericht über Ihre Immobilie einschließlich aller Aufgaben, Dokumente und Auftragnehmer." + "Garden": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Garden" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "This will generate a comprehensive report of your property including all tasks, documents, and contractors." + "es": { + "stringUnit": { + "state": "translated", + "value": "Jardín" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esto generará un informe completo de su propiedad incluyendo todas las tareas, documentos y contratistas." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Jardin" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cela générera un rapport complet de votre propriété incluant toutes les tâches, documents et entrepreneurs." + "de": { + "stringUnit": { + "state": "translated", + "value": "Garten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verrà generato un rapporto completo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Jardim" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件の包括的なレポートを生成します" + "it": { + "stringUnit": { + "state": "translated", + "value": "Giardino" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "종합 보고서가 생성됩니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "庭園" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Er wordt een uitgebreid rapport gegenereerd" + "ko": { + "stringUnit": { + "state": "translated", + "value": "정원" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Isso gerará um relatório abrangente da sua propriedade incluindo todas as tarefas, documentos e empreiteiros." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tuin" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "这将生成房产的综合报告" + "zh": { + "stringUnit": { + "state": "translated", + "value": "花园" } } } }, - "residences_join_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie beitreten" + "Gas Furnace": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Gas Furnace" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Join Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "Calefactor de gas" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unirse a Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Chauffage au gaz" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rejoindre la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Gasheizung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unisciti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Aquecedor a gás" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件に参加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Caldaia a gas" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 참여" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ガスヒーター" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deelnemen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가스 히터" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Participar da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gasverwarming" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加入房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "燃气暖炉" } } } }, - "residences_join_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie beitreten" + "General": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "General" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Join Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "General" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unirse a Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Général" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rejoindre la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Allgemein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unisciti alla proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Geral" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件に参加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Generale" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 참여" + "ja": { + "stringUnit": { + "state": "translated", + "value": "一般" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deelnemen aan eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "일반" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Participar da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Algemeen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加入房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "通用" } } } }, - "residences_loading_residence" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie wird geladen..." + "Google Sign-In error: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Google Sign-In error: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading residence..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de inicio de sesión con Google: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando propiedad..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur de connexion Google : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement de la propriété..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Fehler bei der Google-Anmeldung: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro de login do Google: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore di accesso con Google: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleサインインエラー: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google 로그인 오류: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando propriedade..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Fout bij Google-aanmelding: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载房产中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "Google 登录错误:%@" } } } }, - "residences_loading_tasks" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgaben werden geladen..." + "Google Sign-In is not configured. A Google Cloud client ID is required.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Google Sign-In is not configured. A Google Cloud client ID is required." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading tasks..." + "es": { + "stringUnit": { + "state": "translated", + "value": "El inicio de sesión con Google no está configurado. Se requiere un ID de cliente de Google Cloud." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando tareas..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion Google n'est pas configurée. Un ID client Google Cloud est requis." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement des tâches..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Google-Anmeldung ist nicht konfiguriert. Eine Google Cloud-Client-ID ist erforderlich." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento attività..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "O login do Google não está configurado. É necessário um ID de cliente do Google Cloud." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "L'accesso con Google non è configurato. È richiesto un ID client Google Cloud." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "Googleサインインが設定されていません。Google CloudのクライアントIDが必要です。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taken laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "Google 로그인이 구성되지 않았습니다. Google Cloud 클라이언트 ID가 필요합니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando tarefas..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Google-aanmelding is niet geconfigureerd. Een Google Cloud-client-ID is vereist." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载任务中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "尚未配置 Google 登录。需要 Google Cloud 客户端 ID。" } } } }, - "residences_lot_size" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Grundstücksgröße (Hektar)" + "HVAC": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "HVAC" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lot Size (acres)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Climatización" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tamaño del Lote (acres)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "CVC" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taille du Terrain (acres)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Klimatechnik" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dimensione lotto (acri)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Climatização" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "敷地面積(エーカー)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Climatizzazione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부지 면적(에이커)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "空調" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Perceelgrootte (acres)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "냉난방" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tamanho do Lote (acres)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Klimaatregeling" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "地块面积(英亩)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "暖通空调" } } } }, - "residences_maintenance_report" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wartungsbericht" + "Hardwood": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Hardwood" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maintenance Report" + "es": { + "stringUnit": { + "state": "translated", + "value": "Madera maciza" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informe de Mantenimiento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bois massif" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rapport de Maintenance" + "de": { + "stringUnit": { + "state": "translated", + "value": "Hartholz" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rapporto manutenzione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Madeira maciça" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メンテナンスレポート" + "it": { + "stringUnit": { + "state": "translated", + "value": "Legno massello" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "유지보수 보고서" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無垢材" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Onderhoudsrapport" + "ko": { + "stringUnit": { + "state": "translated", + "value": "원목" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Relatório de Manutenção" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Hardhout" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "维护报告" + "zh": { + "stringUnit": { + "state": "translated", + "value": "实木" } } } }, - "residences_manage_users" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzer verwalten" + "Heat Pump": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Heat Pump" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Manage Users" + "es": { + "stringUnit": { + "state": "translated", + "value": "Bomba de calor" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Administrar Usuarios" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pompe à chaleur" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gérer les Utilisateurs" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wärmepumpe" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gestisci utenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Bomba de calor" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザーを管理" + "it": { + "stringUnit": { + "state": "translated", + "value": "Pompa di calore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자 관리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ヒートポンプ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gebruikers beheren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "히트 펌프" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gerenciar Usuários" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Warmtepomp" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "管理用户" + "zh": { + "stringUnit": { + "state": "translated", + "value": "热泵" } } } }, - "residences_name_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name ist erforderlich" + "Home Sweet Home": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Home Sweet Home" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name is required" + "es": { + "stringUnit": { + "state": "translated", + "value": "Hogar dulce hogar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El nombre es obligatorio" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Maison douce maison" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le nom est requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Trautes Heim" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome obbligatorio" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lar doce lar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "名前は必須です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Casa dolce casa" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이름은 필수입니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "我が家が一番" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Naam is verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "즐거운 나의 집" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O nome é obrigatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Oost west, thuis best" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "名称为必填项" + "zh": { + "stringUnit": { + "state": "translated", + "value": "甜蜜的家" } } } }, - "residences_no_contractors" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noch keine Auftragnehmer" + "Inspection Report": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Inspection Report" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No contractors yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "Informe de inspección" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aún no hay contratistas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rapport d'inspection" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas encore d'entrepreneurs" + "de": { + "stringUnit": { + "state": "translated", + "value": "Inspektionsbericht" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Relatório de inspeção" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者がいません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Rapporto di ispezione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "点検報告書" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen aannemers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "점검 보고서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ainda não há empreiteiros" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inspectierapport" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "检查报告" } } } }, - "residences_postal_code" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Postleitzahl" + "Insurance": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Insurance" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Postal Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Seguro" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código Postal" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Assurance" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code Postal" + "de": { + "stringUnit": { + "state": "translated", + "value": "Versicherung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "CAP" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Seguro" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "郵便番号" + "it": { + "stringUnit": { + "state": "translated", + "value": "Assicurazione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "우편번호" + "ja": { + "stringUnit": { + "state": "translated", + "value": "保険" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Postcode" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보험" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código Postal" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verzekering" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "邮编" + "zh": { + "stringUnit": { + "state": "translated", + "value": "保险" } } } }, - "residences_primary_residence" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hauptwohnsitz" + "Invalid Google OAuth state. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid Google OAuth state. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Primary Residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estado de OAuth de Google no válido. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residencia Principal" + "fr": { + "stringUnit": { + "state": "translated", + "value": "État OAuth Google non valide. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Résidence Principale" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Google-OAuth-Status. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residenza principale" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estado de OAuth do Google inválido. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "主な住居" + "it": { + "stringUnit": { + "state": "translated", + "value": "Stato OAuth di Google non valido. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "주 거주지" + "ja": { + "stringUnit": { + "state": "translated", + "value": "Google OAuthの状態が無効です。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hoofdverblijf" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 Google OAuth 상태입니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Residência Principal" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige Google OAuth-status. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "主要住所" + "zh": { + "stringUnit": { + "state": "translated", + "value": "Google OAuth 状态无效。请重试。" } } } }, - "residences_properties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilien" + "Invalid URL": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid URL" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "properties" + "es": { + "stringUnit": { + "state": "translated", + "value": "URL no válida" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "URL non valide" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "propriétés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültige URL" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "URL inválida" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "URL non valido" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無効なURL" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 URL" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige URL" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "URL 无效" } } } }, - "residences_property" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie" + "Invalid or expired reset token. Please start over.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid or expired reset token. Please start over." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Token de restablecimiento no válido o caducado. Empieza de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Jeton de réinitialisation non valide ou expiré. Veuillez recommencer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiges oder abgelaufenes Zurücksetzungs-Token. Bitte beginne von vorn." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Token de redefinição inválido ou expirado. Comece novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Token di reimpostazione non valido o scaduto. Ricomincia da capo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットトークンが無効または期限切れです。最初からやり直してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 토큰이 잘못되었거나 만료되었습니다. 처음부터 다시 시작하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig of verlopen hersteltoken. Begin opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置令牌无效或已过期。请重新开始。" } } } }, - "residences_property_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobiliendetails" + "Invalid reset token. Please start over.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid reset token. Please start over." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "Token de restablecimiento no válido. Empieza de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles de la Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Jeton de réinitialisation non valide. Veuillez recommencer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails de la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiges Zurücksetzungs-Token. Bitte beginne von vorn." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Token de redefinição inválido. Comece novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件の詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Token di reimpostazione non valido. Ricomincia da capo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 상세" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットトークンが無効です。最初からやり直してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendomsgegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잘못된 재설정 토큰입니다. 처음부터 다시 시작하세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldig hersteltoken. Begin opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置令牌无效。请重新开始。" } } } }, - "residences_property_features" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilienmerkmale" + "Invalid username or password": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Invalid username or password" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Features" + "es": { + "stringUnit": { + "state": "translated", + "value": "Usuario o contraseña no válidos" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Características de la Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom d'utilisateur ou mot de passe non valide" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caractéristiques de la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ungültiger Benutzername oder ungültiges Passwort" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caratteristiche" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome de usuário ou senha inválidos" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件の特徴" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome utente o password non validi" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 특징" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名またはパスワードが無効です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kenmerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 이름 또는 비밀번호가 잘못되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Características da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Ongeldige gebruikersnaam of wachtwoord" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产特点" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名或密码无效" } } } }, - "residences_property_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilienname" + "Laminate": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Laminate" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Laminado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de la Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Stratifié" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom de la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Laminat" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Laminado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件名" + "it": { + "stringUnit": { + "state": "translated", + "value": "Laminato" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ラミネート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Naam eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "라미네이트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nome da Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Laminaat" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "复合地板" } } } }, - "residences_property_type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilientyp" + "Lavender": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Lavender" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property Type" + "es": { + "stringUnit": { + "state": "translated", + "value": "Lavanda" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Lavande" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type de Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Lavendel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lavanda" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件タイプ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Lavanda" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 유형" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ラベンダー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Type eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "라벤더" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tipo de Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Lavendel" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "薰衣草" } } } }, - "residences_required_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich: Name" + "Lawn": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Lawn" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required: Name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Césped" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido: Nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pelouse" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis : Nom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Rasen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio: Nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Gramado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須:名前" + "it": { + "stringUnit": { + "state": "translated", + "value": "Prato" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수: 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "芝生" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht: Naam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "잔디" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório: Nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gazon" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填:名称" + "zh": { + "stringUnit": { + "state": "translated", + "value": "草坪" } } } }, - "residences_select_type" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Typ auswählen" + "Metal": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Metal" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Type" + "es": { + "stringUnit": { + "state": "translated", + "value": "Metal" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Tipo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Métal" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner le Type" + "de": { + "stringUnit": { + "state": "translated", + "value": "Metall" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona tipo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Metal" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タイプを選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Metallo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "유형 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "金属" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer type" + "ko": { + "stringUnit": { + "state": "translated", + "value": "금속" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Tipo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Metaal" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择类型" + "zh": { + "stringUnit": { + "state": "translated", + "value": "金属" } } } }, - "residences_share_code" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Freigabecode" + "Midnight": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Midnight" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share Code" + "es": { + "stringUnit": { + "state": "translated", + "value": "Medianoche" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Compartir" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Minuit" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code de Partage" + "de": { + "stringUnit": { + "state": "translated", + "value": "Mitternacht" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Codice condivisione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Meia-noite" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "共有コード" + "it": { + "stringUnit": { + "state": "translated", + "value": "Mezzanotte" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "공유 코드" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ミッドナイト" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deelcode" + "ko": { + "stringUnit": { + "state": "translated", + "value": "미드나잇" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de Compartilhamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Middernacht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享码" + "zh": { + "stringUnit": { + "state": "translated", + "value": "午夜" } } } }, - "residences_share_code_footer" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geben Sie den 6-stelligen Code ein, der mit Ihnen geteilt wurde, um einer Immobilie beizutreten" + "Mint": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Mint" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter the 6-character code shared with you to join a residence" + "es": { + "stringUnit": { + "state": "translated", + "value": "Menta" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingrese el código de 6 caracteres compartido con usted para unirse a una propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Menthe" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrez le code à 6 caractères partagé avec vous pour rejoindre une propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Minze" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci il codice di 6 caratteri" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Menta" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "6文字の共有コードを入力して参加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Menta" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "6자리 코드를 입력하여 참여" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ミント" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voer de 6-tekens code in" + "ko": { + "stringUnit": { + "state": "translated", + "value": "민트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Insira o código de 6 caracteres compartilhado com você para participar de uma propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Munt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "输入6位分享码以加入" + "zh": { + "stringUnit": { + "state": "translated", + "value": "薄荷" } } } }, - "residences_share_code_must_6" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Der Freigabecode muss 6 Zeichen lang sein" + "Mixed": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Mixed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Share code must be 6 characters" + "es": { + "stringUnit": { + "state": "translated", + "value": "Mixto" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El código de compartir debe tener 6 caracteres" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mixte" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le code de partage doit comporter 6 caractères" + "de": { + "stringUnit": { + "state": "translated", + "value": "Gemischt" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il codice deve essere di 6 caratteri" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Misto" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "共有コードは6文字です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Misto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "코드는 6자여야 합니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "混合" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code moet 6 tekens zijn" + "ko": { + "stringUnit": { + "state": "translated", + "value": "혼합" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "O código de compartilhamento deve ter 6 caracteres" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gemengd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "分享码必须是6个字符" + "zh": { + "stringUnit": { + "state": "translated", + "value": "混合" } } } }, - "residences_square_footage" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quadratmeter" + "Monochrome": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Monochrome" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Square Footage" + "es": { + "stringUnit": { + "state": "translated", + "value": "Monocromo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metros Cuadrados" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Monochrome" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Surface en pieds carrés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Monochrom" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Superficie (mq)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Monocromático" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "面積(平方フィート)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Monocromatico" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "면적(평방피트)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "モノクロ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Oppervlakte (m²)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "모노크롬" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Área em pés quadrados" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Monochroom" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "面积(平方英尺)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "单色" } } } }, - "residences_state_province" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bundesland/Provinz" + "Name": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Name" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "State/Province" + "es": { + "stringUnit": { + "state": "translated", + "value": "Nombre" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado/Provincia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nom" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "État/Province" + "de": { + "stringUnit": { + "state": "translated", + "value": "Name" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stato/Provincia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nome" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "都道府県" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nome" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "시/도" + "ja": { + "stringUnit": { + "state": "translated", + "value": "名前" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Provincie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이름" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado/Província" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Naam" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "省/州" + "zh": { + "stringUnit": { + "state": "translated", + "value": "名称" } } } }, - "residences_street_address" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Straßenadresse" + "Network error: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Network error: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Street Address" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de red: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dirección" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur réseau : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adresse" + "de": { + "stringUnit": { + "state": "translated", + "value": "Netzwerkfehler: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Via" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro de rede: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "住所" + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore di rete: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "도로명 주소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ネットワークエラー: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Straat" + "ko": { + "stringUnit": { + "state": "translated", + "value": "네트워크 오류: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Endereço" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Netwerkfout: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "街道地址" + "zh": { + "stringUnit": { + "state": "translated", + "value": "网络错误:%@" } } } }, - "residences_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Meine Immobilien" + "No file URL available": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No file URL available" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "My Properties" + "es": { + "stringUnit": { + "state": "translated", + "value": "No hay URL de archivo disponible" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mis Propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune URL de fichier disponible" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mes Propriétés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Datei-URL verfügbar" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma URL de arquivo disponível" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun URL di file disponibile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "利用可能なファイルURLがありません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용 가능한 파일 URL이 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minhas Propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen bestands-URL beschikbaar" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "没有可用的文件 URL" } } } }, - "residences_users" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzer" + "No internet connection. Please check your network.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No internet connection. Please check your network." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Users" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin conexión a internet. Comprueba tu red." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuarios" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune connexion Internet. Vérifiez votre réseau." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utilisateurs" + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Internetverbindung. Bitte überprüfe dein Netzwerk." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Utenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem conexão com a internet. Verifique sua rede." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna connessione a internet. Controlla la tua rete." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자" + "ja": { + "stringUnit": { + "state": "translated", + "value": "インターネット接続がありません。ネットワークを確認してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gebruikers" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인터넷 연결이 없습니다. 네트워크를 확인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuários" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen internetverbinding. Controleer je netwerk." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "用户" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无网络连接。请检查您的网络。" } } } }, - "residences_year_built" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Baujahr" + "No purchases found to restore": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No purchases found to restore" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Year Built" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se encontraron compras para restaurar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Año de Construcción" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucun achat à restaurer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Année de Construction" + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Käufe zum Wiederherstellen gefunden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anno costruzione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Nenhuma compra encontrada para restaurar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "築年" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessun acquisto da ripristinare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "건축 연도" + "ja": { + "stringUnit": { + "state": "translated", + "value": "復元できる購入が見つかりません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bouwjaar" + "ko": { + "stringUnit": { + "state": "translated", + "value": "복원할 구매 내역이 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ano de Construção" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen aankopen gevonden om te herstellen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "建造年份" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到可恢复的购买项目" } } } }, - "residences_your_properties" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ihre Immobilien" + "Not authenticated": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Not authenticated" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Your Properties" + "es": { + "stringUnit": { + "state": "translated", + "value": "No autenticado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tus Propiedades" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Non authentifié" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vos Propriétés" + "de": { + "stringUnit": { + "state": "translated", + "value": "Nicht authentifiziert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Le tue proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não autenticado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "あなたの物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non autenticato" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "내 부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "認証されていません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uw eigendommen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "인증되지 않음" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suas Propriedades" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Niet geverifieerd" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您的房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未通过身份验证" } } } }, - "Restore" : { - "comment" : "A button that restores a cancelled task.", - "isCommentAutoGenerated" : true - }, - "Restore Purchases" : { - "comment" : "A button label that allows users to restore previous purchases.", - "isCommentAutoGenerated" : true - }, - "Restore task" : { - "comment" : "A button that restores a task.", - "isCommentAutoGenerated" : true - }, - "Restore Task" : { - "comment" : "A button that restores a cancelled or archived task.", - "isCommentAutoGenerated" : true - }, - "Retry" : { - "comment" : "A button label that says \"Retry\".", - "isCommentAutoGenerated" : true - }, - "Retry Loading Products" : { - "comment" : "A button label that appears when the app is unable to load in-app purchase products. It instructs the user to try again.", - "isCommentAutoGenerated" : true - }, - "Return to Login" : { - - }, - "Save" : { - "comment" : "The text for a button that saves the selected time.", - "isCommentAutoGenerated" : true - }, - "Save your home to your account" : { - - }, - "Search task templates by name" : { - "comment" : "A hint for the search bar in the task templates browser.", - "isCommentAutoGenerated" : true - }, - "Search templates..." : { - "comment" : "A placeholder text for a search bar in the task templates browser.", - "isCommentAutoGenerated" : true - }, - "Select Notification Time" : { - "comment" : "A label displayed above the picker for selecting the notification time.", - "isCommentAutoGenerated" : true - }, - "selected" : { - "comment" : "A label that describes the selection state of a task.", - "isCommentAutoGenerated" : true - }, - "Selected" : { - "comment" : "A label that describes a selected option.", - "isCommentAutoGenerated" : true - }, - "Send a .honeydue file via Messages, Email, or AirDrop. They just tap to join." : { - - }, - "Send Invite Link" : { - "comment" : "A button label for sending an invitation link to others.", - "isCommentAutoGenerated" : true - }, - "Send New Code" : { - "comment" : "A button label that allows a user to request a new verification code.", - "isCommentAutoGenerated" : true - }, - "Send Reset Code" : { - "comment" : "A button label that says \"Send Reset Code\".", - "isCommentAutoGenerated" : true - }, - "Sending..." : { - - }, - "Set Custom Time" : { - "comment" : "A button that allows a user to set a custom notification time.", - "isCommentAutoGenerated" : true - }, - "Set New Password" : { - - }, - "Settings" : { - "comment" : "A button that opens a settings screen.", - "isCommentAutoGenerated" : true - }, - "settings_language" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sprache" + "Ocean": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Ocean" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Language" + "es": { + "stringUnit": { + "state": "translated", + "value": "Océano" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Océan" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Langue" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ozean" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lingua" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Oceano" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "言語" + "it": { + "stringUnit": { + "state": "translated", + "value": "Oceano" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "언어" + "ja": { + "stringUnit": { + "state": "translated", + "value": "オーシャン" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taal" + "ko": { + "stringUnit": { + "state": "translated", + "value": "오션" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Idioma" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Oceaan" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "语言" + "zh": { + "stringUnit": { + "state": "translated", + "value": "海洋" } } } }, - "settings_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Einstellungen" + "One or more photos couldn't be processed.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "One or more photos couldn't be processed." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Settings" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudieron procesar una o más fotos." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configuración" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une ou plusieurs photos n'ont pas pu être traitées." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paramètres" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ein oder mehrere Fotos konnten nicht verarbeitet werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Impostazioni" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Uma ou mais fotos não puderam ser processadas." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile elaborare una o più foto." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "1枚以上の写真を処理できませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Instellingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "하나 이상의 사진을 처리할 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Configurações" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Een of meer foto's konden niet worden verwerkt." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "设置" + "zh": { + "stringUnit": { + "state": "translated", + "value": "一张或多张照片无法处理。" } } } }, - "Share Analytics" : { - - }, - "Share Code" : { - "comment" : "A label displayed above the share code section of the view.", - "isCommentAutoGenerated" : true - }, - "Share code: %@" : { - "comment" : "A label for the share code, with the share code as the value.", - "isCommentAutoGenerated" : true - }, - "Share this 6-character code. They can enter it in the app to join." : { - "comment" : "A description of how to share the invitation code with others.", - "isCommentAutoGenerated" : true - }, - "Shared Users (%lld)" : { - - }, - "Show active warranties only" : { - - }, - "Show all contractors" : { - "comment" : "A label for a button that shows all contractors.", - "isCommentAutoGenerated" : true - }, - "Show all warranties" : { - - }, - "Show favorites only" : { - "comment" : "A label for a button that filters contractors to show only the ones that the user has marked as favorites.", - "isCommentAutoGenerated" : true - }, - "Sign in with Apple" : { - - }, - "Sign in with Google" : { - - }, - "Signing in with Apple..." : { - - }, - "Skip" : { - "comment" : "A button label that allows users to skip the current onboarding step.", - "isCommentAutoGenerated" : true - }, - "Skip for now" : { - "comment" : "A button label that skips onboarding.", - "isCommentAutoGenerated" : true - }, - "Skip for Now" : { - - }, - "Something went wrong" : { - "comment" : "A description of an error that occurs during an asynchronous operation.", - "isCommentAutoGenerated" : true - }, - "Start 7-Day Free Trial" : { - - }, - "Start Fresh" : { - "comment" : "A button label that says \"Start Fresh\".", - "isCommentAutoGenerated" : true - }, - "Start managing your properties today" : { - "comment" : "A description below the title of the screen.", - "isCommentAutoGenerated" : true - }, - "Step %lld of 5" : { - "comment" : "A label that describes the current step in the onboarding flow. The argument is the step number.", - "isCommentAutoGenerated" : true - }, - "Subscription Active" : { - "comment" : "The title of an alert that appears when a user successfully upgrades to a premium subscription.", - "isCommentAutoGenerated" : true - }, - "Swipe to see your tasks" : { - "comment" : "A hint displayed in the \"Tasks\" section of the app, encouraging users to swipe to view their tasks.", - "isCommentAutoGenerated" : true - }, - "Take your home management\nto the next level" : { - - }, - "Tap the + icon in the top right\nto add your first property" : { - "comment" : "A description of an action a user can take to add a property.", - "isCommentAutoGenerated" : true - }, - "Task actions" : { - "comment" : "A label displayed as a button in the task card that opens a menu of task actions.", - "isCommentAutoGenerated" : true - }, - "Task Templates" : { - "comment" : "The title of the view that lists all predefined task templates.", - "isCommentAutoGenerated" : true - }, - "Tasks" : { - "comment" : "A label displayed above the list of task categories.", - "isCommentAutoGenerated" : true - }, - "tasks_actual_cost" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tatsächliche Kosten" + "Other": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Other" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actual Cost" + "es": { + "stringUnit": { + "state": "translated", + "value": "Otro" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo Real" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Autre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coût Réel" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sonstige" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo effettivo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Outro" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "実際の費用" + "it": { + "stringUnit": { + "state": "translated", + "value": "Altro" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "실제 비용" + "ja": { + "stringUnit": { + "state": "translated", + "value": "その他" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Werkelijke kosten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "기타" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custo Real" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Overig" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "实际费用" + "zh": { + "stringUnit": { + "state": "translated", + "value": "其他" } } } }, - "tasks_add_button" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe hinzufügen" + "Password is required": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "La contraseña es obligatoria" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le mot de passe est obligatoire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A senha é obrigatória" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "La password è obbligatoria" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードは必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호는 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码为必填项" } } } }, - "tasks_add_photos" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie bis zu 5 Fotos hinzu, die die abgeschlossene Arbeit dokumentieren." + "Password reset successfully! Logging you in...": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password reset successfully! Logging you in..." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add up to 5 photos documenting the completed work." + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Contraseña restablecida! Iniciando sesión..." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega hasta 5 fotos documentando el trabajo completado." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe réinitialisé ! Connexion en cours..." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez jusqu'à 5 photos documentant le travail terminé." + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort erfolgreich zurückgesetzt! Du wirst angemeldet..." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi fino a 5 foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha redefinida com sucesso! Conectando você..." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最大5枚の写真を追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Password reimpostata! Accesso in corso..." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최대 5장의 사진 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセットしました。ログインしています..." } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg max 5 foto's toe" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호가 재설정되었습니다! 로그인 중..." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione até 5 fotos documentando o trabalho concluído." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord opnieuw ingesteld! Je wordt aangemeld..." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加最多5张照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码重置成功!正在为您登录..." } } } }, - "tasks_add_property_first" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie zuerst eine Immobilie aus dem Tab Residenzen hinzu" + "Password reset successfully! You can now log in with your new password.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Password reset successfully! You can now log in with your new password." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add a property first from the Residences tab" + "es": { + "stringUnit": { + "state": "translated", + "value": "¡Contraseña restablecida! Ya puedes iniciar sesión con tu nueva contraseña." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega una propiedad primero desde la pestaña Residencias" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Mot de passe réinitialisé ! Vous pouvez maintenant vous connecter avec votre nouveau mot de passe." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez d'abord une propriété depuis l'onglet Résidences" + "de": { + "stringUnit": { + "state": "translated", + "value": "Passwort erfolgreich zurückgesetzt! Du kannst dich jetzt mit deinem neuen Passwort anmelden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi prima una proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Senha redefinida com sucesso! Agora você pode entrar com sua nova senha." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "まず物件を追加してください" + "it": { + "stringUnit": { + "state": "translated", + "value": "Password reimpostata! Ora puoi accedere con la nuova password." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "먼저 부동산을 추가하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "パスワードをリセットしました。新しいパスワードでログインできます。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg eerst een eigendom toe" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비밀번호가 재설정되었습니다! 이제 새 비밀번호로 로그인할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione uma propriedade primeiro na aba Residências" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Wachtwoord opnieuw ingesteld! Je kunt nu inloggen met je nieuwe wachtwoord." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "请先添加房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "密码重置成功!您现在可以使用新密码登录。" } } } }, - "tasks_add_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe hinzufügen" + "Permit": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Permit" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Permiso" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Permis" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter une tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Genehmigung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Licença" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを追加" + "it": { + "stringUnit": { + "state": "translated", + "value": "Permesso" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 추가" + "ja": { + "stringUnit": { + "state": "translated", + "value": "許可証" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak toevoegen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "허가증" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicionar Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vergunning" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "许可证" } } } }, - "tasks_all_tasks" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle Aufgaben" + "Please select a category": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please select a category" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "All Tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "Selecciona una categoría" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas las Tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez sélectionner une catégorie" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Toutes les Tâches" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte wähle eine Kategorie" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tutte le attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecione uma categoria" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべてのタスク" + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona una categoria" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "모든 작업" + "ja": { + "stringUnit": { + "state": "translated", + "value": "カテゴリを選択してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Alle taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "카테고리를 선택해 주세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Todas as Tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer een categorie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "所有任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请选择一个类别" } } } }, - "tasks_archive" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivieren" + "Please select a frequency": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please select a frequency" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archive" + "es": { + "stringUnit": { + "state": "translated", + "value": "Selecciona una frecuencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez sélectionner une fréquence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archiver" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte wähle eine Häufigkeit" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivia" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecione uma frequência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アーカイブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona una frequenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보관" + "ja": { + "stringUnit": { + "state": "translated", + "value": "頻度を選択してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archiveren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "빈도를 선택해 주세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Arquivar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer een frequentie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "归档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请选择一个频率" } } } }, - "tasks_archive_confirm" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Möchten Sie diese Aufgabe wirklich archivieren? Sie können sie später aus archivierten Aufgaben wiederherstellen." + "Please select a priority": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Please select a priority" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to archive this task? You can unarchive it later from archived tasks." + "es": { + "stringUnit": { + "state": "translated", + "value": "Selecciona una prioridad" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Estás seguro de que quieres archivar esta tarea? Puedes desarchivarla más tarde desde tareas archivadas." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Veuillez sélectionner une priorité" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir archiver cette tâche ? Vous pouvez la désarchiver plus tard depuis les tâches archivées." + "de": { + "stringUnit": { + "state": "translated", + "value": "Bitte wähle eine Priorität" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivia attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecione uma prioridade" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクをアーカイブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona una priorità" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 보관" + "ja": { + "stringUnit": { + "state": "translated", + "value": "優先度を選択してください" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak archiveren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "우선순위를 선택해 주세요" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza de que deseja arquivar esta tarefa? Você pode desarquivá-la mais tarde nas tarefas arquivadas." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteer een prioriteit" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "归档任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请选择一个优先级" } } } }, - "tasks_archive_task" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe Archivieren" + "Plumbing": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Plumbing" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archive Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Fontanería" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Plomberie" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archiver la Tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sanitär" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivia attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Encanamento" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクをアーカイブ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Idraulica" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 보관" + "ja": { + "stringUnit": { + "state": "translated", + "value": "配管" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak archiveren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "배관" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Arquivar Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Loodgieterswerk" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "归档任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "管道" } } } }, - "tasks_both_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich: Priorität und Status" + "Profile updated successfully": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Profile updated successfully" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required: Both Priority and Status" + "es": { + "stringUnit": { + "state": "translated", + "value": "Perfil actualizado correctamente" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido: Prioridad y Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Profil mis à jour avec succès" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis: Priorité et Statut" + "de": { + "stringUnit": { + "state": "translated", + "value": "Profil erfolgreich aktualisiert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatori: Priorità e Stato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Perfil atualizado com sucesso" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須:優先度とステータス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Profilo aggiornato correttamente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수: 우선순위 및 상태" + "ja": { + "stringUnit": { + "state": "translated", + "value": "プロフィールを更新しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht: Prioriteit en Status" + "ko": { + "stringUnit": { + "state": "translated", + "value": "프로필이 업데이트되었습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório: Prioridade e Status" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Profiel bijgewerkt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填:优先级和状态" - } - } - } - }, - "tasks_browse_templates" : { - "comment" : "Text for browsing task templates.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Browse Templates" + "zh": { + "stringUnit": { + "state": "translated", + "value": "个人资料更新成功" } } } }, - "tasks_cancel" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abbrechen" + "Property is required": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Property is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancel" + "es": { + "stringUnit": { + "state": "translated", + "value": "La propiedad es obligatoria" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La propriété est obligatoire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler" + "de": { + "stringUnit": { + "state": "translated", + "value": "Objekt ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annulla" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A propriedade é obrigatória" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キャンセル" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'immobile è obbligatorio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "취소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "物件は必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuleren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "부동산은 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消" + "zh": { + "stringUnit": { + "state": "translated", + "value": "房产为必填项" } } } }, - "tasks_cancel_confirm" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to cancel this task?" + "Purchase failed: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase failed: %@" } - } - } - }, - "tasks_cancel_task" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancel Task" + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "La compra falló: %@" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de l'achat : %@" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Kauf fehlgeschlagen: %@" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na compra: %@" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Acquisto non riuscito: %@" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入に失敗しました: %@" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매에 실패했습니다: %@" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankoop mislukt: %@" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买失败:%@" } } } }, - "tasks_category" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kategorie" + "Purchase successful but verification is pending. It will complete automatically.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase successful but verification is pending. It will complete automatically." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Category" + "es": { + "stringUnit": { + "state": "translated", + "value": "Compra realizada, pero la verificación está pendiente. Se completará automáticamente." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoría" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Achat réussi mais la vérification est en attente. Elle se terminera automatiquement." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Catégorie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kauf erfolgreich, aber die Überprüfung steht noch aus. Sie wird automatisch abgeschlossen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compra realizada, mas a verificação está pendente. Ela será concluída automaticamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "カテゴリー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Acquisto riuscito, ma la verifica è in sospeso. Verrà completata automaticamente." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "카테고리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入は成功しましたが、確認は保留中です。自動的に完了します。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categorie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매에 성공했지만 확인이 보류 중입니다. 자동으로 완료됩니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Categoria" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Aankoop geslaagd, maar verificatie is in behandeling. Dit wordt automatisch voltooid." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "类别" + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买成功,但验证待处理。它将自动完成。" } } } }, - "tasks_complete" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abschließen" + "Purchase was cancelled. You can continue with Free or try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Purchase was cancelled. You can continue with Free or try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Complete" + "es": { + "stringUnit": { + "state": "translated", + "value": "La compra se canceló. Puedes continuar con el plan gratuito o volver a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "L'achat a été annulé. Vous pouvez continuer avec la version gratuite ou réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Kauf wurde abgebrochen. Du kannst mit der kostenlosen Version fortfahren oder es erneut versuchen." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completa" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A compra foi cancelada. Você pode continuar com o plano gratuito ou tentar novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了" + "it": { + "stringUnit": { + "state": "translated", + "value": "L'acquisto è stato annullato. Puoi continuare con la versione gratuita o riprovare." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "購入はキャンセルされました。無料プランで続行するか、もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooien" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구매가 취소되었습니다. 무료 요금제로 계속하거나 다시 시도할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Concluir" + "nl": { + "stringUnit": { + "state": "translated", + "value": "De aankoop is geannuleerd. Je kunt doorgaan met Gratis of het opnieuw proberen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成" + "zh": { + "stringUnit": { + "state": "translated", + "value": "购买已取消。您可以继续使用免费版或重试。" } } } }, - "tasks_complete_task" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe Abschließen" + "Radiant": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Radiant" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Complete Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Radiante" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rayonnant" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminer la Tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Strahlungsheizung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completa attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Radiante" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを完了" + "it": { + "stringUnit": { + "state": "translated", + "value": "Radiante" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 완료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "輻射式" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak voltooien" + "ko": { + "stringUnit": { + "state": "translated", + "value": "복사식" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Concluir Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stralingsverwarming" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "辐射式" } } } }, - "tasks_completed_by" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abgeschlossen Von" + "Receipt/Invoice": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Receipt/Invoice" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completed By" + "es": { + "stringUnit": { + "state": "translated", + "value": "Recibo/Factura" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completado Por" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Reçu/Facture" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminé Par" + "de": { + "stringUnit": { + "state": "translated", + "value": "Beleg/Rechnung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completato da" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Recibo/Nota fiscal" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ricevuta/Fattura" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료자" + "ja": { + "stringUnit": { + "state": "translated", + "value": "領収書/請求書" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooid door" + "ko": { + "stringUnit": { + "state": "translated", + "value": "영수증/청구서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Concluído Por" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Bon/Factuur" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成者" + "zh": { + "stringUnit": { + "state": "translated", + "value": "收据/发票" } } } }, - "tasks_completed_by_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abgeschlossen von" + "Request timed out. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Request timed out. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completed by" + "es": { + "stringUnit": { + "state": "translated", + "value": "Se agotó el tiempo de la solicitud. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completado por" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Délai de la requête dépassé. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminé par" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zeitüberschreitung der Anfrage. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completato da" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A solicitação expirou. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了者" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta scaduta. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료자" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リクエストがタイムアウトしました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooid door" + "ko": { + "stringUnit": { + "state": "translated", + "value": "요청 시간이 초과되었습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Concluído por" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Time-out van verzoek. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成者" + "zh": { + "stringUnit": { + "state": "translated", + "value": "请求超时。请重试。" } } } }, - "tasks_completion" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abschluss" + "Reset code has expired. Please request a new one.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Reset code has expired. Please request a new one." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "completion" + "es": { + "stringUnit": { + "state": "translated", + "value": "El código de restablecimiento ha caducado. Solicita uno nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "completado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code de réinitialisation a expiré. Veuillez en demander un nouveau." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "achèvement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Zurücksetzungscode ist abgelaufen. Bitte fordere einen neuen an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "completamento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código de redefinição expirou. Solicite um novo." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice di reimpostazione è scaduto. Richiedine uno nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료" + "ja": { + "stringUnit": { + "state": "translated", + "value": "リセットコードの有効期限が切れました。新しいコードを要求してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "voltooiing" + "ko": { + "stringUnit": { + "state": "translated", + "value": "재설정 코드가 만료되었습니다. 새 코드를 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "conclusão" + "nl": { + "stringUnit": { + "state": "translated", + "value": "De herstelcode is verlopen. Vraag een nieuwe aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成记录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "重置码已过期。请重新申请。" } } } }, - "tasks_completion_history" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abschlussverlauf" + "Residence #%lld": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence #%lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Completion History" + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencia n.º %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Historial de Completado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résidence n° %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Historique d'Achèvement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnsitz Nr. %lld" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cronologia completamenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência nº %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了履歴" + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenza n. %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료 기록" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居 #%lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooiingsgeschiedenis" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지 #%lld" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Histórico de Conclusão" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning #%lld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成历史" + "zh": { + "stringUnit": { + "state": "translated", + "value": "住所 #%lld" } } } }, - "tasks_completions" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abschlüsse" + "Residence not found": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Residence not found" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "completions" + "es": { + "stringUnit": { + "state": "translated", + "value": "Residencia no encontrada" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "completados" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Résidence introuvable" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "achèvements" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wohnsitz nicht gefunden" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "completamenti" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Residência não encontrada" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了記録" + "it": { + "stringUnit": { + "state": "translated", + "value": "Residenza non trovata" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료 기록" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居が見つかりません" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "voltooiingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지를 찾을 수 없습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "conclusões" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Woning niet gevonden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "完成记录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到住所" } } } }, - "tasks_contractor_helper" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wählen Sie einen Auftragnehmer aus, wenn er diese Arbeit abgeschlossen hat, oder lassen Sie es für manuelle Eingabe leer." + "Roofing": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Roofing" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select a contractor if they completed this work, or leave blank for manual entry." + "es": { + "stringUnit": { + "state": "translated", + "value": "Tejado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecciona un contratista si completó este trabajo, o déjalo en blanco para entrada manual." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Toiture" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionnez un entrepreneur s'il a terminé ce travail, ou laissez vide pour une saisie manuelle." + "de": { + "stringUnit": { + "state": "translated", + "value": "Dach" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona l'appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telhado" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "作業を完了した業者を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Copertura" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업을 완료한 계약업체 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "屋根" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer de aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "지붕" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecione um empreiteiro se ele concluiu este trabalho, ou deixe em branco para entrada manual." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Dakbedekking" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择完成工作的承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "屋顶" } } } }, - "tasks_contractor_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmer (Optional)" + "Secure connection failed. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Secure connection failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contractor (Optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "La conexión segura falló. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contratista (Opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "La connexion sécurisée a échoué. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrepreneur (Optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sichere Verbindung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appaltatore (opz.)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na conexão segura. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Connessione sicura non riuscita. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체(선택)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "セキュア接続に失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aannemer (opt.)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보안 연결에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Empreiteiro (Opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Beveiligde verbinding mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "承包商(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "安全连接失败。请重试。" } } } }, - "tasks_cost" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kosten" + "Select": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Select" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cost" + "es": { + "stringUnit": { + "state": "translated", + "value": "Seleccionar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sélectionner" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coût" + "de": { + "stringUnit": { + "state": "translated", + "value": "Auswählen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Selecionar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "費用" + "it": { + "stringUnit": { + "state": "translated", + "value": "Seleziona" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "비용" + "ja": { + "stringUnit": { + "state": "translated", + "value": "選択" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kosten" + "ko": { + "stringUnit": { + "state": "translated", + "value": "선택" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custo" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Selecteren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "费用" + "zh": { + "stringUnit": { + "state": "translated", + "value": "选择" } } } }, - "tasks_create_first" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erstellen Sie Ihre erste Aufgabe, um zu beginnen" + "Server error. Please try again later.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Server error. Please try again later." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Create your first task to get started" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error del servidor. Inténtalo más tarde." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crea tu primera tarea para comenzar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Erreur serveur. Réessayez plus tard." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Créez votre première tâche pour commencer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Serverfehler. Bitte versuche es später erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crea la prima attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Erro no servidor. Tente novamente mais tarde." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最初のタスクを作成" + "it": { + "stringUnit": { + "state": "translated", + "value": "Errore del server. Riprova più tardi." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "첫 번째 작업 만들기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サーバーエラー。しばらくしてからもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Maak uw eerste taak" + "ko": { + "stringUnit": { + "state": "translated", + "value": "서버 오류입니다. 나중에 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Crie sua primeira tarefa para começar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Serverfout. Probeer het later opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "创建第一个任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "服务器错误。请稍后重试。" } } } }, - "tasks_custom_interval" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Benutzerdefiniertes Intervall (Tage, optional)" + "Service not found. Please try again later.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Service not found. Please try again later." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custom Interval (days, optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Servicio no encontrado. Inténtalo más tarde." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo Personalizado (días, opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Service introuvable. Réessayez plus tard." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalle Personnalisé (jours, optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Dienst nicht gefunden. Bitte versuche es später erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervallo personalizzato (giorni)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Serviço não encontrado. Tente novamente mais tarde." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "カスタム間隔(日)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Servizio non trovato. Riprova più tardi." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자 정의 간격(일)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サービスが見つかりません。しばらくしてからもう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aangepast interval (dagen)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "서비스를 찾을 수 없습니다. 나중에 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Intervalo Personalizado (dias, opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Service niet gevonden. Probeer het later opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "自定义间隔(天)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未找到服务。请稍后重试。" } } } }, - "tasks_delete_confirm" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Möchten Sie diese Aufgabe wirklich löschen?" + "Share code must be 6 characters": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share code must be 6 characters" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Are you sure you want to delete this task?" + "es": { + "stringUnit": { + "state": "translated", + "value": "El código para compartir debe tener 6 caracteres" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Seguro que quieres eliminar esta tarea?" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le code de partage doit comporter 6 caractères" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer cette tâche ?" + "de": { + "stringUnit": { + "state": "translated", + "value": "Der Freigabecode muss 6 Zeichen lang sein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O código de compartilhamento deve ter 6 caracteres" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il codice di condivisione deve avere 6 caratteri" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "共有コードは6文字である必要があります" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "공유 코드는 6자여야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tem certeza que deseja excluir esta tarefa?" + "nl": { + "stringUnit": { + "state": "translated", + "value": "De deelcode moet 6 tekens lang zijn" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "共享码必须为 6 个字符" } } } }, - "tasks_delete_task" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe Löschen" + "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \\\"didn't know.\\\"": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \\\"didn't know.\\\"" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Delete Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Comparte tu hogar con tu familia. Todos ven lo que hay que hacer y nadie puede decir que \\\"no lo sabía\\\"." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Partagez votre maison avec votre famille. Chacun voit ce qu'il y a à faire et personne ne peut prétendre qu'il \\\"ne savait pas\\\"." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer la Tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Teile dein Zuhause mit deiner Familie. Alle sehen, was zu tun ist, und niemand kann behaupten, er habe es \\\"nicht gewusst\\\"." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Elimina attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Compartilhe sua casa com a família. Todos veem o que precisa ser feito e ninguém pode dizer que \\\"não sabia\\\"." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを削除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Condividi la tua casa con i familiari. Tutti vedono cosa c'è da fare e nessuno può dire di \\\"non saperlo\\\"." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 삭제" + "ja": { + "stringUnit": { + "state": "translated", + "value": "家を家族と共有しましょう。やるべきことを全員が把握でき、誰も \\\"知らなかった\\\" とは言えません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak verwijderen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가족과 집을 공유하세요. 모두가 해야 할 일을 볼 수 있어 누구도 \\\"몰랐다\\\"고 할 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Excluir Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Deel je huis met familieleden. Iedereen ziet wat er moet gebeuren en niemand kan zeggen dat hij het \\\"niet wist\\\"." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "删除任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "与家人共享您的家。每个人都能看到需要做的事,没人能说自己\\\"不知道\\\"。" } } } }, - "tasks_description_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung" + "Sign in failed. Please try again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign in failed. Please try again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al iniciar sesión. Vuelve a intentarlo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descripción" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la connexion. Veuillez réessayer." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description" + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung fehlgeschlagen. Bitte versuche es erneut." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrizione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao entrar. Tente novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "説明" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso non riuscito. Riprova." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설명" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインインに失敗しました。もう一度お試しください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschrijving" + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인에 실패했습니다. 다시 시도해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrição" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen mislukt. Probeer het opnieuw." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "描述" + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录失败。请重试。" } } } }, - "tasks_description_optional" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschreibung (optional)" + "Sign in failed: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sign in failed: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error al iniciar sesión: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descripción (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la connexion : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Description (optionnelle)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Anmeldung fehlgeschlagen: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrizione (opz.)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha ao entrar: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "説明(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Accesso non riuscito: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설명(선택)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サインインに失敗しました: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beschrijving (opt.)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "로그인에 실패했습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Descrição (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Inloggen mislukt: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "描述(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "登录失败:%@" } } } }, - "tasks_due_date" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fälligkeitsdatum" + "Slate": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Slate" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Due Date" + "es": { + "stringUnit": { + "state": "translated", + "value": "Pizarra" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fecha de Vencimiento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ardoise" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date d'Échéance" + "de": { + "stringUnit": { + "state": "translated", + "value": "Schiefer" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scadenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ardósia" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "期限" + "it": { + "stringUnit": { + "state": "translated", + "value": "Ardesia" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "마감일" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スレート" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Deadline" + "ko": { + "stringUnit": { + "state": "translated", + "value": "슬레이트" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data de Vencimento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Leisteen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "截止日期" + "zh": { + "stringUnit": { + "state": "translated", + "value": "石板" } } } }, - "tasks_edit" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bearbeiten" + "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \\\"when did I last...?\\\" moments.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \\\"when did I last...?\\\" moments." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit" + "es": { + "stringUnit": { + "state": "translated", + "value": "Los recordatorios inteligentes te ayudan con los filtros de la calefacción, la limpieza de canalones y todo lo demás. Se acabaron los \\\"¿cuándo fue la última vez...?\\\"." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Les rappels intelligents vous aident à gérer les filtres de chaudière, le nettoyage des gouttières et tout le reste. Fini les \\\"c'était quand la dernière fois... ?\\\"." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier" + "de": { + "stringUnit": { + "state": "translated", + "value": "Intelligente Erinnerungen behalten Heizungsfilter, Dachrinnenreinigung und alles dazwischen im Blick. Schluss mit \\\"wann war das letzte Mal...?\\\"." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Lembretes inteligentes ajudam você a cuidar dos filtros do aquecedor, da limpeza das calhas e de tudo mais. Sem mais momentos de \\\"quando foi a última vez...?\\\"." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "I promemoria intelligenti ti aiutano con i filtri della caldaia, la pulizia delle grondaie e tutto il resto. Niente più momenti da \\\"quando l'ho fatto l'ultima volta...?\\\"." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スマートリマインダーが暖房フィルターや雨どい掃除など、あらゆる作業を管理します。\\\"前回はいつだったか...?\\\" と悩むことはもうありません。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "스마트 알림으로 보일러 필터, 빗물받이 청소 등 모든 일을 챙기세요. \\\"마지막으로 한 게 언제였지...?\\\" 하는 순간은 이제 그만." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Slimme herinneringen helpen je met ketelfilters, dakgoten reinigen en alles ertussenin. Geen \\\"wanneer deed ik dit voor het laatst...?\\\"-momenten meer." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑" + "zh": { + "stringUnit": { + "state": "translated", + "value": "智能提醒帮您随时掌握暖炉滤网、排水沟清理及其间的一切事务。不再有\\\"我上次是什么时候做的...?\\\"的困扰。" } } } }, - "tasks_edit_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabe bearbeiten" + "Solar": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Solar" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edit Task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Solaire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier la tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Solar" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifica attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Solar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクを編集" + "it": { + "stringUnit": { + "state": "translated", + "value": "Solare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 편집" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ソーラー" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak bewerken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "태양광" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zonne-energie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "编辑任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "太阳能" } } } }, - "tasks_empty_subtitle" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie Ihre erste Wartungsaufgabe hinzu" + "Start free trial": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Start free trial" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add your first maintenance task" + "es": { + "stringUnit": { + "state": "translated", + "value": "Empezar prueba gratis" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega tu primera tarea de mantenimiento" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Démarrer l'essai gratuit" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez votre première tâche de maintenance" + "de": { + "stringUnit": { + "state": "translated", + "value": "Kostenlos testen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tieni traccia delle attività di manutenzione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Iniciar teste grátis" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メンテナンスタスクを追跡" + "it": { + "stringUnit": { + "state": "translated", + "value": "Inizia la prova gratuita" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "유지보수 작업을 추적하세요" + "ja": { + "stringUnit": { + "state": "translated", + "value": "無料トライアルを開始" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Houd uw onderhoudstaken bij" + "ko": { + "stringUnit": { + "state": "translated", + "value": "무료 체험 시작" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione sua primeira tarefa de manutenção" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gratis proefperiode starten" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "跟踪您的维护任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "开始免费试用" } } } }, - "tasks_empty_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Aufgaben" + "Stone": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Stone" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No tasks yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "Piedra" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sin tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Pierre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Stein" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pedra" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクがありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Pietra" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "石材" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "석재" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Steen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "石材" } } } }, - "tasks_enter_manually" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Name manuell eingeben" + "Structural": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Structural" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enter name manually" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estructural" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ingresar nombre manualmente" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Structurel" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Entrer le nom manuellement" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bausubstanz" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserisci manualmente" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Estrutura" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "手動で入力" + "it": { + "stringUnit": { + "state": "translated", + "value": "Struttura" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "직접 입력" + "ja": { + "stringUnit": { + "state": "translated", + "value": "構造" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Handmatig invoeren" + "ko": { + "stringUnit": { + "state": "translated", + "value": "구조" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inserir nome manualmente" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Constructie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "手动输入" + "zh": { + "stringUnit": { + "state": "translated", + "value": "结构" } } } }, - "tasks_error" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler" + "Stucco": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Stucco" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estuco" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Stuc" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erreur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Putz" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Errore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Reboco" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "エラー" + "it": { + "stringUnit": { + "state": "translated", + "value": "Intonaco" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "오류" + "ja": { + "stringUnit": { + "state": "translated", + "value": "スタッコ" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fout" + "ko": { + "stringUnit": { + "state": "translated", + "value": "스터코" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stucwerk" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "错误" + "zh": { + "stringUnit": { + "state": "translated", + "value": "灰泥" } } } }, - "tasks_estimated_cost" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geschätzte Kosten (optional)" + "Sunset": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sunset" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estimated Cost (optional)" + "es": { + "stringUnit": { + "state": "translated", + "value": "Atardecer" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo Estimado (opcional)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coucher de soleil" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coût Estimé (optionnel)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sonnenuntergang" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Costo stimato (opz.)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Pôr do sol" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "見積もり費用(任意)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Tramonto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "예상 비용(선택)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "サンセット" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geschatte kosten (opt.)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "선셋" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Custo Estimado (opcional)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Zonsondergang" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "预计费用(可选)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "日落" } } } }, - "tasks_failed_to_load" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fehler beim Laden der Abschlüsse" + "Tank (Electric)": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tank (Electric)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Failed to load completions" + "es": { + "stringUnit": { + "state": "translated", + "value": "Acumulador (eléctrico)" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Error al cargar completados" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cumulus (électrique)" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Échec du chargement des achèvements" + "de": { + "stringUnit": { + "state": "translated", + "value": "Speicher (elektrisch)" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento fallito" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Boiler (elétrico)" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "読み込みに失敗" + "it": { + "stringUnit": { + "state": "translated", + "value": "Boiler (elettrico)" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로딩 실패" + "ja": { + "stringUnit": { + "state": "translated", + "value": "貯湯式(電気)" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Laden mislukt" + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장식 (전기)" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Falha ao carregar conclusões" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Boiler (elektrisch)" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载失败" + "zh": { + "stringUnit": { + "state": "translated", + "value": "储水式(电)" } } } }, - "tasks_frequency" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Häufigkeit" + "Tank (Gas)": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tank (Gas)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frequency" + "es": { + "stringUnit": { + "state": "translated", + "value": "Acumulador (gas)" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frecuencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Cumulus (gaz)" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fréquence" + "de": { + "stringUnit": { + "state": "translated", + "value": "Speicher (Gas)" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frequenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Boiler (gás)" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "頻度" + "it": { + "stringUnit": { + "state": "translated", + "value": "Boiler (gas)" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "빈도" + "ja": { + "stringUnit": { + "state": "translated", + "value": "貯湯式(ガス)" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frequentie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "저장식 (가스)" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Frequência" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Boiler (gas)" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "频率" + "zh": { + "stringUnit": { + "state": "translated", + "value": "储水式(燃气)" } } } }, - "tasks_in_progress" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "In Bearbeitung" + "Tankless (Electric)": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tankless (Electric)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "In Progress" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin depósito (eléctrico)" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Progreso" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sans réservoir (électrique)" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Cours" + "de": { + "stringUnit": { + "state": "translated", + "value": "Durchlauf (elektrisch)" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "In corso" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem boiler (elétrico)" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "進行中" + "it": { + "stringUnit": { + "state": "translated", + "value": "Istantaneo (elettrico)" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "진행 중" + "ja": { + "stringUnit": { + "state": "translated", + "value": "瞬間式(電気)" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "In behandeling" + "ko": { + "stringUnit": { + "state": "translated", + "value": "순간식 (전기)" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Em Andamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Doorstroom (elektrisch)" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "进行中" + "zh": { + "stringUnit": { + "state": "translated", + "value": "即热式(电)" } } } }, - "tasks_in_progress_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "In Bearbeitung" + "Tankless (Gas)": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tankless (Gas)" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "In Progress" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin depósito (gas)" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Progreso" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Sans réservoir (gaz)" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En Cours" + "de": { + "stringUnit": { + "state": "translated", + "value": "Durchlauf (Gas)" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "In corso" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem boiler (gás)" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "進行中" + "it": { + "stringUnit": { + "state": "translated", + "value": "Istantaneo (gas)" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "진행 중" + "ja": { + "stringUnit": { + "state": "translated", + "value": "瞬間式(ガス)" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "In behandeling" + "ko": { + "stringUnit": { + "state": "translated", + "value": "순간식 (가스)" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Em Andamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Doorstroom (gas)" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "进行中" + "zh": { + "stringUnit": { + "state": "translated", + "value": "即热式(燃气)" } } } }, - "tasks_library" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bibliothek" + "Task #%lld": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Task #%lld" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Library" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tarea n.º %lld" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Biblioteca" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Tâche n° %lld" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bibliothèque" + "de": { + "stringUnit": { + "state": "translated", + "value": "Aufgabe Nr. %lld" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Libreria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Tarefa nº %lld" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ライブラリ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Attività n. %lld" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "라이브러리" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タスク #%lld" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bibliotheek" + "ko": { + "stringUnit": { + "state": "translated", + "value": "작업 #%lld" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Biblioteca" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Taak #%lld" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "库" + "zh": { + "stringUnit": { + "state": "translated", + "value": "任务 #%lld" } } } }, - "tasks_loading" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Laden..." + "Teal": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Teal" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading..." + "es": { + "stringUnit": { + "state": "translated", + "value": "Verde azulado" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bleu sarcelle" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Petrol" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "Azul-petróleo" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "Verde acqua" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로딩 중..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "ティール" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "틸" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Blauwgroen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载中..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "青色" } } } }, - "tasks_loading_completions" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Abschlüsse werden geladen..." + "The Cozy Corner": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The Cozy Corner" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Loading completions..." + "es": { + "stringUnit": { + "state": "translated", + "value": "El rincón acogedor" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cargando completados..." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le coin douillet" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chargement des achèvements..." + "de": { + "stringUnit": { + "state": "translated", + "value": "Die gemütliche Ecke" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Caricamento completamenti..." + "pt": { + "stringUnit": { + "state": "translated", + "value": "O cantinho aconchegante" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了記録を読み込み中..." + "it": { + "stringUnit": { + "state": "translated", + "value": "L'angolo accogliente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료 기록 로딩..." + "ja": { + "stringUnit": { + "state": "translated", + "value": "居心地のいい隠れ家" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voltooiingen laden..." + "ko": { + "stringUnit": { + "state": "translated", + "value": "아늑한 공간" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Carregando conclusões..." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het gezellige hoekje" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "加载完成记录..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "温馨小角落" } } } }, - "tasks_no_completions_yet" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noch Keine Abschlüsse" + "The Nest": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The Nest" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No Completions Yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "El nido" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aún No Hay Completados" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le nid" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun Achèvement Pour le Moment" + "de": { + "stringUnit": { + "state": "translated", + "value": "Das Nest" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessun completamento" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O ninho" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "完了記録がありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il nido" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "완료 기록 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "巣" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nog geen voltooiingen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보금자리" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ainda Não Há Conclusões" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het nest" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无完成记录" + "zh": { + "stringUnit": { + "state": "translated", + "value": "小窝" } } } }, - "tasks_no_tasks" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine Aufgaben" + "The file appears to be corrupted and could not be read.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "The file appears to be corrupted and could not be read." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "El archivo parece estar dañado y no se pudo leer." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sin tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le fichier semble corrompu et n'a pas pu être lu." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Die Datei scheint beschädigt zu sein und konnte nicht gelesen werden." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O arquivo parece estar corrompido e não pôde ser lido." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクなし" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il file sembra danneggiato e non può essere letto." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ファイルが破損しているようで、読み込めませんでした。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "파일이 손상된 것 같아 읽을 수 없습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sem tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Het bestand lijkt beschadigd en kon niet worden gelezen." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "无任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "文件似乎已损坏,无法读取。" } } } }, - "tasks_no_tasks_yet" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Noch keine Aufgaben" + "Tile": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Tile" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No tasks yet" + "es": { + "stringUnit": { + "state": "translated", + "value": "Baldosa" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aún no hay tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Carrelage" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucune tâche pour le moment" + "de": { + "stringUnit": { + "state": "translated", + "value": "Fliese" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuna attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Cerâmica" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクがありません" + "it": { + "stringUnit": { + "state": "translated", + "value": "Piastrella" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "아직 작업 없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイル" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nog geen taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "타일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ainda não há tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Tegel" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "暂无任务" - } - } - } - }, - "tasks_no_templates_found" : { - "comment" : "Text displayed when no task templates are found.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "No templates found" + "zh": { + "stringUnit": { + "state": "translated", + "value": "瓷砖" } } } }, - "tasks_none" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine" + "Title": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Title" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None" + "es": { + "stringUnit": { + "state": "translated", + "value": "Título" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ninguno" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Titre" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun" + "de": { + "stringUnit": { + "state": "translated", + "value": "Titel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Título" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "なし" + "it": { + "stringUnit": { + "state": "translated", + "value": "Titolo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "없음" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトル" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "无" + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题" } } } }, - "tasks_none_manual" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Keine (Manuelle Eingabe)" + "Title is required": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Title is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "None (Manual Entry)" + "es": { + "stringUnit": { + "state": "translated", + "value": "El título es obligatorio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ninguno (Entrada Manual)" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le titre est obligatoire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aucun (Saisie Manuelle)" + "de": { + "stringUnit": { + "state": "translated", + "value": "Titel ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nessuno (manuale)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O título é obrigatório" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "なし(手動)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il titolo è obbligatorio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "없음(수동)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "タイトルは必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Geen (handmatig)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "제목은 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nenhum (Entrada Manual)" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Titel is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "无(手动)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "标题为必填项" } } } }, - "tasks_not_completed" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Diese Aufgabe wurde noch nicht abgeschlossen." + "Too many failed attempts. Please request a new reset code.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Too many failed attempts. Please request a new reset code." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "This task has not been completed." + "es": { + "stringUnit": { + "state": "translated", + "value": "Demasiados intentos fallidos. Solicita un nuevo código de restablecimiento." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esta tarea no ha sido completada." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Trop de tentatives échouées. Veuillez demander un nouveau code de réinitialisation." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cette tâche n'a pas été terminée." + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu viele fehlgeschlagene Versuche. Bitte fordere einen neuen Zurücksetzungscode an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività non completata" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Muitas tentativas malsucedidas. Solicite um novo código de redefinição." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "このタスクは未完了です" + "it": { + "stringUnit": { + "state": "translated", + "value": "Troppi tentativi non riusciti. Richiedi un nuovo codice di reimpostazione." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이 작업은 미완료입니다" + "ja": { + "stringUnit": { + "state": "translated", + "value": "失敗が多すぎます。新しいリセットコードを要求してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taak niet voltooid" + "ko": { + "stringUnit": { + "state": "translated", + "value": "실패한 시도가 너무 많습니다. 새 재설정 코드를 요청해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esta tarefa não foi concluída." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te veel mislukte pogingen. Vraag een nieuwe herstelcode aan." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "此任务尚未完成" + "zh": { + "stringUnit": { + "state": "translated", + "value": "失败尝试次数过多。请申请新的重置码。" } } } }, - "tasks_notes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notizen" + "Unable to connect. Please check your internet connection.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to connect. Please check your internet connection." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo conectar. Comprueba tu conexión a internet." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion impossible. Vérifiez votre connexion Internet." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes" + "de": { + "stringUnit": { + "state": "translated", + "value": "Verbindung nicht möglich. Bitte überprüfe deine Internetverbindung." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível conectar. Verifique sua conexão com a internet." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile connettersi. Controlla la tua connessione a internet." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "接続できません。インターネット接続を確認してください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결할 수 없습니다. 인터넷 연결을 확인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan geen verbinding maken. Controleer je internetverbinding." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法连接。请检查您的网络连接。" } } } }, - "tasks_optional_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fügen Sie beliebige zusätzliche Details zum Abschluss dieser Aufgabe hinzu." + "Unable to connect. The server may be temporarily unavailable.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to connect. The server may be temporarily unavailable." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Add any additional details about completing this task." + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo conectar. El servidor puede estar temporalmente no disponible." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agrega cualquier detalle adicional sobre completar esta tarea." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Connexion impossible. Le serveur est peut-être temporairement indisponible." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez tous les détails supplémentaires sur l'achèvement de cette tâche." + "de": { + "stringUnit": { + "state": "translated", + "value": "Verbindung nicht möglich. Der Server ist möglicherweise vorübergehend nicht verfügbar." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aggiungi dettagli" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível conectar. O servidor pode estar temporariamente indisponível." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "追加の詳細を入力" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile connettersi. Il server potrebbe essere temporaneamente non disponibile." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "추가 상세정보 입력" + "ja": { + "stringUnit": { + "state": "translated", + "value": "接続できません。サーバーが一時的に利用できない可能性があります。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voeg details toe" + "ko": { + "stringUnit": { + "state": "translated", + "value": "연결할 수 없습니다. 서버가 일시적으로 사용 불가능할 수 있습니다." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Adicione quaisquer detalhes adicionais sobre a conclusão desta tarefa." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan geen verbinding maken. De server is mogelijk tijdelijk niet beschikbaar." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "添加其他详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法连接。服务器可能暂时不可用。" } } } }, - "tasks_optional_info" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optionale Informationen" + "Unable to start trial: %@": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unable to start trial: %@" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optional Information" + "es": { + "stringUnit": { + "state": "translated", + "value": "No se pudo iniciar la prueba: %@" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Información Opcional" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Impossible de démarrer l'essai : %@" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informations Optionnelles" + "de": { + "stringUnit": { + "state": "translated", + "value": "Testphase konnte nicht gestartet werden: %@" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Info opzionali" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não foi possível iniciar o teste: %@" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "オプション情報" + "it": { + "stringUnit": { + "state": "translated", + "value": "Impossibile avviare la prova: %@" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "선택 정보" + "ja": { + "stringUnit": { + "state": "translated", + "value": "トライアルを開始できません: %@" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optionele info" + "ko": { + "stringUnit": { + "state": "translated", + "value": "체험을 시작할 수 없습니다: %@" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informações Opcionais" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Kan proefperiode niet starten: %@" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "可选信息" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无法开始试用:%@" } } } }, - "tasks_optional_notes" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optionale Notizen über die abgeschlossene Arbeit." + "Uncategorized": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Uncategorized" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optional notes about the work completed." + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin categoría" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas opcionales sobre el trabajo completado." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Non catégorisé" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notes optionnelles sur le travail effectué." + "de": { + "stringUnit": { + "state": "translated", + "value": "Nicht kategorisiert" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note opzionali" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem categoria" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "オプションのメモ" + "it": { + "stringUnit": { + "state": "translated", + "value": "Senza categoria" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "선택적 메모" + "ja": { + "stringUnit": { + "state": "translated", + "value": "未分類" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Optionele notities" + "ko": { + "stringUnit": { + "state": "translated", + "value": "미분류" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notas opcionais sobre o trabalho concluído." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen categorie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "可选备注" + "zh": { + "stringUnit": { + "state": "translated", + "value": "未分类" } } } }, - "tasks_photos" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "Unknown error occurred": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Unknown error occurred" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photos" + "es": { + "stringUnit": { + "state": "translated", + "value": "Se produjo un error desconocido" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Une erreur inconnue s'est produite" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photos" + "de": { + "stringUnit": { + "state": "translated", + "value": "Ein unbekannter Fehler ist aufgetreten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ocorreu um erro desconhecido" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si è verificato un errore sconosciuto" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진" + "ja": { + "stringUnit": { + "state": "translated", + "value": "不明なエラーが発生しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto's" + "ko": { + "stringUnit": { + "state": "translated", + "value": "알 수 없는 오류가 발생했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Er is een onbekende fout opgetreden" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "发生未知错误" } } } }, - "tasks_priority" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorität" + "User Manual": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "User Manual" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priority" + "es": { + "stringUnit": { + "state": "translated", + "value": "Manual de usuario" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioridad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Manuel d'utilisation" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorité" + "de": { + "stringUnit": { + "state": "translated", + "value": "Bedienungsanleitung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Manual do usuário" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "優先度" + "it": { + "stringUnit": { + "state": "translated", + "value": "Manuale utente" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "우선순위" + "ja": { + "stringUnit": { + "state": "translated", + "value": "取扱説明書" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioriteit" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용 설명서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioridade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikershandleiding" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "优先级" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户手册" } } } }, - "tasks_priority_status" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorität & Status" + "Username is required": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Username is required" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priority & Status" + "es": { + "stringUnit": { + "state": "translated", + "value": "El nombre de usuario es obligatorio" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioridad y Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Le nom d'utilisateur est obligatoire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorité et Statut" + "de": { + "stringUnit": { + "state": "translated", + "value": "Benutzername ist erforderlich" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorità e Stato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "O nome de usuário é obrigatório" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "優先度とステータス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Il nome utente è obbligatorio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "우선순위 및 상태" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ユーザー名は必須です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioriteit en Status" + "ko": { + "stringUnit": { + "state": "translated", + "value": "사용자 이름은 필수입니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prioridade e Status" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Gebruikersnaam is verplicht" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "优先级和状态" + "zh": { + "stringUnit": { + "state": "translated", + "value": "用户名为必填项" } } } }, - "tasks_property" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie" + "Verification failed": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Verification failed" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Error de verificación" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Échec de la vérification" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Überprüfung fehlgeschlagen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Falha na verificação" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件" + "it": { + "stringUnit": { + "state": "translated", + "value": "Verifica non riuscita" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산" + "ja": { + "stringUnit": { + "state": "translated", + "value": "確認に失敗しました" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "확인에 실패했습니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Verificatie mislukt" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "验证失败" } } } }, - "tasks_quality_rating" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Qualitätsbewertung" + "Vinyl": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Vinyl" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quality Rating" + "es": { + "stringUnit": { + "state": "translated", + "value": "Vinilo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Calificación de Calidad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vinyle" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Note de Qualité" + "de": { + "stringUnit": { + "state": "translated", + "value": "Vinyl" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Valutazione qualità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Vinil" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "品質評価" + "it": { + "stringUnit": { + "state": "translated", + "value": "Vinile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "품질 평점" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ビニル" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kwaliteitsbeoordeling" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비닐" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avaliação de Qualidade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vinyl" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "质量评分" + "zh": { + "stringUnit": { + "state": "translated", + "value": "乙烯基" } } } }, - "tasks_rate_quality" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bewerten Sie die Arbeitsqualität von 1 bis 5 Sternen." + "Vinyl Siding": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Vinyl Siding" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rate the quality of work from 1 to 5 stars." + "es": { + "stringUnit": { + "state": "translated", + "value": "Revestimiento de vinilo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Califica la calidad del trabajo de 1 a 5 estrellas." + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bardage en vinyle" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Évaluez la qualité du travail de 1 à 5 étoiles." + "de": { + "stringUnit": { + "state": "translated", + "value": "Vinylverkleidung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Valuta la qualità (1-5 stelle)" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Revestimento de vinil" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "品質を評価(1-5つ星)" + "it": { + "stringUnit": { + "state": "translated", + "value": "Rivestimento in vinile" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "품질 평가(1-5점)" + "ja": { + "stringUnit": { + "state": "translated", + "value": "ビニルサイディング" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Beoordeel kwaliteit (1-5 sterren)" + "ko": { + "stringUnit": { + "state": "translated", + "value": "비닐 사이딩" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avalie a qualidade do trabalho de 1 a 5 estrelas." + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vinyl gevelbekleding" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "评价工作质量(1-5星)" + "zh": { + "stringUnit": { + "state": "translated", + "value": "乙烯基外墙板" } } } }, - "tasks_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich" + "Warranty": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Warranty" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required" + "es": { + "stringUnit": { + "state": "translated", + "value": "Garantía" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Garantie" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis" + "de": { + "stringUnit": { + "state": "translated", + "value": "Garantie" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Garantia" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須" + "it": { + "stringUnit": { + "state": "translated", + "value": "Garanzia" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수" + "ja": { + "stringUnit": { + "state": "translated", + "value": "保証書" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht" + "ko": { + "stringUnit": { + "state": "translated", + "value": "보증서" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Garantie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填" + "zh": { + "stringUnit": { + "state": "translated", + "value": "保修" } } } }, - "tasks_restore" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiederherstellen" + "We couldn't determine your email. Please sign in again.": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "We couldn't determine your email. Please sign in again." } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restore" + "es": { + "stringUnit": { + "state": "translated", + "value": "No pudimos determinar tu correo. Inicia sesión de nuevo." } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Nous n'avons pas pu déterminer votre e-mail. Veuillez vous reconnecter." } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurer" + "de": { + "stringUnit": { + "state": "translated", + "value": "Wir konnten deine E-Mail nicht ermitteln. Bitte melde dich erneut an." } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ripristina" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Não conseguimos identificar seu e-mail. Entre novamente." } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "復元" + "it": { + "stringUnit": { + "state": "translated", + "value": "Non siamo riusciti a determinare la tua email. Accedi di nuovo." } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "복원" + "ja": { + "stringUnit": { + "state": "translated", + "value": "メールアドレスを特定できませんでした。もう一度サインインしてください。" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Herstellen" + "ko": { + "stringUnit": { + "state": "translated", + "value": "이메일을 확인할 수 없습니다. 다시 로그인해 주세요." } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Restaurar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "We konden je e-mail niet bepalen. Log opnieuw in." } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "恢复" + "zh": { + "stringUnit": { + "state": "translated", + "value": "我们无法确定您的电子邮件。请重新登录。" } } } }, - "tasks_result" : { - "comment" : "A singular label for a result in a list. E.g. \"1 result\", \"2 results\".", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "result" + "Window AC": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Window AC" } - } - } - }, - "tasks_results" : { - "comment" : "Plural form of \"result\".", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "results" + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Aire de ventana" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Clim de fenêtre" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Fensterklimagerät" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ar-condicionado de janela" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Climatizzatore da finestra" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "窓用エアコン" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "창문형 에어컨" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Raamairco" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "窗式空调" } } } }, - "tasks_scheduling" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Terminplanung" + "Wood Shake": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Wood Shake" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scheduling" + "es": { + "stringUnit": { + "state": "translated", + "value": "Tejuela de madera" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Programación" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bardeau de bois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Planification" + "de": { + "stringUnit": { + "state": "translated", + "value": "Holzschindel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pianificazione" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Telha de madeira" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スケジュール" + "it": { + "stringUnit": { + "state": "translated", + "value": "Scandola di legno" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "일정" + "ja": { + "stringUnit": { + "state": "translated", + "value": "木製シェイク" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Planning" + "ko": { + "stringUnit": { + "state": "translated", + "value": "우드 셰이크" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agendamento" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Houten shake" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "计划" - } - } - } - }, - "tasks_search_templates" : { - "comment" : "Title of a screen that allows users to search for task templates.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Search templates..." + "zh": { + "stringUnit": { + "state": "translated", + "value": "木瓦" } } } }, - "tasks_select_category" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kategorie Auswählen" + "Wood Siding": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Wood Siding" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Category" + "es": { + "stringUnit": { + "state": "translated", + "value": "Revestimiento de madera" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Categoría" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Bardage en bois" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner la Catégorie" + "de": { + "stringUnit": { + "state": "translated", + "value": "Holzverkleidung" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona categoria" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Revestimento de madeira" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "カテゴリーを選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Rivestimento in legno" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "카테고리 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "木製サイディング" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer categorie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "목재 사이딩" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Categoria" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Houten gevelbekleding" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择类别" + "zh": { + "stringUnit": { + "state": "translated", + "value": "木质外墙板" } } } }, - "tasks_select_contractor" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Auftragnehmer Auswählen" + "Xeriscape": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Xeriscape" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Contractor" + "es": { + "stringUnit": { + "state": "translated", + "value": "Xerojardinería" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Contratista" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Xéropaysagisme" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner l'Entrepreneur" + "de": { + "stringUnit": { + "state": "translated", + "value": "Xeriscaping" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona appaltatore" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Paisagismo xérico" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "業者を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Giardino xerofilo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계약업체 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "乾燥地造園" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer aannemer" + "ko": { + "stringUnit": { + "state": "translated", + "value": "건조 조경" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Empreiteiro" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Droogtetuin" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择承包商" + "zh": { + "stringUnit": { + "state": "translated", + "value": "旱生园艺" } } } }, - "tasks_select_frequency" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Häufigkeit Auswählen" + "You must be logged in to import": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You must be logged in to import" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Frequency" + "es": { + "stringUnit": { + "state": "translated", + "value": "Debes iniciar sesión para importar" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Frecuencia" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous devez être connecté pour importer" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner la Fréquence" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du musst angemeldet sein, um zu importieren" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona frequenza" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você precisa estar conectado para importar" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "頻度を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Devi aver effettuato l'accesso per importare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "빈도 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "インポートするにはログインが必要です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer frequentie" + "ko": { + "stringUnit": { + "state": "translated", + "value": "가져오려면 로그인해야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Frequência" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je moet ingelogd zijn om te importeren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择频率" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您必须登录才能导入" } } } }, - "tasks_select_priority" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Priorität Auswählen" + "You must be logged in to import a contractor": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You must be logged in to import a contractor" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Priority" + "es": { + "stringUnit": { + "state": "translated", + "value": "Debes iniciar sesión para importar un contratista" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Prioridad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous devez être connecté pour importer un prestataire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner la Priorité" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du musst angemeldet sein, um einen Dienstleister zu importieren" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona priorità" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você precisa estar conectado para importar um prestador" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "優先度を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Devi aver effettuato l'accesso per importare un fornitore" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "우선순위 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "業者をインポートするにはログインが必要です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer prioriteit" + "ko": { + "stringUnit": { + "state": "translated", + "value": "업체를 가져오려면 로그인해야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Prioridade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je moet ingelogd zijn om een aannemer te importeren" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择优先级" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您必须登录才能导入承包商" } } } }, - "tasks_select_property" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Immobilie Auswählen" + "You must be logged in to join a residence": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You must be logged in to join a residence" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Property" + "es": { + "stringUnit": { + "state": "translated", + "value": "Debes iniciar sesión para unirte a una residencia" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Propiedad" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Vous devez être connecté pour rejoindre une résidence" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner la Propriété" + "de": { + "stringUnit": { + "state": "translated", + "value": "Du musst angemeldet sein, um einem Wohnsitz beizutreten" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona proprietà" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Você precisa estar conectado para entrar em uma residência" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "物件を選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Devi aver effettuato l'accesso per entrare in una residenza" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "부동산 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "住居に参加するにはログインが必要です" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer eigendom" + "ko": { + "stringUnit": { + "state": "translated", + "value": "거주지에 참여하려면 로그인해야 합니다" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Propriedade" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Je moet ingelogd zijn om aan een woning deel te nemen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择房产" + "zh": { + "stringUnit": { + "state": "translated", + "value": "您必须登录才能加入住所" } } } }, - "tasks_select_status" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status Auswählen" + "honeyDue Support Request": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "honeyDue Support Request" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Select Status" + "es": { + "stringUnit": { + "state": "translated", + "value": "Solicitud de soporte de honeyDue" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleccionar Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Demande d'assistance honeyDue" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sélectionner le Statut" + "de": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-Supportanfrage" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seleziona stato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Solicitação de suporte do honeyDue" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ステータスを選択" + "it": { + "stringUnit": { + "state": "translated", + "value": "Richiesta di assistenza honeyDue" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상태 선택" + "ja": { + "stringUnit": { + "state": "translated", + "value": "honeyDue サポートリクエスト" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecteer status" + "ko": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 지원 요청" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Selecionar Status" + "nl": { + "stringUnit": { + "state": "translated", + "value": "honeyDue-ondersteuningsverzoek" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "选择状态" + "zh": { + "stringUnit": { + "state": "translated", + "value": "honeyDue 支持请求" } } } }, - "tasks_status" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "Checkmark with expanding rings": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Checkmark with expanding rings" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "es": { + "stringUnit": { + "state": "translated", + "value": "Marca de verificación con anillos que se expanden" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Coche avec des anneaux qui s'élargissent" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statut" + "de": { + "stringUnit": { + "state": "translated", + "value": "Häkchen mit sich ausbreitenden Ringen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Stato" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Marca de seleção com anéis em expansão" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ステータス" + "it": { + "stringUnit": { + "state": "translated", + "value": "Segno di spunta con anelli che si espandono" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상태" + "ja": { + "stringUnit": { + "state": "translated", + "value": "広がるリングとチェックマーク" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "ko": { + "stringUnit": { + "state": "translated", + "value": "퍼져 나가는 고리와 체크 표시" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vinkje met uitdijende ringen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "状态" + "zh": { + "stringUnit": { + "state": "translated", + "value": "对勾配合扩散的圆环" } } } }, - "tasks_take_photo" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto Aufnehmen" + "Explodes into colorful sparks": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Explodes into colorful sparks" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Take Photo" + "es": { + "stringUnit": { + "state": "translated", + "value": "Estalla en chispas de colores" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tomar Foto" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Explose en étincelles colorées" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prendre une Photo" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zerplatzt in bunte Funken" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Scatta foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Explode em faíscas coloridas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真を撮る" + "it": { + "stringUnit": { + "state": "translated", + "value": "Esplode in scintille colorate" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진 찍기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "色とりどりの火花が弾ける" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto maken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "화려한 불꽃으로 터짐" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tirar Foto" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Spat uiteen in kleurrijke vonken" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "拍照" + "zh": { + "stringUnit": { + "state": "translated", + "value": "迸发成绚丽火花" } } } }, - "tasks_task_details" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabendetails" + "Firework": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Firework" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Details" + "es": { + "stringUnit": { + "state": "translated", + "value": "Fuego artificial" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalles de la Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Feu d'artifice" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Détails de la Tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Feuerwerk" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dettagli attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Fogo de artifício" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスクの詳細" + "it": { + "stringUnit": { + "state": "translated", + "value": "Fuoco d'artificio" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업 상세" + "ja": { + "stringUnit": { + "state": "translated", + "value": "花火" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taakgegevens" + "ko": { + "stringUnit": { + "state": "translated", + "value": "불꽃놀이" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Detalhes da Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Vuurwerk" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务详情" + "zh": { + "stringUnit": { + "state": "translated", + "value": "烟花" } } } }, - "tasks_title" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgaben" + "Implode": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Implode" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tasks" + "es": { + "stringUnit": { + "state": "translated", + "value": "Implosión" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tareas" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Implosion" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tâches" + "de": { + "stringUnit": { + "state": "translated", + "value": "Implosion" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Attività" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Implosão" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タスク" + "it": { + "stringUnit": { + "state": "translated", + "value": "Implosione" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작업" + "ja": { + "stringUnit": { + "state": "translated", + "value": "収縮" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Taken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "수축" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tarefas" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Implosie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "任务" + "zh": { + "stringUnit": { + "state": "translated", + "value": "内爆" } } } }, - "tasks_title_label" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aufgabentitel" + "No animation, instant move": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "No animation, instant move" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Task Title" + "es": { + "stringUnit": { + "state": "translated", + "value": "Sin animación, cambio instantáneo" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Título de la Tarea" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Aucune animation, déplacement instantané" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titre de la tâche" + "de": { + "stringUnit": { + "state": "translated", + "value": "Keine Animation, sofortiger Wechsel" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Sem animação, mudança instantânea" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "タイトル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Nessuna animazione, spostamento istantaneo" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "제목" + "ja": { + "stringUnit": { + "state": "translated", + "value": "アニメーションなし、即座に移動" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Titel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "애니메이션 없이 즉시 이동" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Título da Tarefa" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Geen animatie, directe verplaatsing" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "标题" + "zh": { + "stringUnit": { + "state": "translated", + "value": "无动画,立即移动" } } } }, - "tasks_title_required" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Erforderlich: Titel" + "Radiating rays from checkmark": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Radiating rays from checkmark" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Required: Title" + "es": { + "stringUnit": { + "state": "translated", + "value": "Rayos que irradian desde la marca" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requerido: Título" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Rayons émanant de la coche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Requis: Titre" + "de": { + "stringUnit": { + "state": "translated", + "value": "Strahlen vom Häkchen ausgehend" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obbligatorio: Titolo" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Raios irradiando da marca" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "必須:タイトル" + "it": { + "stringUnit": { + "state": "translated", + "value": "Raggi che si irradiano dal segno di spunta" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "필수: 제목" + "ja": { + "stringUnit": { + "state": "translated", + "value": "チェックマークから放射する光線" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Verplicht: Titel" + "ko": { + "stringUnit": { + "state": "translated", + "value": "체크 표시에서 뻗어 나가는 빛줄기" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obrigatório: Título" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Stralen vanuit het vinkje" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "必填:标题" + "zh": { + "stringUnit": { + "state": "translated", + "value": "从对勾放射出光线" } } } }, - "tasks_try_different_search" : { - "comment" : "Text to prompt the user to try a different search query when no task templates are found.", - "isCommentAutoGenerated" : true, - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Try a different search term" + "Ripple": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Ripple" + } + }, + "es": { + "stringUnit": { + "state": "translated", + "value": "Onda" + } + }, + "fr": { + "stringUnit": { + "state": "translated", + "value": "Ondulation" + } + }, + "de": { + "stringUnit": { + "state": "translated", + "value": "Welle" + } + }, + "pt": { + "stringUnit": { + "state": "translated", + "value": "Ondulação" + } + }, + "it": { + "stringUnit": { + "state": "translated", + "value": "Increspatura" + } + }, + "ja": { + "stringUnit": { + "state": "translated", + "value": "波紋" + } + }, + "ko": { + "stringUnit": { + "state": "translated", + "value": "물결" + } + }, + "nl": { + "stringUnit": { + "state": "translated", + "value": "Rimpeling" + } + }, + "zh": { + "stringUnit": { + "state": "translated", + "value": "涟漪" } } } }, - "tasks_unarchive" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiederherstellen" + "Starburst": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Starburst" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Unarchive" + "es": { + "stringUnit": { + "state": "translated", + "value": "Destello" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desarchivar" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Éclat d'étoile" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Désarchiver" + "de": { + "stringUnit": { + "state": "translated", + "value": "Sternexplosion" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ripristina" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Explosão de estrelas" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アーカイブ解除" + "it": { + "stringUnit": { + "state": "translated", + "value": "Esplosione stellare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보관 취소" + "ja": { + "stringUnit": { + "state": "translated", + "value": "星形の閃光" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Archivering ongedaan" + "ko": { + "stringUnit": { + "state": "translated", + "value": "별빛 폭발" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desarquivar" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Sterrenexplosie" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "取消归档" + "zh": { + "stringUnit": { + "state": "translated", + "value": "星芒" } } } }, - "tasks_view_photos" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fotos Ansehen" + "Sucks into center, becomes checkmark": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "Sucks into center, becomes checkmark" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "View Photos" + "es": { + "stringUnit": { + "state": "translated", + "value": "Se contrae al centro y forma la marca" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ver Fotos" + "fr": { + "stringUnit": { + "state": "translated", + "value": "Se contracte au centre et devient une coche" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voir les Photos" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zieht sich zur Mitte und wird zum Häkchen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Visualizza foto" + "pt": { + "stringUnit": { + "state": "translated", + "value": "Contrai para o centro e vira marca" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "写真を表示" + "it": { + "stringUnit": { + "state": "translated", + "value": "Si contrae al centro e diventa un segno di spunta" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사진 보기" + "ja": { + "stringUnit": { + "state": "translated", + "value": "中心に吸い込まれてチェックマークに" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto's bekijken" + "ko": { + "stringUnit": { + "state": "translated", + "value": "중심으로 모여 체크 표시가 됨" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ver Fotos" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Trekt samen naar het midden en wordt een vinkje" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "查看照片" + "zh": { + "stringUnit": { + "state": "translated", + "value": "向中心收缩并变成对勾" } } } }, - "tasks_your_name" : { - "extractionState" : "manual", - "localizations" : { - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ihr Name" + "To Do": { + "extractionState": "manual", + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "To Do" } }, - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Your name" + "es": { + "stringUnit": { + "state": "translated", + "value": "Por hacer" } }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tu nombre" + "fr": { + "stringUnit": { + "state": "translated", + "value": "À faire" } }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Votre nom" + "de": { + "stringUnit": { + "state": "translated", + "value": "Zu erledigen" } }, - "it" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il tuo nome" + "pt": { + "stringUnit": { + "state": "translated", + "value": "A fazer" } }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "あなたの名前" + "it": { + "stringUnit": { + "state": "translated", + "value": "Da fare" } }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "당신의 이름" + "ja": { + "stringUnit": { + "state": "translated", + "value": "未着手" } }, - "nl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uw naam" + "ko": { + "stringUnit": { + "state": "translated", + "value": "할 일" } }, - "pt" : { - "stringUnit" : { - "state" : "translated", - "value" : "Seu nome" + "nl": { + "stringUnit": { + "state": "translated", + "value": "Te doen" } }, - "zh" : { - "stringUnit" : { - "state" : "translated", - "value" : "您的名字" + "zh": { + "stringUnit": { + "state": "translated", + "value": "待办" } } } - }, - "Tell us about your home" : { - - }, - "Templates will appear here once loaded" : { - "comment" : "A description text displayed when there are no task templates available.", - "isCommentAutoGenerated" : true - }, - "That's Perfect!" : { - - }, - "The Smith Residence" : { - - }, - "Toggle password visibility" : { - "comment" : "A button that toggles the visibility of a password.", - "isCommentAutoGenerated" : true - }, - "Try a different search term" : { - "comment" : "A description below the \"No Templates Found\" message in the search results section of the task templates browser.", - "isCommentAutoGenerated" : true - }, - "Try Again" : { - "comment" : "A button label that says \"Try Again\".", - "isCommentAutoGenerated" : true - }, - "Unarchive" : { - "comment" : "A button that unarchives a task.", - "isCommentAutoGenerated" : true - }, - "Unarchive task" : { - "comment" : "A button that unarchives a task.", - "isCommentAutoGenerated" : true - }, - "Unarchive Task" : { - - }, - "Upgrade to Pro for unlimited access" : { - "comment" : "A description of the benefit of upgrading to the Pro plan.", - "isCommentAutoGenerated" : true - }, - "Use the share button to invite others" : { - - }, - "Using system default time" : { - "comment" : "A description of how a user can set a custom notification time.", - "isCommentAutoGenerated" : true - }, - "VERIFICATION CODE" : { - - }, - "Verify" : { - "comment" : "A button label that says \"Verify\".", - "isCommentAutoGenerated" : true - }, - "Verify Code" : { - "comment" : "A button that verifies a user's reset code.", - "isCommentAutoGenerated" : true - }, - "Verify your email" : { - "comment" : "A title for a screen that asks users to verify their email address.", - "isCommentAutoGenerated" : true - }, - "Verifying..." : { - "comment" : "A message displayed while waiting for the email verification process to complete.", - "isCommentAutoGenerated" : true - }, - "View %d completions" : { - "comment" : "A label that describes the action of viewing the completions of a task. The argument is the number of completions.", - "isCommentAutoGenerated" : true - }, - "View %lld photos" : { - "comment" : "A button that opens a new screen showing a list of photos. The number in parentheses is replaced with the actual number of photos.", - "isCommentAutoGenerated" : true - }, - "View Photos (%lld)" : { - "comment" : "A button that, when tapped, opens a view displaying photos taken during a task completion. The number in parentheses is replaced with the actual number of photos.", - "isCommentAutoGenerated" : true - }, - "We sent a 6-digit code to" : { - "comment" : "A message explaining that a verification code has been sent to their email.", - "isCommentAutoGenerated" : true - }, - "We sent a 6-digit code to your email address. Enter it below to verify your account." : { - "comment" : "A description below the email verification code field, instructing the user to enter the code they received.", - "isCommentAutoGenerated" : true - }, - "We'll send a 6-digit verification code to this address" : { - "comment" : "A footer label within the \"Forgot Password?\" view, instructing the user to check their email for a verification code.", - "isCommentAutoGenerated" : true - }, - "Welcome to honeyDue" : { - "comment" : "The title of the welcome screen in the preview.", - "isCommentAutoGenerated" : true - }, - "Welcome to Your Space" : { - "comment" : "A welcoming message displayed at the top of the \"Organic Empty Residences\" view.", - "isCommentAutoGenerated" : true - }, - "Where's your home?" : { - - }, - "You now have access to %@." : { - "comment" : "A message displayed when a user successfully imports a residence, indicating that they now have access to it. The argument is the name of the residence that was imported.", - "isCommentAutoGenerated" : true - }, - "You now have full access to all Pro features!" : { - "comment" : "A message displayed to users after successfully upgrading to the Pro version of the app.", - "isCommentAutoGenerated" : true - }, - "You're all set up!" : { - - }, - "You're already subscribed" : { - "comment" : "A message displayed when a user is already subscribed to the app.", - "isCommentAutoGenerated" : true - }, - "Your data will be synced across devices" : { - - }, - "Your Home Dashboard" : { - - }, - "Your home maintenance companion" : { - "comment" : "The tagline for the app, describing its purpose.", - "isCommentAutoGenerated" : true - }, - "Your subscription is managed on another platform." : { - "comment" : "A description of a user's subscription on an unspecified platform.", - "isCommentAutoGenerated" : true - }, - "Your subscription is managed through Google Play on your Android device." : { - } }, - "version" : "1.1" -} \ No newline at end of file + "version": "1.1" +} diff --git a/iosApp/iosApp/Login/AppleSignInManager.swift b/iosApp/iosApp/Login/AppleSignInManager.swift index 8aaecf6..0661911 100644 --- a/iosApp/iosApp/Login/AppleSignInManager.swift +++ b/iosApp/iosApp/Login/AppleSignInManager.swift @@ -159,19 +159,19 @@ enum AppleSignInError: LocalizedError { var errorDescription: String? { switch self { case .invalidCredential: - return "Invalid Apple ID credential" + return String(localized: "Invalid Apple ID credential") case .missingIdentityToken: - return "Missing identity token from Apple" + return String(localized: "Missing identity token from Apple") case .userCancelled: return nil // Don't show error for user cancellation case .authorizationFailed: - return "Apple Sign In authorization failed" + return String(localized: "Apple Sign In authorization failed") case .invalidResponse: - return "Invalid response from Apple" + return String(localized: "Invalid response from Apple") case .notHandled: - return "Apple Sign In request was not handled" + return String(localized: "Apple Sign In request was not handled") case .notInteractive: - return "Apple Sign In requires user interaction" + return String(localized: "Apple Sign In requires user interaction") case .serverError(let message): return message } diff --git a/iosApp/iosApp/Login/AppleSignInViewModel.swift b/iosApp/iosApp/Login/AppleSignInViewModel.swift index edfddfe..356f030 100644 --- a/iosApp/iosApp/Login/AppleSignInViewModel.swift +++ b/iosApp/iosApp/Login/AppleSignInViewModel.swift @@ -70,7 +70,7 @@ class AppleSignInViewModel: ObservableObject { self.handleBackendError(error) } else { self.isLoading = false - self.errorMessage = "Sign in failed. Please try again." + self.errorMessage = String(localized: "Sign in failed. Please try again.") } } catch { self.isLoading = false @@ -129,9 +129,9 @@ class AppleSignInViewModel: ObservableObject { if let code = error.code?.intValue { switch code { case 401: - errorMessage = "Authentication failed. Please try again." + errorMessage = String(localized: "Authentication failed. Please try again.") case 403: - errorMessage = "Access denied" + errorMessage = String(localized: "Access denied") case 409: // Conflict - let backend message explain the issue errorMessage = ErrorMessageParser.parse(error.message) @@ -139,7 +139,7 @@ class AppleSignInViewModel: ObservableObject { // Bad request - validation errors from backend errorMessage = ErrorMessageParser.parse(error.message) case 500...599: - errorMessage = "Server error. Please try again later." + errorMessage = String(localized: "Server error. Please try again later.") default: errorMessage = ErrorMessageParser.parse(error.message) } diff --git a/iosApp/iosApp/Login/GoogleSignInManager.swift b/iosApp/iosApp/Login/GoogleSignInManager.swift index 2cdb348..fae71dd 100644 --- a/iosApp/iosApp/Login/GoogleSignInManager.swift +++ b/iosApp/iosApp/Login/GoogleSignInManager.swift @@ -30,7 +30,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication guard !isLoading else { return } guard let clientId = resolvedClientID() else { - errorMessage = "Google Sign-In is not configured. A Google Cloud client ID is required." + errorMessage = String(localized: "Google Sign-In is not configured. A Google Cloud client ID is required.") return } @@ -50,7 +50,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication URLQueryItem(name: "client_id", value: clientId), URLQueryItem(name: "redirect_uri", value: redirectURI), URLQueryItem(name: "response_type", value: "code"), - URLQueryItem(name: "scope", value: "openid email profile"), + URLQueryItem(name: "scope", value: "openid email profile"), // i18n-ignore: OAuth scope value (non-UI) URLQueryItem(name: "access_type", value: "offline"), URLQueryItem(name: "prompt", value: "select_account"), URLQueryItem(name: "code_challenge", value: challenge), @@ -60,7 +60,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication guard let authURL = components.url else { isLoading = false - errorMessage = "Failed to build authentication URL" + errorMessage = String(localized: "Failed to build authentication URL") return } @@ -76,7 +76,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication self.isLoading = false // Don't show error for user cancellation if (error as NSError).code != ASWebAuthenticationSessionError.canceledLogin.rawValue { - self.errorMessage = "Sign in failed: \(error.localizedDescription)" + self.errorMessage = String(format: String(localized: "Sign in failed: %@"), error.localizedDescription) } return } @@ -85,14 +85,14 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication let components = URLComponents(url: callbackURL, resolvingAgainstBaseURL: false) else { self.isLoading = false self.resetOAuthState() - self.errorMessage = "Failed to get authorization code from Google" + self.errorMessage = String(localized: "Failed to get authorization code from Google") return } if let oauthError = components.queryItems?.first(where: { $0.name == "error" })?.value { self.isLoading = false self.resetOAuthState() - self.errorMessage = "Google Sign-In error: \(oauthError)" + self.errorMessage = String(format: String(localized: "Google Sign-In error: %@"), oauthError) return } @@ -100,7 +100,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication callbackState == self.oauthState else { self.isLoading = false self.resetOAuthState() - self.errorMessage = "Invalid Google OAuth state. Please try again." + self.errorMessage = String(localized: "Invalid Google OAuth state. Please try again.") return } @@ -108,7 +108,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication let verifier = self.codeVerifier else { self.isLoading = false self.resetOAuthState() - self.errorMessage = "Failed to get authorization code from Google" + self.errorMessage = String(localized: "Failed to get authorization code from Google") return } @@ -170,7 +170,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { resetOAuthState() isLoading = false - errorMessage = "Failed to exchange authorization code" + errorMessage = String(localized: "Failed to exchange authorization code") return } @@ -179,7 +179,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication guard let parsed = try JSONSerialization.jsonObject(with: data) as? [String: Any] else { resetOAuthState() isLoading = false - errorMessage = "Failed to get ID token from Google" + errorMessage = String(localized: "Failed to get ID token from Google") return } json = parsed @@ -187,14 +187,14 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication print("GoogleSignInManager: Failed to parse token response JSON: \(error)") resetOAuthState() isLoading = false - errorMessage = "Failed to get ID token from Google" + errorMessage = String(localized: "Failed to get ID token from Google") return } guard let idToken = json["id_token"] as? String else { resetOAuthState() isLoading = false - errorMessage = "Failed to get ID token from Google" + errorMessage = String(localized: "Failed to get ID token from Google") return } @@ -203,7 +203,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication } catch { resetOAuthState() isLoading = false - errorMessage = "Network error: \(error.localizedDescription)" + errorMessage = String(format: String(localized: "Network error: %@"), error.localizedDescription) } } @@ -217,7 +217,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication print("GoogleSignInManager: Backend sign-in request failed: \(error)") resetOAuthState() isLoading = false - errorMessage = "Sign in failed: \(error.localizedDescription)" + errorMessage = String(format: String(localized: "Sign in failed: %@"), error.localizedDescription) return } @@ -242,7 +242,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication } else { resetOAuthState() isLoading = false - errorMessage = "Sign in failed. Please try again." + errorMessage = String(localized: "Sign in failed. Please try again.") } } @@ -264,7 +264,7 @@ final class GoogleSignInManager: NSObject, ObservableObject, ASWebAuthentication } private static func randomURLSafeString(length: Int) -> String { - let allowed = Array("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") + let allowed = Array("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~") // i18n-ignore: URL-safe character set for nonce generation (non-UI) var bytes = [UInt8](repeating: 0, count: length) _ = SecRandomCopyBytes(kSecRandomDefault, bytes.count, &bytes) return String(bytes.map { allowed[Int($0) % allowed.count] }) diff --git a/iosApp/iosApp/Login/LoginView.swift b/iosApp/iosApp/Login/LoginView.swift index 6b8fd40..1ac48d2 100644 --- a/iosApp/iosApp/Login/LoginView.swift +++ b/iosApp/iosApp/Login/LoginView.swift @@ -358,7 +358,7 @@ struct LoginView: View { )) { Button("OK", role: .cancel) { } } message: { - Text(googleSignInManager.errorMessage ?? "An error occurred.") + Text(googleSignInManager.errorMessage ?? String(localized: "An error occurred.")) } } } diff --git a/iosApp/iosApp/Login/LoginViewModel.swift b/iosApp/iosApp/Login/LoginViewModel.swift index f22795d..1de102d 100644 --- a/iosApp/iosApp/Login/LoginViewModel.swift +++ b/iosApp/iosApp/Login/LoginViewModel.swift @@ -55,12 +55,12 @@ class LoginViewModel: ObservableObject { // MARK: - Public Methods func login() { guard !username.isEmpty else { - errorMessage = "Username is required" + errorMessage = String(localized: "Username is required") return } guard !password.isEmpty else { - errorMessage = "Password is required" + errorMessage = String(localized: "Password is required") return } @@ -75,7 +75,7 @@ class LoginViewModel: ObservableObject { onLoginSuccess?(true) } else { isLoading = false - errorMessage = "Invalid username or password" + errorMessage = String(localized: "Invalid username or password") } return } @@ -95,7 +95,7 @@ class LoginViewModel: ObservableObject { #if DEBUG print("Login successful!") - print("User: \(response.user.username ?? "unknown"), Verified: \(self.isVerified)") + print("User: \(response.user.username ?? "unknown"), Verified: \(self.isVerified)") // i18n-ignore: DEBUG log statement (non-UI) #endif // Share token and API URL with widget extension @@ -115,7 +115,7 @@ class LoginViewModel: ObservableObject { self.handleLoginError(error) } else { self.isLoading = false - self.errorMessage = "Failed to sign in" + self.errorMessage = String(localized: "Failed to sign in") } } catch { self.isLoading = false @@ -129,11 +129,11 @@ class LoginViewModel: ObservableObject { if let code = error.code?.intValue { switch code { case 401: - self.errorMessage = "Invalid username or password" + self.errorMessage = String(localized: "Invalid username or password") case 403: - self.errorMessage = "Access denied. Please check your credentials." + self.errorMessage = String(localized: "Access denied. Please check your credentials.") case 404: - self.errorMessage = "Service not found. Please try again later." + self.errorMessage = String(localized: "Service not found. Please try again later.") case 409: // Conflict - let backend message explain the issue self.errorMessage = ErrorMessageParser.parse(error.message) @@ -141,7 +141,7 @@ class LoginViewModel: ObservableObject { // Bad request - validation errors from backend self.errorMessage = ErrorMessageParser.parse(error.message) case 500...599: - self.errorMessage = "Server error. Please try again later." + self.errorMessage = String(localized: "Server error. Please try again later.") default: self.errorMessage = ErrorMessageParser.parse(error.message) } diff --git a/iosApp/iosApp/Onboarding/OnboardingCreateAccountView.swift b/iosApp/iosApp/Onboarding/OnboardingCreateAccountView.swift index ebe11b4..8a1267f 100644 --- a/iosApp/iosApp/Onboarding/OnboardingCreateAccountView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingCreateAccountView.swift @@ -220,7 +220,7 @@ struct OnboardingCreateAccountContent: View { VStack(spacing: 16) { OrganicOnboardingTextField( icon: "person.fill", - placeholder: "Username", + placeholder: String(localized: "Username"), text: $viewModel.username, isFocused: focusedField == .username, accessibilityIdentifier: AccessibilityIdentifiers.Onboarding.usernameField @@ -233,7 +233,7 @@ struct OnboardingCreateAccountContent: View { OrganicOnboardingTextField( icon: "envelope.fill", - placeholder: "Email", + placeholder: String(localized: "Email"), text: $viewModel.email, isFocused: focusedField == .email, accessibilityIdentifier: AccessibilityIdentifiers.Onboarding.emailField @@ -247,7 +247,7 @@ struct OnboardingCreateAccountContent: View { OrganicOnboardingSecureField( icon: "lock.fill", - placeholder: "Password", + placeholder: String(localized: "Password"), text: $viewModel.password, isFocused: focusedField == .password, accessibilityIdentifier: AccessibilityIdentifiers.Onboarding.passwordField @@ -257,7 +257,7 @@ struct OnboardingCreateAccountContent: View { OrganicOnboardingSecureField( icon: "lock.fill", - placeholder: "Confirm Password", + placeholder: String(localized: "Confirm Password"), text: $viewModel.confirmPassword, isFocused: focusedField == .confirmPassword, accessibilityIdentifier: AccessibilityIdentifiers.Onboarding.confirmPasswordField @@ -268,11 +268,11 @@ struct OnboardingCreateAccountContent: View { // Password Requirements if !viewModel.password.isEmpty { VStack(alignment: .leading, spacing: 6) { - OnboardingPasswordRequirementRow(isMet: hasMinLength, text: "At least 8 characters") - OnboardingPasswordRequirementRow(isMet: hasUppercase, text: "Contains an uppercase letter") - OnboardingPasswordRequirementRow(isMet: hasLowercase, text: "Contains a lowercase letter") - OnboardingPasswordRequirementRow(isMet: hasDigit, text: "Contains a number") - OnboardingPasswordRequirementRow(isMet: passwordsMatch, text: "Passwords match") + OnboardingPasswordRequirementRow(isMet: hasMinLength, text: String(localized: "At least 8 characters")) + OnboardingPasswordRequirementRow(isMet: hasUppercase, text: String(localized: "Contains an uppercase letter")) + OnboardingPasswordRequirementRow(isMet: hasLowercase, text: String(localized: "Contains a lowercase letter")) + OnboardingPasswordRequirementRow(isMet: hasDigit, text: String(localized: "Contains a number")) + OnboardingPasswordRequirementRow(isMet: passwordsMatch, text: String(localized: "Passwords match")) } .padding(12) .background(Color.appBackgroundPrimary.opacity(0.5)) @@ -311,7 +311,7 @@ struct OnboardingCreateAccountContent: View { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) } - Text(viewModel.isLoading ? "Creating Account..." : "Create Account") + Text(viewModel.isLoading ? String(localized: "Creating Account...") : String(localized: "Create Account")) .font(.system(size: 17, weight: .semibold)) } .frame(maxWidth: .infinity) @@ -362,7 +362,7 @@ struct OnboardingCreateAccountContent: View { )) { Button("OK", role: .cancel) { } } message: { - Text(googleSignInManager.errorMessage ?? "An error occurred.") + Text(googleSignInManager.errorMessage ?? String(localized: "An error occurred.")) } .onChange(of: viewModel.isRegistered) { _, isRegistered in if isRegistered { @@ -406,7 +406,7 @@ private struct OnboardingPasswordRequirementRow: View { .font(.system(size: 14, weight: .medium)) .foregroundColor(isMet ? Color.appPrimary : Color.appTextSecondary) - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 13, weight: .medium)) .foregroundColor(isMet ? Color.appTextPrimary : Color.appTextSecondary) } @@ -434,7 +434,7 @@ private struct OrganicOnboardingTextField: View { .foregroundColor(Color.appPrimary) } - TextField(placeholder, text: $text) + TextField(LocalizedStringKey(placeholder), text: $text) .font(.system(size: 16, weight: .medium)) .accessibilityIdentifier(accessibilityIdentifier ?? "") } @@ -477,12 +477,12 @@ private struct OrganicOnboardingSecureField: View { } if showPassword { - TextField(placeholder, text: $text) + TextField(LocalizedStringKey(placeholder), text: $text) .font(.system(size: 16, weight: .medium)) .textContentType(.password) .accessibilityIdentifier(accessibilityIdentifier ?? "") } else { - SecureField(placeholder, text: $text) + SecureField(LocalizedStringKey(placeholder), text: $text) .font(.system(size: 16, weight: .medium)) .textContentType(.password) .accessibilityIdentifier(accessibilityIdentifier ?? "") @@ -541,7 +541,7 @@ private struct OrganicDividerWithText: View { ) .frame(height: 1) - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 14, weight: .medium)) .foregroundColor(Color.appTextSecondary) diff --git a/iosApp/iosApp/Onboarding/OnboardingFirstTaskView.swift b/iosApp/iosApp/Onboarding/OnboardingFirstTaskView.swift index dc5b86f..5d4bd53 100644 --- a/iosApp/iosApp/Onboarding/OnboardingFirstTaskView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingFirstTaskView.swift @@ -3,8 +3,8 @@ import ComposeApp /// Tab selection for task browsing enum OnboardingTaskTab: String, CaseIterable { - case forYou = "For You" - case browse = "Browse All" + case forYou = "For You" // i18n-ignore: rawValue is the catalog key, localized at render via Text(LocalizedStringKey(tab.rawValue)) + case browse = "Browse All" // i18n-ignore: rawValue is the catalog key, localized at render via Text(LocalizedStringKey(tab.rawValue)) } /// First-task onboarding content — pure server-driven, no hardcoded catalog. @@ -102,7 +102,7 @@ struct OnboardingFirstTaskContent: View { let stableId: Int32 = rawId ?? Int32(truncatingIfNeeded: abs(group.categoryName.hashValue)) * -1 return OnboardingTaskCategory( id: stableId, - name: group.categoryName.isEmpty ? "Uncategorized" : group.categoryName, + name: group.categoryName.isEmpty ? String(localized: "Uncategorized") : group.categoryName, icon: Self.icon(for: group.categoryName), color: Self.color(for: rawId), tasks: group.templates.map { Self.template(from: $0, categoryName: group.categoryName) } @@ -122,7 +122,7 @@ struct OnboardingFirstTaskContent: View { if map[t.id] == nil { map[t.id] = Self.template( from: t, - categoryName: t.category?.name ?? "Suggested" + categoryName: t.category?.name ?? String(localized: "Suggested") ) } } @@ -136,7 +136,7 @@ struct OnboardingFirstTaskContent: View { description: t.description_.isEmpty ? nil : t.description_, categoryId: t.categoryId?.int32Value, frequencyId: t.frequencyId?.int32Value, - frequencyLabel: t.frequency?.displayName ?? "One time", + frequencyLabel: t.frequency?.displayName ?? String(localized: "One time"), icon: t.iconIos.isEmpty ? Self.icon(for: categoryName) : t.iconIos, color: Self.color(for: t.categoryId?.int32Value) ) @@ -259,7 +259,7 @@ struct OnboardingFirstTaskContent: View { Image(systemName: selectedCount > 0 ? "checkmark.seal.fill" : "checkmark.circle.fill") .foregroundColor(selectedCount > 0 ? Color.appAccent : Color.appPrimary) - Text("\(selectedCount) task\(selectedCount == 1 ? "" : "s") selected") + Text("\(selectedCount) tasks selected") .font(.system(size: 14, weight: .semibold)) .foregroundColor(Color.appPrimary) } @@ -268,25 +268,25 @@ struct OnboardingFirstTaskContent: View { .background(Color.appPrimary.opacity(0.1)) .clipShape(Capsule()) .animation(.spring(response: 0.3), value: selectedCount) - .accessibilityLabel("\(selectedCount) task\(selectedCount == 1 ? "" : "s") selected") + .accessibilityLabel("\(selectedCount) tasks selected") } @ViewBuilder private var forYouTab: some View { if vm.isLoadingSuggestions { - OnboardingLoadingPane(message: "Finding tasks for your home...") + OnboardingLoadingPane(message: String(localized: "Finding tasks for your home...")) } else if let errorMessage = vm.suggestionsError { OnboardingErrorPane( - headline: "Couldn't load your suggestions", + headline: String(localized: "Couldn't load your suggestions"), message: errorMessage, retry: retrySuggestions, skip: { skip(reason: "network_error_for_you") }, - secondary: vm.grouped != nil ? .init(label: "Browse All", action: { selectedTab = .browse }) : nil + secondary: vm.grouped != nil ? .init(label: String(localized: "Browse All"), action: { selectedTab = .browse }) : nil ) } else if vm.suggestions.isEmpty && vm.suggestionsAttempted { OnboardingEmptyPane( - message: "No personalised suggestions yet — browse the full catalog or skip this step.", - primary: .init(label: vm.grouped != nil ? "Browse All" : "Skip", action: { + message: String(localized: "No personalised suggestions yet — browse the full catalog or skip this step."), + primary: .init(label: vm.grouped != nil ? String(localized: "Browse All") : String(localized: "Skip"), action: { if vm.grouped != nil { selectedTab = .browse } else { @@ -319,18 +319,18 @@ struct OnboardingFirstTaskContent: View { @ViewBuilder private var browseTab: some View { if vm.isLoadingGrouped && vm.grouped == nil { - OnboardingLoadingPane(message: "Loading the task catalog...") + OnboardingLoadingPane(message: String(localized: "Loading the task catalog...")) } else if let errorMessage = vm.groupedError, vm.grouped == nil { OnboardingErrorPane( - headline: "Couldn't load the task catalog", + headline: String(localized: "Couldn't load the task catalog"), message: errorMessage, retry: retryGrouped, skip: { skip(reason: "network_error_browse") } ) } else if browseCategories.isEmpty { OnboardingEmptyPane( - message: "No templates available right now.", - primary: .init(label: "Skip", action: { skip(reason: "empty_catalog") }) + message: String(localized: "No templates available right now."), + primary: .init(label: String(localized: "Skip"), action: { skip(reason: "empty_catalog") }) ) } else { VStack(spacing: 12) { @@ -366,8 +366,8 @@ struct OnboardingFirstTaskContent: View { .progressViewStyle(CircularProgressViewStyle(tint: .white)) } else { Text(selectedCount > 0 - ? "Add \(selectedCount) Task\(selectedCount == 1 ? "" : "s") & Continue" - : "Skip for Now") + ? String(format: String(localized: "Add %lld Tasks & Continue"), selectedCount) + : String(localized: "Skip for Now")) .font(.system(size: 17, weight: .bold)) Image(systemName: "arrow.right") @@ -591,7 +591,7 @@ private struct OnboardingTaskTabBar: View { var body: some View { Picker("", selection: $selectedTab) { ForEach(OnboardingTaskTab.allCases, id: \.self) { tab in - Text(tab.rawValue).tag(tab) + Text(LocalizedStringKey(tab.rawValue)).tag(tab) } } .pickerStyle(.segmented) @@ -656,8 +656,8 @@ private struct OnboardingSuggestionRow: View { } .buttonStyle(.plain) .accessibilityIdentifier("\(AccessibilityIdentifiers.Onboarding.templateRowPrefix).\(suggestion.template.id)") - .accessibilityLabel("\(suggestion.template.title), \(suggestion.template.frequencyDisplay), \(relevancePercent)% match") - .accessibilityValue(isSelected ? "selected" : "not selected") + .accessibilityLabel(String(format: String(localized: "%@, %@, %lld%% match"), suggestion.template.title, suggestion.template.frequencyDisplay, relevancePercent)) + .accessibilityValue(isSelected ? String(localized: "selected") : String(localized: "not selected")) } } @@ -803,7 +803,7 @@ private struct OnboardingTemplateRow: View { .buttonStyle(.plain) .accessibilityIdentifier("\(AccessibilityIdentifiers.Onboarding.templateRowPrefix).\(template.id)") .accessibilityLabel("\(template.title), \(template.frequencyLabel)") - .accessibilityValue(isSelected ? "selected" : "not selected") + .accessibilityValue(isSelected ? String(localized: "selected") : String(localized: "not selected")) } } @@ -822,7 +822,7 @@ private struct OnboardingLoadingPane: View { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: Color.appPrimary)) .scaleEffect(1.2) - Text(message) + Text(LocalizedStringKey(message)) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) @@ -850,7 +850,7 @@ private struct OnboardingErrorPane: View { .foregroundColor(Color.appError) } - Text(headline) + Text(LocalizedStringKey(headline)) .font(.system(size: 17, weight: .semibold)) .foregroundColor(Color.appTextPrimary) .multilineTextAlignment(.center) @@ -926,7 +926,7 @@ private struct OnboardingEmptyPane: View { .foregroundColor(Color.appPrimary) } - Text(message) + Text(LocalizedStringKey(message)) .font(.system(size: 14, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) diff --git a/iosApp/iosApp/Onboarding/OnboardingHomeProfileView.swift b/iosApp/iosApp/Onboarding/OnboardingHomeProfileView.swift index 9f29abf..db1b2cb 100644 --- a/iosApp/iosApp/Onboarding/OnboardingHomeProfileView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingHomeProfileView.swift @@ -6,9 +6,19 @@ struct OnboardingHomeProfileContent: View { var onSkip: () -> Void @ObservedObject private var onboardingState = OnboardingState.shared + @ObservedObject private var dataManager = DataManagerObservable.shared @State private var isAnimating = false @Environment(\.colorScheme) var colorScheme + /// Resolve a field's dropdown options: prefer the backend-served (and + /// localized) list, falling back to the bundled English defaults when the + /// lookup data hasn't loaded yet (e.g. offline first run). + private func resolvedOptions(_ field: String, _ fallback: [HomeProfileOption]) -> [HomeProfileOption] { + let server = dataManager.homeProfileOptions[field] ?? [] + guard !server.isEmpty else { return fallback } + return server.map { HomeProfileOption(value: $0.value, display: $0.displayName) } + } + var body: some View { ZStack { WarmGradientBackground() @@ -129,75 +139,75 @@ struct OnboardingHomeProfileContent: View { .padding(.top, OrganicSpacing.cozy) // Systems section - ProfileSection(title: "Systems", icon: "gearshape.2.fill", color: .appPrimary) { + ProfileSection(title: String(localized: "Systems"), icon: "gearshape.2.fill", color: .appPrimary) { VStack(spacing: 12) { ProfilePicker( - label: "Heating", + label: String(localized: "Heating"), icon: "flame.fill", selection: $onboardingState.pendingHeatingType, - options: HomeProfileOptions.heatingTypes + options: resolvedOptions("heating_type", HomeProfileOptions.heatingTypes) ) ProfilePicker( - label: "Cooling", + label: String(localized: "Cooling"), icon: "snowflake", selection: $onboardingState.pendingCoolingType, - options: HomeProfileOptions.coolingTypes + options: resolvedOptions("cooling_type", HomeProfileOptions.coolingTypes) ) ProfilePicker( - label: "Water Heater", + label: String(localized: "Water Heater"), icon: "drop.fill", selection: $onboardingState.pendingWaterHeaterType, - options: HomeProfileOptions.waterHeaterTypes + options: resolvedOptions("water_heater_type", HomeProfileOptions.waterHeaterTypes) ) } } // Features section - ProfileSection(title: "Features", icon: "star.fill", color: .appAccent) { + ProfileSection(title: String(localized: "Features"), icon: "star.fill", color: .appAccent) { HomeFeatureChipGrid( features: [ - FeatureToggle(label: "Pool", icon: "figure.pool.swim", isOn: $onboardingState.pendingHasPool), - FeatureToggle(label: "Sprinklers", icon: "sprinkler.and.droplets.fill", isOn: $onboardingState.pendingHasSprinklerSystem), - FeatureToggle(label: "Fireplace", icon: "fireplace.fill", isOn: $onboardingState.pendingHasFireplace), - FeatureToggle(label: "Garage", icon: "car.fill", isOn: $onboardingState.pendingHasGarage), - FeatureToggle(label: "Basement", icon: "arrow.down.square.fill", isOn: $onboardingState.pendingHasBasement), - FeatureToggle(label: "Attic", icon: "arrow.up.square.fill", isOn: $onboardingState.pendingHasAttic), - FeatureToggle(label: "Septic", icon: "drop.triangle.fill", isOn: $onboardingState.pendingHasSeptic), + FeatureToggle(label: String(localized: "Pool"), icon: "figure.pool.swim", isOn: $onboardingState.pendingHasPool), + FeatureToggle(label: String(localized: "Sprinklers"), icon: "sprinkler.and.droplets.fill", isOn: $onboardingState.pendingHasSprinklerSystem), + FeatureToggle(label: String(localized: "Fireplace"), icon: "fireplace.fill", isOn: $onboardingState.pendingHasFireplace), + FeatureToggle(label: String(localized: "Garage"), icon: "car.fill", isOn: $onboardingState.pendingHasGarage), + FeatureToggle(label: String(localized: "Basement"), icon: "arrow.down.square.fill", isOn: $onboardingState.pendingHasBasement), + FeatureToggle(label: String(localized: "Attic"), icon: "arrow.up.square.fill", isOn: $onboardingState.pendingHasAttic), + FeatureToggle(label: String(localized: "Septic"), icon: "drop.triangle.fill", isOn: $onboardingState.pendingHasSeptic), ] ) } // Exterior section - ProfileSection(title: "Exterior", icon: "house.fill", color: Color(hex: "#34C759") ?? .green) { + ProfileSection(title: String(localized: "Exterior"), icon: "house.fill", color: Color(hex: "#34C759") ?? .green) { VStack(spacing: 12) { ProfilePicker( - label: "Roof Type", + label: String(localized: "Roof Type"), icon: "triangle.fill", selection: $onboardingState.pendingRoofType, - options: HomeProfileOptions.roofTypes + options: resolvedOptions("roof_type", HomeProfileOptions.roofTypes) ) ProfilePicker( - label: "Exterior", + label: String(localized: "Exterior"), icon: "square.stack.3d.up.fill", selection: $onboardingState.pendingExteriorType, - options: HomeProfileOptions.exteriorTypes + options: resolvedOptions("exterior_type", HomeProfileOptions.exteriorTypes) ) ProfilePicker( - label: "Landscaping", + label: String(localized: "Landscaping"), icon: "leaf.fill", selection: $onboardingState.pendingLandscapingType, - options: HomeProfileOptions.landscapingTypes + options: resolvedOptions("landscaping_type", HomeProfileOptions.landscapingTypes) ) } } // Interior section - ProfileSection(title: "Interior", icon: "sofa.fill", color: Color(hex: "#AF52DE") ?? .purple) { + ProfileSection(title: String(localized: "Interior"), icon: "sofa.fill", color: Color(hex: "#AF52DE") ?? .purple) { ProfilePicker( - label: "Primary Flooring", + label: String(localized: "Primary Flooring"), icon: "square.grid.3x3.fill", selection: $onboardingState.pendingFlooringPrimary, - options: HomeProfileOptions.flooringTypes + options: resolvedOptions("flooring_primary", HomeProfileOptions.flooringTypes) ) } } @@ -277,7 +287,7 @@ private struct ProfileSection: View { .foregroundColor(.white) } - Text(title) + Text(LocalizedStringKey(title)) .font(.system(size: 16, weight: .bold, design: .rounded)) .foregroundColor(Color.appTextPrimary) } @@ -312,7 +322,7 @@ private struct ProfilePicker: View { .foregroundColor(Color.appPrimary) .frame(width: 24) - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextPrimary) @@ -351,7 +361,7 @@ private struct ProfilePicker: View { } private var displayValue: String { - guard let selection = selection else { return "Select" } + guard let selection = selection else { return String(localized: "Select") } return options.first { $0.value == selection }?.display ?? selection } } @@ -398,7 +408,7 @@ private struct HomeFeatureChip: View { Image(systemName: icon) .font(.system(size: 14, weight: .medium)) - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 14, weight: .semibold)) } .foregroundColor(isSelected ? .white : Color.appTextPrimary) @@ -424,7 +434,7 @@ private struct HomeFeatureChip: View { } .buttonStyle(.plain) .accessibilityLabel(label) - .accessibilityValue(isSelected ? "selected" : "not selected") + .accessibilityValue(isSelected ? String(localized: "selected") : String(localized: "not selected")) } } @@ -437,71 +447,71 @@ struct HomeProfileOption { enum HomeProfileOptions { static let heatingTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "gas_furnace", display: "Gas Furnace"), - HomeProfileOption(value: "electric_furnace", display: "Electric Furnace"), - HomeProfileOption(value: "heat_pump", display: "Heat Pump"), - HomeProfileOption(value: "boiler", display: "Boiler"), - HomeProfileOption(value: "radiant", display: "Radiant"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "gas_furnace", display: String(localized: "Gas Furnace")), + HomeProfileOption(value: "electric_furnace", display: String(localized: "Electric Furnace")), + HomeProfileOption(value: "heat_pump", display: String(localized: "Heat Pump")), + HomeProfileOption(value: "boiler", display: String(localized: "Boiler")), + HomeProfileOption(value: "radiant", display: String(localized: "Radiant")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let coolingTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "central_ac", display: "Central AC"), - HomeProfileOption(value: "window_ac", display: "Window AC"), - HomeProfileOption(value: "heat_pump", display: "Heat Pump"), - HomeProfileOption(value: "evaporative", display: "Evaporative"), - HomeProfileOption(value: "none", display: "None"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "central_ac", display: String(localized: "Central AC")), + HomeProfileOption(value: "window_ac", display: String(localized: "Window AC")), + HomeProfileOption(value: "heat_pump", display: String(localized: "Heat Pump")), + HomeProfileOption(value: "evaporative", display: String(localized: "Evaporative")), + HomeProfileOption(value: "none", display: String(localized: "None")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let waterHeaterTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "tank_gas", display: "Tank (Gas)"), - HomeProfileOption(value: "tank_electric", display: "Tank (Electric)"), - HomeProfileOption(value: "tankless_gas", display: "Tankless (Gas)"), - HomeProfileOption(value: "tankless_electric", display: "Tankless (Electric)"), - HomeProfileOption(value: "heat_pump", display: "Heat Pump"), - HomeProfileOption(value: "solar", display: "Solar"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "tank_gas", display: String(localized: "Tank (Gas)")), + HomeProfileOption(value: "tank_electric", display: String(localized: "Tank (Electric)")), + HomeProfileOption(value: "tankless_gas", display: String(localized: "Tankless (Gas)")), + HomeProfileOption(value: "tankless_electric", display: String(localized: "Tankless (Electric)")), + HomeProfileOption(value: "heat_pump", display: String(localized: "Heat Pump")), + HomeProfileOption(value: "solar", display: String(localized: "Solar")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let roofTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "asphalt_shingle", display: "Asphalt Shingle"), - HomeProfileOption(value: "metal", display: "Metal"), - HomeProfileOption(value: "tile", display: "Tile"), - HomeProfileOption(value: "slate", display: "Slate"), - HomeProfileOption(value: "wood_shake", display: "Wood Shake"), - HomeProfileOption(value: "flat", display: "Flat"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "asphalt_shingle", display: String(localized: "Asphalt Shingle")), + HomeProfileOption(value: "metal", display: String(localized: "Metal")), + HomeProfileOption(value: "tile", display: String(localized: "Tile")), + HomeProfileOption(value: "slate", display: String(localized: "Slate")), + HomeProfileOption(value: "wood_shake", display: String(localized: "Wood Shake")), + HomeProfileOption(value: "flat", display: String(localized: "Flat")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let exteriorTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "brick", display: "Brick"), - HomeProfileOption(value: "vinyl_siding", display: "Vinyl Siding"), - HomeProfileOption(value: "wood_siding", display: "Wood Siding"), - HomeProfileOption(value: "stucco", display: "Stucco"), - HomeProfileOption(value: "stone", display: "Stone"), - HomeProfileOption(value: "fiber_cement", display: "Fiber Cement"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "brick", display: String(localized: "Brick")), + HomeProfileOption(value: "vinyl_siding", display: String(localized: "Vinyl Siding")), + HomeProfileOption(value: "wood_siding", display: String(localized: "Wood Siding")), + HomeProfileOption(value: "stucco", display: String(localized: "Stucco")), + HomeProfileOption(value: "stone", display: String(localized: "Stone")), + HomeProfileOption(value: "fiber_cement", display: String(localized: "Fiber Cement")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let flooringTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "hardwood", display: "Hardwood"), - HomeProfileOption(value: "laminate", display: "Laminate"), - HomeProfileOption(value: "tile", display: "Tile"), - HomeProfileOption(value: "carpet", display: "Carpet"), - HomeProfileOption(value: "vinyl", display: "Vinyl"), - HomeProfileOption(value: "concrete", display: "Concrete"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "hardwood", display: String(localized: "Hardwood")), + HomeProfileOption(value: "laminate", display: String(localized: "Laminate")), + HomeProfileOption(value: "tile", display: String(localized: "Tile")), + HomeProfileOption(value: "carpet", display: String(localized: "Carpet")), + HomeProfileOption(value: "vinyl", display: String(localized: "Vinyl")), + HomeProfileOption(value: "concrete", display: String(localized: "Concrete")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] static let landscapingTypes: [HomeProfileOption] = [ - HomeProfileOption(value: "lawn", display: "Lawn"), - HomeProfileOption(value: "desert", display: "Desert"), - HomeProfileOption(value: "xeriscape", display: "Xeriscape"), - HomeProfileOption(value: "garden", display: "Garden"), - HomeProfileOption(value: "mixed", display: "Mixed"), - HomeProfileOption(value: "none", display: "None"), - HomeProfileOption(value: "other", display: "Other"), + HomeProfileOption(value: "lawn", display: String(localized: "Lawn")), + HomeProfileOption(value: "desert", display: String(localized: "Desert")), + HomeProfileOption(value: "xeriscape", display: String(localized: "Xeriscape")), + HomeProfileOption(value: "garden", display: String(localized: "Garden")), + HomeProfileOption(value: "mixed", display: String(localized: "Mixed")), + HomeProfileOption(value: "none", display: String(localized: "None")), + HomeProfileOption(value: "other", display: String(localized: "Other")), ] } diff --git a/iosApp/iosApp/Onboarding/OnboardingJoinResidenceView.swift b/iosApp/iosApp/Onboarding/OnboardingJoinResidenceView.swift index 1270772..929f799 100644 --- a/iosApp/iosApp/Onboarding/OnboardingJoinResidenceView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingJoinResidenceView.swift @@ -203,7 +203,7 @@ struct OnboardingJoinResidenceContent: View { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) } - Text(isLoading ? "Joining..." : "Join Residence") + Text(isLoading ? String(localized: "Joining...") : String(localized: "Join Residence")) .font(.system(size: 17, weight: .semibold)) } .frame(maxWidth: .infinity) @@ -235,7 +235,7 @@ struct OnboardingJoinResidenceContent: View { private func joinResidence() { guard shareCode.count == 6 else { - errorMessage = "Share code must be 6 characters" + errorMessage = String(localized: "Share code must be 6 characters") return } diff --git a/iosApp/iosApp/Onboarding/OnboardingNameResidenceView.swift b/iosApp/iosApp/Onboarding/OnboardingNameResidenceView.swift index 8903341..ca4a59a 100644 --- a/iosApp/iosApp/Onboarding/OnboardingNameResidenceView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingNameResidenceView.swift @@ -14,11 +14,11 @@ struct OnboardingNameResidenceContent: View { } private let nameSuggestions = [ - "Casa de [Your Name]", - "The Cozy Corner", - "Home Sweet Home", - "The Nest", - "Château Us" + String(localized: "Casa de [Your Name]"), + String(localized: "The Cozy Corner"), + String(localized: "Home Sweet Home"), + String(localized: "The Nest"), + String(localized: "Château Us") ] var body: some View { diff --git a/iosApp/iosApp/Onboarding/OnboardingState.swift b/iosApp/iosApp/Onboarding/OnboardingState.swift index 3d5cc1b..894843e 100644 --- a/iosApp/iosApp/Onboarding/OnboardingState.swift +++ b/iosApp/iosApp/Onboarding/OnboardingState.swift @@ -18,7 +18,7 @@ class OnboardingState: ObservableObject { /// Whether the user has completed onboarding. /// This is the persisted flag read at launch to decide whether to show onboarding. /// When set to `true`, Kotlin DataManager is also updated to keep both layers in sync. - @AppStorage("hasCompletedOnboarding") var hasCompletedOnboarding: Bool = false { + @AppStorage("hasCompletedOnboarding") var hasCompletedOnboarding: Bool = false { // i18n-ignore: @AppStorage key (non-UI) didSet { // Keep Kotlin DataManager in sync so Android/shared code sees the same value. ComposeApp.DataManager.shared.setHasCompletedOnboarding(completed: hasCompletedOnboarding) @@ -26,10 +26,10 @@ class OnboardingState: ObservableObject { } /// The name of the residence being created during onboarding - @AppStorage("onboardingResidenceName") var pendingResidenceName: String = "" + @AppStorage("onboardingResidenceName") var pendingResidenceName: String = "" // i18n-ignore: @AppStorage key (non-UI) /// Backing storage for user intent (persisted across app restarts) - @AppStorage("onboardingUserIntent") private var userIntentRaw: String = OnboardingIntent.unknown.rawValue + @AppStorage("onboardingUserIntent") private var userIntentRaw: String = OnboardingIntent.unknown.rawValue // i18n-ignore: @AppStorage key (non-UI) // MARK: - Transient State (via @Published, reset each session as needed) @@ -179,6 +179,7 @@ enum OnboardingStep: Int, CaseIterable { case firstTask = 8 case subscriptionUpsell = 9 + // i18n-ignore-begin: dead code — `title` is never rendered (verified); pending removal var title: String { switch self { case .welcome: @@ -203,4 +204,5 @@ enum OnboardingStep: Int, CaseIterable { return "Go Pro" } } + // i18n-ignore-end } diff --git a/iosApp/iosApp/Onboarding/OnboardingSubscriptionView.swift b/iosApp/iosApp/Onboarding/OnboardingSubscriptionView.swift index c32b941..6707694 100644 --- a/iosApp/iosApp/Onboarding/OnboardingSubscriptionView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingSubscriptionView.swift @@ -15,38 +15,38 @@ struct OnboardingSubscriptionContent: View { private let benefits: [SubscriptionBenefit] = [ SubscriptionBenefit( icon: "building.2.fill", - title: "Unlimited Properties", - description: "Track every home you own—vacation houses, rentals, you name it", + title: String(localized: "Unlimited Properties"), + description: String(localized: "Track every home you own—vacation houses, rentals, you name it"), gradient: [Color.appPrimary, Color.appSecondary] ), SubscriptionBenefit( icon: "doc.badge.plus", - title: "Document Vault", - description: "All your warranties, receipts, and manuals in one searchable place", + title: String(localized: "Document Vault"), + description: String(localized: "All your warranties, receipts, and manuals in one searchable place"), gradient: [Color(hex: "#34C759") ?? .green, Color(hex: "#30D158") ?? .green] ), SubscriptionBenefit( icon: "person.3.fill", - title: "Family Sharing", - description: "Get everyone on the same page—literally", + title: String(localized: "Family Sharing"), + description: String(localized: "Get everyone on the same page—literally"), gradient: [Color(hex: "#AF52DE") ?? .purple, Color(hex: "#BF5AF2") ?? .purple] ), SubscriptionBenefit( icon: "square.and.arrow.up.fill", - title: "Contractor Sharing", - description: "Share your trusted contractors with family and friends", + title: String(localized: "Contractor Sharing"), + description: String(localized: "Share your trusted contractors with family and friends"), gradient: [Color.appAccent, Color(hex: "#FF9500") ?? .orange] ), SubscriptionBenefit( icon: "bell.badge.fill", - title: "Actionable Notifications", - description: "Complete tasks directly from notifications—no app opening needed", + title: String(localized: "Actionable Notifications"), + description: String(localized: "Complete tasks directly from notifications—no app opening needed"), gradient: [Color(hex: "#FF3B30") ?? .red, Color(hex: "#FF6961") ?? .red] ), SubscriptionBenefit( icon: "square.grid.2x2.fill", - title: "Home Screen Widgets", - description: "Quick actions right from your home screen", + title: String(localized: "Home Screen Widgets"), + description: String(localized: "Quick actions right from your home screen"), gradient: [Color(hex: "#007AFF") ?? .blue, Color(hex: "#5AC8FA") ?? .blue] ) ] @@ -275,7 +275,7 @@ struct OnboardingSubscriptionContent: View { .naturalShadow(.medium) } .disabled(isLoading) - .a11yButton("Start free trial") + .a11yButton(String(localized: "Start free trial")) // Continue without Button(action: { @@ -285,11 +285,13 @@ struct OnboardingSubscriptionContent: View { .font(.system(size: 15, weight: .semibold)) .foregroundColor(Color.appTextSecondary) } - .a11yButton("Continue with free plan") + .a11yButton(String(localized: "Continue with free plan")) // Legal text + let trialPriceValue = productForSelectedPlan()?.displayPrice ?? selectedPlan.price + let trialPriceText = trialPriceValue + selectedPlan.period VStack(spacing: 4) { - Text("7-day free trial, then \(productForSelectedPlan()?.displayPrice ?? selectedPlan.price)\(selectedPlan.period)") + Text(String(format: String(localized: "7-day free trial, then %@"), trialPriceText)) .font(.system(size: 12, weight: .medium)) .foregroundColor(Color.appTextSecondary) @@ -345,13 +347,13 @@ struct OnboardingSubscriptionContent: View { onSubscribe() } } else { - purchaseError = "Purchase was cancelled. You can continue with Free or try again." + purchaseError = String(localized: "Purchase was cancelled. You can continue with Free or try again.") } } } catch { await MainActor.run { isLoading = false - purchaseError = "Unable to start trial: \(error.localizedDescription)" + purchaseError = String(format: String(localized: "Unable to start trial: %@"), error.localizedDescription) } } } @@ -380,36 +382,36 @@ enum PricingPlan { var title: String { switch self { - case .monthly: return "Monthly" - case .yearly: return "Yearly" + case .monthly: return String(localized: "Monthly") + case .yearly: return String(localized: "Yearly") } } var price: String { switch self { - case .monthly: return "$2.99" - case .yearly: return "$23.99" + case .monthly: return String(localized: "$2.99") + case .yearly: return String(localized: "$23.99") } } var period: String { switch self { - case .monthly: return "/month" - case .yearly: return "/year" + case .monthly: return String(localized: "/month") + case .yearly: return String(localized: "/year") } } var monthlyEquivalent: String? { switch self { case .monthly: return nil - case .yearly: return "Just $1.99/month" + case .yearly: return String(localized: "Just $1.99/month") } } var savings: String? { switch self { case .monthly: return nil - case .yearly: return "Save 30%" + case .yearly: return String(localized: "Save 30%") } } } @@ -442,12 +444,12 @@ private struct OrganicPricingPlanCard: View { VStack(alignment: .leading, spacing: 2) { HStack(spacing: 8) { - Text(plan.title) + Text(LocalizedStringKey(plan.title)) .font(.system(size: 16, weight: .semibold)) .foregroundColor(Color.appTextPrimary) if let savings = plan.savings { - Text(savings) + Text(LocalizedStringKey(savings)) .font(.system(size: 10, weight: .bold)) .foregroundColor(.white) .padding(.horizontal, 8) @@ -464,7 +466,7 @@ private struct OrganicPricingPlanCard: View { } if let monthlyEquivalent = plan.monthlyEquivalent { - Text(monthlyEquivalent) + Text(LocalizedStringKey(monthlyEquivalent)) .font(.system(size: 12, weight: .medium)) .foregroundColor(Color.appTextSecondary) } @@ -515,7 +517,7 @@ private struct OrganicPricingPlanCard: View { .buttonStyle(.plain) .animation(.easeInOut(duration: 0.2), value: isSelected) .accessibilityLabel("\(plan.title) plan, \(displayPrice ?? plan.price)\(plan.period)\(plan.savings.map { ", \($0)" } ?? "")") - .accessibilityValue(isSelected ? "Selected" : "") + .accessibilityValue(isSelected ? String(localized: "Selected") : "") } } @@ -567,11 +569,11 @@ private struct OrganicSubscriptionBenefitRow: View { .a11yDecorative() VStack(alignment: .leading, spacing: 2) { - Text(benefit.title) + Text(LocalizedStringKey(benefit.title)) .font(.system(size: 14, weight: .semibold)) .foregroundColor(Color.appTextPrimary) - Text(benefit.description) + Text(LocalizedStringKey(benefit.description)) .font(.system(size: 12, weight: .medium)) .foregroundColor(Color.appTextSecondary) .lineLimit(2) diff --git a/iosApp/iosApp/Onboarding/OnboardingTasksViewModel.swift b/iosApp/iosApp/Onboarding/OnboardingTasksViewModel.swift index 16f9d89..fd80113 100644 --- a/iosApp/iosApp/Onboarding/OnboardingTasksViewModel.swift +++ b/iosApp/iosApp/Onboarding/OnboardingTasksViewModel.swift @@ -84,7 +84,7 @@ final class OnboardingTasksViewModel: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { suggestionsError = ErrorMessageParser.parse(error.message) } else { - suggestionsError = "Could not load suggestions." + suggestionsError = String(localized: "Could not load suggestions.") } } catch { suggestionsError = ErrorMessageParser.parse(error.localizedDescription) @@ -107,7 +107,7 @@ final class OnboardingTasksViewModel: ObservableObject { } else if let error = ApiResultBridge.error(from: result) { groupedError = ErrorMessageParser.parse(error.message) } else { - groupedError = "Could not load templates." + groupedError = String(localized: "Could not load templates.") } } catch { groupedError = ErrorMessageParser.parse(error.localizedDescription) @@ -143,7 +143,7 @@ final class OnboardingTasksViewModel: ObservableObject { submitError = ErrorMessageParser.parse(error.message) return false } else { - submitError = "Could not create tasks." + submitError = String(localized: "Could not create tasks.") return false } } catch { diff --git a/iosApp/iosApp/Onboarding/OnboardingValuePropsView.swift b/iosApp/iosApp/Onboarding/OnboardingValuePropsView.swift index d789f06..4ce1e41 100644 --- a/iosApp/iosApp/Onboarding/OnboardingValuePropsView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingValuePropsView.swift @@ -9,48 +9,48 @@ struct OnboardingValuePropsContent: View { private let features: [FeatureHighlight] = [ FeatureHighlight( icon: "clock.badge.checkmark.fill", - title: "Never Forget Again", - subtitle: "Your memory just got an upgrade", - description: "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \"when did I last...?\" moments.", + title: String(localized: "Never Forget Again"), + subtitle: String(localized: "Your memory just got an upgrade"), + description: String(localized: "Smart reminders keep you on top of furnace filters, gutter cleaning, and everything in between. No more \"when did I last...?\" moments."), gradient: [Color.appPrimary, Color.appSecondary], statNumber: "$6,000+", - statLabel: "spent yearly on repairs that could've been prevented" + statLabel: String(localized: "spent yearly on repairs that could've been prevented") ), FeatureHighlight( icon: "doc.text.fill", - title: "Warranties at Your Fingertips", - subtitle: "No more digging through drawers", - description: "Snap a photo of your receipts and warranties. When something breaks, you'll know exactly what's covered—instantly.", + title: String(localized: "Warranties at Your Fingertips"), + subtitle: String(localized: "No more digging through drawers"), + description: String(localized: "Snap a photo of your receipts and warranties. When something breaks, you'll know exactly what's covered—instantly."), gradient: [Color.appAccent, Color(hex: "#FF9500") ?? .orange], statNumber: "47%", - statLabel: "of homebuyers lack emergency funds for repairs" + statLabel: String(localized: "of homebuyers lack emergency funds for repairs") ), FeatureHighlight( icon: "person.2.fill", - title: "The Whole Family's In", - subtitle: "Teamwork makes the dream work", - description: "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \"didn't know.\"", + title: String(localized: "The Whole Family's In"), + subtitle: String(localized: "Teamwork makes the dream work"), + description: String(localized: "Share your home with family members. Everyone sees what needs doing, and nobody can claim they \"didn't know.\""), gradient: [Color(hex: "#AF52DE") ?? .purple, Color(hex: "#BF5AF2") ?? .purple], statNumber: "56%", - statLabel: "say sharing chores is key to a happy home" + statLabel: String(localized: "say sharing chores is key to a happy home") ), FeatureHighlight( icon: "bell.badge.fill", - title: "Smart Notifications", - subtitle: "Act right from your lock screen", - description: "Get actionable reminders that let you complete tasks right from the notification. No need to even open the app.", + title: String(localized: "Smart Notifications"), + subtitle: String(localized: "Act right from your lock screen"), + description: String(localized: "Get actionable reminders that let you complete tasks right from the notification. No need to even open the app."), gradient: [Color(hex: "#FF3B30") ?? .red, Color(hex: "#FF6961") ?? .red], statNumber: "3x", - statLabel: "faster task completion with actionable notifications" + statLabel: String(localized: "faster task completion with actionable notifications") ), FeatureHighlight( icon: "square.grid.2x2.fill", - title: "Home Screen Widgets", - subtitle: "Your tasks at a glance", - description: "Quick access to upcoming tasks and reminders directly from your home screen. Stay on top of maintenance without opening the app.", + title: String(localized: "Home Screen Widgets"), + subtitle: String(localized: "Your tasks at a glance"), + description: String(localized: "Quick access to upcoming tasks and reminders directly from your home screen. Stay on top of maintenance without opening the app."), gradient: [Color(hex: "#007AFF") ?? .blue, Color(hex: "#5AC8FA") ?? .blue], statNumber: "68%", - statLabel: "of widget users complete tasks on time" + statLabel: String(localized: "of widget users complete tasks on time") ) ] @@ -180,13 +180,13 @@ struct OrganicFeatureCard: View { // Text content VStack(spacing: 10) { - Text(feature.title) + Text(LocalizedStringKey(feature.title)) .font(.system(size: 24, weight: .bold, design: .rounded)) .foregroundColor(Color.appTextPrimary) .multilineTextAlignment(.center) .a11yHeader() - Text(feature.subtitle) + Text(LocalizedStringKey(feature.subtitle)) .font(.system(size: 15, weight: .semibold)) .foregroundStyle( LinearGradient( @@ -197,7 +197,7 @@ struct OrganicFeatureCard: View { ) .multilineTextAlignment(.center) - Text(feature.description) + Text(LocalizedStringKey(feature.description)) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) @@ -221,7 +221,7 @@ struct OrganicFeatureCard: View { ) ) - Text(feature.statLabel) + Text(LocalizedStringKey(feature.statLabel)) .font(.system(size: 13, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) diff --git a/iosApp/iosApp/Onboarding/OnboardingVerifyEmailView.swift b/iosApp/iosApp/Onboarding/OnboardingVerifyEmailView.swift index 4be18ff..df42228 100644 --- a/iosApp/iosApp/Onboarding/OnboardingVerifyEmailView.swift +++ b/iosApp/iosApp/Onboarding/OnboardingVerifyEmailView.swift @@ -220,7 +220,7 @@ struct OnboardingVerifyEmailContent: View { ProgressView() .progressViewStyle(CircularProgressViewStyle(tint: .white)) } - Text(viewModel.isLoading ? "Verifying..." : "Verify") + Text(viewModel.isLoading ? String(localized: "Verifying...") : String(localized: "Verify")) .font(.system(size: 17, weight: .semibold)) } .frame(maxWidth: .infinity) diff --git a/iosApp/iosApp/PasswordReset/ForgotPasswordView.swift b/iosApp/iosApp/PasswordReset/ForgotPasswordView.swift index ed31cf1..377c813 100644 --- a/iosApp/iosApp/PasswordReset/ForgotPasswordView.swift +++ b/iosApp/iosApp/PasswordReset/ForgotPasswordView.swift @@ -141,7 +141,7 @@ struct ForgotPasswordView: View { } else { Image(systemName: "envelope.fill") } - Text(viewModel.isLoading ? "Sending..." : "Send Reset Code") + Text(viewModel.isLoading ? String(localized: "Sending...") : String(localized: "Send Reset Code")) .font(.headline) .fontWeight(.semibold) } diff --git a/iosApp/iosApp/PasswordReset/PasswordResetViewModel.swift b/iosApp/iosApp/PasswordReset/PasswordResetViewModel.swift index ae0e57f..1e8149d 100644 --- a/iosApp/iosApp/PasswordReset/PasswordResetViewModel.swift +++ b/iosApp/iosApp/PasswordReset/PasswordResetViewModel.swift @@ -66,7 +66,7 @@ class PasswordResetViewModel: ObservableObject { if result is ApiResultSuccess { self.isLoading = false - self.successMessage = "Check your email for a 6-digit verification code" + self.successMessage = String(localized: "Check your email for a 6-digit verification code") // Automatically move to next step after short delay self.delayedTransitionTask?.cancel() @@ -81,7 +81,7 @@ class PasswordResetViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) } else { self.isLoading = false - self.errorMessage = "Failed to request password reset" + self.errorMessage = String(localized: "Failed to request password reset") } } catch { self.isLoading = false @@ -109,7 +109,7 @@ class PasswordResetViewModel: ObservableObject { let token = response.resetToken self.resetToken = token self.isLoading = false - self.successMessage = "Code verified! Now set your new password" + self.successMessage = String(localized: "Code verified! Now set your new password") // Automatically move to next step after short delay self.delayedTransitionTask?.cancel() @@ -124,7 +124,7 @@ class PasswordResetViewModel: ObservableObject { self.handleVerifyError(ErrorMessageParser.parse(error.message)) } else { self.isLoading = false - self.errorMessage = "Failed to verify code" + self.errorMessage = String(localized: "Failed to verify code") } } catch { self.isLoading = false @@ -151,7 +151,7 @@ class PasswordResetViewModel: ObservableObject { } guard let token = resetToken else { - errorMessage = "Invalid reset token. Please start over." + errorMessage = String(localized: "Invalid reset token. Please start over.") return } @@ -168,7 +168,7 @@ class PasswordResetViewModel: ObservableObject { if result is ApiResultSuccess { // Password reset successful - now auto-login - self.successMessage = "Password reset successfully! Logging you in..." + self.successMessage = String(localized: "Password reset successfully! Logging you in...") self.currentStep = .loggingIn await self.autoLogin() } else if let error = ApiResultBridge.error(from: result) { @@ -176,7 +176,7 @@ class PasswordResetViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) } else { self.isLoading = false - self.errorMessage = "Failed to reset password" + self.errorMessage = String(localized: "Failed to reset password") } } catch { self.isLoading = false @@ -193,7 +193,7 @@ class PasswordResetViewModel: ObservableObject { guard !username.isEmpty else { // If we don't have the email (e.g., deep link flow), fall back to manual login self.isLoading = false - self.successMessage = "Password reset successfully! You can now log in with your new password." + self.successMessage = String(localized: "Password reset successfully! You can now log in with your new password.") self.currentStep = .success return } @@ -220,11 +220,11 @@ class PasswordResetViewModel: ObservableObject { print("Auto-login failed: \(error.message)") #endif self.isLoading = false - self.successMessage = "Password reset successfully! You can now log in with your new password." + self.successMessage = String(localized: "Password reset successfully! You can now log in with your new password.") self.currentStep = .success } else { self.isLoading = false - self.successMessage = "Password reset successfully! You can now log in with your new password." + self.successMessage = String(localized: "Password reset successfully! You can now log in with your new password.") self.currentStep = .success } } catch { @@ -233,7 +233,7 @@ class PasswordResetViewModel: ObservableObject { print("Auto-login error: \(error.localizedDescription)") #endif self.isLoading = false - self.successMessage = "Password reset successfully! You can now log in with your new password." + self.successMessage = String(localized: "Password reset successfully! You can now log in with your new password.") self.currentStep = .success } } @@ -302,11 +302,11 @@ class PasswordResetViewModel: ObservableObject { let normalized = message.lowercased() if normalized.contains("expired") { - errorMessage = "Reset code has expired. Please request a new one." + errorMessage = String(localized: "Reset code has expired. Please request a new one.") } else if normalized.contains("attempts") { - errorMessage = "Too many failed attempts. Please request a new reset code." + errorMessage = String(localized: "Too many failed attempts. Please request a new reset code.") } else if normalized.contains("invalid") && normalized.contains("token") { - errorMessage = "Invalid or expired reset token. Please start over." + errorMessage = String(localized: "Invalid or expired reset token. Please start over.") } else { errorMessage = message } diff --git a/iosApp/iosApp/PasswordReset/ResetPasswordView.swift b/iosApp/iosApp/PasswordReset/ResetPasswordView.swift index 0751c4c..3d792b5 100644 --- a/iosApp/iosApp/PasswordReset/ResetPasswordView.swift +++ b/iosApp/iosApp/PasswordReset/ResetPasswordView.swift @@ -90,23 +90,23 @@ struct ResetPasswordView: View { VStack(alignment: .leading, spacing: 8) { RequirementRow( isMet: hasMinLength, - text: "At least 8 characters" + text: String(localized: "At least 8 characters") ) RequirementRow( isMet: hasUppercase, - text: "Contains an uppercase letter" + text: String(localized: "Contains an uppercase letter") ) RequirementRow( isMet: hasLowercase, - text: "Contains a lowercase letter" + text: String(localized: "Contains a lowercase letter") ) RequirementRow( isMet: hasNumber, - text: "Contains a number" + text: String(localized: "Contains a number") ) RequirementRow( isMet: passwordsMatch, - text: "Passwords match" + text: String(localized: "Passwords match") ) } .padding(16) @@ -255,7 +255,7 @@ struct ResetPasswordView: View { } else { Image(systemName: "lock.shield.fill") } - Text(viewModel.currentStep == .loggingIn ? "Logging in..." : (viewModel.isLoading ? "Resetting..." : "Reset Password")) + Text(viewModel.currentStep == .loggingIn ? String(localized: "Logging in...") : (viewModel.isLoading ? String(localized: "Resetting...") : String(localized: "Reset Password"))) .font(.headline) .fontWeight(.semibold) } @@ -317,7 +317,7 @@ struct ResetPasswordView: View { HStack(spacing: 6) { Image(systemName: viewModel.currentStep == .success ? "xmark" : "chevron.left") .font(.system(size: 14, weight: .semibold)) - Text(viewModel.currentStep == .success ? "Close" : "Back") + Text(viewModel.currentStep == .success ? String(localized: "Close") : String(localized: "Back")) .font(.system(size: 15, weight: .medium)) } .foregroundColor(Color.appPrimary) @@ -343,7 +343,7 @@ private struct RequirementRow: View { .font(.system(size: 14, weight: .medium)) .foregroundColor(isMet ? Color.appPrimary : Color.appTextSecondary) - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 13, weight: .medium)) .foregroundColor(isMet ? Color.appTextPrimary : Color.appTextSecondary) } diff --git a/iosApp/iosApp/PasswordReset/VerifyResetCodeView.swift b/iosApp/iosApp/PasswordReset/VerifyResetCodeView.swift index 24658b2..4e06bfe 100644 --- a/iosApp/iosApp/PasswordReset/VerifyResetCodeView.swift +++ b/iosApp/iosApp/PasswordReset/VerifyResetCodeView.swift @@ -152,7 +152,7 @@ struct VerifyResetCodeView: View { } else { Image(systemName: "checkmark.shield.fill") } - Text(viewModel.isLoading ? "Verifying..." : "Verify Code") + Text(viewModel.isLoading ? String(localized: "Verifying...") : String(localized: "Verify Code")) .font(.headline) .fontWeight(.semibold) } diff --git a/iosApp/iosApp/Profile/AnimationTesting/AnimationTestingCard.swift b/iosApp/iosApp/Profile/AnimationTesting/AnimationTestingCard.swift index ce06a57..d7647a2 100644 --- a/iosApp/iosApp/Profile/AnimationTesting/AnimationTestingCard.swift +++ b/iosApp/iosApp/Profile/AnimationTesting/AnimationTestingCard.swift @@ -56,7 +56,7 @@ struct AnimationTestingCard: View { } private var priorityBadge: some View { - Text(task.priority.rawValue) + Text(task.priority.displayName) .font(.system(size: 10, weight: .bold, design: .rounded)) .foregroundColor(.white) .padding(.horizontal, 8) diff --git a/iosApp/iosApp/Profile/AnimationTesting/TaskAnimations.swift b/iosApp/iosApp/Profile/AnimationTesting/TaskAnimations.swift index 9afa7b8..0bf8abf 100644 --- a/iosApp/iosApp/Profile/AnimationTesting/TaskAnimations.swift +++ b/iosApp/iosApp/Profile/AnimationTesting/TaskAnimations.swift @@ -3,14 +3,27 @@ import SwiftUI // MARK: - Animation Type Enum enum TaskAnimationType: String, CaseIterable, Identifiable { + // i18n-ignore-begin: rawValue is a stable persisted id (AnimationPreference); UI shows displayName case none = "None" case implode = "Implode" case firework = "Firework" case starburst = "Starburst" case ripple = "Ripple" + // i18n-ignore-end var id: String { rawValue } + /// Localized name shown in the picker and Profile row. + var displayName: String { + switch self { + case .none: return String(localized: "None") + case .implode: return String(localized: "Implode") + case .firework: return String(localized: "Firework") + case .starburst: return String(localized: "Starburst") + case .ripple: return String(localized: "Ripple") + } + } + var icon: String { switch self { case .none: return "minus.circle" @@ -23,11 +36,11 @@ enum TaskAnimationType: String, CaseIterable, Identifiable { var description: String { switch self { - case .none: return "No animation, instant move" - case .implode: return "Sucks into center, becomes checkmark" - case .firework: return "Explodes into colorful sparks" - case .starburst: return "Radiating rays from checkmark" - case .ripple: return "Checkmark with expanding rings" + case .none: return String(localized: "No animation, instant move") + case .implode: return String(localized: "Sucks into center, becomes checkmark") + case .firework: return String(localized: "Explodes into colorful sparks") + case .starburst: return String(localized: "Radiating rays from checkmark") + case .ripple: return String(localized: "Checkmark with expanding rings") } } @@ -66,9 +79,20 @@ struct TestTask: Identifiable, Equatable { var dueDate: String enum TestPriority: String { + // i18n-ignore-begin: rawValue is an internal id; the badge renders displayName case high = "High" case medium = "Medium" case low = "Low" + // i18n-ignore-end + + /// Localized label shown in the preview card's priority badge. + var displayName: String { + switch self { + case .high: return String(localized: "High") + case .medium: return String(localized: "Medium") + case .low: return String(localized: "Low") + } + } var color: Color { switch self { @@ -79,6 +103,7 @@ struct TestTask: Identifiable, Equatable { } } + // i18n-ignore-begin: mock sample tasks shown in the completion-animation preview (not real content) static let samples: [TestTask] = [ TestTask( id: "1", @@ -105,6 +130,7 @@ struct TestTask: Identifiable, Equatable { dueDate: "Dec 30" ) ] + // i18n-ignore-end } struct TestColumn: Identifiable, Equatable { @@ -118,22 +144,22 @@ struct TestColumn: Identifiable, Equatable { [ TestColumn( id: "todo", - name: "To Do", - displayName: "To Do", + name: "todo", // i18n-ignore: internal column id + displayName: String(localized: "To Do"), color: Color.appAccent, tasks: TestTask.samples ), TestColumn( id: "progress", - name: "In Progress", - displayName: "In Progress", + name: "progress", // i18n-ignore: internal column id + displayName: String(localized: "In Progress"), color: Color.appPrimary, tasks: [] ), TestColumn( id: "done", - name: "Done", - displayName: "Done", + name: "done", // i18n-ignore: internal column id + displayName: String(localized: "Done"), color: Color.appPrimary.opacity(0.6), tasks: [] ) @@ -153,7 +179,7 @@ struct AnimationChip: View { HStack(spacing: 6) { Image(systemName: animation.icon) .font(.system(size: 12, weight: .semibold)) - Text(animation.rawValue) + Text(animation.displayName) .font(.system(size: 13, weight: .semibold, design: .rounded)) } .foregroundColor(isSelected ? Color.appTextOnPrimary : Color.appTextPrimary) diff --git a/iosApp/iosApp/Profile/NotificationPreferencesView.swift b/iosApp/iosApp/Profile/NotificationPreferencesView.swift index 4b50f2c..54cb271 100644 --- a/iosApp/iosApp/Profile/NotificationPreferencesView.swift +++ b/iosApp/iosApp/Profile/NotificationPreferencesView.swift @@ -435,7 +435,7 @@ class NotificationPreferencesViewModelWrapper: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to load notification preferences" + self.errorMessage = String(localized: "Failed to load notification preferences") self.isLoading = false } } catch { @@ -491,7 +491,7 @@ class NotificationPreferencesViewModelWrapper: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isSaving = false } else { - self.errorMessage = "Failed to save notification preferences" + self.errorMessage = String(localized: "Failed to save notification preferences") self.isSaving = false } } catch { @@ -551,10 +551,10 @@ class NotificationPreferencesViewModelWrapper: ObservableObject { // Format hour to display string func formatHour(_ hour: Int) -> String { switch hour { - case 0: return "12:00 AM" - case 1...11: return "\(hour):00 AM" - case 12: return "12:00 PM" - default: return "\(hour - 12):00 PM" + case 0: return String(localized: "12:00 AM") + case 1...11: return String(format: String(localized: "%lld:00 AM"), hour) + case 12: return String(localized: "12:00 PM") + default: return String(format: String(localized: "%lld:00 PM"), hour - 12) } } } @@ -637,10 +637,10 @@ struct TimePickerSheet: View { private static let hourOptions: [HourOption] = (0..<24).map { hour in let label: String switch hour { - case 0: label = "12:00 AM" - case 1...11: label = "\(hour):00 AM" - case 12: label = "12:00 PM" - default: label = "\(hour - 12):00 PM" + case 0: label = String(localized: "12:00 AM") + case 1...11: label = String(format: String(localized: "%lld:00 AM"), hour) + case 12: label = String(localized: "12:00 PM") + default: label = String(format: String(localized: "%lld:00 PM"), hour - 12) } return HourOption(id: hour, label: label) } @@ -672,7 +672,7 @@ struct TimePickerSheet: View { } .pickerStyle(.wheel) .frame(height: 150) - .id("hourPicker") // Stable identity to prevent view recycling issues + .id("hourPicker") // i18n-ignore: SwiftUI view identity (non-UI) } Text("Notifications will be sent at \(formatHour(selectedHour)) in your local timezone") diff --git a/iosApp/iosApp/Profile/ProfileTabView.swift b/iosApp/iosApp/Profile/ProfileTabView.swift index 696f2ea..f94a49f 100644 --- a/iosApp/iosApp/Profile/ProfileTabView.swift +++ b/iosApp/iosApp/Profile/ProfileTabView.swift @@ -207,7 +207,7 @@ struct ProfileTabView: View { Spacer() - Text(animationPreference.selectedAnimation.rawValue) + Text(LocalizedStringKey(animationPreference.selectedAnimation.rawValue)) .font(.subheadline) .foregroundColor(Color.appTextSecondary) @@ -217,7 +217,7 @@ struct ProfileTabView: View { .a11yDecorative() } } - .accessibilityLabel("Completion Animation, \(animationPreference.selectedAnimation.rawValue)") + .accessibilityLabel(String(format: String(localized: "Completion Animation, %@"), animationPreference.selectedAnimation.displayName)) } .sectionBackground() @@ -335,9 +335,9 @@ struct ProfileTabView: View { } private func sendSupportEmail() { - let email = "honeydue@treymail.com" - let subject = "honeyDue Support Request" - let urlString = "mailto:\(email)?subject=\(subject.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? subject)" + let email = "honeydue@treymail.com" // i18n-ignore: support email address (non-UI) + let subject = String(localized: "honeyDue Support Request") + let urlString = "mailto:\(email)?subject=\(subject.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? subject)" // i18n-ignore: mailto URL construction (non-UI) if let url = URL(string: urlString) { UIApplication.shared.open(url) diff --git a/iosApp/iosApp/Profile/ProfileViewModel.swift b/iosApp/iosApp/Profile/ProfileViewModel.swift index eef6382..daea29b 100644 --- a/iosApp/iosApp/Profile/ProfileViewModel.swift +++ b/iosApp/iosApp/Profile/ProfileViewModel.swift @@ -61,7 +61,7 @@ class ProfileViewModel: ObservableObject { // MARK: - Public Methods func loadCurrentUser() { guard tokenStorage.getToken() != nil else { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") isLoadingUser = false return } @@ -87,7 +87,7 @@ class ProfileViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoadingUser = false } else { - self.errorMessage = "Failed to load profile" + self.errorMessage = String(localized: "Failed to load profile") self.isLoadingUser = false } } catch { @@ -99,12 +99,12 @@ class ProfileViewModel: ObservableObject { func updateProfile() { guard !email.isEmpty else { - errorMessage = "Email is required" + errorMessage = String(localized: "Email is required") return } guard let token = tokenStorage.getToken() else { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") return } @@ -125,14 +125,14 @@ class ProfileViewModel: ObservableObject { if result is ApiResultSuccess { self.isLoading = false self.errorMessage = nil - self.successMessage = "Profile updated successfully" + self.successMessage = String(localized: "Profile updated successfully") } else if let error = ApiResultBridge.error(from: result) { self.isLoading = false self.errorMessage = ErrorMessageParser.parse(error.message) self.successMessage = nil } else { self.isLoading = false - self.errorMessage = "Failed to update profile" + self.errorMessage = String(localized: "Failed to update profile") self.successMessage = nil } } catch { diff --git a/iosApp/iosApp/Profile/ThemeSelectionView.swift b/iosApp/iosApp/Profile/ThemeSelectionView.swift index 1bb9546..3421ffb 100644 --- a/iosApp/iosApp/Profile/ThemeSelectionView.swift +++ b/iosApp/iosApp/Profile/ThemeSelectionView.swift @@ -148,7 +148,7 @@ struct ThemeRow: View { .padding(.vertical, 6) .contentShape(Rectangle()) .accessibilityLabel(theme.displayName) - .accessibilityValue(isSelected ? "Selected" : "") + .accessibilityValue(isSelected ? String(localized: "Selected") : "") } } diff --git a/iosApp/iosApp/PushNotifications/NotificationCategories.swift b/iosApp/iosApp/PushNotifications/NotificationCategories.swift index 57c416d..ae0adec 100644 --- a/iosApp/iosApp/PushNotifications/NotificationCategories.swift +++ b/iosApp/iosApp/PushNotifications/NotificationCategories.swift @@ -54,19 +54,19 @@ struct NotificationCategories { private static func createTaskActionableCategory() -> UNNotificationCategory { let completeAction = UNNotificationAction( identifier: NotificationActionID.completeTask.rawValue, - title: "Complete", + title: String(localized: "Complete"), options: [] ) let inProgressAction = UNNotificationAction( identifier: NotificationActionID.markInProgress.rawValue, - title: "Start", + title: String(localized: "Start"), options: [] ) let cancelAction = UNNotificationAction( identifier: NotificationActionID.cancelTask.rawValue, - title: "Cancel", + title: String(localized: "Cancel"), options: [.destructive] ) @@ -83,13 +83,13 @@ struct NotificationCategories { private static func createTaskInProgressCategory() -> UNNotificationCategory { let completeAction = UNNotificationAction( identifier: NotificationActionID.completeTask.rawValue, - title: "Complete", + title: String(localized: "Complete"), options: [] ) let cancelAction = UNNotificationAction( identifier: NotificationActionID.cancelTask.rawValue, - title: "Cancel", + title: String(localized: "Cancel"), options: [.destructive] ) @@ -106,7 +106,7 @@ struct NotificationCategories { private static func createTaskCancelledCategory() -> UNNotificationCategory { let uncancelAction = UNNotificationAction( identifier: NotificationActionID.uncancelTask.rawValue, - title: "Restore", + title: String(localized: "Restore"), options: [] ) diff --git a/iosApp/iosApp/PushNotifications/PushNotificationManager.swift b/iosApp/iosApp/PushNotifications/PushNotificationManager.swift index 9953fa4..a58b91e 100644 --- a/iosApp/iosApp/PushNotifications/PushNotificationManager.swift +++ b/iosApp/iosApp/PushNotifications/PushNotificationManager.swift @@ -69,7 +69,7 @@ class PushNotificationManager: NSObject, ObservableObject { // MARK: - Token Management func didRegisterForRemoteNotifications(withDeviceToken deviceToken: Data) { - let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() + let tokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() // i18n-ignore: hex byte format spec (non-UI) self.deviceToken = tokenString let redactedToken = "\(tokenString.prefix(8))...\(tokenString.suffix(8))" #if DEBUG @@ -527,7 +527,7 @@ class PushNotificationManager: NSObject, ObservableObject { NotificationCenter.default.post( name: .navigateToTask, object: nil, - userInfo: ["taskId": taskId] + userInfo: ["taskId": taskId] // i18n-ignore: NotificationCenter userInfo key (non-UI) ) } @@ -551,7 +551,7 @@ class PushNotificationManager: NSObject, ObservableObject { NotificationCenter.default.post( name: .navigateToEditTask, object: nil, - userInfo: ["taskId": taskId] + userInfo: ["taskId": taskId] // i18n-ignore: NotificationCenter userInfo key (non-UI) ) } @@ -563,7 +563,7 @@ class PushNotificationManager: NSObject, ObservableObject { NotificationCenter.default.post( name: .navigateToResidence, object: nil, - userInfo: ["residenceId": residenceId] + userInfo: ["residenceId": residenceId] // i18n-ignore: NotificationCenter userInfo key (non-UI) ) } @@ -579,7 +579,7 @@ class PushNotificationManager: NSObject, ObservableObject { NotificationCenter.default.post( name: .navigateToDocument, object: nil, - userInfo: ["documentId": documentId] + userInfo: ["documentId": documentId] // i18n-ignore: NotificationCenter userInfo key (non-UI) ) } @@ -623,7 +623,7 @@ class PushNotificationManager: NSObject, ObservableObject { let taskId = stringValue(for: "task_id", in: userInfo) ?? "none" let residenceId = stringValue(for: "residence_id", in: userInfo) ?? "none" let documentId = stringValue(for: "document_id", in: userInfo) ?? "none" - return "type=\(type), notification_id=\(notificationId), task_id=\(taskId), residence_id=\(residenceId), document_id=\(documentId)" + return "type=\(type), notification_id=\(notificationId), task_id=\(taskId), residence_id=\(residenceId), document_id=\(documentId)" // i18n-ignore: redacted debug log summary (non-UI) } private func markNotificationAsRead(notificationId: String) async { diff --git a/iosApp/iosApp/Register/RegisterView.swift b/iosApp/iosApp/Register/RegisterView.swift index e4a04b2..6543526 100644 --- a/iosApp/iosApp/Register/RegisterView.swift +++ b/iosApp/iosApp/Register/RegisterView.swift @@ -148,11 +148,11 @@ struct RegisterView: View { .tracking(1.2) VStack(alignment: .leading, spacing: 6) { - PasswordRequirementRow(isMet: hasMinLength, text: "At least 8 characters") - PasswordRequirementRow(isMet: hasUppercase, text: "Contains an uppercase letter") - PasswordRequirementRow(isMet: hasLowercase, text: "Contains a lowercase letter") - PasswordRequirementRow(isMet: hasDigit, text: "Contains a number") - PasswordRequirementRow(isMet: passwordsMatch, text: "Passwords match") + PasswordRequirementRow(isMet: hasMinLength, text: String(localized: "At least 8 characters")) + PasswordRequirementRow(isMet: hasUppercase, text: String(localized: "Contains an uppercase letter")) + PasswordRequirementRow(isMet: hasLowercase, text: String(localized: "Contains a lowercase letter")) + PasswordRequirementRow(isMet: hasDigit, text: String(localized: "Contains a number")) + PasswordRequirementRow(isMet: passwordsMatch, text: String(localized: "Passwords match")) } .padding(12) .background(Color.appBackgroundPrimary.opacity(0.5)) @@ -388,7 +388,7 @@ private struct PasswordRequirementRow: View { .font(.system(size: 14, weight: .medium)) .foregroundColor(isMet ? Color.appPrimary : Color.appTextSecondary) - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 13, weight: .medium)) .foregroundColor(isMet ? Color.appTextPrimary : Color.appTextSecondary) } diff --git a/iosApp/iosApp/Register/RegisterViewModel.swift b/iosApp/iosApp/Register/RegisterViewModel.swift index 1269c99..8e58a5f 100644 --- a/iosApp/iosApp/Register/RegisterViewModel.swift +++ b/iosApp/iosApp/Register/RegisterViewModel.swift @@ -26,7 +26,7 @@ class RegisterViewModel: ObservableObject { // MARK: - Public Methods func register() { // Validation using ValidationRules - if let error = ValidationRules.validateRequired(username, fieldName: "Username") { + if let error = ValidationRules.validateRequired(username, fieldName: String(localized: "Username")) { errorMessage = error.errorDescription return } @@ -92,7 +92,7 @@ class RegisterViewModel: ObservableObject { // Bad request - validation errors self.errorMessage = ErrorMessageParser.parse(error.message) case 500...599: - self.errorMessage = "Server error. Please try again later." + self.errorMessage = String(localized: "Server error. Please try again later.") default: self.errorMessage = ErrorMessageParser.parse(error.message) } @@ -101,7 +101,7 @@ class RegisterViewModel: ObservableObject { } self.isLoading = false } else { - self.errorMessage = "Failed to create account" + self.errorMessage = String(localized: "Failed to create account") self.isLoading = false } } catch { diff --git a/iosApp/iosApp/Residence/JoinResidenceView.swift b/iosApp/iosApp/Residence/JoinResidenceView.swift index cb05555..890683a 100644 --- a/iosApp/iosApp/Residence/JoinResidenceView.swift +++ b/iosApp/iosApp/Residence/JoinResidenceView.swift @@ -115,7 +115,7 @@ struct JoinResidenceView: View { } else { Image(systemName: "person.badge.plus") } - Text(viewModel.isLoading ? "Joining..." : L10n.Residences.joinButton) + Text(viewModel.isLoading ? String(localized: "Joining...") : L10n.Residences.joinButton) .font(.headline) .fontWeight(.semibold) } diff --git a/iosApp/iosApp/Residence/ManageUsersView.swift b/iosApp/iosApp/Residence/ManageUsersView.swift index eb63033..e715b8d 100644 --- a/iosApp/iosApp/Residence/ManageUsersView.swift +++ b/iosApp/iosApp/Residence/ManageUsersView.swift @@ -117,7 +117,7 @@ struct ManageUsersView: View { )) { Button("OK", role: .cancel) {} } message: { - Text(sharingManager.errorMessage ?? "Failed to create share link.") + Text(sharingManager.errorMessage ?? String(localized: "Failed to create share link.")) } } @@ -176,7 +176,7 @@ struct ManageUsersView: View { private func loadUsers() { guard TokenStorage.shared.getToken() != nil else { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") return } @@ -196,7 +196,7 @@ struct ManageUsersView: View { self.errorMessage = ErrorMessageParser.parse(errorResult.message) self.isLoading = false } else { - self.errorMessage = "Failed to load users" + self.errorMessage = String(localized: "Failed to load users") self.isLoading = false } } @@ -246,7 +246,7 @@ struct ManageUsersView: View { self.errorMessage = ErrorMessageParser.parse(errorResult.message) self.isGeneratingCode = false } else { - self.errorMessage = "Failed to generate share code" + self.errorMessage = String(localized: "Failed to generate share code") self.isGeneratingCode = false } } @@ -273,7 +273,7 @@ struct ManageUsersView: View { } else if let errorResult = ApiResultBridge.error(from: result) { self.errorMessage = ErrorMessageParser.parse(errorResult.message) } else { - self.errorMessage = "Failed to remove user" + self.errorMessage = String(localized: "Failed to remove user") } } } catch { diff --git a/iosApp/iosApp/Residence/ResidenceDetailView.swift b/iosApp/iosApp/Residence/ResidenceDetailView.swift index 8dfdd8d..9a84c36 100644 --- a/iosApp/iosApp/Residence/ResidenceDetailView.swift +++ b/iosApp/iosApp/Residence/ResidenceDetailView.swift @@ -511,7 +511,7 @@ private extension ResidenceDetailView { } else if let errorResult = ApiResultBridge.error(from: result) { self.viewModel.errorMessage = ErrorMessageParser.parse(errorResult.message) } else { - self.viewModel.errorMessage = "Failed to delete residence" + self.viewModel.errorMessage = String(localized: "Failed to delete residence") } } } catch { @@ -544,7 +544,7 @@ private extension ResidenceDetailView { self.contractorsError = errorResult.message self.isLoadingContractors = false } else { - self.contractorsError = "Failed to load contractors" + self.contractorsError = String(localized: "Failed to load contractors") self.isLoadingContractors = false } } diff --git a/iosApp/iosApp/Residence/ResidenceSharingManager.swift b/iosApp/iosApp/Residence/ResidenceSharingManager.swift index 7444feb..6528361 100644 --- a/iosApp/iosApp/Residence/ResidenceSharingManager.swift +++ b/iosApp/iosApp/Residence/ResidenceSharingManager.swift @@ -50,7 +50,7 @@ class ResidenceSharingManager: ObservableObject { do { result = try await APILayer.shared.generateSharePackage(residenceId: residence.id) } catch { - errorMessage = "Failed to generate share code: \(error.localizedDescription)" + errorMessage = String(format: String(localized: "Failed to generate share code: %@"), error.localizedDescription) return nil } @@ -59,7 +59,7 @@ class ResidenceSharingManager: ObservableObject { if let error = ApiResultBridge.error(from: result) { errorMessage = ErrorMessageParser.parse(error.message) } else { - errorMessage = "Failed to generate share code" + errorMessage = String(localized: "Failed to generate share code") } return nil } @@ -69,7 +69,7 @@ class ResidenceSharingManager: ObservableObject { #if DEBUG print("ResidenceSharingManager: Failed to encode residence package as UTF-8") #endif - errorMessage = "Failed to create share file" + errorMessage = String(localized: "Failed to create share file") return nil } @@ -85,7 +85,7 @@ class ResidenceSharingManager: ObservableObject { #if DEBUG print("ResidenceSharingManager: Failed to write .honeydue file: \(error)") #endif - errorMessage = "Failed to save share file" + errorMessage = String(localized: "Failed to save share file") return nil } } @@ -103,7 +103,7 @@ class ResidenceSharingManager: ObservableObject { // Verify user is authenticated guard TokenStorage.shared.getToken() != nil else { - errorMessage = "You must be logged in to join a residence" + errorMessage = String(localized: "You must be logged in to join a residence") isImporting = false completion(false) return @@ -137,7 +137,7 @@ class ResidenceSharingManager: ObservableObject { self.isImporting = false completion(false) } else { - self.errorMessage = "Unknown error occurred" + self.errorMessage = String(localized: "Unknown error occurred") self.isImporting = false completion(false) } @@ -148,7 +148,7 @@ class ResidenceSharingManager: ObservableObject { } } } catch { - errorMessage = "Failed to read residence share file: \(error.localizedDescription)" + errorMessage = String(format: String(localized: "Failed to read residence share file: %@"), error.localizedDescription) isImporting = false completion(false) } diff --git a/iosApp/iosApp/Residence/ResidenceViewModel.swift b/iosApp/iosApp/Residence/ResidenceViewModel.swift index bb9b9b3..b144f7b 100644 --- a/iosApp/iosApp/Residence/ResidenceViewModel.swift +++ b/iosApp/iosApp/Residence/ResidenceViewModel.swift @@ -138,7 +138,7 @@ class ResidenceViewModel: ObservableObject { if UITestRuntime.shouldMockAuth { if Self.uiTestMockResidences.isEmpty || forceRefresh { if Self.uiTestMockResidences.isEmpty { - Self.uiTestMockResidences = [makeMockResidence(name: "Seed Residence")] + Self.uiTestMockResidences = [makeMockResidence(name: "Seed Residence")] // i18n-ignore: UI-test mock data (non-UI) } } myResidences = MyResidencesResponse(residences: Self.uiTestMockResidences) @@ -179,7 +179,7 @@ class ResidenceViewModel: ObservableObject { if UITestRuntime.shouldMockAuth { selectedResidence = Self.uiTestMockResidences.first(where: { $0.id == id }) isLoading = false - errorMessage = selectedResidence == nil ? "Residence not found" : nil + errorMessage = selectedResidence == nil ? String(localized: "Residence not found") : nil return } @@ -197,7 +197,7 @@ class ResidenceViewModel: ObservableObject { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to load residence" + self.errorMessage = String(localized: "Failed to load residence") self.isLoading = false } } catch { @@ -286,7 +286,7 @@ class ResidenceViewModel: ObservableObject { self.isLoading = false completion(false) } else { - self.errorMessage = "Failed to update residence" + self.errorMessage = String(localized: "Failed to update residence") self.isLoading = false completion(false) } @@ -307,13 +307,13 @@ class ResidenceViewModel: ObservableObject { let result = try await APILayer.shared.generateTasksReport(residenceId: residenceId, email: email) if let success = result as? ApiResultSuccess { - self.reportMessage = success.data?.message ?? "Report generated, but no message returned." + self.reportMessage = success.data?.message ?? String(localized: "Report generated, but no message returned.") self.isGeneratingReport = false } else if let error = ApiResultBridge.error(from: result) { self.reportMessage = ErrorMessageParser.parse(error.message) self.isGeneratingReport = false } else { - self.reportMessage = "Failed to generate report" + self.reportMessage = String(localized: "Failed to generate report") self.isGeneratingReport = false } } catch { @@ -346,7 +346,7 @@ class ResidenceViewModel: ObservableObject { self.isLoading = false completion(false) } else { - self.errorMessage = "Failed to join residence" + self.errorMessage = String(localized: "Failed to join residence") self.isLoading = false completion(false) } @@ -367,15 +367,15 @@ class ResidenceViewModel: ObservableObject { ) -> ResidenceResponse { let id = Self.uiTestNextResidenceId Self.uiTestNextResidenceId += 1 - let now = "2026-02-20T00:00:00Z" + let now = "2026-02-20T00:00:00Z" // i18n-ignore: ISO timestamp for UI-test mock data (non-UI) return ResidenceResponse( id: Int32(id), ownerId: 1, - owner: ResidenceUserResponse(id: 1, username: "testuser", email: "test@example.com", firstName: "UI", lastName: "Tester"), + owner: ResidenceUserResponse(id: 1, username: "testuser", email: "test@example.com", firstName: "UI", lastName: "Tester"), // i18n-ignore: UI-test mock data (non-UI) users: [], name: name, propertyTypeId: 1, - propertyType: ResidenceType(id: 1, name: "House"), + propertyType: ResidenceType(id: 1, name: "House", displayNameLocalized: ""), // i18n-ignore: UI-test mock model value (non-UI) streetAddress: streetAddress, apartmentUnit: "", city: city, diff --git a/iosApp/iosApp/Residence/ResidencesListView.swift b/iosApp/iosApp/Residence/ResidencesListView.swift index 9d6ef02..13a8019 100644 --- a/iosApp/iosApp/Residence/ResidencesListView.swift +++ b/iosApp/iosApp/Residence/ResidencesListView.swift @@ -133,7 +133,7 @@ struct ResidencesListView: View { } } .onReceive(NotificationCenter.default.publisher(for: .navigateToResidence)) { notification in - if let residenceId = notification.userInfo?["residenceId"] as? Int { + if let residenceId = notification.userInfo?["residenceId"] as? Int { // i18n-ignore: NotificationCenter userInfo key (non-UI) navigateToResidenceFromPush(residenceId: residenceId) } } diff --git a/iosApp/iosApp/Shared/Components/ButtonStyles.swift b/iosApp/iosApp/Shared/Components/ButtonStyles.swift index 0bb25eb..fe04fa3 100644 --- a/iosApp/iosApp/Shared/Components/ButtonStyles.swift +++ b/iosApp/iosApp/Shared/Components/ButtonStyles.swift @@ -50,7 +50,7 @@ struct PrimaryButton: View { .cornerRadius(AppRadius.md) } .disabled(isDisabled || isLoading) - .accessibilityValue(isLoading ? "Loading" : "") + .accessibilityValue(isLoading ? String(localized: "Loading") : "") } } @@ -297,6 +297,6 @@ struct OrganicPrimaryButton: View { ) } .disabled(isDisabled || isLoading) - .accessibilityValue(isLoading ? "Loading" : "") + .accessibilityValue(isLoading ? String(localized: "Loading") : "") } } diff --git a/iosApp/iosApp/Shared/Extensions/ColorExtensions.swift b/iosApp/iosApp/Shared/Extensions/ColorExtensions.swift index 862a461..25b071d 100644 --- a/iosApp/iosApp/Shared/Extensions/ColorExtensions.swift +++ b/iosApp/iosApp/Shared/Extensions/ColorExtensions.swift @@ -11,7 +11,7 @@ extension Color { case "safety", "electrical": return Color.appError case "hvac": return Color.appPrimary case "appliances": return Color.appAccent - case "exterior", "lawn & garden": return Color(hex: "#34C759") ?? .green + case "exterior", "lawn & garden": return Color(hex: "#34C759") ?? .green // i18n-ignore: category-name match keys for color lookup (non-UI) case "interior": return Color(hex: "#AF52DE") ?? .purple case "general", "seasonal": return Color(hex: "#FF9500") ?? .orange default: return Color.appPrimary diff --git a/iosApp/iosApp/Shared/Extensions/DateExtensions.swift b/iosApp/iosApp/Shared/Extensions/DateExtensions.swift index b971fee..f390739 100644 --- a/iosApp/iosApp/Shared/Extensions/DateExtensions.swift +++ b/iosApp/iosApp/Shared/Extensions/DateExtensions.swift @@ -46,17 +46,21 @@ extension Date { /// Returns relative description (e.g., "Today", "Tomorrow", "In 3 days", "2 days ago") var relativeDescription: String { if isToday { - return "Today" + return String(localized: "Today") } else if isTomorrow { - return "Tomorrow" + return String(localized: "Tomorrow") } else { let days = daysFromToday if days > 0 { - return "In \(days) day\(days == 1 ? "" : "s")" + return days == 1 + ? String(format: String(localized: "In %lld day"), days) + : String(format: String(localized: "In %lld days"), days) } else if days < 0 { - return "\(abs(days)) day\(abs(days) == 1 ? "" : "s") ago" + return abs(days) == 1 + ? String(format: String(localized: "%lld day ago"), abs(days)) + : String(format: String(localized: "%lld days ago"), abs(days)) } else { - return "Today" + return String(localized: "Today") } } } @@ -92,27 +96,27 @@ class DateFormatters { private init() {} - /// "MMM d, yyyy" - e.g., "Jan 15, 2024" + /// "MMM d, yyyy" - e.g., "Jan 15, 2024" (localized for current locale) lazy var mediumDate: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "MMM d, yyyy" - formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.locale = Locale.current + formatter.setLocalizedDateFormatFromTemplate("MMM d, yyyy") return formatter }() - /// "MMMM d, yyyy" - e.g., "January 15, 2024" + /// "MMMM d, yyyy" - e.g., "January 15, 2024" (localized for current locale) lazy var longDate: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "MMMM d, yyyy" - formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.locale = Locale.current + formatter.setLocalizedDateFormatFromTemplate("MMMM d, yyyy") return formatter }() - /// "MM/dd/yyyy" - e.g., "01/15/2024" + /// "MM/dd/yyyy" - e.g., "01/15/2024" (localized for current locale) lazy var shortDate: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "MM/dd/yyyy" - formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.locale = Locale.current + formatter.setLocalizedDateFormatFromTemplate("MM/dd/yyyy") return formatter }() @@ -124,19 +128,20 @@ class DateFormatters { return formatter }() - /// "h:mm a" - e.g., "3:30 PM" + /// "h:mm a" - e.g., "3:30 PM" (localized for current locale) lazy var time: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "h:mm a" - formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.locale = Locale.current + formatter.setLocalizedDateFormatFromTemplate("h:mm a") return formatter }() - /// "MMM d, yyyy 'at' h:mm a" - e.g., "Jan 15, 2024 at 3:30 PM" + /// "MMM d, yyyy 'at' h:mm a" - e.g., "Jan 15, 2024 at 3:30 PM" (localized for current locale) lazy var dateTime: DateFormatter = { let formatter = DateFormatter() - formatter.dateFormat = "MMM d, yyyy 'at' h:mm a" - formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.locale = Locale.current + formatter.dateStyle = .medium + formatter.timeStyle = .short return formatter }() } diff --git a/iosApp/iosApp/Shared/Extensions/DoubleExtensions.swift b/iosApp/iosApp/Shared/Extensions/DoubleExtensions.swift index 6cab652..bf25dc2 100644 --- a/iosApp/iosApp/Shared/Extensions/DoubleExtensions.swift +++ b/iosApp/iosApp/Shared/Extensions/DoubleExtensions.swift @@ -24,7 +24,7 @@ private enum CachedFormatters { static let currency: NumberFormatter = { let f = NumberFormatter() f.numberStyle = .currency - f.currencyCode = "USD" + f.locale = Locale.current return f }() @@ -47,8 +47,10 @@ extension Double { /// Formats as currency (e.g., "$1,234.56") func toCurrency() -> String { let formatter = CachedFormatters.currency - formatter.currencyCode = "USD" - return formatter.string(from: NSNumber(value: self)) ?? "$\(self)" + formatter.locale = Locale.current + formatter.currencyCode = Locale.current.currency?.identifier ?? formatter.currencyCode + return formatter.string(from: NSNumber(value: self)) + ?? self.toDecimalString() } /// Formats as currency with currency symbol (e.g., "$1,234.56") @@ -63,7 +65,7 @@ extension Double { let formatter = CachedFormatters.decimal formatter.minimumFractionDigits = fractionDigits formatter.maximumFractionDigits = fractionDigits - return formatter.string(from: NSNumber(value: self)) ?? String(format: "%.\(fractionDigits)f", self) + return formatter.string(from: NSNumber(value: self)) ?? String(format: "%.\(fractionDigits)f", self) // i18n-ignore: numeric format spec (non-UI) } /// Formats as percentage (e.g., "45.5%") diff --git a/iosApp/iosApp/Shared/Utilities/AnimationPreference.swift b/iosApp/iosApp/Shared/Utilities/AnimationPreference.swift index b5f1e9b..a4b0f8d 100644 --- a/iosApp/iosApp/Shared/Utilities/AnimationPreference.swift +++ b/iosApp/iosApp/Shared/Utilities/AnimationPreference.swift @@ -5,7 +5,7 @@ import SwiftUI final class AnimationPreference: ObservableObject { static let shared = AnimationPreference() - @AppStorage("selectedTaskAnimation") private var storedValue: String = TaskAnimationType.implode.rawValue + @AppStorage("selectedTaskAnimation") private var storedValue: String = TaskAnimationType.implode.rawValue // i18n-ignore: @AppStorage key (non-UI) /// The currently selected animation type, persisted across launches. var selectedAnimation: TaskAnimationType { diff --git a/iosApp/iosApp/Shared/Utilities/SharedErrorMessageParser.swift b/iosApp/iosApp/Shared/Utilities/SharedErrorMessageParser.swift index 4cecb8e..f3b4d69 100644 --- a/iosApp/iosApp/Shared/Utilities/SharedErrorMessageParser.swift +++ b/iosApp/iosApp/Shared/Utilities/SharedErrorMessageParser.swift @@ -4,6 +4,7 @@ import Foundation // Note: The comprehensive ErrorMessageParser is in Helpers/ErrorMessageParser.swift // This file provides additional helper messages for common error scenarios +// i18n-ignore-begin: dead code — unreferenced (verified); pending removal struct ErrorMessages { static let networkError = "Network connection error. Please check your internet connection." static let unknownError = "An unexpected error occurred. Please try again." @@ -53,3 +54,4 @@ struct ErrorChecks { message.lowercased().contains("forbidden") } } +// i18n-ignore-end diff --git a/iosApp/iosApp/Shared/Utilities/ValidationHelpers.swift b/iosApp/iosApp/Shared/Utilities/ValidationHelpers.swift index ca0224a..75160db 100644 --- a/iosApp/iosApp/Shared/Utilities/ValidationHelpers.swift +++ b/iosApp/iosApp/Shared/Utilities/ValidationHelpers.swift @@ -1,5 +1,6 @@ import Foundation +// i18n-ignore-begin: dead code — unreferenced (verified); pending removal // MARK: - Field Validation Helpers struct ValidationHelpers { @@ -230,3 +231,4 @@ enum FormValidationResult { return [:] } } +// i18n-ignore-end diff --git a/iosApp/iosApp/Subscription/FeatureComparisonView.swift b/iosApp/iosApp/Subscription/FeatureComparisonView.swift index a864e45..76364ad 100644 --- a/iosApp/iosApp/Subscription/FeatureComparisonView.swift +++ b/iosApp/iosApp/Subscription/FeatureComparisonView.swift @@ -96,13 +96,13 @@ struct FeatureComparisonView: View { // Default features if no data loaded if subscriptionCache.featureBenefits.isEmpty { - ComparisonRow(featureName: "Properties", freeText: "1 property", proText: "Unlimited") + ComparisonRow(featureName: String(localized: "Properties"), freeText: String(localized: "1 property"), proText: String(localized: "Unlimited")) Divider() - ComparisonRow(featureName: "Tasks", freeText: "10 tasks", proText: "Unlimited") + ComparisonRow(featureName: String(localized: "Tasks"), freeText: String(localized: "10 tasks"), proText: String(localized: "Unlimited")) Divider() - ComparisonRow(featureName: "Contractors", freeText: "Not available", proText: "Unlimited") + ComparisonRow(featureName: String(localized: "Contractors"), freeText: String(localized: "Not available"), proText: String(localized: "Unlimited")) Divider() - ComparisonRow(featureName: "Documents", freeText: "Not available", proText: "Unlimited") + ComparisonRow(featureName: String(localized: "Documents"), freeText: String(localized: "Not available"), proText: String(localized: "Unlimited")) } } .background(Color.appBackgroundSecondary) @@ -217,7 +217,7 @@ struct SubscriptionButton: View { var savingsText: String? { if isAnnual { - return "Save 17%" + return String(format: String(localized: "Save %lld%%"), 17) } return nil } diff --git a/iosApp/iosApp/Subscription/StoreKitManager.swift b/iosApp/iosApp/Subscription/StoreKitManager.swift index f5561df..94aa9b1 100644 --- a/iosApp/iosApp/Subscription/StoreKitManager.swift +++ b/iosApp/iosApp/Subscription/StoreKitManager.swift @@ -68,7 +68,7 @@ class StoreKitManager: ObservableObject { print("✅ StoreKit: Loaded \(products.count) products") } catch { print("❌ StoreKit: Failed to load products: \(error)") - purchaseError = "Failed to load products: \(error.localizedDescription)" + purchaseError = String(format: String(localized: "Failed to load products: %@"), error.localizedDescription) } } @@ -94,7 +94,7 @@ class StoreKitManager: ObservableObject { print("✅ StoreKit: Purchase successful for \(product.id)") } catch { print("⚠️ StoreKit: Backend verification failed for \(product.id), transaction NOT finished so it can be retried: \(error)") - self.purchaseError = "Purchase successful but verification is pending. It will complete automatically." + self.purchaseError = String(localized: "Purchase successful but verification is pending. It will complete automatically.") } return transaction @@ -133,7 +133,7 @@ class StoreKitManager: ObservableObject { print("✅ StoreKit: Purchases restored") } catch { print("❌ StoreKit: Failed to restore purchases: \(error)") - purchaseError = "Failed to restore purchases: \(error.localizedDescription)" + purchaseError = String(format: String(localized: "Failed to restore purchases: %@"), error.localizedDescription) } } @@ -312,13 +312,13 @@ extension StoreKitManager { var errorDescription: String? { switch self { case .verificationFailed: - return "Transaction verification failed" + return String(localized: "Transaction verification failed") case .noProducts: - return "No products available" + return String(localized: "No products available") case .purchaseFailed: - return "Purchase failed" + return String(localized: "Purchase failed") case .backendVerificationFailed(let message): - return "Backend verification failed: \(message)" + return String(format: String(localized: "Backend verification failed: %@"), message) } } } diff --git a/iosApp/iosApp/Subscription/SubscriptionPurchaseHelper.swift b/iosApp/iosApp/Subscription/SubscriptionPurchaseHelper.swift index 8d2b27d..95211e0 100644 --- a/iosApp/iosApp/Subscription/SubscriptionPurchaseHelper.swift +++ b/iosApp/iosApp/Subscription/SubscriptionPurchaseHelper.swift @@ -36,7 +36,7 @@ final class SubscriptionPurchaseHelper: ObservableObject { } catch { await MainActor.run { isProcessing = false - errorMessage = "Purchase failed: \(error.localizedDescription)" + errorMessage = String(format: String(localized: "Purchase failed: %@"), error.localizedDescription) } } } @@ -55,7 +55,7 @@ final class SubscriptionPurchaseHelper: ObservableObject { if !storeKit.purchasedProductIDs.isEmpty { showSuccessAlert = true } else { - errorMessage = "No purchases found to restore" + errorMessage = String(localized: "No purchases found to restore") } } } diff --git a/iosApp/iosApp/Subscription/UpgradeFeatureView.swift b/iosApp/iosApp/Subscription/UpgradeFeatureView.swift index aec93c1..7bf9dce 100644 --- a/iosApp/iosApp/Subscription/UpgradeFeatureView.swift +++ b/iosApp/iosApp/Subscription/UpgradeFeatureView.swift @@ -17,15 +17,15 @@ struct UpgradeFeatureView: View { } private var title: String { - triggerData?.title ?? "Upgrade Required" + triggerData?.title ?? String(localized: "Upgrade Required") } private var message: String { - triggerData?.message ?? "This feature is available with a Pro subscription." + triggerData?.message ?? String(localized: "This feature is available with a Pro subscription.") } private var buttonText: String { - triggerData?.buttonText ?? "Upgrade to Pro" + triggerData?.buttonText ?? String(localized: "Upgrade to Pro") } /// Whether the user is already subscribed from a non-iOS platform @@ -124,10 +124,10 @@ struct UpgradeFeatureView: View { PromoContentView(content: promoContent) } else { VStack(alignment: .leading, spacing: 14) { - OrganicUpgradeFeatureRow(icon: "outline", text: "Unlimited properties") - OrganicUpgradeFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks") - OrganicUpgradeFeatureRow(icon: "person.2.fill", text: "Contractor management") - OrganicUpgradeFeatureRow(icon: "doc.fill", text: "Document & warranty storage") + OrganicUpgradeFeatureRow(icon: "outline", text: String(localized: "Unlimited properties")) + OrganicUpgradeFeatureRow(icon: "checkmark.circle.fill", text: String(localized: "Unlimited tasks")) + OrganicUpgradeFeatureRow(icon: "person.2.fill", text: String(localized: "Contractor management")) + OrganicUpgradeFeatureRow(icon: "doc.fill", text: String(localized: "Document & warranty storage")) } } } @@ -266,7 +266,7 @@ private struct OrganicUpgradeFeatureRow: View { } } - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextPrimary) diff --git a/iosApp/iosApp/Subscription/UpgradePromptView.swift b/iosApp/iosApp/Subscription/UpgradePromptView.swift index f515f6b..635bcbb 100644 --- a/iosApp/iosApp/Subscription/UpgradePromptView.swift +++ b/iosApp/iosApp/Subscription/UpgradePromptView.swift @@ -213,12 +213,12 @@ struct UpgradePromptView: View { .padding(.top, OrganicSpacing.comfortable) VStack(spacing: 8) { - Text(triggerData?.title ?? "Upgrade to Pro") + Text(triggerData?.title ?? String(localized: "Upgrade to Pro")) .font(.system(size: 26, weight: .bold, design: .rounded)) .foregroundColor(Color.appTextPrimary) .multilineTextAlignment(.center) - Text(triggerData?.message ?? "Unlock unlimited access to all features") + Text(triggerData?.message ?? String(localized: "Unlock unlimited access to all features")) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) @@ -232,10 +232,10 @@ struct UpgradePromptView: View { PromoContentView(content: promoContent) } else { VStack(alignment: .leading, spacing: 14) { - OrganicFeatureRow(icon: "outline", text: "Unlimited properties") - OrganicFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks") - OrganicFeatureRow(icon: "person.2.fill", text: "Contractor management") - OrganicFeatureRow(icon: "doc.fill", text: "Document & warranty storage") + OrganicFeatureRow(icon: "outline", text: String(localized: "Unlimited properties")) + OrganicFeatureRow(icon: "checkmark.circle.fill", text: String(localized: "Unlimited tasks")) + OrganicFeatureRow(icon: "person.2.fill", text: String(localized: "Contractor management")) + OrganicFeatureRow(icon: "doc.fill", text: String(localized: "Document & warranty storage")) } } } @@ -339,7 +339,7 @@ struct UpgradePromptView: View { .background(Color.appBackgroundSecondary.opacity(0.8)) .clipShape(Circle()) } - .a11yButton("Close") + .a11yButton(String(localized: "Close")) } } .sheet(isPresented: $showFeatureComparison) { @@ -390,7 +390,7 @@ private struct OrganicFeatureRow: View { } } - Text(text) + Text(LocalizedStringKey(text)) .font(.system(size: 15, weight: .medium)) .foregroundColor(Color.appTextPrimary) @@ -414,7 +414,7 @@ private struct OrganicSubscriptionButton: View { var savingsText: String? { if isAnnual { - return "Save 17%" + return String(format: String(localized: "Save %lld%%"), 17) } return nil } @@ -492,7 +492,7 @@ struct SubscriptionProductButton: View { var savingsText: String? { if isAnnual { - return "Save 17%" + return String(format: String(localized: "Save %lld%%"), 17) } return nil } diff --git a/iosApp/iosApp/Subviews/Common/OverviewCard.swift b/iosApp/iosApp/Subviews/Common/OverviewCard.swift index 3f6c472..ccb5195 100644 --- a/iosApp/iosApp/Subviews/Common/OverviewCard.swift +++ b/iosApp/iosApp/Subviews/Common/OverviewCard.swift @@ -31,7 +31,7 @@ struct OverviewCard: View { StatView( icon: "outline", value: "\(summary.totalResidences)", - label: "Properties", + label: String(localized: "Properties"), color: Color.appPrimary ) @@ -41,7 +41,7 @@ struct OverviewCard: View { StatView( icon: "list.bullet", value: "\(summary.totalTasks)", - label: "Total Tasks", + label: String(localized: "Total Tasks"), color: Color.appPrimary ) @@ -51,7 +51,7 @@ struct OverviewCard: View { StatView( icon: "clock.fill", value: "\(summary.totalPending)", - label: "Pending", + label: String(localized: "Pending"), color: Color.appAccent ) } diff --git a/iosApp/iosApp/Subviews/Common/StatView.swift b/iosApp/iosApp/Subviews/Common/StatView.swift index 62abb68..aa019f3 100644 --- a/iosApp/iosApp/Subviews/Common/StatView.swift +++ b/iosApp/iosApp/Subviews/Common/StatView.swift @@ -57,7 +57,7 @@ struct StatView: View { .font(.system(size: 22, weight: .bold, design: .rounded)) .foregroundColor(Color.appTextPrimary) - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 12, weight: .medium)) .foregroundColor(Color.appTextSecondary) .multilineTextAlignment(.center) diff --git a/iosApp/iosApp/Subviews/Residence/PropertyHeaderCard.swift b/iosApp/iosApp/Subviews/Residence/PropertyHeaderCard.swift index c90e650..decb172 100644 --- a/iosApp/iosApp/Subviews/Residence/PropertyHeaderCard.swift +++ b/iosApp/iosApp/Subviews/Residence/PropertyHeaderCard.swift @@ -116,20 +116,20 @@ struct PropertyHeaderCard: View { PropertyFeaturePill( icon: "bed.double.fill", value: "\(bedrooms.intValue)", - label: "Beds" + label: String(localized: "Beds") ) PropertyFeaturePill( icon: "shower.fill", value: String(format: "%.1f", bathrooms.doubleValue), - label: "Baths" + label: String(localized: "Baths") ) if let sqft = residence.squareFootage { PropertyFeaturePill( icon: "square.dashed", value: formatNumber(sqft.intValue), - label: "Sq Ft" + label: String(localized: "Sq Ft") ) } @@ -137,7 +137,7 @@ struct PropertyHeaderCard: View { PropertyFeaturePill( icon: "calendar", value: "\(yearBuilt.intValue)", - label: "Built" + label: String(localized: "Built") ) } } @@ -243,7 +243,7 @@ private struct PropertyFeaturePill: View { .foregroundColor(Color.appTextPrimary) } - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 11, weight: .medium)) .foregroundColor(Color.appTextSecondary) } @@ -299,7 +299,7 @@ private struct PropertyHeaderBackground: View { users: [], name: "Sunset Villa", propertyTypeId: 1, - propertyType: ResidenceType(id: 1, name: "House"), + propertyType: ResidenceType(id: 1, name: "House", displayNameLocalized: ""), streetAddress: "742 Evergreen Terrace", apartmentUnit: "", city: "San Francisco", diff --git a/iosApp/iosApp/Subviews/Residence/ResidenceCard.swift b/iosApp/iosApp/Subviews/Residence/ResidenceCard.swift index 33021ee..e25fd6a 100644 --- a/iosApp/iosApp/Subviews/Residence/ResidenceCard.swift +++ b/iosApp/iosApp/Subviews/Residence/ResidenceCard.swift @@ -104,28 +104,28 @@ struct ResidenceCard: View { // Total Tasks TaskStatItem( value: taskMetrics.totalCount, - label: "Tasks", + label: String(localized: "Tasks"), color: Color.appPrimary ) // Overdue TaskStatItem( value: taskMetrics.overdueCount, - label: "Overdue", + label: String(localized: "Overdue"), color: taskMetrics.overdueCount > 0 ? Color.appError : Color.appTextSecondary ) // Due Next 7 Days TaskStatItem( value: taskMetrics.upcoming7Days, - label: "7 Days", + label: String(localized: "7 Days"), color: Color.appAccent ) // Next 30 Days TaskStatItem( value: taskMetrics.upcoming30Days, - label: "30 Days", + label: String(localized: "30 Days"), color: Color.appPrimary.opacity(0.7) ) } @@ -159,10 +159,10 @@ struct ResidenceCard: View { parts.append(residence.streetAddress) } if taskMetrics.totalCount > 0 { - parts.append("\(taskMetrics.totalCount) tasks") + parts.append(String(format: String(localized: "%lld tasks"), taskMetrics.totalCount)) } if residence.isPrimary { - parts.append("Primary property") + parts.append(String(localized: "Primary property")) } return parts.joined(separator: ", ") }()) @@ -233,7 +233,7 @@ private struct TaskStatItem: View { .font(.system(size: 15, weight: .bold, design: .rounded)) .foregroundColor(color) - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 11, weight: .medium)) .foregroundColor(Color.appTextSecondary) } @@ -289,7 +289,7 @@ private struct CardBackgroundView: View { users: [], name: "Sunset Villa", propertyTypeId: 1, - propertyType: ResidenceType(id: 1, name: "House"), + propertyType: ResidenceType(id: 1, name: "House", displayNameLocalized: ""), streetAddress: "742 Evergreen Terrace", apartmentUnit: "", city: "San Francisco", @@ -336,7 +336,7 @@ private struct CardBackgroundView: View { users: [], name: "Downtown Loft", propertyTypeId: 2, - propertyType: ResidenceType(id: 2, name: "Apartment"), + propertyType: ResidenceType(id: 2, name: "Apartment", displayNameLocalized: ""), streetAddress: "100 Market Street, Unit 502", apartmentUnit: "502", city: "San Francisco", diff --git a/iosApp/iosApp/Subviews/Residence/ShareCodeCard.swift b/iosApp/iosApp/Subviews/Residence/ShareCodeCard.swift index 8e91165..967b633 100644 --- a/iosApp/iosApp/Subviews/Residence/ShareCodeCard.swift +++ b/iosApp/iosApp/Subviews/Residence/ShareCodeCard.swift @@ -107,7 +107,7 @@ struct ShareCodeCard: View { } else { Image(systemName: "arrow.clockwise") } - Text(shareCode != nil ? "Generate New Code" : "Generate Code") + Text(shareCode != nil ? String(localized: "Generate New Code") : String(localized: "Generate Code")) } .frame(maxWidth: .infinity) } diff --git a/iosApp/iosApp/Subviews/Residence/SummaryCard.swift b/iosApp/iosApp/Subviews/Residence/SummaryCard.swift index 5fdd18f..cc503e9 100644 --- a/iosApp/iosApp/Subviews/Residence/SummaryCard.swift +++ b/iosApp/iosApp/Subviews/Residence/SummaryCard.swift @@ -22,7 +22,7 @@ struct SummaryCard: View { OrganicStatItem( icon: "outline", value: "\(summary.totalResidences)", - label: "Properties", + label: String(localized: "Properties"), accentColor: Color.appPrimary ) @@ -34,7 +34,7 @@ struct SummaryCard: View { OrganicStatItem( icon: "checklist", value: "\(summary.totalTasks)", - label: "Total Tasks", + label: String(localized: "Total Tasks"), accentColor: Color.appSecondary ) } @@ -50,7 +50,7 @@ struct SummaryCard: View { TimelineStatPill( icon: "exclamationmark.circle.fill", value: "\(summary.totalOverdue)", - label: "Overdue", + label: String(localized: "Overdue"), color: summary.totalOverdue > 0 ? Color.appError : Color.appTextSecondary, isAlert: summary.totalOverdue > 0 ) @@ -58,14 +58,14 @@ struct SummaryCard: View { TimelineStatPill( icon: "clock.fill", value: "\(summary.tasksDueNextWeek)", - label: "Next 7 Days", + label: String(localized: "Next 7 Days"), color: Color.appAccent ) TimelineStatPill( icon: "arrow.forward.circle.fill", value: "\(summary.tasksDueNextMonth)", - label: "Next 30 Days", + label: String(localized: "Next 30 Days"), color: Color.appPrimary.opacity(0.7) ) } @@ -116,7 +116,7 @@ private struct OrganicStatItem: View { .foregroundColor(Color.appTextPrimary) // Label - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 12, weight: .medium)) .foregroundColor(Color.appTextSecondary) } @@ -146,7 +146,7 @@ private struct TimelineStatPill: View { .foregroundColor(isAlert ? color : Color.appTextPrimary) } - Text(label) + Text(LocalizedStringKey(label)) .font(.system(size: 13, weight: .medium)) .foregroundColor(Color.appTextSecondary) } diff --git a/iosApp/iosApp/Subviews/Task/PhotoViewerSheet.swift b/iosApp/iosApp/Subviews/Task/PhotoViewerSheet.swift index f2fbe88..ef79713 100644 --- a/iosApp/iosApp/Subviews/Task/PhotoViewerSheet.swift +++ b/iosApp/iosApp/Subviews/Task/PhotoViewerSheet.swift @@ -15,7 +15,7 @@ struct PhotoViewerSheet: View { VStack(spacing: 16) { AuthenticatedImage(mediaURL: selectedImage.mediaUrl) .frame(minHeight: 300) - .accessibilityLabel("Completion photo\(selectedImage.caption.map { ", \($0)" } ?? "")") + .accessibilityLabel(String(format: String(localized: "Completion photo%@"), selectedImage.caption.map { ", \($0)" } ?? "")) if let caption = selectedImage.caption { VStack(alignment: .leading, spacing: 8) { @@ -82,7 +82,7 @@ struct PhotoViewerSheet: View { } } .buttonStyle(.plain) - .accessibilityLabel("Photo\(image.caption.map { ", \($0)" } ?? "")") + .accessibilityLabel(String(format: String(localized: "Photo%@"), image.caption.map { ", \($0)" } ?? "")) } } .padding() diff --git a/iosApp/iosApp/Subviews/Task/PriorityBadge.swift b/iosApp/iosApp/Subviews/Task/PriorityBadge.swift index 8e9cba6..5291be7 100644 --- a/iosApp/iosApp/Subviews/Task/PriorityBadge.swift +++ b/iosApp/iosApp/Subviews/Task/PriorityBadge.swift @@ -8,7 +8,7 @@ struct PriorityBadge: View { Image(systemName: priorityIcon) .font(.system(size: 10, weight: .bold)) - Text(priority.capitalized) + Text(LocalizedStringKey(priority.capitalized)) .font(.system(size: 11, weight: .semibold, design: .rounded)) } .padding(.horizontal, 10) diff --git a/iosApp/iosApp/Subviews/Task/StatusBadge.swift b/iosApp/iosApp/Subviews/Task/StatusBadge.swift index f5d4e40..f3ef2ca 100644 --- a/iosApp/iosApp/Subviews/Task/StatusBadge.swift +++ b/iosApp/iosApp/Subviews/Task/StatusBadge.swift @@ -28,8 +28,11 @@ struct StatusBadge: View { private func formatStatus(_ status: String) -> String { switch status { - case "in_progress": return "In Progress" - case "cancelled": return "Cancelled" + case "in_progress": return String(localized: "In Progress") + case "cancelled": return String(localized: "Cancelled") + case "completed": return String(localized: "Completed") + case "pending": return String(localized: "Pending") + case "archived": return String(localized: "Archived") default: return status.capitalized } } diff --git a/iosApp/iosApp/Subviews/Task/TaskActionButtons.swift b/iosApp/iosApp/Subviews/Task/TaskActionButtons.swift index 29ca3ce..ee207f0 100644 --- a/iosApp/iosApp/Subviews/Task/TaskActionButtons.swift +++ b/iosApp/iosApp/Subviews/Task/TaskActionButtons.swift @@ -52,7 +52,7 @@ struct CancelTaskButton: View { if success { onCompletion() } else { - onError("Failed to cancel task") + onError(String(localized: "Failed to cancel task")) } } } @@ -76,7 +76,7 @@ struct UncancelTaskButton: View { if success { onCompletion() } else { - onError("Failed to restore task") + onError(String(localized: "Failed to restore task")) } } }) { @@ -105,7 +105,7 @@ struct MarkInProgressButton: View { if success { onCompletion() } else { - onError("Failed to mark task in progress") + onError(String(localized: "Failed to mark task in progress")) } } }) { @@ -179,7 +179,7 @@ struct ArchiveTaskButton: View { if success { onCompletion() } else { - onError("Failed to archive task") + onError(String(localized: "Failed to archive task")) } } } @@ -203,7 +203,7 @@ struct UnarchiveTaskButton: View { if success { onCompletion() } else { - onError("Failed to unarchive task") + onError(String(localized: "Failed to unarchive task")) } } }) { diff --git a/iosApp/iosApp/Subviews/Task/TaskCard.swift b/iosApp/iosApp/Subviews/Task/TaskCard.swift index 1c10944..81c5972 100644 --- a/iosApp/iosApp/Subviews/Task/TaskCard.swift +++ b/iosApp/iosApp/Subviews/Task/TaskCard.swift @@ -94,7 +94,7 @@ struct TaskCard: View { } } .accessibilityLabel("Completions (\(task.completions.count))") - .accessibilityHint("Double tap to \(isCompletionsExpanded ? "collapse" : "expand") completions") + .accessibilityHint(isCompletionsExpanded ? String(localized: "Double tap to collapse completions") : String(localized: "Double tap to expand completions")) if isCompletionsExpanded { ForEach(task.completions, id: \.id) { completion in @@ -321,12 +321,12 @@ private struct TaskCardBackground: View { title: "Clean Gutters", description: "Remove all debris from gutters", categoryId: 1, - category: TaskCategory(id: 1, name: "maintenance", description: "", icon: "", color: "", displayOrder: 0), + category: TaskCategory(id: 1, name: "maintenance", displayNameLocalized: "", description: "", icon: "", color: "", displayOrder: 0), priorityId: 2, - priority: TaskPriority(id: 2, name: "medium", level: 2, color: "", displayOrder: 0), + priority: TaskPriority(id: 2, name: "medium", displayNameLocalized: "", level: 2, color: "", displayOrder: 0), inProgress: false, frequencyId: 1, - frequency: TaskFrequency(id: 1, name: "monthly", days: 30, displayOrder: 0), + frequency: TaskFrequency(id: 1, name: "monthly", displayNameLocalized: "", days: 30, displayOrder: 0), customIntervalDays: nil, dueDate: "2024-12-15", nextDueDate: nil, diff --git a/iosApp/iosApp/Subviews/Task/TasksSection.swift b/iosApp/iosApp/Subviews/Task/TasksSection.swift index 0f6240e..b9b3923 100644 --- a/iosApp/iosApp/Subviews/Task/TasksSection.swift +++ b/iosApp/iosApp/Subviews/Task/TasksSection.swift @@ -126,12 +126,12 @@ struct SwipeHintView: View { title: "Clean Gutters", description: "Remove all debris", categoryId: 1, - category: TaskCategory(id: 1, name: "maintenance", description: "", icon: "", color: "", displayOrder: 0), + category: TaskCategory(id: 1, name: "maintenance", displayNameLocalized: "", description: "", icon: "", color: "", displayOrder: 0), priorityId: 2, - priority: TaskPriority(id: 2, name: "medium", level: 2, color: "", displayOrder: 0), + priority: TaskPriority(id: 2, name: "medium", displayNameLocalized: "", level: 2, color: "", displayOrder: 0), inProgress: false, frequencyId: 1, - frequency: TaskFrequency(id: 1, name: "monthly", days: 30, displayOrder: 0), + frequency: TaskFrequency(id: 1, name: "monthly", displayNameLocalized: "", days: 30, displayOrder: 0), customIntervalDays: nil, dueDate: "2024-12-15", nextDueDate: nil, @@ -168,12 +168,12 @@ struct SwipeHintView: View { title: "Fix Leaky Faucet", description: "Kitchen sink fixed", categoryId: 2, - category: TaskCategory(id: 2, name: "plumbing", description: "", icon: "", color: "", displayOrder: 0), + category: TaskCategory(id: 2, name: "plumbing", displayNameLocalized: "", description: "", icon: "", color: "", displayOrder: 0), priorityId: 3, - priority: TaskPriority(id: 3, name: "high", level: 3, color: "", displayOrder: 0), + priority: TaskPriority(id: 3, name: "high", displayNameLocalized: "", level: 3, color: "", displayOrder: 0), inProgress: false, frequencyId: 6, - frequency: TaskFrequency(id: 6, name: "once", days: nil, displayOrder: 0), + frequency: TaskFrequency(id: 6, name: "once", displayNameLocalized: "", days: nil, displayOrder: 0), customIntervalDays: nil, dueDate: "2024-11-01", nextDueDate: nil, diff --git a/iosApp/iosApp/Task/AllTasksView.swift b/iosApp/iosApp/Task/AllTasksView.swift index 8b4fe86..283ded4 100644 --- a/iosApp/iosApp/Task/AllTasksView.swift +++ b/iosApp/iosApp/Task/AllTasksView.swift @@ -90,7 +90,7 @@ struct AllTasksView: View { } } message: { if let task = selectedTaskForArchive { - Text(L10n.Tasks.archiveConfirm.replacingOccurrences(of: "this task", with: "\"\(task.title)\"")) + Text(L10n.Tasks.archiveConfirm.replacingOccurrences(of: "this task", with: "\"\(task.title)\"")) // i18n-ignore: "this task" is a match token substituted out of an already-localized string (non-UI) } } .alert(L10n.Tasks.cancelTask, isPresented: $showCancelConfirmation) { @@ -125,7 +125,7 @@ struct AllTasksView: View { } .onReceive(NotificationCenter.default.publisher(for: .navigateToTask)) { notification in if let userInfo = notification.userInfo, - let taskId = userInfo["taskId"] as? Int { + let taskId = userInfo["taskId"] as? Int { // i18n-ignore: NotificationCenter userInfo key (non-UI) pendingTaskId = Int32(taskId) if let response = tasksResponse { navigateToTaskInKanban(taskId: Int32(taskId), response: response) @@ -134,7 +134,7 @@ struct AllTasksView: View { } .onReceive(NotificationCenter.default.publisher(for: .navigateToEditTask)) { notification in if let userInfo = notification.userInfo, - let taskId = userInfo["taskId"] as? Int { + let taskId = userInfo["taskId"] as? Int { // i18n-ignore: NotificationCenter userInfo key (non-UI) pendingTaskId = Int32(taskId) if let response = tasksResponse { navigateToTaskInKanban(taskId: Int32(taskId), response: response) diff --git a/iosApp/iosApp/Task/CompleteTaskView.swift b/iosApp/iosApp/Task/CompleteTaskView.swift index 22c0ad9..5113958 100644 --- a/iosApp/iosApp/Task/CompleteTaskView.swift +++ b/iosApp/iosApp/Task/CompleteTaskView.swift @@ -334,7 +334,7 @@ struct CompleteTaskView: View { private func handleComplete() { guard TokenStorage.shared.getToken() != nil else { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") showError = true return } @@ -376,11 +376,11 @@ struct CompleteTaskView: View { guard let data = ImageDownsampler.downsample(uiImage: uiImage, profile: .completion) else { return nil } - return (data, "completion_\(UUID().uuidString).jpg") + return (data, "completion_\(UUID().uuidString).jpg") // i18n-ignore: generated upload filename (non-UI) } guard payloads.count == selectedImages.count else { await MainActor.run { - errorMessage = "One or more photos couldn't be processed." + errorMessage = String(localized: "One or more photos couldn't be processed.") showError = true isSubmitting = false } @@ -391,7 +391,7 @@ struct CompleteTaskView: View { // them in parallel under a server-enforced concurrency cap of 10. guard let uploader = PresignedUploader() else { await MainActor.run { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") showError = true isSubmitting = false } @@ -537,7 +537,7 @@ struct ContractorPickerView: View { HStack(spacing: 4) { Image(systemName: "wrench.and.screwdriver") .font(.caption2) - Text(firstSpecialty.name) + Text(firstSpecialty.displayName) .font(.caption2) } .foregroundColor(Color.appTextSecondary.opacity(0.7)) diff --git a/iosApp/iosApp/Task/TaskFormView.swift b/iosApp/iosApp/Task/TaskFormView.swift index f4f7a9a..557fd46 100644 --- a/iosApp/iosApp/Task/TaskFormView.swift +++ b/iosApp/iosApp/Task/TaskFormView.swift @@ -206,7 +206,7 @@ struct TaskFormView: View { Picker(L10n.Tasks.category, selection: $selectedCategory) { Text(L10n.Tasks.selectCategory).tag(nil as TaskCategory?) ForEach(taskCategories, id: \.id) { category in - Text(category.name.capitalized).tag(category as TaskCategory?) + Text(category.displayName).tag(category as TaskCategory?) } } .accessibilityIdentifier(AccessibilityIdentifiers.Task.categoryPicker) @@ -428,36 +428,36 @@ struct TaskFormView: View { var isValid = true if title.isEmpty { - titleError = "Title is required" + titleError = String(localized: "Title is required") isValid = false } else { titleError = "" } if needsResidenceSelection && selectedResidence == nil { - residenceError = "Property is required" + residenceError = String(localized: "Property is required") isValid = false } else { residenceError = "" } if selectedCategory == nil { - viewModel.errorMessage = "Please select a category" + viewModel.errorMessage = String(localized: "Please select a category") isValid = false } if selectedFrequency == nil { - viewModel.errorMessage = "Please select a frequency" + viewModel.errorMessage = String(localized: "Please select a frequency") isValid = false } if selectedPriority == nil { - viewModel.errorMessage = "Please select a priority" + viewModel.errorMessage = String(localized: "Please select a priority") isValid = false } if !intervalDays.isEmpty, Int32(intervalDays) == nil { - viewModel.errorMessage = "Custom interval must be a valid number" + viewModel.errorMessage = String(localized: "Custom interval must be a valid number") isValid = false } diff --git a/iosApp/iosApp/Task/TaskTemplatesBrowserView.swift b/iosApp/iosApp/Task/TaskTemplatesBrowserView.swift index da2aa4d..ad9dacb 100644 --- a/iosApp/iosApp/Task/TaskTemplatesBrowserView.swift +++ b/iosApp/iosApp/Task/TaskTemplatesBrowserView.swift @@ -34,7 +34,7 @@ struct TaskTemplatesBrowserView: View { } .standardFormStyle() .background(WarmGradientBackground()) - .searchable(text: $searchText, prompt: "Search templates...") + .searchable(text: $searchText, prompt: String(localized: "Search templates...")) .accessibilityHint("Search task templates by name") .navigationTitle("Task Templates") .navigationBarTitleDisplayMode(.inline) @@ -77,7 +77,7 @@ struct TaskTemplatesBrowserView: View { taskRow(template) } } header: { - Text("\(filteredTemplates.count) \(filteredTemplates.count == 1 ? "result" : "results")") + Text("\(filteredTemplates.count) results") } .listRowBackground(Color.appBackgroundSecondary) } diff --git a/iosApp/iosApp/Task/TaskViewModel.swift b/iosApp/iosApp/Task/TaskViewModel.swift index 0bc0850..4b13ead 100644 --- a/iosApp/iosApp/Task/TaskViewModel.swift +++ b/iosApp/iosApp/Task/TaskViewModel.swift @@ -376,7 +376,7 @@ class TaskViewModel: ObservableObject { self.tasksError = error.message self.isLoadingTasks = false } else { - self.tasksError = "Failed to load tasks" + self.tasksError = String(localized: "Failed to load tasks") self.isLoadingTasks = false } } diff --git a/iosApp/iosApp/VerifyEmail/VerifyEmailView.swift b/iosApp/iosApp/VerifyEmail/VerifyEmailView.swift index 9e89d27..cb5abed 100644 --- a/iosApp/iosApp/VerifyEmail/VerifyEmailView.swift +++ b/iosApp/iosApp/VerifyEmail/VerifyEmailView.swift @@ -143,7 +143,7 @@ struct VerifyEmailView: View { } else { Image(systemName: "checkmark.shield.fill") } - Text(viewModel.isLoading ? "Verifying..." : L10n.Auth.verifyEmailButton) + Text(viewModel.isLoading ? String(localized: "Verifying...") : L10n.Auth.verifyEmailButton) .font(.headline) .fontWeight(.semibold) } diff --git a/iosApp/iosApp/VerifyEmail/VerifyEmailViewModel.swift b/iosApp/iosApp/VerifyEmail/VerifyEmailViewModel.swift index c5d1a67..ab8fdf1 100644 --- a/iosApp/iosApp/VerifyEmail/VerifyEmailViewModel.swift +++ b/iosApp/iosApp/VerifyEmail/VerifyEmailViewModel.swift @@ -36,7 +36,7 @@ class VerifyEmailViewModel: ObservableObject { /// Called on screen appear and on "Resend code". func sendCode(silent: Bool = false) { guard let email = dataManager.currentUser?.email, !email.isEmpty else { - errorMessage = "We couldn't determine your email. Please sign in again." + errorMessage = String(localized: "We couldn't determine your email. Please sign in again.") return } if !silent { isLoading = true } @@ -58,7 +58,7 @@ class VerifyEmailViewModel: ObservableObject { } guard let token = tokenStorage.getToken() else { - errorMessage = "Not authenticated" + errorMessage = String(localized: "Not authenticated") return } @@ -78,14 +78,14 @@ class VerifyEmailViewModel: ObservableObject { self.isLoading = false print("VerifyEmailViewModel: isVerified is now \(self.isVerified)") } else { - self.errorMessage = "Verification failed" + self.errorMessage = String(localized: "Verification failed") self.isLoading = false } } else if let error = ApiResultBridge.error(from: result) { self.errorMessage = ErrorMessageParser.parse(error.message) self.isLoading = false } else { - self.errorMessage = "Failed to verify email" + self.errorMessage = String(localized: "Failed to verify email") self.isLoading = false } } catch { diff --git a/iosApp/iosApp/iOSApp.swift b/iosApp/iosApp/iOSApp.swift index 48b84ef..0bc6141 100644 --- a/iosApp/iosApp/iOSApp.swift +++ b/iosApp/iosApp/iOSApp.swift @@ -145,7 +145,7 @@ struct iOSApp: App { contractorSharingManager.resetImportState() } } message: { - Text("\(contractorSharingManager.importedContractorName ?? "Contractor") has been added to your contacts.") + Text(String(format: String(localized: "%@ has been added to your contacts."), contractorSharingManager.importedContractorName ?? String(localized: "Contractor"))) } // Contractor import error dialog .alert("Import Failed", isPresented: .init( @@ -156,7 +156,7 @@ struct iOSApp: App { contractorSharingManager.resetImportState() } } message: { - Text(contractorSharingManager.importError ?? "An error occurred while importing the contractor.") + Text(contractorSharingManager.importError ?? String(localized: "An error occurred while importing the contractor.")) } // Residence import success dialog .alert("Joined Residence", isPresented: $residenceSharingManager.importSuccess) { @@ -164,7 +164,7 @@ struct iOSApp: App { residenceSharingManager.resetState() } } message: { - Text("You now have access to \(residenceSharingManager.importedResidenceName ?? "the residence").") + Text("You now have access to \(residenceSharingManager.importedResidenceName ?? String(localized: "the residence")).") } // Residence import error dialog .alert("Join Failed", isPresented: .init( @@ -175,7 +175,7 @@ struct iOSApp: App { residenceSharingManager.resetState() } } message: { - Text(residenceSharingManager.errorMessage ?? "An error occurred while joining the residence.") + Text(residenceSharingManager.errorMessage ?? String(localized: "An error occurred while joining the residence.")) } } } @@ -185,18 +185,18 @@ struct iOSApp: App { private var importConfirmationTitle: String { switch pendingImportType { case .contractor: - return "Import Contractor" + return String(localized: "Import Contractor") case .residence: - return "Join Residence" + return String(localized: "Join Residence") } } private var importConfirmationMessage: String { switch pendingImportType { case .contractor: - return "Would you like to import this contractor to your contacts?" + return String(localized: "Would you like to import this contractor to your contacts?") case .residence: - return "Would you like to join this shared residence?" + return String(localized: "Would you like to join this shared residence?") } } @@ -233,7 +233,7 @@ struct iOSApp: App { // Check if user is authenticated guard TokenStorage.shared.getToken() != nil else { - contractorSharingManager.importError = "You must be logged in to import" + contractorSharingManager.importError = String(localized: "You must be logged in to import") return } @@ -262,7 +262,7 @@ struct iOSApp: App { if accessing { url.stopAccessingSecurityScopedResource() } - contractorSharingManager.importError = "The file appears to be corrupted and could not be read." + contractorSharingManager.importError = String(localized: "The file appears to be corrupted and could not be read.") return } @@ -298,17 +298,17 @@ struct iOSApp: App { case "task": if let idString = components.queryItems?.first(where: { $0.name == "id" })?.value, let id = Int(idString) { - NotificationCenter.default.post(name: .navigateToTask, object: nil, userInfo: ["taskId": id]) + NotificationCenter.default.post(name: .navigateToTask, object: nil, userInfo: ["taskId": id]) // i18n-ignore: NotificationCenter userInfo key (non-UI) } case "residence": if let idString = components.queryItems?.first(where: { $0.name == "id" })?.value, let id = Int(idString) { - NotificationCenter.default.post(name: .navigateToResidence, object: nil, userInfo: ["residenceId": id]) + NotificationCenter.default.post(name: .navigateToResidence, object: nil, userInfo: ["residenceId": id]) // i18n-ignore: NotificationCenter userInfo key (non-UI) } case "document": if let idString = components.queryItems?.first(where: { $0.name == "id" })?.value, let id = Int(idString) { - NotificationCenter.default.post(name: .navigateToDocument, object: nil, userInfo: ["documentId": id]) + NotificationCenter.default.post(name: .navigateToDocument, object: nil, userInfo: ["documentId": id]) // i18n-ignore: NotificationCenter userInfo key (non-UI) } default: #if DEBUG diff --git a/scripts/i18n_audit.py b/scripts/i18n_audit.py new file mode 100644 index 0000000..40cf847 --- /dev/null +++ b/scripts/i18n_audit.py @@ -0,0 +1,297 @@ +#!/usr/bin/env python3 +""" +i18n_audit.py — exhaustive localization gap detector for honeyDue (KMM). + +Method: enumerate EVERY prose string literal in the iOS Swift + shared Kotlin +sources (char-aware: comments and interpolation excluded), then assign each to +exactly one bucket: + + LOCALIZED — inside a localization wrapper (String(localized:), stringResource, + ClientStrings.t, LocalizedStringKey, NSLocalizedString, + LocalizedStringResource/IntentDescription, ...) or the direct + literal argument of an auto-localizing SwiftUI view init/modifier + (Text, Label, Button, .navigationTitle, .accessibilityLabel, ...). + ALLOWLIST — matches an explicit, reviewable non-UI rule (logging, asset/symbol + names, color/asset lookups, keys, URLs, routes, regex/predicate, + date-format patterns, API-value comparisons, serialization, the + brand name "honeyDue") OR is suppressed by an inline directive. + GAP — everything else. THIS BUCKET MUST BE EMPTY. + +"Done" == GAP count is 0: every literal accounted for in LOCALIZED or ALLOWLIST. +High recall by design. False positives are silenced ONLY by a documented allowlist +rule or an in-source suppression directive — never by narrowing the enumeration. + +Inline suppression (auditable; reviewed by the adversarial re-scan): + "..." // i18n-ignore: skip literals on this line + // i18n-ignore-next: skip the next code line + // i18n-ignore-begin: ... // i18n-ignore-end skip the region + +Usage: + python3 scripts/i18n_audit.py [--json OUT] [--all] [--allowlist] +Exit code: 0 if GAP==0 else 1 (CI gate). +""" +import os, re, sys, json, argparse + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +IOS_DIRS = ["iosApp/iosApp", "iosApp/HoneyDue"] +KT_DIRS = ["composeApp/src/commonMain/kotlin"] + +# Files/dirs skipped entirely, each with a reason (test data, samples, analytics +# identifiers, the translation data store, dev-only screens). +SKIP_PATH_SUBSTR = { + "/build/": "build artifacts", "/DerivedData/": "build artifacts", + "ClientStringsData.kt": "translation data store", + "/testing/": "test fixtures", "Fixtures.kt": "test fixtures", + "/analytics/": "analytics event/property identifiers (non-UI)", + "Greeting.kt": "KMM template boilerplate", + "/dev/": "dev-only screen (Android, unreachable)", + "AnimationTestingScreen.kt": "dev-only screen (Android, unregistered route)", + "SimpleTaskListItem.kt": "dead/unused component", + # NOTE: iOS /AnimationTesting/ is intentionally NOT skipped — it ships & is + # reachable from Profile > Completion Animation (no #if DEBUG gate). +} +SKIP_PATH_REGEX = re.compile(r"(Tests?/|UITests?/|/Test[A-Z]|Tests\.swift$|/Mock)") + +# ---------- char-aware literal extraction (comments + triple-strings handled) ---------- +def extract_literals(line, state): + """Return list of (col, inner) string literals on `line`; mutate `state` + (block-comment / triple-string carry across lines).""" + lits = [] + if state["triple"]: + idx = line.find('"""') + if idx < 0: + return lits + state["triple"] = False + line = line[idx + 3:] + i, n = 0, len(line) + while i < n: + if state["block"]: + j = line.find("*/", i) + if j < 0: + return lits + state["block"] = False + i = j + 2 + continue + c = line[i] + if c == "/" and i + 1 < n and line[i + 1] == "/": + break # line comment -> rest ignored + if c == "/" and i + 1 < n and line[i + 1] == "*": + state["block"] = True + i += 2 + continue + if c == '"': + if line[i:i + 3] == '"""': + k = line.find('"""', i + 3) + if k < 0: + state["triple"] = True + return lits + i = k + 3 + continue + start = i + i += 1 + buf = [] + while i < n: + if line[i] == "\\": + buf.append(line[i:i + 2]); i += 2; continue + if line[i] == '"': + break + buf.append(line[i]); i += 1 + lits.append((start, "".join(buf))) + i += 1 + continue + i += 1 + return lits + +def strip_interpolation(lit): + lit = re.sub(r"\\\([^)]*\)", "X", lit) # swift \( ... ) + lit = re.sub(r"\$\{[^}]*\}", "X", lit) # kotlin ${ ... } + lit = re.sub(r"\$[A-Za-z_][A-Za-z0-9_]*", "X", lit) # kotlin $ident + return lit + +# ---------- "prose" test ---------- +def is_prose(s): + st = s.strip() + if sum(c.isalpha() for c in st) < 2: + return False + if re.fullmatch(r"[X\W\s]*", st): # only interpolation residue/punct + return False + if re.fullmatch(r"[A-Za-z0-9]+([._\-/][A-Za-z0-9]+)+", st): # dotted.key/snake/kebab/path + return False + if ("/" in st or st.startswith("http")) and " " not in st: + return False + if re.fullmatch(r"[%@{}\d\s.,:#x*lld$\-]*", st): # format-spec residue + return False + if re.fullmatch(r"[a-z][a-z0-9]*", st): # lowercase single token (route/key) + return False + if re.fullmatch(r"[A-Z][A-Z0-9_]*", st): # ALLCAPS const / api enum + return False + if re.fullmatch(r"#?[0-9A-Fa-f]{3,}", st): # hex/uuid-ish + return False + return True + +def is_regex(s): + return bool(re.search(r"\\[.dwsDWSbB]|\[[A-Za-z0-9^]|\]\+|\]\*|\]\{|MATCHES|\(\?:|\^|\$$", s)) + +def is_date_pattern(s): + st = s.strip() + if not re.search(r"[MdyHhmsaEZ]", st): + return False + return bool(re.fullmatch(r"[MdyHhmsaEZ:/.,'\s\-]+", st)) + +LOCALIZED_PREFIX = re.compile( + r"(String\(\s*localized:\s*|LocalizedStringKey\(\s*|NSLocalizedString\(\s*" + r"|ClientStrings\.t\(\s*|\.t\(\s*|IntentDescription\(\s*|LocalizedStringResource\(\s*" + r"|TypeDisplayRepresentation\(\s*name:\s*|DisplayRepresentation\(\s*title:\s*" + r"|stringResource\(\s*)$") + +AUTOLOC_PREFIX = re.compile( + r"(\bText\(\s*|\bText\(\s*verbatim:\s*|\bLabel\(\s*|\bButton\(\s*|\bToggle\(\s*" + r"|\bPicker\(\s*|\bStepper\(\s*|\bLink\(\s*|\bMenu\(\s*|\bTextField\(\s*" + r"|\bSecureField\(\s*|\bNavigationLink\(\s*|\bSection\(\s*" + r"|\.navigationTitle\(\s*|\.navigationBarTitle\(\s*|\.help\(\s*" + r"|\.accessibilityLabel\(\s*|\.accessibilityHint\(\s*|\.accessibilityValue\(\s*" + r"|\.alert\(\s*|\.confirmationDialog\(\s*|\.configurationDisplayName\(\s*|\.description\(\s*" + # `titleKey:` is SwiftUI's documented LocalizedStringKey param. Other labeled + # args (label:/title:/message:/...) are NOT trusted — custom components often + # take a plain String and render it verbatim (Text(String)), bypassing the + # catalog. Those must be explicitly wrapped, so we let them fall through to GAP. + r"|\btitleKey:\s*)$") + +ALLOWLIST_PREFIX = re.compile( + r"(print\(|NSLog\(|os_log|Logger|\bprintln\(|\blog\.|Log\.[a-z]+\(" + r"|\.debug\(|\.error\(|\.info\(|\.warning\(|\.fault\(|\.verbose\(" + r"|systemName:\s*|\bImage\(\s*|\bUIImage\(|named:\s*|Color\(\s*|UIColor\(|themed\(\s*" + r"|forKey:\s*|forHTTPHeaderField:\s*|setValue\(|withName:\s*|appendPathComponent\(\s*" + r"|URL\(\s*string:\s*|accessibilityIdentifier\(\s*|\.font\(|Font\(|fontName|infoDictionary\??!?\[" + r"|navigate\(\s*|composable\(\s*|route\s*=\s*|startDestination" + r"|@SerialName\(\s*|SerialName\(\s*|JSONDecoder|JSONEncoder|NSPredicate\(\s*format:\s*" + r"|==\s*|!=\s*|\bcase\s+|contains\(\s*|hasPrefix\(\s*|hasSuffix\(\s*|range\(\s*of:\s*" + r"|\.tag\(\s*|identifier:\s*|kCFBundle|Bundle\.|Notification\.Name\(\s*|previewDisplayName\(\s*" + r"|NotificationCenter)$") + +ALLOWLIST_LINE = re.compile( + r"(accessibilityIdentifier|AccessibilityIdentifiers\.|UserDefaults|keychain|Keychain" + r"|mimeType|MimeType|contentType:\s*\"|application/json|image/jpeg|text/plain" + r"|NSPredicate\(format:|\.regularExpression|Icons\.|Notification\.Name\()") + +# Line declares an iOS LocalizedStringResource / IntentDescription / AppEnum display, +# or an AppIntent @Parameter(title:) (title is a LocalizedStringResource → auto-localizes). +LOCALIZED_LINE = re.compile( + r"(LocalizedStringResource|IntentDescription|DisplayRepresentation|TypeDisplayRepresentation|@Parameter\()") + +def classify(lang, prefix, inner_clean, raw, suffix): + tail = prefix[-80:] + if inner_clean.strip() == "honeyDue": + return "allowlist" + if is_regex(inner_clean) or is_date_pattern(inner_clean): + return "allowlist" + # Kotlin detection-pattern map: "incoming error substring" to "err.key" + if lang == "kotlin" and re.match(r'\s*to\s+"', suffix): + return "allowlist" + if LOCALIZED_PREFIX.search(tail): + return "localized" + if lang == "swift" and (AUTOLOC_PREFIX.search(tail) or LOCALIZED_LINE.search(raw)): + return "localized" + if ALLOWLIST_PREFIX.search(tail) or ALLOWLIST_LINE.search(raw): + return "allowlist" + return "gap" + +def scan_file(path, lang): + rel = os.path.relpath(path, ROOT) + out = {"localized": [], "allowlist": [], "gap": []} + try: + lines = open(path, encoding="utf-8").read().splitlines() + except Exception: + return out + state = {"block": False, "triple": False} + ignore_region = False + ignore_next = False + preview_depth = 0 # >0 while inside a #Preview / PreviewProvider block + for ln, raw in enumerate(lines, 1): + line_ignored = ignore_next + ignore_next = False + if "i18n-ignore-begin" in raw: + ignore_region = True + if "i18n-ignore-end" in raw: + ignore_region = False + if "i18n-ignore-next" in raw: + ignore_next = True + lits = extract_literals(raw, state) + # --- #Preview / PreviewProvider block skip (mock/sample data, not shipped UI) --- + if preview_depth == 0 and re.search(r"#Preview\b|PreviewProvider|_Previews\b", raw): + preview_depth = 1 if "{" not in raw else 0 # arm; depth counted below + if preview_depth > 0 or re.search(r"#Preview\b|PreviewProvider|_Previews\b", raw): + preview_depth += raw.count("{") - raw.count("}") + if preview_depth < 0: + preview_depth = 0 + continue + if ignore_region or line_ignored: + continue + line_suppress = "i18n-ignore" in raw and "i18n-ignore-next" not in raw + for start, inner in lits: + inner_clean = strip_interpolation(inner) + if not is_prose(inner_clean): + continue + if line_suppress: + out["allowlist"].append({"file": rel, "line": ln, "text": inner, "ctx": raw.strip()[:160], "supp": True}) + continue + end = start + 1 + # locate closing quote to compute suffix + k = raw.find('"', start + 1) + while k != -1 and raw[k - 1] == "\\": + k = raw.find('"', k + 1) + suffix = raw[k + 1:] if k != -1 else "" + b = classify(lang, raw[:start], inner_clean, raw, suffix) + out[b].append({"file": rel, "line": ln, "text": inner, "ctx": raw.strip()[:160]}) + return out + +def collect(): + files = [] + for d in IOS_DIRS + KT_DIRS: + base = os.path.join(ROOT, d) + lang = "swift" if "iosApp" in d else "kotlin" + for r, _, fs in os.walk(base): + for f in fs: + if f.endswith(".swift") or f.endswith(".kt"): + files.append((os.path.join(r, f), "swift" if f.endswith(".swift") else "kotlin")) + res = {"localized": [], "allowlist": [], "gap": []} + for path, lang in files: + rel = os.path.relpath(path, ROOT) + if any(s in path for s in SKIP_PATH_SUBSTR) or SKIP_PATH_REGEX.search(rel): + continue + r = scan_file(path, lang) + for k in res: + res[k].extend(r[k]) + return res + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--json") + ap.add_argument("--all", action="store_true") + ap.add_argument("--allowlist", action="store_true") + args = ap.parse_args() + res = collect() + g = res["gap"] + print("\n=== i18n audit ===") + print(f"LOCALIZED : {len(res['localized'])}") + print(f"ALLOWLIST : {len(res['allowlist'])} (incl. {sum(1 for x in res['allowlist'] if x.get('supp'))} inline-suppressed)") + print(f"GAP : {len(g)}") + by_file = {} + for r in g: + by_file.setdefault(r["file"], []).append(r) + print(f"\n--- GAPS in {len(by_file)} files ---") + for f in sorted(by_file): + print(f"\n{f} ({len(by_file[f])})") + for r in by_file[f]: + print(f" {r['line']:>4}: \"{r['text']}\"") + if args.json: + json.dump(res, open(args.json, "w"), ensure_ascii=False, indent=2) + print(f"\nwrote {args.json}") + if args.allowlist: + print("\n--- ALLOWLIST (non-suppressed) sample ---") + for r in [x for x in res["allowlist"] if not x.get("supp")][:60]: + print(f" {r['file']}:{r['line']}: \"{r['text']}\"") + sys.exit(0 if not g else 1) + +if __name__ == "__main__": + main() diff --git a/scripts/i18n_coverage.py b/scripts/i18n_coverage.py new file mode 100644 index 0000000..e7e51c5 --- /dev/null +++ b/scripts/i18n_coverage.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python3 +""" +i18n_coverage.py — translation-coverage + format-specifier gate for honeyDue. + +For each localization store, verify every source key is present and translated in +ALL target locales, and that format specifiers (%@ %lld %d %s %1$s {0} ...) match +the source count in each translation. + +Stores: + iOS catalogs : iosApp/iosApp/Localizable.xcstrings, InfoPlist.xcstrings, + iosApp/HoneyDue/Localizable.xcstrings (locales: en es fr de pt-BR it ja ko nl zh-Hans) + Android : composeApp/.../composeResources/values*/strings.xml + Kotlin : composeApp/.../i18n/ClientStringsData.kt (STRINGS map) + +Exit 0 if fully covered + specifier-clean, else 1. --json OUT to dump details. +""" +import os, re, sys, json, argparse, xml.etree.ElementTree as ET + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +IOS_LOCALES = ["en","es","fr","de","pt","it","ja","ko","nl","zh"] +AND_LOCALES = ["", "es","fr","de","pt","it","ja","ko","nl","zh"] # "" == values/ (en) +KT_LOCALES = ["en","es","fr","de","pt","it","ja","ko","nl","zh"] + +SPEC_RE = re.compile(r"%(?:\d+\$)?[@a-zA-Z]|%%|\{\d+\}") +def specs(s): + # normalize positional %1$@ -> %@ ; count multiset + out = {} + for m in SPEC_RE.findall(s or ""): + key = re.sub(r"^%\d+\$", "%", m) + out[key] = out.get(key, 0) + 1 + return out + +def check_specs(src, tr): + a, b = specs(src), specs(tr) + # ignore %% and plain '%'; compare placeholder multisets + a = {k:v for k,v in a.items() if k not in ("%%",)} + b = {k:v for k,v in b.items() if k not in ("%%",)} + return a == b + +# ---------------- iOS xcstrings ---------------- +def unit_value(node): + """Return concatenated translated text for a localization node (stringUnit or + plural variations), or None if not translated/empty.""" + if not isinstance(node, dict): + return None + if "stringUnit" in node: + su = node["stringUnit"] + if su.get("state") in ("translated", "needs_review") and su.get("value", "") != "": + return su["value"] + return None + if "variations" in node: + var = node["variations"] + cat = var.get("plural") or var.get("device") or {} + vals = [] + for k, v in cat.items(): + uv = unit_value(v) + if uv is None: + return None + vals.append(uv) + return " ".join(vals) if vals else None + return None + +def check_ios(path, locales, problems): + if not os.path.exists(path): + return + data = json.load(open(path)) + src_lang = data.get("sourceLanguage", "en") + rel = os.path.relpath(path, ROOT) + for key, entry in data.get("strings", {}).items(): + locs = entry.get("localizations", {}) + # keys explicitly excluded from translation + if entry.get("shouldTranslate") is False: + continue + # non-prose symbol/format-only keys ("•", "%@", "%lld / 5", "+%lld", "%lld%%") + # never need translation — strip format specifiers first, then require real letters. + bare = re.sub(r"%(?:\d+\$)?[a-zA-Z@]+|%%", "", key) + if sum(c.isalpha() for c in bare) < 2: + continue + src = unit_value(locs.get(src_lang)) or key + for loc in locales: + if loc == src_lang: + continue + uv = unit_value(locs.get(loc)) + if uv is None: + problems.append({"store": rel, "key": key[:60], "locale": loc, "issue": "missing"}) + elif not check_specs(src, uv): + problems.append({"store": rel, "key": key[:60], "locale": loc, "issue": f"spec {specs(src)} vs {specs(uv)}"}) + +# ---------------- Android strings.xml ---------------- +def load_xml(path): + d = {} + if not os.path.exists(path): + return None + try: + root = ET.parse(path).getroot() + except Exception as e: + return {"__error__": str(e)} + for el in root: + if el.tag == "string" and el.get("name"): + d[el.get("name")] = "".join(el.itertext()) + elif el.tag == "plurals" and el.get("name"): + d[el.get("name")] = "".join(el.itertext()) + return d + +def check_android(problems): + base = os.path.join(ROOT, "composeApp/src/commonMain/composeResources") + en = load_xml(os.path.join(base, "values/strings.xml")) + if en is None: + problems.append({"store": "android", "key": "-", "locale": "values", "issue": "missing strings.xml"}) + return + for loc in AND_LOCALES: + if loc == "": + continue + p = os.path.join(base, f"values-{loc}/strings.xml") + d = load_xml(p) + if d is None: + problems.append({"store": "android", "key": "-", "locale": loc, "issue": "locale file missing"}) + continue + if "__error__" in d: + problems.append({"store": "android", "key": "-", "locale": loc, "issue": "xml parse: " + d["__error__"]}) + continue + for k, sv in en.items(): + if k not in d: + problems.append({"store": "android", "key": k, "locale": loc, "issue": "missing"}) + elif not check_specs(sv, d[k]): + problems.append({"store": "android", "key": k, "locale": loc, "issue": f"spec {specs(sv)} vs {specs(d[k])}"}) + +# ---------------- Kotlin ClientStringsData ---------------- +def check_kotlin(problems): + path = os.path.join(ROOT, "composeApp/src/commonMain/kotlin/com/tt/honeyDue/i18n/ClientStringsData.kt") + if not os.path.exists(path): + return + src = open(path, encoding="utf-8").read() + # entries look like: "key" to mapOf("en" to "..", "es" to "..", ...) + # find each top-level "key" to mapOf( ... ) block + for m in re.finditer(r'"((?:[^"\\]|\\.)+)"\s*to\s*mapOf\s*\(', src): + key = m.group(1) + # capture the mapOf(...) body by brace matching from the '(' after mapOf + i = m.end() - 1 + depth = 0 + j = i + while j < len(src): + if src[j] == "(": + depth += 1 + elif src[j] == ")": + depth -= 1 + if depth == 0: + break + j += 1 + body = src[i:j] + langs = dict(re.findall(r'"([a-zA-Z\-]+)"\s*to\s*"((?:[^"\\]|\\.)*)"', body)) + srcval = langs.get("en", key) + for loc in KT_LOCALES: + if loc == "en": + continue + # empty string is a deliberate choice for some keys (e.g. date.at has no + # connector word in CJK); treat key-present-but-empty as covered. + if loc not in langs: + problems.append({"store": "kotlin", "key": key[:60], "locale": loc, "issue": "missing"}) + elif not check_specs(srcval, langs[loc]): + problems.append({"store": "kotlin", "key": key[:60], "locale": loc, "issue": f"spec {specs(srcval)} vs {specs(langs[loc])}"}) + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--json") + args = ap.parse_args() + problems = [] + check_ios(os.path.join(ROOT, "iosApp/iosApp/Localizable.xcstrings"), IOS_LOCALES, problems) + check_ios(os.path.join(ROOT, "iosApp/iosApp/InfoPlist.xcstrings"), IOS_LOCALES, problems) + check_ios(os.path.join(ROOT, "iosApp/HoneyDue/Localizable.xcstrings"), IOS_LOCALES, problems) + check_android(problems) + check_kotlin(problems) + import collections + by_store = collections.Counter(p["store"] for p in problems) + miss = collections.Counter(p["store"] for p in problems if p["issue"] == "missing") + spec = collections.Counter(p["store"] for p in problems if p["issue"].startswith("spec")) + print("\n=== i18n coverage ===") + stores = set([p["store"] for p in problems]) | {"iosApp/iosApp/Localizable.xcstrings","android","kotlin"} + for s in sorted(stores): + print(f" {s:42} problems={by_store.get(s,0):>4} (missing={miss.get(s,0)}, spec={spec.get(s,0)})") + print(f"TOTAL problems: {len(problems)}") + if args.json: + json.dump(problems, open(args.json, "w"), ensure_ascii=False, indent=2) + print("wrote", args.json) + # sample + for p in problems[:25]: + print(f" {p['store']} [{p['locale']}] {p['key']} :: {p['issue']}") + sys.exit(0 if not problems else 1) + +if __name__ == "__main__": + main()