From 82cfa7bb79158e1c3eac7f22293c1139567b6b66 Mon Sep 17 00:00:00 2001 From: Cryptobot Date: Fri, 10 Mar 2023 16:34:38 +0100 Subject: [PATCH 1/5] New Crowdin updates (#309) [ci skip] --- .../zh-Hans.lproj/Intents.strings | 2 +- SharedResources/fa.lproj/Localizable.strings | 3 + SharedResources/he.lproj/Localizable.strings | 189 +++++++++++++++++- .../zh-HK.lproj/Localizable.strings | 5 +- .../zh-Hans.lproj/Localizable.strings | 48 ++--- .../zh-Hant.lproj/Localizable.strings | 24 +-- 6 files changed, 232 insertions(+), 39 deletions(-) diff --git a/CryptomatorIntents/zh-Hans.lproj/Intents.strings b/CryptomatorIntents/zh-Hans.lproj/Intents.strings index 36bc6db14..6b3c4d7bf 100644 --- a/CryptomatorIntents/zh-Hans.lproj/Intents.strings +++ b/CryptomatorIntents/zh-Hans.lproj/Intents.strings @@ -4,7 +4,7 @@ "common.true" = "true"; "common.vault" = "保险库"; -"getFolderIntent.description" = "返回给定保险库中给定路径的文件夹对象"; +"getFolderIntent.description" = "返回给定保险库中给定路径的文件夹对象。"; "getFolderIntent.path" = "路径"; "getFolderIntent.text" = "获取位于“${vault}”中 ${path} 的文件夹"; "getFolderIntent.title" = "获取文件夹"; diff --git a/SharedResources/fa.lproj/Localizable.strings b/SharedResources/fa.lproj/Localizable.strings index 08cf14d5c..81009d812 100644 --- a/SharedResources/fa.lproj/Localizable.strings +++ b/SharedResources/fa.lproj/Localizable.strings @@ -2,6 +2,7 @@ "common.button.change" = "تغییر"; "common.button.choose" = "انتخاب کنید"; "common.button.close" = "ببند"; +"common.button.create" = "ایجاد"; "common.button.done" = "انجام شده"; "common.button.edit" = "ویرایش"; "common.button.next" = "بعدی"; @@ -13,6 +14,7 @@ "addVault.title" = "اضافه کردن گاوصندوق"; "addVault.createNewVault.title" = "ساخت گاوصندوق جدید"; "addVault.createNewVault.setVaultName.cells.name" = "نام گاوصندوق"; +"addVault.createNewVault.password.confirmPassword.alert.message" = "مهم: اگر پسروردتان را از یاد ببرید، هیچ راهی برای بازگردانی اطلاعاتتان نیست."; "addVault.openExistingVault.title" = "باز کردن گاوصندوق موجود"; "fileProvider.error.unlockButton" = "بازکردن قفل"; "purchase.retry.button" = "تلاش مجدد"; @@ -20,6 +22,7 @@ "settings.title" = "تنظیمات"; "s3Authentication.accessKey" = "کلید دسترسی"; "s3Authentication.secretKey" = "کلید مخفی"; +"s3Authentication.region" = "منطقه"; "unlockVault.button.unlock" = "بازکردن قفل"; "vaultDetail.button.moveVault" = "انتقال"; diff --git a/SharedResources/he.lproj/Localizable.strings b/SharedResources/he.lproj/Localizable.strings index 1a3dbfb3c..f131f6aea 100644 --- a/SharedResources/he.lproj/Localizable.strings +++ b/SharedResources/he.lproj/Localizable.strings @@ -10,7 +10,9 @@ "common.button.cancel" = "ביטול"; "common.button.change" = "שנה"; "common.button.choose" = "בחר"; +"common.button.clear" = "ניקוי"; "common.button.close" = "סגירה"; +"common.button.confirm" = "אישור"; "common.button.create" = "צור"; "common.button.createFolder" = "צור תיקייה"; "common.button.done" = "סיום"; @@ -21,6 +23,9 @@ "common.button.ok" = "אישור"; "common.button.remove" = "הסר"; "common.button.retry" = "לנסות שוב"; +"common.button.signOut" = "התנתק"; +"common.button.verify" = "אמת"; +"common.cells.openInFilesApp" = "פתיחת ביישום Files"; "common.cells.password" = "סיסמה"; "common.cells.url" = "כתובת URL"; "common.cells.username" = "שם משתמש"; @@ -28,11 +33,19 @@ "common.hud.authenticating" = "בתהליך אימות…"; "accountList.header.title" = "אימות"; +"accountList.emptyList.message" = "לחץ כאן להוספת חשבון"; +"accountList.signOut.alert.title" = "הסרת כספות קשורות?"; +"accountList.signOut.alert.message" = "אם תנתק, כל הכספות הקשורות יוסרו מרשימת הכספות. לא ימחק מידע מוצפן. ניתן להכנס שוב ולהוסיף את הכספות בעתיד."; -"addVault.title" = "הוספת כספת"; +"addVault.title" = "הוסף כספת"; "addVault.createNewVault.title" = "צור כספת חדשה"; +"addVault.createNewVault.purchase" = "יצירת כספת חדשה מצריך את הגרסה המלאה של Cryptomator."; +"addVault.createNewVault.setVaultName.header.title" = "בחר שם לכספת."; "addVault.createNewVault.setVaultName.cells.name" = "שם הכספת"; +"addVault.createNewVault.setVaultName.error.emptyVaultName" = "שם הכספת לא יכול להיות ריק."; "addVault.createNewVault.chooseCloud.header" = "היכן Cryptomator צריך לשמור את הקבצים המוצפנים של הכספת שלך?"; +"addVault.createNewVault.chooseFolder.error.vaultNameCollision" = "%@ כבר קיים במיקום זה. בחר שם אחר לכספת או מיקום אחר."; +"addVault.createNewVault.detectedMasterkey.text" = "Cryptomator זיהה כספת קיימת במיקום זה.\nכדי ליצר כספת חדשה חזרו אחורה ובחרו תיקיה אחרת."; "addVault.createNewVault.password.enterPassword.header" = "בחירת סיסמה חדשה."; "addVault.createNewVault.password.confirmPassword.header" = "אישור סיסמה חדשה."; "addVault.createNewVault.password.confirmPassword.alert.title" = "אישור סיסמה?"; @@ -42,36 +55,156 @@ "addVault.createNewVault.password.error.tooShortPassword" = "הסיסמא חייבת להכיל 8 תווים לפחות."; "addVault.createNewVault.progress" = "יוצר כספת…"; "addVault.openExistingVault.title" = "פתיחת כספת קיימת"; +"addVault.openExistingVault.chooseCloud.header" = "איפה הכספת ממוקמת?"; +"addVault.openExistingVault.detectedMasterkey.text" = "Cryptomator זיהה את הכספת ״%@״.\nהאם ברצונך להוסיף את כספת זו?"; +"addVault.openExistingVault.detectedMasterkey.add" = "הוסף כספת זו"; +"addVault.openExistingVault.password.footer" = "הכנס/י סיסמה ל-\"%@\"."; "addVault.openExistingVault.progress" = "מוסיף כספת…"; +"addVault.success.info" = "הכספת ״%@״ הוספה בהצלחה.\nהגישה לכספת דרך ישום Files."; +"addVault.success.footer" = "הפעילו את Cryptomator בישום Files, אם טרם עשית זאת."; "biometryType.faceID" = "Face ID"; "biometryType.touchID" = "Touch ID"; + +"changePassword.error.invalidOldPassword" = "הסיסמה הנוכחית שגויה. אנא נסה שנית."; +"changePassword.header.currentPassword.title" = "הזן סיסמה נוכחית."; "changePassword.header.newPassword.title" = "בחירת סיסמה חדשה."; "changePassword.header.newPasswordConfirmation.title" = "אישור סיסמה חדשה."; +"changePassword.progress" = "שנה סיסמה…"; "chooseFolder.emptyFolder.footer" = "התיקייה ריקה"; +"chooseFolder.createNewFolder.header.title" = "בחר שם לתיקיה."; "chooseFolder.createNewFolder.cells.name" = "שם תיקייה"; +"chooseFolder.createNewFolder.error.emptyFolderName" = "שם התיקיה לא יכול להיות ריק."; "chooseFolder.createNewFolder.progress" = "יוצר תיקייה…"; +"cloudProvider.error.itemNotFound" = "״%@״ לא נמצא."; +"cloudProvider.error.itemAlreadyExists" = "״%@״ כבר קיים."; +"cloudProvider.error.itemTypeMismatch" = "״%@״ מכיל פריט לא צפוי."; +"cloudProvider.error.parentFolderDoesNotExist" = "תיקית אב ״%@״ לא קיימת."; +"cloudProvider.error.pageTokenInvalid" = "לא ניתן להמשיך במשיכת תוכן התיקיה."; +"cloudProvider.error.quotaInsufficient" = "חסר מקום פנוי באחסון שלך."; +"cloudProvider.error.unauthorized" = "לא ניתן לבצע פעולה לא מאושרת."; +"cloudProvider.error.noInternetConnection" = "תקשורת לאינטרנט נדרשת לפעולה זו."; + +"cloudProviderType.localFileSystem" = "ספק קבצים אחר"; + "fileProvider.onboarding.title" = "ברוך הבא"; +"fileProvider.onboarding.info" = "תודה שבחרת ב- Cryptomator להגנה על הקבצים שלך. להתחלה, פתח את האפליקציה והוסף כספת."; +"fileProvider.onboarding.button.openCryptomator" = "פתח את Cryptomator"; +"fileProvider.error.biometricalAuthCanceled.title" = "שחרור נעילה בוטל"; +"fileProvider.error.biometricalAuthCanceled.message" = "שחרור נעילה דרך %@ נכשל. אנא נסה שוב."; +"fileProvider.error.biometricalAuthWrongPassword.title" = "סיסמה שגויה"; +"fileProvider.error.biometricalAuthWrongPassword.message" = "הסיסמה השמורה עבור %@ שגויה. אנא נסה שוב והקש את הסיסמה להפעלה מחדש של %@."; +"fileProvider.error.defaultLock.title" = "שחרור נעילה נדרש"; +"fileProvider.error.defaultLock.message" = "לגישה וצפיה בתוכן הכספת, יש לבצע שחרור נעילה."; "fileProvider.error.unlockButton" = "בטל נעילה"; +"fileProvider.clearFileFromCache.title" = "מחק את הקובץ מזיכרון המטמון"; +"fileProvider.clearFileFromCache.message" = "זה רק מוחק את הקובץ המקומי ממכשירך ולא מוחק את הקובץ בענן."; +"fileProvider.fileImporting.error.missingPremium" = "בצע שחרר נעילה של הגרסה המלאה בישום Cryptomator לקבלת גישת כתיבה לכספות שלך."; "fileProvider.uploadProgress.connecting" = "התחברות…"; "fileProvider.uploadProgress.message" = "תהליך נוכחי: %@\n\nאם תהליך ההעלאה תקוע, ניתן לנסות שוב."; "fileProvider.uploadProgress.missing" = "לא ניתן לקבוע את תהליך ההתקדמות. ייתכן והתהליך עדיין רץ ברקע."; "fileProvider.uploadProgress.title" = "העלאה…"; "fileProvider.uploadProgress.missingDomainError" = "לא ניתן למצוא את הדומיין."; + +"getFolderIntent.error.missingPath" = "לא סופק נתיב. נא ספק נתיב תקין שממנו יש להחזיר תיקיה."; "getFolderIntent.error.noVaultSelected" = "לא נבחר קובץ vault."; +"intents.saveFile.missingFile" = "הקובץ שסופק אינו תקין."; "intents.saveFile.invalidFolder" = "התיקייה שנבחרה איננה תקינה."; +"intents.saveFile.missingTemporaryFolder" = "כשלון ביצירת תיקיה זמנית."; +"intents.saveFile.lockedVault" = "עליך לבצע שחרור נעילה של הכספת כדי להשתמש בקיצור דרך זה."; "intents.saveFile.selectedVaultNotFound" = "ה vault שנבחר לא נמצא."; +"keepUnlocked.alert.title" = "לנעול את הכספת?"; +"keepUnlocked.alert.message" = "השינוי מצריך את נעילת הכספת כדי שיכנס לתוקף."; +"keepUnlocked.alert.confirm" = "אשר ונעל כעת"; +"keepUnlocked.header" = "הגדר לכמה זמן הכספת תשאר לא נעולה בעת שאינה בשימוש."; +"keepUnlocked.footer.auto" = "האפשרות לתת ל- iOS תאפשר לה לסגור את Cryptomator בכל עת כדי לשחרר זיכרון, פעולה שתגרום לנעילה אוטומטית של הכספת."; +"keepUnlocked.footer.on" = "באמצעות האפשרות שנבחרה, יהיה צורך לשמור עותק של המפתח בצרור המפתחות של iOS למשך הזמן שהכספת לא נעולה."; +"keepUnlockedDuration.auto" = "תן ל- iOS להחליט אוטומטית"; +"keepUnlockedDuration.auto.shortDisplayName" = "אוטומטי"; +"keepUnlockedDuration.indefinite" = "ללא הגבלה"; + +"localFileSystemAuthentication.createNewVault.header" = "במסך הבא, בחר את המיקום לאחסנת הכספת החדשה שלך."; +"localFileSystemAuthentication.createNewVault.button" = "בחר מקום אחסון"; +"localFileSystemAuthentication.createNewVault.error.detectedExistingVault" = "כספת כבר קיימת במיקום זה. נסה שוב עם מיקום אחסון שונה."; +"localFileSystemAuthentication.openExistingVault.header" = "במסך הבא, בחר את התיקיה של הכספת הקיימת."; +"localFileSystemAuthentication.openExistingVault.button" = "בחר את תיקיית הכספת"; +"localFileSystemAuthentication.openExistingVault.error.noVaultFound" = "התיקיה שנבחרה אינה כספת. נסה שוב עם תיקיה אחרת."; +"localFileSystemAuthentication.info.footer" = "ספקי קבצים אפורים אינם מאפשרים ״בחירת תיקיות״. זו אינה מגבלה של Cryptomator."; + +"maintenanceModeError.runningCloudTask" = "לא ניתן לבצע את הפעולה עקב פעולות אחרות ברקע שנדרשות להסתיים לפני כן. נסה שוב מאוחר יותר."; + +"nameValidation.error.endsWithPeriod" = "לא ניתן להשתמש בשם שמסתיים בנקודה. אנא בחר שם אחר."; +"nameValidation.error.endsWithSpace" = "לא ניתן להשתמש בשם שמסתיים ברווח. אנא בחר שם אחר."; +"nameValidation.error.containsIllegalCharacter" = "לא ניתן להשתמש בשם שמכיל ״%@״. אנא בחר שם אחר."; + "onboarding.title" = "ברוך הבא"; +"onboarding.info" = "תודה שבחרת ב- Cryptomator להגנה על הקבצים שלך.\n\nעם Cryptomator, המפתח למידע שלך בידיים שלך. Cryptomator מצפין את המידע מהר ובקלות.\n\nישום זה משולב באופן מלא עם ישום הקבצים Files. מאוחר יותר ודא שאיפשרת את Cryptomator בישום Files לצורך גישה אל הכספות."; "onboarding.button.continue" = "המשך"; + +"purchase.beginFreeTrial.alert.title" = "תקופת ניסיון הופעלה"; +"purchase.expiredTrial" = "תקופת הניסיון פגה."; +"purchase.footer.privacyPolicy" = "מדיניות פרטיות"; +"purchase.footer.termsOfUse" = "תנאי שימוש"; +"purchase.header.feature.familySharing" = "שיתוף משפחתי"; +"purchase.header.feature.openSource" = "פיתוח קוד-פתוח"; +"purchase.header.feature.writeAccess" = "גישה כתיבה לכספות שלך"; +"purchase.product.donateAndUpgrade" = "תרום ושדרג"; +"purchase.product.freeUpgrade" = "שדרוג חינם"; +"purchase.product.lifetimeLicense" = "רשיון לכל החיים"; +"purchase.product.lifetimeLicense.duration" = "חד פעמי"; +"purchase.product.pricing.free" = "חינם"; +"purchase.product.trial" = "30 ימי ניסיון"; +"purchase.product.trial.expirationDate" = "תאריך תפוגה: %@"; +"purchase.product.trial.duration" = "ל- 30 ימים"; +"purchase.product.yearlySubscription" = "מנוי שנתי"; +"purchase.product.yearlySubscription.duration" = "שנתי"; +"purchase.readOnlyMode.alert.title" = "מצב קריאה בלבד"; +"purchase.readOnlyMode.alert.message" = "אתה יכול לאפשר את הגרסה המלאה של Cryptomator במסך ההגדרות ולהשתמש בו במצב קריאה בלבד לעכשיו."; +"purchase.restorePurchase.button" = "שחזר רכישה"; +"purchase.restorePurchase.validTrialFound.alert.title" = "תקופת הניסיון ממשיכה"; +"purchase.restorePurchase.validTrialFound.alert.message" = "אתה יכול להשתמש בגרסה המלאה של Cryptomator לזמן קצוב. תקופת הניסיון תפוג ב- %@. לאחר מכן, הכספות עדיין יהיו נגישות במצב קריאה בלבד."; +"purchase.restorePurchase.fullVersionFound.alert.title" = "שוחזר בהצלחה"; +"purchase.restorePurchase.fullVersionNotFound.alert.title" = "אין גרסה מלאה"; +"purchase.restorePurchase.fullVersionNotFound.alert.message" = "לא הצלחנו למצוא רכישה קודמת של הגרסה המלאה שניתן לשחזר. אנא נסה אפשרות אחרת."; +"purchase.restorePurchase.eligibleForUpgrade.alert.title" = "זכאי לשדרוג"; +"purchase.restorePurchase.eligibleForUpgrade.alert.message" = "נראה שאתה מנסה לשדרג מגרסה ישנה של Cryptomator. אם זה המצב, אנא בחר באפשרות ״הצעת שדרוג״ במקום."; "purchase.retry.button" = "נסה שוב"; +"purchase.retry.footer" = "העלאת המוצרים הזמינים לא צלח."; +"purchase.title" = "שחרור גרסה מלאה"; +"purchase.unlockedFullVersion.message" = "אתה יכול להשתמש בגרסה המלאה של Cryptomator. הצפנה נעימה!"; "purchase.unlockedFullVersion.title" = "תודה"; +"purchase.error.unknown" = "הרגישה לא זמינה בחנות האפליקציות מסיבה לא ידועה. אנא נסה שוב מאוחר יותר.\n\nאם התקלה ממשיכה, נסה להפעיל מחדש את המכשיר או לצאת ולהכנס מחדש עם המשתמש אפל שלך באפליקצית ההגדרות של iOS."; "settings.title" = "הגדרות"; +"settings.aboutCryptomator" = "אודות Cryptomator"; +"settings.aboutCryptomator.title" = "גרסה %@ (%@)"; +"settings.cacheSize" = "גודל מטמון"; "settings.clearCache" = "נקה מטמון"; +"settings.cloudServices" = "שירותי ענן"; +"settings.contact" = "צור קשר"; +"settings.debugMode" = "מצב ניפוי תקלות"; +"settings.debugMode.alert.message" = "במצב זה, מידע רגיש עשוי להכתב לקובץ לוג על מכשירך (כגון שמות קבצים ותיקיות). סיסמאות, עוגיות וכו׳ מוחרגים.\n\nזכור לבטל את מצב ניפוי התקלות בהקדם האפשרי."; +"settings.manageSubscriptions" = "ניהול מנוי"; +"settings.rateApp" = "דרג את האפליקציה"; +"settings.sendLogFile" = "שלח קובץ לוג"; "settings.shortcutsGuide" = "מדריך קיצורי דרך"; +"settings.unlockFullVersion" = "שחרור גרסה מלאה"; + +"snapshots.fileprovider.file1" = "/הנהלת-חשבונות.numbers"; +"snapshots.fileprovider.file2" = "/מצגת סופית.key"; +"snapshots.fileprovider.file3" = "/קדימון המוצר.mov"; +"snapshots.fileprovider.file4" = "/הצעה.docx"; +"snapshots.fileprovider.file5" = "/דוח.pdf"; +"snapshots.fileprovider.folder3" = "/פרויקט סודי"; +"snapshots.fileprovider.folder2" = "/חשבוניות"; +"snapshots.fileprovider.folder1" = "/תעודות"; +"snapshots.main.vault1" = "/עבודה"; +"snapshots.main.vault2" = "/משפחה"; +"snapshots.main.vault3" = "/מסמכים"; +"snapshots.main.vault4" = "/טיול לקליפורניה"; "s3Authentication.displayName" = "שם תצוגה"; "s3Authentication.accessKey" = "מפתח גישה"; @@ -80,9 +213,35 @@ "s3Authentication.endpoint" = "נקודת גישה"; "s3Authentication.region" = "אזור"; "s3Authentication.error.invalidCredentials" = "פרטי התחברות שגויים."; +"s3Authentication.error.invalidEndpoint" = "היעד שסופק אינו מתאים למבנה של כתובת אתר."; + +"trialStatus.active" = "פעיל"; +"trialStatus.expired" = "פג תוקף"; "unlockVault.button.unlock" = "בטל נעילה"; +"unlockVault.button.unlockVia" = "שחרר נעילה דרך %@"; +"unlockVault.password.footer" = "הכנס/י סיסמה ל-\"%@\"."; +"unlockVault.enableBiometricalUnlock.switch" = "הפעלת %@"; +"unlockVault.enableBiometricalUnlock.footer" = "במקום לשחרר את נעילה הכספת עם הסיסמה שלך, ניתן לבצע שחרור נעילה דרך %@."; +"unlockVault.evaluatePolicy.reason" = "שחרר את נעילה הכספת שלך"; +"unlockVault.progress" = "משחרר נעילה…"; + +"untrustedTLSCertificate.title" = "תעודת תקשורת TLS לא חוקית"; +"untrustedTLSCertificate.message" = "תעודת התקשורת TLS של ״%@״ לא חוקית. האם ברצונך לסמוך עליה בכל זאת?\n\n SHA-256: %@"; +"untrustedTLSCertificate.add" = "סמוך"; +"untrustedTLSCertificate.dismiss" = "אל תסמוך"; + +"upgrade.title" = "הצעת שדרוג"; +"upgrade.notEligible.alert.title" = "השדרוג נכשל"; +"upgrade.notEligible.alert.message" = "Cryptomator לא זיהה גרסה ישנה יותר המותקנת על המכשיר. אם קנית אותו, אנא הורד אותו שוב מחנות האפליקציות ונסה שוב."; "upgrade.info" = "תודה על התמיכה ב-Cryptomator מהגירסה הראשונה. לאות הערכה, יש לך זכאות לשדרוג חינם."; + +"urlSession.error.httpError.401" = "שם משתמש ו/או סיסמה שגויים."; +"urlSession.error.httpError.403" = "חסרות הרשאות לגשת למשאב."; +"urlSession.error.httpError.404" = "המשאב המבוקש לא נמצא."; +"urlSession.error.httpError.405" = "השיטה המבוקשת אינה נתמכת על ידי משאב היעד."; +"urlSession.error.httpError.409" = "יש קונפליקט בין המצב הקיים לזה של משאב היעד."; +"urlSession.error.httpError.412" = "הגישה למשאב היעד סורבה."; "urlSession.error.httpError.default" = "חיבור לרשת נכשל עם קוד שגיאה %ld."; "urlSession.error.unexpectedResponse" = "אירעה שגיאת רשת בלתי צפויה."; @@ -94,9 +253,37 @@ "vaultDetail.button.removeVault" = "הסרת מרשימת הכספות"; "vaultDetail.button.renameVault" = "שנה שם"; "vaultDetail.changePassword.footer" = "יש לבחור סיסמה חזקה הידועה רק לך ולשמור אותה במקום בטוח."; +"vaultDetail.disabledBiometricalUnlock.footer" = "אם תאפשר %@, סיסמת הכספת תשמר בצרור המפתחות של iOS."; +"vaultDetail.enabledBiometricalUnlock.footer" = "סיסמת הכספת תדרש רק אם אימות %@ יכשל."; +"vaultDetail.info.footer.accessVault" = "הגישה אל הכספת מבוצעת דרך ישום Files."; +"vaultDetail.info.footer.accountInfo" = "מחובר כ- %@ דרך %@."; +"vaultDetail.keepUnlocked.title" = "משך שחרור נעילה"; +"vaultDetail.keepUnlocked.footer.off" = "שחרור נעילה ידרש כאשר Cryptomator יסגר על ידי הישום Files."; +"vaultDetail.keepUnlocked.footer.limitedDuration" = "שחרור נעילה ידרש כאשר הכספת ללא פעילות למשך %@."; +"vaultDetail.keepUnlocked.footer.unlimitedDuration" = "לא ידרש שחרור נעילה אלא אם יבוצע נעילה ידנית."; +"vaultDetail.locked.footer" = "הכספת שלך כרגע נעולה."; +"vaultDetail.moveVault.detectedMasterkey.text" = "Cryptomator זיהה כספת קיימת במיקום זה.\nכדי ליצר כספת חדשה חזרו אחורה ובחרו תיקיה אחרת."; +"vaultDetail.moveVault.progress" = "מעביר…"; +"vaultDetail.removeVault.footer" = "זה רק יסיר את הכספת מרשימת הכספות ולא ימחק קבצים מוצפנים."; +"vaultDetail.renameVault.progress" = "משנה שם…"; +"vaultDetail.unlocked.footer" = "הכספת שלך כרגע לא נעולה בישום Files."; +"vaultDetail.unlockVault.footer" = "הקש סיסמה עבור ״%@״ לשמירתה בצרור המפתחות של iOS ולהפעלת %@."; + +"vaultList.header.title" = "כספות"; +"vaultList.emptyList.message" = "לחץ כאן להוספת כספת"; +"vaultList.remove.alert.title" = "הסר כספת?"; +"vaultList.remove.alert.message" = "זה רק יסיר את הכספת מרשימת הכספות ולא ימחק מידע מוצפן. אתה יכול להוסיף מחדש את הכספת בהמשך."; + +"vaultProviderFactory.error.unsupportedVaultConfig" = "תצורת הכספת אינה נתמכת. אנא ודא שאתה מריץ את הגרסה האחרונה של Cryptomator."; +"vaultProviderFactory.error.unsupportedVaultVersion" = "גרסת כספת %ld אינה נתמכת. כספת זו נוצרה עם גרסה ישנה או חדשה יותר של Cryptomator."; "webDAVAuthentication.httpConnection.alert.title" = "להשתמש ב-HTTPS?"; "webDAVAuthentication.httpConnection.alert.message" = "HTTP הוא פרוטוקול לא מאובטח. אנו ממליצים להשתמש ב HTTPS במקום. אם אתה מבין את הסיכונים בכך, אתה יכול להמשיך להשתמש ב HTTP."; "webDAVAuthentication.httpConnection.change" = "עבור ל-HTTPS"; +"webDAVAuthentication.httpConnection.continue" = "להשאיר HTTP"; + +"webDAVAuthenticator.error.unsupportedProtocol" = "נראה שהשרת אינו תואם WebDAV. ודא שהשתמשת בכתובת הנכונה."; +"webDAVAuthenticator.error.untrustedCertificate" = "התעודה של שרת זה אינה מהימנה. יתכן שתצטרך להוסיף מחדש את קישוריות WebDAV הזו."; "Retry Upload" = "לנסות העלאה שוב"; +"Clear from Cache" = "נקה מהמטמון"; diff --git a/SharedResources/zh-HK.lproj/Localizable.strings b/SharedResources/zh-HK.lproj/Localizable.strings index b83f02eab..97a46b73b 100644 --- a/SharedResources/zh-HK.lproj/Localizable.strings +++ b/SharedResources/zh-HK.lproj/Localizable.strings @@ -30,6 +30,7 @@ "common.cells.url" = "網址"; "common.cells.username" = "使用者名稱"; "common.footer.learnMore" = "了解更多。"; +"common.hud.authenticating" = "驗證中..."; "accountList.header.title" = "認證"; "accountList.emptyList.message" = "點擊此處添加帳號"; @@ -212,6 +213,8 @@ "s3Authentication.existingBucket" = "現有儲存槽(Bucket)"; "s3Authentication.endpoint" = "終端節點(Endpoint)"; "s3Authentication.region" = "地域(Region)"; +"s3Authentication.error.invalidCredentials" = "憑證無效。"; +"s3Authentication.error.invalidEndpoint" = "所提供的端點不符合 URL 格式。"; "trialStatus.active" = "生效中"; "trialStatus.expired" = "已過期"; @@ -225,7 +228,7 @@ "unlockVault.progress" = "解鎖中…"; "untrustedTLSCertificate.title" = "無效的 TLS 憑證"; -"untrustedTLSCertificate.message" = "「%@」的 TLS 證書無效。您還是要信任它嗎?\n\nSHA-256: %@"; +"untrustedTLSCertificate.message" = "「%@」的 TLS 憑證無效。您還是要信任它嗎?\n\nSHA-256: %@"; "untrustedTLSCertificate.add" = "信任"; "untrustedTLSCertificate.dismiss" = "不信任"; diff --git a/SharedResources/zh-Hans.lproj/Localizable.strings b/SharedResources/zh-Hans.lproj/Localizable.strings index 91a26f3bb..695e47f50 100644 --- a/SharedResources/zh-Hans.lproj/Localizable.strings +++ b/SharedResources/zh-Hans.lproj/Localizable.strings @@ -35,7 +35,7 @@ "accountList.header.title" = "身份验证"; "accountList.emptyList.message" = "点击此处添加保险库"; "accountList.signOut.alert.title" = "移除关联的保险库吗?"; -"accountList.signOut.alert.message" = "登出后,所有关联的保险库将从保险库列表中移除。未加密的数据将被删除,您可以以后再登录并重新添加保险库"; +"accountList.signOut.alert.message" = "登出后,所有关联的保险库将从保险库列表中移除。未加密的数据将被删除,您可以重新登录并添加保险库。"; "addVault.title" = "添加保险库"; "addVault.createNewVault.title" = "新建保险库"; @@ -67,7 +67,7 @@ "biometryType.touchID" = "触控 ID"; "changePassword.error.invalidOldPassword" = "当前密码错误,请重试。"; -"changePassword.header.currentPassword.title" = "请输入当前密码"; +"changePassword.header.currentPassword.title" = "请输入当前密码。"; "changePassword.header.newPassword.title" = "输入新密码。"; "changePassword.header.newPasswordConfirmation.title" = "确认新密码。"; "changePassword.progress" = "正在修改密码……"; @@ -87,7 +87,7 @@ "cloudProvider.error.unauthorized" = "无法执行未经授权的操作。"; "cloudProvider.error.noInternetConnection" = "此操作需要网络连接。"; -"cloudProviderType.localFileSystem" = "其他文件提供商"; +"cloudProviderType.localFileSystem" = "其他文件存储提供商"; "fileProvider.onboarding.title" = "欢迎使用"; "fileProvider.onboarding.info" = "感谢您选择 Cryptomator 来保护您的文件。若要开始,请前往主应用程序并添加一个保险库。"; @@ -103,25 +103,25 @@ "fileProvider.clearFileFromCache.message" = "该操作仅会删除设备中的本地文件,不会删除云存储中的文件"; "fileProvider.fileImporting.error.missingPremium" = "在 Cryptomator 应用中解锁完整版以获取保险库写入权限"; "fileProvider.uploadProgress.connecting" = "正在连接…"; -"fileProvider.uploadProgress.message" = "当前进度:%@\n\n若发现上传进度卡住,请重试上传"; -"fileProvider.uploadProgress.missing" = "无法确定上传进度,可能仍在后台运行"; +"fileProvider.uploadProgress.message" = "当前进度:%@\n\n若发现上传进度卡住,请重新尝试上传。"; +"fileProvider.uploadProgress.missing" = "无法确定上传进度,它可能仍在后台运行。"; "fileProvider.uploadProgress.title" = "正在上传…"; -"fileProvider.uploadProgress.missingDomainError" = "找不到域名"; +"fileProvider.uploadProgress.missingDomainError" = "找不到域名。"; -"getFolderIntent.error.missingPath" = "未提供路径,请提供文件夹应返回的有效路径"; -"getFolderIntent.error.noVaultSelected" = "未选择任何保险库"; -"intents.saveFile.missingFile" = "提供的文件无效"; -"intents.saveFile.invalidFolder" = "提供的文件夹无效"; -"intents.saveFile.missingTemporaryFolder" = "无法创建临时文件夹"; -"intents.saveFile.lockedVault" = "你需要解锁保险库才能使用此快捷方式"; -"intents.saveFile.selectedVaultNotFound" = "找不到选定的保险库"; +"getFolderIntent.error.missingPath" = "未提供路径,请提供文件夹应转到的有效路径。"; +"getFolderIntent.error.noVaultSelected" = "未选择任何保险库。"; +"intents.saveFile.missingFile" = "提供的文件无效。"; +"intents.saveFile.invalidFolder" = "提供的文件夹无效。"; +"intents.saveFile.missingTemporaryFolder" = "无法创建临时文件夹。"; +"intents.saveFile.lockedVault" = "你需要解锁保险库才能使用此快捷方式。"; +"intents.saveFile.selectedVaultNotFound" = "找不到选定的保险库。"; "keepUnlocked.alert.title" = "锁定保险库?"; "keepUnlocked.alert.message" = "此更改需要锁定您的保险库才能生效。"; "keepUnlocked.alert.confirm" = "确认并立即锁定"; "keepUnlocked.header" = "指定您希望此保险库的解锁状态在空闲时最长持续多久。"; -"keepUnlocked.footer.auto" = "交由 iOS 决定意味着 Cryptomator 可能随时被终止以释放内存,释放将自动锁定保险库。"; -"keepUnlocked.footer.on" = "选中此选项后,保险库解锁时会将您的密钥副本在 iOS 密钥链中存储。"; +"keepUnlocked.footer.auto" = "交由 iOS 决定意味着 Cryptomator 可能随时被终止以释放内存,释放操作将自动锁定保险库。"; +"keepUnlocked.footer.on" = "选中此选项后,保险库解锁时会将您的密钥副本在 iOS 钥匙串中存储。"; "keepUnlockedDuration.auto" = "由 iOS 自动决定"; "keepUnlockedDuration.auto.shortDisplayName" = "自动"; "keepUnlockedDuration.indefinite" = "不限时"; @@ -169,7 +169,7 @@ "purchase.restorePurchase.fullVersionFound.alert.title" = "恢复成功"; "purchase.restorePurchase.fullVersionNotFound.alert.title" = "未购买完整版"; "purchase.restorePurchase.fullVersionNotFound.alert.message" = "我们无法找到可供恢复的完整版本。请尝试其他选项。"; -"purchase.restorePurchase.eligibleForUpgrade.alert.title" = "升级资格"; +"purchase.restorePurchase.eligibleForUpgrade.alert.title" = "可以升级"; "purchase.restorePurchase.eligibleForUpgrade.alert.message" = "似乎您正在从 Cryptomator 的旧版本进行升级。在这种情况下,请选择“升级优惠”选项。"; "purchase.retry.button" = "重试"; "purchase.retry.footer" = "无法加载可用产品。"; @@ -186,7 +186,7 @@ "settings.cloudServices" = "云服务"; "settings.contact" = "联系"; "settings.debugMode" = "调试模式"; -"settings.debugMode.alert.message" = "在此模式下,敏感数据可能会写入您设备上的日志文件 (例如文件名和路径)。密码、cookies等除外\n\n请记住要尽快关闭调试模式"; +"settings.debugMode.alert.message" = "在此模式下,敏感数据可能会写入您设备上的日志文件 (例如文件名和路径)。密码、cookies等除外。\n\n请记得要尽快关闭调试模式。"; "settings.manageSubscriptions" = "管理订阅"; "settings.rateApp" = "给应用评分"; "settings.sendLogFile" = "发送日志文件"; @@ -210,9 +210,9 @@ "s3Authentication.accessKey" = "通行密钥"; "s3Authentication.secretKey" = "私钥"; "s3Authentication.existingBucket" = "现有 Bucket"; -"s3Authentication.endpoint" = "端点"; +"s3Authentication.endpoint" = "终端"; "s3Authentication.region" = "区域"; -"s3Authentication.error.invalidCredentials" = "无效凭证"; +"s3Authentication.error.invalidCredentials" = "无效凭证。"; "s3Authentication.error.invalidEndpoint" = "提供的端点与URL格式不匹配。"; "trialStatus.active" = "进行中"; @@ -234,7 +234,7 @@ "upgrade.title" = "升级优惠"; "upgrade.notEligible.alert.title" = "升级失败"; "upgrade.notEligible.alert.message" = "Cryptomator 未能检测到您设备安装有旧版本。如果您购买过它,请从 App Store 重新下载后再试。"; -"upgrade.info" = "感谢您从第一版开始就信任 Cryptomator。作为忠实用户,您有资格获得免费升级"; +"upgrade.info" = "感谢您从第一版开始就信任 Cryptomator。作为忠实用户,您有资格获得免费升级。"; "urlSession.error.httpError.401" = "用户名或密码错误。"; "urlSession.error.httpError.403" = "对请求的资源权限不足。"; @@ -267,7 +267,7 @@ "vaultDetail.removeVault.footer" = "这只会从保险库列表中移除,并不会删除任何加密文件。"; "vaultDetail.renameVault.progress" = "正在重命名……"; "vaultDetail.unlocked.footer" = "您的保险库目前已在文件应用中解锁。"; -"vaultDetail.unlockVault.footer" = "请输入 \"%@\" 的密码以将其存储到 iOS 密钥链并启用 %@。"; +"vaultDetail.unlockVault.footer" = "请输入 \"%@\" 的密码以将其存储到 iOS 钥匙串并启用 %@。"; "vaultList.header.title" = "保险库"; "vaultList.emptyList.message" = "点击此处添加保险库"; @@ -278,12 +278,12 @@ "vaultProviderFactory.error.unsupportedVaultVersion" = "不支持的保险库版本 %ld。这可能是使用太新或太旧的 Cryptomator 版本创建的保险库。"; "webDAVAuthentication.httpConnection.alert.title" = "使用 HTTPS?"; -"webDAVAuthentication.httpConnection.alert.message" = "HTTP 不安全,我们建议使用 HTTPS。如果您知道其中风险,您可以继续使用 HTTP"; +"webDAVAuthentication.httpConnection.alert.message" = "HTTP 不安全,我们建议使用 HTTPS。如果您知道其中风险,您可以继续使用 HTTP。"; "webDAVAuthentication.httpConnection.change" = "换成 HTTPS"; "webDAVAuthentication.httpConnection.continue" = "保持 HTTP"; -"webDAVAuthenticator.error.unsupportedProtocol" = "服务器似乎不兼容 WebDAV,请检查链接是否正确"; -"webDAVAuthenticator.error.untrustedCertificate" = "此服务器的证书不受信任,你可能需要重新添加此 WebDAV 连接"; +"webDAVAuthenticator.error.unsupportedProtocol" = "服务器似乎不兼容 WebDAV,请检查链接是否正确。"; +"webDAVAuthenticator.error.untrustedCertificate" = "此服务器的证书不受信任,你可能需要重新添加此 WebDAV 连接。"; "Retry Upload" = "重试上传"; "Clear from Cache" = "清除缓存"; diff --git a/SharedResources/zh-Hant.lproj/Localizable.strings b/SharedResources/zh-Hant.lproj/Localizable.strings index b757a6b89..194b20c31 100644 --- a/SharedResources/zh-Hant.lproj/Localizable.strings +++ b/SharedResources/zh-Hant.lproj/Localizable.strings @@ -19,14 +19,14 @@ "common.button.download" = "下載"; "common.button.edit" = "編輯"; "common.button.enable" = "啟用"; -"common.button.next" = "下一步"; +"common.button.next" = "繼續"; "common.button.ok" = "確認"; "common.button.remove" = "移除"; "common.button.retry" = "重試"; "common.button.signOut" = "登出"; "common.button.verify" = "驗證"; "common.cells.openInFilesApp" = "在「檔案」應用程式中開啟"; -"common.cells.password" = "密码"; +"common.cells.password" = "密碼"; "common.cells.url" = "網址"; "common.cells.username" = "帳號"; "common.footer.learnMore" = "了解更多。"; @@ -38,12 +38,12 @@ "accountList.signOut.alert.message" = "登出後,所有關聯的加密檔案庫將從列表中移除。這並不會刪除任何加密數據。您可以稍後再次登入並重新添加加密檔案庫。"; "addVault.title" = "新增加密檔案庫"; -"addVault.createNewVault.title" = "创建新的保险库"; +"addVault.createNewVault.title" = "新建加密檔案庫"; "addVault.createNewVault.purchase" = "創建新的加密檔案庫需要 Cryptomator 完整版。"; "addVault.createNewVault.setVaultName.header.title" = "為加密檔案庫命名."; -"addVault.createNewVault.setVaultName.cells.name" = "保险库名称"; +"addVault.createNewVault.setVaultName.cells.name" = "加密檔案庫名稱"; "addVault.createNewVault.setVaultName.error.emptyVaultName" = "加密檔案庫名稱不可留空。"; -"addVault.createNewVault.chooseCloud.header" = "Cryptomator 应该在哪里存储您保险库的加密文件?"; +"addVault.createNewVault.chooseCloud.header" = "Cryptomator 應該將您加密後的檔案存放在哪裡?"; "addVault.createNewVault.chooseFolder.error.vaultNameCollision" = "“%@”已經在此位置,請更換加密檔案庫名或位置"; "addVault.createNewVault.detectedMasterkey.text" = "Cryptomator 在此檢測到現有的加密檔案庫。\n如要建立新的加密檔案庫,請返回並選擇其他資料夾。"; "addVault.createNewVault.password.enterPassword.header" = "輸入新密碼."; @@ -98,7 +98,7 @@ "fileProvider.error.biometricalAuthWrongPassword.message" = "保存在%@的密碼錯誤,請重試並輸入你的密碼來重新啟用%@"; "fileProvider.error.defaultLock.title" = "需要解鎖"; "fileProvider.error.defaultLock.message" = "要存取加密庫和顯示其內容,需要先解鎖。"; -"fileProvider.error.unlockButton" = "解锁"; +"fileProvider.error.unlockButton" = "解鎖"; "fileProvider.clearFileFromCache.title" = "清除快取檔䅁"; "fileProvider.clearFileFromCache.message" = "這只會從您的本機上刪除文件,而不會刪除雲端的文件。"; "fileProvider.fileImporting.error.missingPremium" = "解鎖 Cryptomator 完整版本以獲得寫入加密檔案庫的功能。"; @@ -183,7 +183,7 @@ "settings.aboutCryptomator" = "關於 Cryptomator"; "settings.aboutCryptomator.title" = "版本號%@(%@)"; "settings.cacheSize" = "緩存大小"; -"settings.clearCache" = "清除緩存"; +"settings.clearCache" = "清除快取"; "settings.cloudServices" = "雲端服務"; "settings.contact" = "聯絡方式"; "settings.debugMode" = "調試模式"; @@ -213,13 +213,13 @@ "s3Authentication.existingBucket" = "現有儲存槽(Bucket)"; "s3Authentication.endpoint" = "終端節點(Endpoint)"; "s3Authentication.region" = "地域(Region)"; -"s3Authentication.error.invalidCredentials" = "憑證無效"; -"s3Authentication.error.invalidEndpoint" = "所提供的端點不符合網址格式"; +"s3Authentication.error.invalidCredentials" = "憑證無效。"; +"s3Authentication.error.invalidEndpoint" = "所提供的端點不符合 URL 格式。"; "trialStatus.active" = "生效中"; "trialStatus.expired" = "已過期"; -"unlockVault.button.unlock" = "解锁"; +"unlockVault.button.unlock" = "解鎖"; "unlockVault.button.unlockVia" = "使用%@解鎖"; "unlockVault.password.footer" = "輸入 「%@」 的密碼:"; "unlockVault.enableBiometricalUnlock.switch" = "啓用 %@"; @@ -228,7 +228,7 @@ "unlockVault.progress" = "正在解鎖……"; "untrustedTLSCertificate.title" = "無效的 TLS 憑證"; -"untrustedTLSCertificate.message" = "「%@」的 TLS 證書無效。您還是要信任它嗎?\n\nSHA-256: %@"; +"untrustedTLSCertificate.message" = "「%@」的 TLS 憑證無效。您還是要信任它嗎?\n\nSHA-256: %@"; "untrustedTLSCertificate.add" = "信任"; "untrustedTLSCertificate.dismiss" = "不信任"; @@ -248,7 +248,7 @@ "vaultAccountManager.error.vaultAccountAlreadyExists" = "您已經添加了這個加密檔案庫。"; -"vaultDetail.button.changeVaultPassword" = "更改密码"; +"vaultDetail.button.changeVaultPassword" = "變更密碼"; "vaultDetail.button.lock" = "立即鎖定"; "vaultDetail.button.moveVault" = "移動"; "vaultDetail.button.removeVault" = "從加密檔案庫列表中移除"; From 06d6d7a0e1e76fdc84daa2a86d390e06756148a3 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Fri, 10 Mar 2023 16:39:11 +0100 Subject: [PATCH 2/5] Enabled Hebrew translation --- Cryptomator.xcodeproj/project.pbxproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Cryptomator.xcodeproj/project.pbxproj b/Cryptomator.xcodeproj/project.pbxproj index 2fe686661..dd6649595 100644 --- a/Cryptomator.xcodeproj/project.pbxproj +++ b/Cryptomator.xcodeproj/project.pbxproj @@ -1003,6 +1003,8 @@ 74AE94EF27A0282300D71AEC /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; 74AE94F027A0283500D71AEC /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; 74AE94F127A0285400D71AEC /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; + 74B46E5529BB8629000C1CC0 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; }; + 74B46E5629BB863C000C1CC0 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Intents.strings; sourceTree = ""; }; 74BDA62B26CE8AE1007FBD72 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; 74C2BC4726E8E21D00BCAA03 /* OnboardingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; }; 74C2BC4926E8E24A00BCAA03 /* OnboardingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingViewModel.swift; sourceTree = ""; }; @@ -2283,6 +2285,7 @@ el, es, fr, + he, hi, hr, id, @@ -3030,6 +3033,7 @@ 74275AD728478E050058AD25 /* el */, 74275AE428478E130058AD25 /* es */, 74275AD628478E040058AD25 /* fr */, + 74B46E5629BB863C000C1CC0 /* he */, 74275AD828478E060058AD25 /* hi */, 74275AD328478E010058AD25 /* hr */, 74275AD928478E070058AD25 /* id */, @@ -3075,6 +3079,7 @@ 74267A0326A5793E004C61BC /* el */, 74267A0426A57944004C61BC /* es */, 74267A0526A57947004C61BC /* fr */, + 74B46E5529BB8629000C1CC0 /* he */, 74A1B13D2726A9E60098224B /* hi */, 74E93B75281010E50047A116 /* hr */, 74AE94F127A0285400D71AEC /* id */, From 60c373c7423e1f4cd8a7fd63339b3177f845bec6 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Fri, 10 Mar 2023 16:52:58 +0100 Subject: [PATCH 3/5] Fixed format --- ...teNewVaultChooseFolderViewController.swift | 2 +- .../SetVaultNameViewController.swift | 2 +- Cryptomator/Common/CloudAuthenticator.swift | 2 +- .../Manager/MasterkeyCacheManager.swift | 2 +- .../Manager/VaultDBManager.swift | 10 ++++---- .../Manager/VaultKeepUnlockedManager.swift | 4 ++-- .../ItemNameValidatorTests.swift | 6 ++--- .../Manager/VaultDBCacheTests.swift | 2 +- .../Manager/VaultManagerTests.swift | 4 ++-- .../DB/MaintenanceManagerTests.swift | 14 +++++------ .../DB/MetadataManagerTests.swift | 12 +++++----- ...leProviderAdapterImportDocumentTests.swift | 6 ++--- .../FileProviderAdapterMoveItemTests.swift | 24 +++++++++---------- .../FileProviderEnumeratorTests.swift | 8 +++---- .../UnlockVaultViewModel.swift | 2 +- 15 files changed, 50 insertions(+), 50 deletions(-) diff --git a/Cryptomator/AddVault/CreateNewVault/CreateNewVaultChooseFolderViewController.swift b/Cryptomator/AddVault/CreateNewVault/CreateNewVaultChooseFolderViewController.swift index 91687ad69..313937f16 100644 --- a/Cryptomator/AddVault/CreateNewVault/CreateNewVaultChooseFolderViewController.swift +++ b/Cryptomator/AddVault/CreateNewVault/CreateNewVaultChooseFolderViewController.swift @@ -43,7 +43,7 @@ class CreateNewVaultChooseFolderViewController: ChooseFolderViewController { return } do { - coordinator?.chooseItem(try viewModel.chooseCurrentFolder()) + try coordinator?.chooseItem(viewModel.chooseCurrentFolder()) } catch { coordinator?.handleError(error, for: self) } diff --git a/Cryptomator/AddVault/CreateNewVault/SetVaultNameViewController.swift b/Cryptomator/AddVault/CreateNewVault/SetVaultNameViewController.swift index a064c2941..449aaaa03 100644 --- a/Cryptomator/AddVault/CreateNewVault/SetVaultNameViewController.swift +++ b/Cryptomator/AddVault/CreateNewVault/SetVaultNameViewController.swift @@ -31,7 +31,7 @@ class SetVaultNameViewController: SingleSectionStaticUITableViewController { @objc func nextButtonClicked() { do { - coordinator?.setVaultName(try viewModel.getValidatedVaultName()) + try coordinator?.setVaultName(viewModel.getValidatedVaultName()) } catch { coordinator?.handleError(error, for: self) } diff --git a/Cryptomator/Common/CloudAuthenticator.swift b/Cryptomator/Common/CloudAuthenticator.swift index 433c1af4f..be92c3a1e 100644 --- a/Cryptomator/Common/CloudAuthenticator.swift +++ b/Cryptomator/Common/CloudAuthenticator.swift @@ -37,7 +37,7 @@ class CloudAuthenticator { func authenticateGoogleDrive(from viewController: UIViewController) -> Promise { let credential = GoogleDriveCredential() return GoogleDriveAuthenticator.authenticate(credential: credential, from: viewController).then { () -> CloudProviderAccount in - let account = CloudProviderAccount(accountUID: try credential.getAccountID(), cloudProviderType: .googleDrive) + let account = try CloudProviderAccount(accountUID: credential.getAccountID(), cloudProviderType: .googleDrive) try self.accountManager.saveNewAccount(account) return account } diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/MasterkeyCacheManager.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/MasterkeyCacheManager.swift index 5a86cc6af..5703e713d 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/MasterkeyCacheManager.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/MasterkeyCacheManager.swift @@ -30,7 +30,7 @@ public class MasterkeyCacheKeychainManager: MasterkeyCacheManager { public func cacheMasterkey(_ masterkey: Masterkey, forVaultUID vaultUID: String) throws { let cachedMasterkey = CachedMasterkey(rawKey: masterkey.rawKey) let jsonEncoder = JSONEncoder() - try keychain.set(vaultUID, value: try jsonEncoder.encode(cachedMasterkey)) + try keychain.set(vaultUID, value: jsonEncoder.encode(cachedMasterkey)) } public func getMasterkey(forVaultUID vaultUID: String) throws -> Masterkey? { diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultDBManager.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultDBManager.swift index 3bfdbc425..3c00887dd 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultDBManager.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultDBManager.swift @@ -84,7 +84,7 @@ public class VaultDBManager: VaultManager { try FileManager.default.createDirectory(at: tmpDirURL, withIntermediateDirectories: true) masterkey = try Masterkey.createNew() vaultConfigToken = try vaultConfig.toToken(keyId: "masterkeyfile:masterkey.cryptomator", rawKey: masterkey.rawKey) - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: delegateAccountUID)) let masterkeyFileData = try exportMasterkey(masterkey, vaultVersion: VaultDBManager.fakeVaultVersion, password: password) cachedVault = CachedVault(vaultUID: vaultUID, masterkeyFileData: masterkeyFileData, vaultConfigToken: vaultConfigToken, lastUpToDateCheck: Date(), masterkeyFileLastModifiedDate: nil, vaultConfigLastModifiedDate: nil) } catch { @@ -187,7 +187,7 @@ public class VaultDBManager: VaultManager { public func createFromExisting(withVaultUID vaultUID: String, delegateAccountUID: String, vaultItem: VaultItem, password: String, storePasswordInKeychain: Bool) -> Promise { let provider: LocalizedCloudProviderDecorator do { - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: delegateAccountUID)) } catch { return Promise(error) } @@ -234,7 +234,7 @@ public class VaultDBManager: VaultManager { public func createLegacyFromExisting(withVaultUID vaultUID: String, delegateAccountUID: String, vaultItem: VaultItem, password: String, storePasswordInKeychain: Bool) -> Promise { let provider: LocalizedCloudProviderDecorator do { - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: delegateAccountUID)) } catch { return Promise(error) } @@ -364,7 +364,7 @@ public class VaultDBManager: VaultManager { } let provider: CloudProvider do { - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: account.delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: account.delegateAccountUID)) } catch { return Promise(error) } @@ -392,7 +392,7 @@ public class VaultDBManager: VaultManager { masterkeyFileData = try changePassphrase(masterkeyFileData: cachedVault.masterkeyFileData, oldPassphrase: oldPassphrase, newPassphrase: newPassphrase) vaultAccount = try vaultAccountManager.getAccount(with: vaultUID) try FileManager.default.createDirectory(at: tmpDirURL, withIntermediateDirectories: true) - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: vaultAccount.delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: vaultAccount.delegateAccountUID)) } catch { return Promise(error) } diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultKeepUnlockedManager.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultKeepUnlockedManager.swift index ddacebb46..63dc51b48 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultKeepUnlockedManager.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/Manager/VaultKeepUnlockedManager.swift @@ -93,7 +93,7 @@ extension VaultKeepUnlockedManager: VaultKeepUnlockedSettings { public func setKeepUnlockedDuration(_ duration: KeepUnlockedDuration, forVaultUID vaultUID: String) throws { let jsonEncoder = JSONEncoder() - try keychain.set(getKeepUnlockedDurationKey(forVaultUID: vaultUID), value: try jsonEncoder.encode(duration)) + try keychain.set(getKeepUnlockedDurationKey(forVaultUID: vaultUID), value: jsonEncoder.encode(duration)) } public func removeKeepUnlockedDuration(forVaultUID vaultUID: String) throws { @@ -112,7 +112,7 @@ extension VaultKeepUnlockedManager: VaultKeepUnlockedSettings { public func setLastUsedDate(_ date: Date, forVaultUID vaultUID: String) throws { let jsonEncoder = JSONEncoder() - try keychain.set(getLastUsedDateKey(forVaultUID: vaultUID), value: try jsonEncoder.encode(date)) + try keychain.set(getLastUsedDateKey(forVaultUID: vaultUID), value: jsonEncoder.encode(date)) } private func getKeepUnlockedDurationKey(forVaultUID vaultUID: String) -> String { diff --git a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/ItemNameValidatorTests.swift b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/ItemNameValidatorTests.swift index b2e8c91d0..44a9243e4 100644 --- a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/ItemNameValidatorTests.swift +++ b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/ItemNameValidatorTests.swift @@ -12,8 +12,8 @@ import XCTest class ItemNameValidatorTests: XCTestCase { func testValidateItemName() throws { try ItemNameValidator.validateName("foo..pages") - assertThrowsItemNameValidatorError(try ItemNameValidator.validateName("foo."), expectedError: .nameEndsWithPeriod) - assertThrowsItemNameValidatorError(try ItemNameValidator.validateName("foo "), expectedError: .nameEndsWithSpace) + try assertThrowsItemNameValidatorError(ItemNameValidator.validateName("foo."), expectedError: .nameEndsWithPeriod) + try assertThrowsItemNameValidatorError(ItemNameValidator.validateName("foo "), expectedError: .nameEndsWithSpace) } func testValidateItemNameIllegalCharacter() throws { @@ -46,7 +46,7 @@ class ItemNameValidatorTests: XCTestCase { } private func assertThrowsIllegalCharacterErrorWhenValidating(_ name: String, illegalCharacter: String) { - assertThrowsItemNameValidatorError(try ItemNameValidator.validateName(name), expectedError: .nameContainsIllegalCharacter(illegalCharacter)) + try assertThrowsItemNameValidatorError(ItemNameValidator.validateName(name), expectedError: .nameContainsIllegalCharacter(illegalCharacter)) } private func assertThrowsItemNameValidatorError(_ expression: @autoclosure () throws -> Void, expectedError: ItemNameValidatorError) { diff --git a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultDBCacheTests.swift b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultDBCacheTests.swift index 6b63efadb..78f2de195 100644 --- a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultDBCacheTests.swift +++ b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultDBCacheTests.swift @@ -276,7 +276,7 @@ class VaultDBCacheTests: XCTestCase { } else { data = updatedVaultConfigData } - return Promise(try data.write(to: downloadDestination)) + return try Promise(data.write(to: downloadDestination)) } private func defaultFetchItemMetadataMock(_ cloudPath: CloudPath) -> Promise { diff --git a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultManagerTests.swift b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultManagerTests.swift index 54e31a2ad..bd12cf3cc 100644 --- a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultManagerTests.swift +++ b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Manager/VaultManagerTests.swift @@ -117,7 +117,7 @@ class VaultManagerTests: XCTestCase { XCTAssertTrue(cloudProviderMock.createdFolders[2].hasPrefix(CloudPath("/Vault/d/").path) && cloudProviderMock.createdFolders[2].count == 11) XCTAssertTrue(cloudProviderMock.createdFolders[3].hasPrefix(cloudProviderMock.createdFolders[2] + "/") && cloudProviderMock.createdFolders[3].count == 42) - let uploadedMasterkeyFile = try MasterkeyFile.withContentFromData(data: try getUploadedMasterkeyFileData()) + let uploadedMasterkeyFile = try MasterkeyFile.withContentFromData(data: getUploadedMasterkeyFileData()) XCTAssertEqual(999, uploadedMasterkeyFile.version) let uploadedMasterkey = try uploadedMasterkeyFile.unlock(passphrase: "pw") @@ -657,7 +657,7 @@ class VaultManagerTests: XCTestCase { .filter { $0.cloudPath == cloudPath } .map { cloudProviderMock.tmpDir.appendingPathComponent($0.cloudPath) } .first - return try Data(contentsOf: try XCTUnwrap(uploadedFileURL)) + return try Data(contentsOf: XCTUnwrap(uploadedFileURL)) } } diff --git a/CryptomatorFileProviderTests/DB/MaintenanceManagerTests.swift b/CryptomatorFileProviderTests/DB/MaintenanceManagerTests.swift index e072973bb..1065ab970 100644 --- a/CryptomatorFileProviderTests/DB/MaintenanceManagerTests.swift +++ b/CryptomatorFileProviderTests/DB/MaintenanceManagerTests.swift @@ -50,7 +50,7 @@ class MaintenanceManagerTests: XCTestCase { // Prevent INSERT try manager.enableMaintenanceMode() - checkThrowsMaintenanceError(try uploadTaskManager.createNewTaskRecord(for: itemMetadata)) + try checkThrowsMaintenanceError(uploadTaskManager.createNewTaskRecord(for: itemMetadata)) } func testPreventCreatingReparentTasks() throws { @@ -59,7 +59,7 @@ class MaintenanceManagerTests: XCTestCase { // Prevent INSERT try manager.enableMaintenanceMode() - checkThrowsMaintenanceError(try reparentTaskManager.createTaskRecord(for: itemMetadata, targetCloudPath: CloudPath("Foo"), newParentID: 1)) + try checkThrowsMaintenanceError(reparentTaskManager.createTaskRecord(for: itemMetadata, targetCloudPath: CloudPath("Foo"), newParentID: 1)) } func testPreventCreatingDeletionTasks() throws { @@ -68,7 +68,7 @@ class MaintenanceManagerTests: XCTestCase { // Prevent INSERT try manager.enableMaintenanceMode() - checkThrowsMaintenanceError(try deletionTaskManager.createTaskRecord(for: itemMetadata)) + try checkThrowsMaintenanceError(deletionTaskManager.createTaskRecord(for: itemMetadata)) } func testPreventCreatingItemEnumerationTasks() throws { @@ -77,7 +77,7 @@ class MaintenanceManagerTests: XCTestCase { // Prevent INSERT try manager.enableMaintenanceMode() - checkThrowsMaintenanceError(try itemEnumerationTaskManager.createTask(for: itemMetadata, pageToken: nil)) + try checkThrowsMaintenanceError(itemEnumerationTaskManager.createTask(for: itemMetadata, pageToken: nil)) } func testPreventCreatingDownloadTasks() throws { @@ -86,7 +86,7 @@ class MaintenanceManagerTests: XCTestCase { // Prevent INSERT try manager.enableMaintenanceMode() - checkThrowsMaintenanceError(try downloadTaskManager.createTask(for: itemMetadata, replaceExisting: true, localURL: URL(string: "/Test")!, onURLSessionTaskCreation: nil)) + try checkThrowsMaintenanceError(downloadTaskManager.createTask(for: itemMetadata, replaceExisting: true, localURL: URL(string: "/Test")!, onURLSessionTaskCreation: nil)) } // MARK: - Prevent enabling maintenance mode for running tasks @@ -157,7 +157,7 @@ class MaintenanceManagerTests: XCTestCase { func assertOnlyFalseAllowedForInsertOrUpdate() throws { // Prevent INSERT true - checkThrowsRunningTaskError(try manager.enableMaintenanceMode()) + try checkThrowsRunningTaskError(manager.enableMaintenanceMode()) // Allow INSERT false try manager.disableMaintenanceMode() @@ -166,6 +166,6 @@ class MaintenanceManagerTests: XCTestCase { try manager.disableMaintenanceMode() // Prevent UPDATE with true - checkThrowsRunningTaskError(try manager.enableMaintenanceMode()) + try checkThrowsRunningTaskError(manager.enableMaintenanceMode()) } } diff --git a/CryptomatorFileProviderTests/DB/MetadataManagerTests.swift b/CryptomatorFileProviderTests/DB/MetadataManagerTests.swift index 2118b89dc..0bb44192e 100644 --- a/CryptomatorFileProviderTests/DB/MetadataManagerTests.swift +++ b/CryptomatorFileProviderTests/DB/MetadataManagerTests.swift @@ -240,7 +240,7 @@ class MetadataManagerTests: XCTestCase { let id = try XCTUnwrap(itemMetadata.id) try manager.setTagData(to: tagData, forItemWithID: id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertEqual(tagData, cachedMetadata.tagData) } @@ -253,7 +253,7 @@ class MetadataManagerTests: XCTestCase { let id = try XCTUnwrap(itemMetadata.id) try manager.setTagData(to: nil, forItemWithID: id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertNil(cachedMetadata.tagData) } @@ -267,7 +267,7 @@ class MetadataManagerTests: XCTestCase { try manager.cacheMetadata(itemMetadata) let id = try XCTUnwrap(itemMetadata.id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertEqual(tagData, cachedMetadata.tagData) } @@ -281,7 +281,7 @@ class MetadataManagerTests: XCTestCase { let id = try XCTUnwrap(itemMetadata.id) try manager.setFavoriteRank(to: favoriteRank, forItemWithID: id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertEqual(favoriteRank, cachedMetadata.favoriteRank) } @@ -292,7 +292,7 @@ class MetadataManagerTests: XCTestCase { let id = try XCTUnwrap(itemMetadata.id) try manager.setFavoriteRank(to: nil, forItemWithID: id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertNil(cachedMetadata.favoriteRank) } @@ -306,7 +306,7 @@ class MetadataManagerTests: XCTestCase { try manager.cacheMetadata(itemMetadata) let id = try XCTUnwrap(itemMetadata.id) - let cachedMetadata = try XCTUnwrap(try manager.getCachedMetadata(for: id)) + let cachedMetadata = try XCTUnwrap(manager.getCachedMetadata(for: id)) XCTAssertEqual(favoriteRank, cachedMetadata.favoriteRank) } } diff --git a/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterImportDocumentTests.swift b/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterImportDocumentTests.swift index fb7323b30..2c83892f7 100644 --- a/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterImportDocumentTests.swift +++ b/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterImportDocumentTests.swift @@ -36,7 +36,7 @@ class FileProviderAdapterImportDocumentTests: FileProviderAdapterTestCase { // Check that file was copied to the url provided by the localURLProvider XCTAssert(FileManager.default.fileExists(atPath: expectedFileURL.path)) - let contentOfCopiedFile = String(data: try Data(contentsOf: expectedFileURL), encoding: .utf8) + let contentOfCopiedFile = try String(data: Data(contentsOf: expectedFileURL), encoding: .utf8) XCTAssertEqual(fileContent, contentOfCopiedFile) // Check that the original file was not altered XCTAssert(FileManager.default.contentsEqual(atPath: fileURL.path, andPath: expectedFileURL.path)) @@ -97,7 +97,7 @@ class FileProviderAdapterImportDocumentTests: FileProviderAdapterTestCase { // Check that existing file at the url provided by the localURLProvider was not overwritten XCTAssert(FileManager.default.fileExists(atPath: expectedFileURL.path)) - let contentOfCopiedFile = String(data: try Data(contentsOf: expectedFileURL), encoding: .utf8) + let contentOfCopiedFile = try String(data: Data(contentsOf: expectedFileURL), encoding: .utf8) XCTAssertEqual(existingFileContent, contentOfCopiedFile) XCTAssertEqual(1, metadataManagerMock.removedMetadataID.count) @@ -136,7 +136,7 @@ class FileProviderAdapterImportDocumentTests: FileProviderAdapterTestCase { XCTAssert(FileManager.default.fileExists(atPath: self.expectedFileURL.path)) let contentOfCopiedFile: String? do { - contentOfCopiedFile = String(data: try Data(contentsOf: self.expectedFileURL), encoding: .utf8) + contentOfCopiedFile = try String(data: Data(contentsOf: self.expectedFileURL), encoding: .utf8) } catch { XCTFail("Content of copied file failed with error: \(error)") return diff --git a/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterMoveItemTests.swift b/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterMoveItemTests.swift index ef62d2435..beba85c1d 100644 --- a/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterMoveItemTests.swift +++ b/CryptomatorFileProviderTests/FileProviderAdapter/FileProviderAdapterMoveItemTests.swift @@ -64,7 +64,7 @@ class FileProviderAdapterMoveItemTests: FileProviderAdapterTestCase { let itemID: Int64 = 2 let itemMetadata = ItemMetadata(id: itemID, name: "Test.txt", type: .file, size: nil, parentID: NSFileProviderItemIdentifier.rootContainerDatabaseValue, lastModifiedDate: nil, statusCode: .isUploaded, cloudPath: sourceCloudPath, isPlaceholderItem: false) metadataManagerMock.cachedMetadata[itemID] = itemMetadata - let itemIdentifier = NSFileProviderItemIdentifier(domainIdentifier: .test, itemID: try XCTUnwrap(itemMetadata.id)) + let itemIdentifier = try NSFileProviderItemIdentifier(domainIdentifier: .test, itemID: XCTUnwrap(itemMetadata.id)) let newName = "RenamedTest.txt" let result = try adapter.moveItemLocally(withIdentifier: itemIdentifier, toParentItemWithIdentifier: nil, newName: newName) let item = result.item @@ -232,17 +232,17 @@ class FileProviderAdapterMoveItemTests: FileProviderAdapterTestCase { try adapter.validateItemName("Foo Bar.pages") try adapter.validateItemName("Foo") try adapter.validateItemName(".foo") - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Foo."), localizedDescription: ItemNameValidatorError.nameEndsWithPeriod.localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Foo "), localizedDescription: ItemNameValidatorError.nameEndsWithSpace.localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo\\o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("\\").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo/o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("/").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo:o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter(":").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo*o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("*").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo?o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("?").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo\"o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("\"").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Foo"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter(">").localizedDescription) - assertThrowsInvalidNameCocoaError(try adapter.validateItemName("Fo|o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("|").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Foo."), localizedDescription: ItemNameValidatorError.nameEndsWithPeriod.localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Foo "), localizedDescription: ItemNameValidatorError.nameEndsWithSpace.localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo\\o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("\\").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo/o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("/").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo:o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter(":").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo*o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("*").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo?o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("?").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo\"o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("\"").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Foo"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter(">").localizedDescription) + try assertThrowsInvalidNameCocoaError(adapter.validateItemName("Fo|o"), localizedDescription: ItemNameValidatorError.nameContainsIllegalCharacter("|").localizedDescription) } private func assertThrowsInvalidNameCocoaError(_ expression: @autoclosure () throws -> Void, localizedDescription: String) { diff --git a/CryptomatorFileProviderTests/FileProviderEnumeratorTests.swift b/CryptomatorFileProviderTests/FileProviderEnumeratorTests.swift index c884bc775..ecc2721b1 100644 --- a/CryptomatorFileProviderTests/FileProviderEnumeratorTests.swift +++ b/CryptomatorFileProviderTests/FileProviderEnumeratorTests.swift @@ -42,7 +42,7 @@ class FileProviderEnumeratorTestCase: XCTestCase { } func createSyncAnchor(from date: Date, locked: Bool = false) throws -> NSFileProviderSyncAnchor { - return NSFileProviderSyncAnchor(try JSONEncoder().encode(SyncAnchor(invalidated: locked, date: date))) + return try NSFileProviderSyncAnchor(JSONEncoder().encode(SyncAnchor(invalidated: locked, date: date))) } func createFullyMockedEnumerator(for itemIdentifier: NSFileProviderItemIdentifier) -> FileProviderEnumerator { @@ -159,9 +159,9 @@ class FileProviderEnumeratorTests: FileProviderEnumeratorTestCase { } enumerator.enumerateChanges(for: changeObserverMock, from: syncAnchor) wait(for: [expectation], timeout: 1.0) - assertChangeObserverUpdated(deletedItems: [], - updatedItems: items, - currentSyncAnchor: try createSyncAnchor(from: currentSyncAnchorDate)) + try assertChangeObserverUpdated(deletedItems: [], + updatedItems: items, + currentSyncAnchor: createSyncAnchor(from: currentSyncAnchorDate)) } private func assertWaitForSemaphoreCalled() { diff --git a/FileProviderExtensionUI/UnlockVaultViewModel.swift b/FileProviderExtensionUI/UnlockVaultViewModel.swift index 9a5f7249e..10b46d3aa 100644 --- a/FileProviderExtensionUI/UnlockVaultViewModel.swift +++ b/FileProviderExtensionUI/UnlockVaultViewModel.swift @@ -312,7 +312,7 @@ class UnlockVaultViewModel { let provider: CloudProvider do { vaultAccount = try vaultAccountManager.getAccount(with: vaultUID) - provider = LocalizedCloudProviderDecorator(delegate: try providerManager.getProvider(with: vaultAccount.delegateAccountUID)) + provider = try LocalizedCloudProviderDecorator(delegate: providerManager.getProvider(with: vaultAccount.delegateAccountUID)) } catch { return Promise(error) } From 317e6cb6076ae202286c67bba49d042f14b50e10 Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Fri, 10 Mar 2023 16:53:11 +0100 Subject: [PATCH 4/5] Updated cloud-access-swift dependency, fixes #313 --- .../xcshareddata/swiftpm/Package.resolved | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 14dbc1f91..6620f8acf 100644 --- a/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -24,8 +24,8 @@ "repositoryURL": "https://github.com/aws-amplify/aws-sdk-ios-spm.git", "state": { "branch": null, - "revision": "eae68dde708c17a3ed249f1926e96d5bda20d2d2", - "version": "2.28.5" + "revision": "51d99d74be7249ac6444581bd1e394fb60ea86a3", + "version": "2.30.4" } }, { @@ -42,8 +42,8 @@ "repositoryURL": "https://github.com/cryptomator/cloud-access-swift.git", "state": { "branch": null, - "revision": "99fa3b966d153cfb1ee34755bd3b4736b4a25ab6", - "version": "1.7.4" + "revision": "c9eaa84a3e73aceef10fc724d386eab3d6e3cbb7", + "version": "1.7.5" } }, { From 2cb5dbb975055e959fb00917315fe3f20889859b Mon Sep 17 00:00:00 2001 From: Tobias Hagemann Date: Sun, 12 Mar 2023 11:00:03 +0100 Subject: [PATCH 5/5] Preparing 2.4.9 --- Cryptomator.xcodeproj/project.pbxproj | 17 ++++++++--------- fastlane/changelog.txt | 5 ++--- .../freemium/metadata/de-DE/release_notes.txt | 5 ++--- .../freemium/metadata/en-US/release_notes.txt | 5 ++--- .../premium/metadata/de-DE/release_notes.txt | 5 ++--- .../premium/metadata/en-US/release_notes.txt | 5 ++--- 6 files changed, 18 insertions(+), 24 deletions(-) diff --git a/Cryptomator.xcodeproj/project.pbxproj b/Cryptomator.xcodeproj/project.pbxproj index dd6649595..b45695d55 100644 --- a/Cryptomator.xcodeproj/project.pbxproj +++ b/Cryptomator.xcodeproj/project.pbxproj @@ -2309,8 +2309,8 @@ ); mainGroup = 4A5E5B202453119100BD6298; packageReferences = ( - 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt.git" */, - 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect.git" */, + 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt" */, + 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */, ); productRefGroup = 4A5E5B2A2453119100BD6298 /* Products */; projectDirPath = ""; @@ -2979,7 +2979,6 @@ }; 4A9172722619F16C003C4043 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - productRef = 4A9172712619F16C003C4043; }; 4A9BED69268F379300721BAA /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -3265,7 +3264,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 2.4.8; + MARKETING_VERSION = 2.4.9; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -3327,7 +3326,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 13.0; - MARKETING_VERSION = 2.4.8; + MARKETING_VERSION = 2.4.9; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=200 -Xfrontend -warn-long-function-bodies=200"; @@ -3665,7 +3664,7 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt.git" */ = { + 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/tikhop/TPInAppReceipt.git"; requirement = { @@ -3673,7 +3672,7 @@ minimumVersion = 3.3.0; }; }; - 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect.git" */ = { + 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/siteline/SwiftUI-Introspect.git"; requirement = { @@ -3686,7 +3685,7 @@ /* Begin XCSwiftPackageProductDependency section */ 4A1521E327C55EA2006C96B2 /* TPInAppReceipt */ = { isa = XCSwiftPackageProductDependency; - package = 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt.git" */; + package = 4A1521E227C55EA2006C96B2 /* XCRemoteSwiftPackageReference "TPInAppReceipt" */; productName = TPInAppReceipt; }; 4A33092C282EC23400876A3E /* CryptomatorCommonCore */ = { @@ -3703,7 +3702,7 @@ }; 4AED9A6E286B38DA00352951 /* Introspect */ = { isa = XCSwiftPackageProductDependency; - package = 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect.git" */; + package = 4AED9A6D286B38D900352951 /* XCRemoteSwiftPackageReference "SwiftUI-Introspect" */; productName = Introspect; }; /* End XCSwiftPackageProductDependency section */ diff --git a/fastlane/changelog.txt b/fastlane/changelog.txt index a4d0f0b2b..995f6a12f 100644 --- a/fastlane/changelog.txt +++ b/fastlane/changelog.txt @@ -1,3 +1,2 @@ -- Fixed file upload errors with certain Nextcloud servers via WebDAV (#308) -- Improved debug logging with WebDAV -- Improved background upload support (you may need to reinstall the app for this to take effect) \ No newline at end of file +- Added Hebrew translation +- Fixed "not found" error when listing a directory with unreachable files in iCloud Drive (#313) \ No newline at end of file diff --git a/fastlane/config/freemium/metadata/de-DE/release_notes.txt b/fastlane/config/freemium/metadata/de-DE/release_notes.txt index ed955413d..3e52e6c8b 100644 --- a/fastlane/config/freemium/metadata/de-DE/release_notes.txt +++ b/fastlane/config/freemium/metadata/de-DE/release_notes.txt @@ -1,3 +1,2 @@ -- Fehler beim Hochladen von Dateien mit bestimmten Nextcloud-Servern über WebDAV behoben (#308) -- Diagnose-Protokollierung mit WebDAV verbessert -- Unterstützung für Uploads im Hintergrund verbessert (evtl. muss die App neu installiert werden, damit dies funktioniert) \ No newline at end of file +- Hebräische Übersetzung hinzugefügt +- Fehler "nicht gefunden" beim Auflisten eines Verzeichnisses mit nicht erreichbaren Dateien in iCloud Drive behoben (#313) \ No newline at end of file diff --git a/fastlane/config/freemium/metadata/en-US/release_notes.txt b/fastlane/config/freemium/metadata/en-US/release_notes.txt index a4d0f0b2b..995f6a12f 100644 --- a/fastlane/config/freemium/metadata/en-US/release_notes.txt +++ b/fastlane/config/freemium/metadata/en-US/release_notes.txt @@ -1,3 +1,2 @@ -- Fixed file upload errors with certain Nextcloud servers via WebDAV (#308) -- Improved debug logging with WebDAV -- Improved background upload support (you may need to reinstall the app for this to take effect) \ No newline at end of file +- Added Hebrew translation +- Fixed "not found" error when listing a directory with unreachable files in iCloud Drive (#313) \ No newline at end of file diff --git a/fastlane/config/premium/metadata/de-DE/release_notes.txt b/fastlane/config/premium/metadata/de-DE/release_notes.txt index ed955413d..3e52e6c8b 100644 --- a/fastlane/config/premium/metadata/de-DE/release_notes.txt +++ b/fastlane/config/premium/metadata/de-DE/release_notes.txt @@ -1,3 +1,2 @@ -- Fehler beim Hochladen von Dateien mit bestimmten Nextcloud-Servern über WebDAV behoben (#308) -- Diagnose-Protokollierung mit WebDAV verbessert -- Unterstützung für Uploads im Hintergrund verbessert (evtl. muss die App neu installiert werden, damit dies funktioniert) \ No newline at end of file +- Hebräische Übersetzung hinzugefügt +- Fehler "nicht gefunden" beim Auflisten eines Verzeichnisses mit nicht erreichbaren Dateien in iCloud Drive behoben (#313) \ No newline at end of file diff --git a/fastlane/config/premium/metadata/en-US/release_notes.txt b/fastlane/config/premium/metadata/en-US/release_notes.txt index a4d0f0b2b..995f6a12f 100644 --- a/fastlane/config/premium/metadata/en-US/release_notes.txt +++ b/fastlane/config/premium/metadata/en-US/release_notes.txt @@ -1,3 +1,2 @@ -- Fixed file upload errors with certain Nextcloud servers via WebDAV (#308) -- Improved debug logging with WebDAV -- Improved background upload support (you may need to reinstall the app for this to take effect) \ No newline at end of file +- Added Hebrew translation +- Fixed "not found" error when listing a directory with unreachable files in iCloud Drive (#313) \ No newline at end of file