diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e2cfc5839..50343ef4a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,22 +6,24 @@ on: jobs: build: name: Build and test - runs-on: macos-13 + runs-on: macos-14 env: DERIVED_DATA_PATH: 'DerivedData' - DEVICE: 'iPhone 14 Pro' + DEVICE: 'iPhone 15 Pro' if: "!contains(github.event.head_commit.message, '[ci skip]') && !contains(github.event.head_commit.message, '[skip ci]')" strategy: matrix: config: ['freemium', 'premium'] steps: - - uses: actions/checkout@v3 - - uses: actions/cache@v3 + - uses: actions/checkout@v4 + - uses: actions/cache@v4 with: path: .build key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} restore-keys: | ${{ runner.os }}-spm- + - name: Install SwiftLint + run: brew install swiftlint - name: Run process.sh script run: | ./Scripts/process.sh @@ -30,8 +32,8 @@ jobs: run: | cd fastlane ./scripts/create-cloud-access-secrets.sh - - name: Select Xcode 15.1 - run: sudo xcode-select -s /Applications/Xcode_15.1.app + - name: Select Xcode 15.2 + run: sudo xcode-select -s /Applications/Xcode_15.2.app - name: Configuration for freemium if: ${{ matrix.config == 'freemium' }} run: | diff --git a/Cryptomator.xcodeproj/project.pbxproj b/Cryptomator.xcodeproj/project.pbxproj index 849360299..f577662f6 100644 --- a/Cryptomator.xcodeproj/project.pbxproj +++ b/Cryptomator.xcodeproj/project.pbxproj @@ -3300,7 +3300,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 2.5.0; + MARKETING_VERSION = 2.5.1; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -3362,7 +3362,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 14.0; - MARKETING_VERSION = 2.5.0; + MARKETING_VERSION = 2.5.1; 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"; diff --git a/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index b87dbea32..967f9b0ad 100644 --- a/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Cryptomator.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/leif-ibsen/ASN1", "state" : { - "revision" : "5bb6eca2e4b250995f189c3d04ec53b6cd8257c5", - "version" : "2.2.0" + "revision" : "8a5cb6ce9b4a009a5b8d82465caf1aafb720096e", + "version" : "2.5.0" } }, { @@ -23,8 +23,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/tikhop/ASN1Swift", "state" : { - "revision" : "b53bee03a942623db25afc5bfb80227b2cb3b425", - "version" : "1.2.4" + "revision" : "177417b6bf89431a0750ee640012b6aed8961c6a", + "version" : "1.2.5" } }, { @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/aws-amplify/aws-sdk-ios-spm.git", "state" : { - "revision" : "59fdc9ca7ff3f5d38e07af27526a527c199b8de6", - "version" : "2.33.7" + "revision" : "cfcf97f6994b6ffd9a3244dc638458f5822aba56", + "version" : "2.34.0" } }, { @@ -50,8 +50,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/leif-ibsen/BigInt", "state" : { - "revision" : "3fe07ec38afa732e86d4f3e867cb43b05d004941", - "version" : "1.14.0" + "revision" : "ba54c8b51392627d4cc9b05a672cce558be56e04", + "version" : "1.17.0" } }, { @@ -59,8 +59,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/cryptomator/cloud-access-swift.git", "state" : { - "revision" : "63fd1cfee9e4d1c0a8d585dd0c7008eb37d2f037", - "version" : "1.9.0" + "revision" : "bb9cc1c300be890f3a47efa0ac0808ee7c42146d", + "version" : "1.9.2" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/CocoaLumberjack/CocoaLumberjack.git", "state" : { - "revision" : "67ec5818a757aba4d7c534e21a905d878d128dbf", - "version" : "3.8.1" + "revision" : "4b8714a7fb84d42393314ce897127b3939885ec3", + "version" : "3.8.5" } }, { @@ -86,8 +86,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/leif-ibsen/Digest", "state" : { - "revision" : "fd501645c5f14c17207c4ada4281a1e6b7cb03df", - "version" : "1.1.0" + "revision" : "1202dcb976e481e7c228492c5a8d5159cfa4ea97", + "version" : "1.4.0" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/phil1995/dropbox-sdk-obj-c-spm.git", "state" : { - "revision" : "f0eafe25d26c52377c4a1c08f1dbd77320164994", - "version" : "7.0.0" + "revision" : "87c1fcf96622ab90a956bdf89331ddb4164f4855", + "version" : "7.2.0" } }, { @@ -104,8 +104,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/google/google-api-objectivec-client-for-rest.git", "state" : { - "revision" : "40930b2c3add6234b8be1a780c08cf88b6a7a1f7", - "version" : "3.2.0" + "revision" : "bcb0439b37d16d39da6f62139d4009d09e7aef14", + "version" : "3.4.0" } }, { @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/AzureAD/microsoft-authentication-library-for-objc.git", "state" : { - "revision" : "e9ef281b2f281c3ba2d32608138b1431cba5e4df", - "version" : "1.2.20" + "revision" : "9d15d7980a52945dd17ea529bcf4c92f2c0d9a12", + "version" : "1.3.1" } }, { @@ -201,10 +201,10 @@ { "identity" : "swift-log", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-log.git", + "location" : "https://github.com/apple/swift-log", "state" : { - "revision" : "532d8b529501fb73a2455b179e0bbb6d49b652ed", - "version" : "1.5.3" + "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", + "version" : "1.5.4" } }, { @@ -212,8 +212,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/leif-ibsen/SwiftECC", "state" : { - "revision" : "18c0e462882d0a4fa910472a0a6cc13ef97bbc21", - "version" : "5.0.0" + "revision" : "0efa7eed9eeedb93e6d42bc4a18a40ef5c1ef2d0", + "version" : "5.3.0" } }, { @@ -239,8 +239,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", "state" : { - "revision" : "23cbf2294e350076ea4dbd7d5d047c1e76b03631", - "version" : "1.0.2" + "revision" : "b13b1d1a8e787a5ffc71ac19dcaf52183ab27ba2", + "version" : "1.1.1" } } ], diff --git a/Cryptomator/Common/Cells/BindableTableViewCellViewModel.swift b/Cryptomator/Common/Cells/BindableTableViewCellViewModel.swift index 7c12f3b90..154850374 100644 --- a/Cryptomator/Common/Cells/BindableTableViewCellViewModel.swift +++ b/Cryptomator/Common/Cells/BindableTableViewCellViewModel.swift @@ -55,6 +55,7 @@ protocol ConfigurableTableViewCell: UITableViewCell { } import Combine + protocol ViewModel { var error: AnyPublisher { get } } diff --git a/Cryptomator/Common/Cells/SystemSymbolButtonCell.swift b/Cryptomator/Common/Cells/SystemSymbolButtonCell.swift index 5f582aa86..f27663ee2 100644 --- a/Cryptomator/Common/Cells/SystemSymbolButtonCell.swift +++ b/Cryptomator/Common/Cells/SystemSymbolButtonCell.swift @@ -8,6 +8,7 @@ import Foundation import UIKit + class SystemSymbolButtonCell: ButtonTableViewCell { override func configure(with viewModel: TableViewCellViewModel) { super.configure(with: viewModel) diff --git a/Cryptomator/Common/StaticUITableViewController.swift b/Cryptomator/Common/StaticUITableViewController.swift index 1dde5247b..49ca1c030 100644 --- a/Cryptomator/Common/StaticUITableViewController.swift +++ b/Cryptomator/Common/StaticUITableViewController.swift @@ -36,7 +36,7 @@ class StaticUITableViewController: BaseUITableViewControl func applySnapshot(sections: [Section], animatingDifferences: Bool = true) { var snapshot = NSDiffableDataSourceSnapshot() snapshot.appendSections(sections.map { $0.id }) - sections.forEach { section in + for section in sections { snapshot.appendItems(section.elements, toSection: section.id) } // A snapshot can only be applied animated when the view is visible. diff --git a/Cryptomator/Purchase/IAPViewController.swift b/Cryptomator/Purchase/IAPViewController.swift index 6c8885f1a..0279cb6d1 100644 --- a/Cryptomator/Purchase/IAPViewController.swift +++ b/Cryptomator/Purchase/IAPViewController.swift @@ -316,16 +316,16 @@ class BaseIAPViewModel { } private func setEnabledFlagForAllButtonCellViewModels(to enabled: Bool) { - cells.forEach { - if case let Item.purchaseCell(purchaseCellViewModel) = $0 { + for cell in cells { + if case let Item.purchaseCell(purchaseCellViewModel) = cell { purchaseCellViewModel.purchaseButtonViewModel.isEnabled.value = enabled } } } private func setIsLoading(to isLoading: Bool, forCellWith productIdentifier: ProductIdentifier) { - cells.forEach { - if case let Item.purchaseCell(purchaseCellViewModel) = $0, purchaseCellViewModel.productIdentifier == productIdentifier { + for cell in cells { + if case let Item.purchaseCell(purchaseCellViewModel) = cell, purchaseCellViewModel.productIdentifier == productIdentifier { purchaseCellViewModel.purchaseButtonViewModel.isLoading.value = isLoading } } diff --git a/Cryptomator/VaultDetail/ChangePassword/VaultPasswordChanging.swift b/Cryptomator/VaultDetail/ChangePassword/VaultPasswordChanging.swift index 9aa9076ed..14ac3a9ba 100644 --- a/Cryptomator/VaultDetail/ChangePassword/VaultPasswordChanging.swift +++ b/Cryptomator/VaultDetail/ChangePassword/VaultPasswordChanging.swift @@ -7,6 +7,7 @@ // import Foundation + protocol VaultPasswordChanging { func changedPassword() } diff --git a/Cryptomator/VaultList/EmptyListMessage.swift b/Cryptomator/VaultList/EmptyListMessage.swift index fcfe48116..cac18feb5 100644 --- a/Cryptomator/VaultList/EmptyListMessage.swift +++ b/Cryptomator/VaultList/EmptyListMessage.swift @@ -71,7 +71,7 @@ class EmptyListMessage: UIView { private var shapeLayer: CAShapeLayer { // swiftlint:disable:next force_cast - return self.layer as! CAShapeLayer + return layer as! CAShapeLayer } override func layoutSubviews() { diff --git a/Cryptomator/VaultList/VaultListViewModel.swift b/Cryptomator/VaultList/VaultListViewModel.swift index 4c6254a58..facc4ed0a 100644 --- a/Cryptomator/VaultList/VaultListViewModel.swift +++ b/Cryptomator/VaultList/VaultListViewModel.swift @@ -111,7 +111,7 @@ class VaultListViewModel: ViewModel, VaultListViewModelProtocol { xpc.proxy.getUnlockedVaultDomainIdentifiers(reply: handler) } }.then { unlockedVaultDomainIdentifiers -> Void in - unlockedVaultDomainIdentifiers.forEach { domainIdentifier in + for domainIdentifier in unlockedVaultDomainIdentifiers { let vaultInfo = self.vaultCellViewModels.first { $0.vault.vaultUID == domainIdentifier.rawValue } vaultInfo?.setVaultUnlockStatus(unlocked: true) } diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/CloudPath+Contains.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/CloudPath+Contains.swift index da96d5155..2329c8111 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/CloudPath+Contains.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/CloudPath+Contains.swift @@ -8,6 +8,7 @@ import CryptomatorCloudAccessCore import Foundation + public extension CloudPath { func contains(_ other: CloudPath) -> Bool { return pathComponents.starts(with: other.pathComponents) diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/LogLevelUpdating.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/LogLevelUpdating.swift index e83e018e5..e5b325681 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/LogLevelUpdating.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/LogLevelUpdating.swift @@ -8,6 +8,7 @@ import FileProvider import Foundation + @objc public protocol LogLevelUpdating: NSFileProviderServiceSource { func logLevelUpdated() } diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/XPCErrorHelper.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/XPCErrorHelper.swift index f807b7e06..6eb7d8719 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/XPCErrorHelper.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/FileProviderXPC/XPCErrorHelper.swift @@ -7,6 +7,7 @@ // import Foundation + public enum XPCErrorHelper { /** Bridges a Swift Error to an XPC compatible NSError. diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/KeepUnlockedDuration.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/KeepUnlockedDuration.swift index 2179cc3c8..ed6a68eb5 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/KeepUnlockedDuration.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/KeepUnlockedDuration.swift @@ -7,6 +7,7 @@ // import Foundation + public enum KeepUnlockedDuration: CaseIterable, Codable { case auto case fiveMinutes diff --git a/CryptomatorCommon/Sources/CryptomatorCommonCore/SwiftUI/SwiftUI+Focus.swift b/CryptomatorCommon/Sources/CryptomatorCommonCore/SwiftUI/SwiftUI+Focus.swift index 67c8b0cfd..f5e7819e2 100644 --- a/CryptomatorCommon/Sources/CryptomatorCommonCore/SwiftUI/SwiftUI+Focus.swift +++ b/CryptomatorCommon/Sources/CryptomatorCommonCore/SwiftUI/SwiftUI+Focus.swift @@ -9,6 +9,7 @@ import Foundation import Introspect import SwiftUI + // inspired by https://github.com/art-technologies/swift-focuser public extension View { diff --git a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Hub/HubVaultUnlockHandlerDelegateMock.swift b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Hub/HubVaultUnlockHandlerDelegateMock.swift index aa6ec4fb1..b6eebcbf4 100644 --- a/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Hub/HubVaultUnlockHandlerDelegateMock.swift +++ b/CryptomatorCommon/Tests/CryptomatorCommonCoreTests/Hub/HubVaultUnlockHandlerDelegateMock.swift @@ -7,6 +7,7 @@ import Foundation @testable import CryptomatorCommonCore + // swiftlint:disable all final class HubVaultUnlockHandlerDelegateMock: HubVaultUnlockHandlerDelegate { // MARK: - successfullyProcessedUnlockedVault diff --git a/CryptomatorFileProvider/DB/DatabaseHelper.swift b/CryptomatorFileProvider/DB/DatabaseHelper.swift index ac53965c9..9181a3f67 100644 --- a/CryptomatorFileProvider/DB/DatabaseHelper.swift +++ b/CryptomatorFileProvider/DB/DatabaseHelper.swift @@ -10,6 +10,7 @@ import CryptomatorCloudAccessCore import FileProvider import Foundation import GRDB + public protocol DatabaseHelping { func getDatabaseURL(for domain: NSFileProviderDomain) -> URL func getMigratedDB(at databaseURL: URL, purposeIdentifier: String) throws -> DatabaseWriter diff --git a/CryptomatorFileProvider/FileProviderNotificator.swift b/CryptomatorFileProvider/FileProviderNotificator.swift index 42386a4c3..cff2d195b 100644 --- a/CryptomatorFileProvider/FileProviderNotificator.swift +++ b/CryptomatorFileProvider/FileProviderNotificator.swift @@ -142,7 +142,7 @@ public class FileProviderNotificator: FileProviderNotificatorType { public func updateWorkingSetItems(_ items: [NSFileProviderItem]) { queue.sync(flags: .barrier) { - items.forEach { item in + for item in items { signalDeleteWorkingSetItemIdentifier.remove(item.itemIdentifier) signalUpdateWorkingSetItem[item.itemIdentifier] = item } diff --git a/CryptomatorFileProvider/ServiceSource/CacheManagingServiceSource.swift b/CryptomatorFileProvider/ServiceSource/CacheManagingServiceSource.swift index 441c89fb2..2e2cc0636 100644 --- a/CryptomatorFileProvider/ServiceSource/CacheManagingServiceSource.swift +++ b/CryptomatorFileProvider/ServiceSource/CacheManagingServiceSource.swift @@ -67,8 +67,8 @@ public class CacheManagingServiceSource: ServiceSource, CacheManaging { } private func clearCache(for domains: [NSFileProviderDomain]) throws { - try domains.forEach { - let cacheManager = try cachedManagerFactory.createCachedFileManager(for: $0) + for domain in domains { + let cacheManager = try cachedManagerFactory.createCachedFileManager(for: domain) try cacheManager.clearCache() } } diff --git a/CryptomatorFileProvider/Workflow/WorkflowDependencyFactory.swift b/CryptomatorFileProvider/Workflow/WorkflowDependencyFactory.swift index 56b706ce6..c35c7f311 100644 --- a/CryptomatorFileProvider/Workflow/WorkflowDependencyFactory.swift +++ b/CryptomatorFileProvider/Workflow/WorkflowDependencyFactory.swift @@ -40,7 +40,7 @@ class WorkflowDependencyFactory { public func createDependencies(paths: [CloudPath], lockType: LockType) -> WorkflowDependency { let unlock = Promise.pending() var locks = [Promise]() - paths.forEach { path in + for path in paths { let lock = createLock(path: path, type: lockType) locks.append(lock) createUnlock(path: path, type: lockType, basedOn: unlock) diff --git a/CryptomatorIntents/ar.lproj/Intents.strings b/CryptomatorIntents/ar.lproj/Intents.strings index aa2d90733..9b29a286f 100644 --- a/CryptomatorIntents/ar.lproj/Intents.strings +++ b/CryptomatorIntents/ar.lproj/Intents.strings @@ -1 +1,11 @@ "common.vault" = "الخزينة"; +"openVaultIntent.title" = "افتح المخزن"; + +"saveFileIntent.description" = "يحفظ الملف إلى المخزن."; +"saveFileIntent.file" = "الملف"; +"saveFileIntent.parameter.ignoreExisting" = "تجاهل الملف الموجود بنفس الاسم"; +"saveFileIntent.text" = "حفظ ${file} إلى ${folder}"; +"saveFileIntent.title" = "احفظ الملف"; + +"vaultFolder.displayName" = "مجلد المخزن"; +"vaultFolder.vaultIdentifier" = "معرّف المخزن"; diff --git a/CryptomatorIntents/id.lproj/Intents.strings b/CryptomatorIntents/id.lproj/Intents.strings index a86bed0fa..ceed77a23 100644 --- a/CryptomatorIntents/id.lproj/Intents.strings +++ b/CryptomatorIntents/id.lproj/Intents.strings @@ -9,6 +9,20 @@ "getFolderIntent.text" = "Mengambil folder yang berada di ${path} di dalam ${vault}"; "getFolderIntent.title" = "Ambil Folder"; +"isUnlockedIntent.description" = "Mengembalikan apakah vault yang diberikan tidak terkunci."; +"isUnlockedIntent.title" = "Tidak Terkunci"; + +"isVaultLockedIntent.title" = "Vault tidak terkunci"; +"isVaultUnlockedIntent.text" = "Apakah ${vault} tidak terkunci?"; + +"lockVaultIntent.description" = "Mengunci vault yang diberikan."; +"lockVaultIntent.text" = "Kunci ${vault}"; +"lockVaultIntent.title" = "Kunci Vault"; + +"openVaultIntent.description" = "Membuka vault yang diberikan di aplikasi Files."; +"openVaultIntent.text" = "Membuka ${vault} di Files aplikasi"; +"openVaultIntent.title" = "Buka Vault"; + "saveFileIntent.description" = "Simpan sebuah file ke vault."; "saveFileIntent.file" = "File"; "saveFileIntent.parameter.ignoreExisting" = "Abaikan file yang sudah ada dengan nama yang sama"; diff --git a/CryptomatorIntents/ko.lproj/Intents.strings b/CryptomatorIntents/ko.lproj/Intents.strings index f302a3d9a..14c254dcf 100644 --- a/CryptomatorIntents/ko.lproj/Intents.strings +++ b/CryptomatorIntents/ko.lproj/Intents.strings @@ -5,6 +5,7 @@ "getFolderIntent.title" = "폴더 열기"; "lockVaultIntent.description" = "해당 vault를 잠급니다."; +"lockVaultIntent.text" = "${vault} 잠금"; "lockVaultIntent.title" = "Vault 잠그기"; "openVaultIntent.title" = "Vault 열기"; "saveFileIntent.file" = "파일"; diff --git a/CryptomatorIntents/mr.lproj/Intents.strings b/CryptomatorIntents/mr.lproj/Intents.strings new file mode 100644 index 000000000..e69de29bb diff --git a/CryptomatorIntents/sl.lproj/Intents.strings b/CryptomatorIntents/sl.lproj/Intents.strings index e69de29bb..80ced805f 100644 --- a/CryptomatorIntents/sl.lproj/Intents.strings +++ b/CryptomatorIntents/sl.lproj/Intents.strings @@ -0,0 +1,11 @@ +"common.failureReason" = "Vzrok za neuspeh"; +"common.folder" = "Mapa"; +"common.vault" = "Trezor"; +"getFolderIntent.path" = "Pot"; +"isUnlockedIntent.title" = "Je zaklenjen"; +"lockVaultIntent.title" = "Zakleni trezor"; +"openVaultIntent.title" = "Odpri trezor"; +"saveFileIntent.file" = "Datoteka"; +"saveFileIntent.title" = "Shrani datoteko"; + +"vaultFolder.displayName" = "Mapa trezorja"; diff --git a/CryptomatorTests/Purchase/IAPViewModelTestCase.swift b/CryptomatorTests/Purchase/IAPViewModelTestCase.swift index e6e85a878..7e3b93a63 100644 --- a/CryptomatorTests/Purchase/IAPViewModelTestCase.swift +++ b/CryptomatorTests/Purchase/IAPViewModelTestCase.swift @@ -84,8 +84,8 @@ class IAPViewModelTestCase: XCTestCase { func recordEnabledStatusForAllButtonCellViewModels(next: Int, viewModel: BaseIAPViewModel) -> [Recorder] { var recorders = [Recorder]() - viewModel.cells.forEach { - if case let BaseIAPViewModel.Item.purchaseCell(cellViewModel) = $0 { + for cell in viewModel.cells { + if case let BaseIAPViewModel.Item.purchaseCell(cellViewModel) = cell { let buttonCellViewModel = cellViewModel.purchaseButtonViewModel recorders.append(buttonCellViewModel.isEnabled.$value.recordNext(next)) } @@ -125,8 +125,8 @@ class IAPViewModelTestCase: XCTestCase { } private func assertCorrectEnabledStatusHistoryForAllButtonCellViewModels(recorders: [Recorder]) { - recorders.forEach({ - XCTAssertEqual([true, false, true], $0.getElements()) - }) + for recorder in recorders { + XCTAssertEqual([true, false, true], recorder.getElements()) + } } } diff --git a/CryptomatorTests/Purchase/StoreObserverTests.swift b/CryptomatorTests/Purchase/StoreObserverTests.swift index a8a6adfc0..50347da25 100644 --- a/CryptomatorTests/Purchase/StoreObserverTests.swift +++ b/CryptomatorTests/Purchase/StoreObserverTests.swift @@ -200,8 +200,8 @@ private class StoreObserverDelegateMock: StoreObserverDelegate { @available(iOS 14.0, *) extension SKPaymentQueue { func removeAllObservers() { - transactionObservers.forEach { - remove($0) + for transactionObserver in transactionObservers { + remove(transactionObserver) } } } diff --git a/CryptomatorTests/VaultKeepUnlockedViewModelTests.swift b/CryptomatorTests/VaultKeepUnlockedViewModelTests.swift index 7ddb6d789..b9d0a228b 100644 --- a/CryptomatorTests/VaultKeepUnlockedViewModelTests.swift +++ b/CryptomatorTests/VaultKeepUnlockedViewModelTests.swift @@ -217,8 +217,8 @@ class VaultKeepUnlockedViewModelTests: XCTestCase { .init(duration: .oneHour, isSelected: false), .init(duration: .indefinite, isSelected: false) ] - expectedKeepUnlockedItems.forEach { - $0.isSelected.value = $0.duration == selectedKeepUnlockedDuration + for expectedKeepUnlockedItem in expectedKeepUnlockedItems { + expectedKeepUnlockedItem.isSelected.value = expectedKeepUnlockedItem.duration == selectedKeepUnlockedDuration } let expectedSections: [Section] = [ Section(id: .main, elements: viewModel.keepUnlockedItems) diff --git a/SharedResources/ar.lproj/Localizable.strings b/SharedResources/ar.lproj/Localizable.strings index d277bdefa..7c0f0174b 100644 --- a/SharedResources/ar.lproj/Localizable.strings +++ b/SharedResources/ar.lproj/Localizable.strings @@ -103,6 +103,9 @@ "hubAuthentication.licenseExceeded" = "نموذج المركز Cryptomator الخاص بك لديه ترخيص غير صالح. الرجاء إبلاغ مسؤول مركز لترقية أو تجديد الترخيص."; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "اسم الجهاز"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "للدخول إلى الخزينة، يحتاج جهازك إلى إذن من مالك الخزينة."; + +"keepUnlocked.alert.title" = "قفل المخزن؟"; +"keepUnlocked.alert.confirm" = "تأكيد واقفل الآن"; "keepUnlockedDuration.auto.shortDisplayName" = "تلقائيًا"; "keepUnlockedDuration.indefinite" = "دائم"; diff --git a/SharedResources/cs.lproj/Localizable.strings b/SharedResources/cs.lproj/Localizable.strings index 896b5ac67..de842ad8d 100644 --- a/SharedResources/cs.lproj/Localizable.strings +++ b/SharedResources/cs.lproj/Localizable.strings @@ -22,6 +22,7 @@ "common.button.next" = "Další"; "common.button.ok" = "OK"; "common.button.refresh" = "Načíst znovu"; +"common.button.register" = "Registrovat"; "common.button.remove" = "Odstranit"; "common.button.retry" = "Opakovat"; "common.button.signOut" = "Odhlásit se"; @@ -113,7 +114,10 @@ "getFolderIntent.error.noVaultSelected" = "Nebyl vybrán žádný trezor."; "hubAuthentication.accessNotGranted" = "Vaše zařízení dosud nebylo oprávněno k přístupu k tomuto trezoru. Požádejte vlastníka trezoru, aby jej autorizoval."; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "Název zařízení"; +"hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "Registrace zařízení úspěšná"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "Pro přístup k trezoru musí být vaše zařízení autorizováno majitelem trezoru."; +"hubAuthentication.requireAccountInit.alert.title" = "Požadována akce"; +"hubAuthentication.requireAccountInit.alert.actionButton" = "Jít na profil"; "intents.saveFile.missingFile" = "Zadaný soubor není platný."; "intents.saveFile.invalidFolder" = "Zadaná složka není platná."; diff --git a/SharedResources/de.lproj/Localizable.strings b/SharedResources/de.lproj/Localizable.strings index 221a89aec..1bf251644 100644 --- a/SharedResources/de.lproj/Localizable.strings +++ b/SharedResources/de.lproj/Localizable.strings @@ -119,11 +119,11 @@ "hubAuthentication.licenseExceeded" = "Die Lizenz deiner Cryptomator-Hub-Instanz ist ungültig. Bitte informiere deinen Hub-Administrator, um die Lizenz zu erweitern oder zu erneuern."; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "Gerätename"; "hubAuthentication.deviceRegistration.deviceName.footer.title" = "Dies scheint der erste Hub-Zugriff von diesem Gerät zu sein. Um es für die Zugriffsberechtigung zu identifizieren, musst du diesem Gerät einen Namen geben."; -"hubAuthentication.deviceRegistration.accountKey.footer.title" = "Ihr Account Key ist erforderlich, um sich von neuen Anwendungen oder Browsern aus anzumelden. Sie können ihn in Ihrem Profil finden."; +"hubAuthentication.deviceRegistration.accountKey.footer.title" = "Um sich von neuen Apps oder Browsern aus anzumelden, ist dein Account Key erforderlich. Er befindet sich in deinem Profil."; "hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "Gerät erfolgreich registriert"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "Für Zugriff auf den Tresor muss dein Gerät vom Tresorbesitzer autorisiert werden."; "hubAuthentication.requireAccountInit.alert.title" = "Handlung erforderlich"; -"hubAuthentication.requireAccountInit.alert.message" = "Um fortzufahren, führen Sie bitte die erforderlichen Schritte in Ihrem Hub Benutzerprofil aus."; +"hubAuthentication.requireAccountInit.alert.message" = "Schließe bitte die erforderlichen Schritte in deinem Hub-Benutzerprofil ab, um fortzufahren."; "hubAuthentication.requireAccountInit.alert.actionButton" = "Zum Profil"; "intents.saveFile.missingFile" = "Die bereitgestellte Datei ist nicht gültig."; diff --git a/SharedResources/hi.lproj/Localizable.strings b/SharedResources/hi.lproj/Localizable.strings index 4ca6c79d6..0cb39e650 100644 --- a/SharedResources/hi.lproj/Localizable.strings +++ b/SharedResources/hi.lproj/Localizable.strings @@ -150,4 +150,7 @@ "vaultList.header.title" = "कक्षों का नाम"; "vaultList.emptyList.message" = "कक्ष जोड़ने के लिए यहाँ दबाएँ"; "vaultList.remove.alert.title" = "कक्ष हटाना चाहेंगे?"; + +"webDAVAuthentication.httpConnection.alert.title" = "HTTPS का उपयोग करें?"; +"webDAVAuthentication.httpConnection.change" = "HTTPS में बदलें"; "Clear from Cache" = "कैशे से फ़ाइल साफ़ करें"; diff --git a/SharedResources/id.lproj/Localizable.strings b/SharedResources/id.lproj/Localizable.strings index d915210e4..220d8f255 100644 --- a/SharedResources/id.lproj/Localizable.strings +++ b/SharedResources/id.lproj/Localizable.strings @@ -8,7 +8,7 @@ "common.alert.error.title" = "Kesalahan"; "common.alert.attention.title" = "Perhatian"; "common.button.cancel" = "Batalkan"; -"common.button.change" = "Ganti"; +"common.button.change" = "Ubah"; "common.button.choose" = "Pilih"; "common.button.clear" = "Hapus"; "common.button.close" = "Tutup"; @@ -22,6 +22,7 @@ "common.button.next" = "Lanjut"; "common.button.ok" = "OK"; "common.button.refresh" = "Segarkan"; +"common.button.register" = "Daftar"; "common.button.remove" = "Hapus"; "common.button.retry" = "Coba lagi"; "common.button.signOut" = "Keluar"; @@ -31,9 +32,10 @@ "common.cells.url" = "URL"; "common.cells.username" = "Nama pengguna"; "common.footer.learnMore" = "Selengkapnya."; +"common.hud.authenticating" = "Mengotentikasi…"; "accountList.header.title" = "Otentikasi"; -"accountList.emptyList.message" = "Klik untuk menambah akun"; +"accountList.emptyList.message" = "Ketuk disini untuk menambah akun"; "accountList.signOut.alert.title" = "Hapus Vault Terkait?"; "accountList.signOut.alert.message" = "Dengan keluar, semua vault terkait akan dihapus dari daftar vault. Tidak ada data terenkripsi yang akan dihapus. Anda dapat masuk lagi dan menambahkan kembali vault nanti."; @@ -58,6 +60,7 @@ "addVault.openExistingVault.chooseCloud.header" = "Dimana lokasi vault berada?"; "addVault.openExistingVault.detectedMasterkey.text" = "Cryptomator mendeteksi vault \"%@\".\nApakah Anda ingin menambahkan vault ini?"; "addVault.openExistingVault.detectedMasterkey.add" = "Tambah Vault Ini"; +"addVault.openExistingVault.downloadVault.progress" = "Mengunduh Vault…"; "addVault.openExistingVault.password.footer" = "Masukkan kata sandi untuk \"%@\"."; "addVault.openExistingVault.progress" = "Menambahkan Vault…"; "addVault.success.info" = "Berhasil menambahkan vault \"%@\".\nAkses vault ini melalui aplikasi Files."; @@ -111,6 +114,18 @@ "getFolderIntent.error.missingPath" = "Tidak ada path yang disediakan. Harap cantumkan path yang valid untuk folder yang harus dikembalikan."; "getFolderIntent.error.noVaultSelected" = "Tidak ada vault yang dipilih."; +"hubAuthentication.title" = "Hub Vault"; +"hubAuthentication.accessNotGranted" = "Perangkat Anda belum diizinkan mengakses vault ini. Minta pemilik vault untuk mengizinkannya."; +"hubAuthentication.licenseExceeded" = "Contoh Cryptomator Hub Anda memiliki lisensi yang tidak valid. Mohon informasikan kepada administrator Hub untuk meningkatkan atau memperbarui lisensi."; +"hubAuthentication.deviceRegistration.deviceName.cells.name" = "Nama Perangkat"; +"hubAuthentication.deviceRegistration.deviceName.footer.title" = "Tampaknya ini adalah akses Hub pertama dari perangkat ini. Untuk mengidentifikasi otorisasi akses ini, Anda perlu memberi nama untuk perangkat ini."; +"hubAuthentication.deviceRegistration.accountKey.footer.title" = "Kunci Akun Anda diperlukan untuk masuk dari aplikasi atau browser baru. Kunci dapat ditemukan di profil Anda."; +"hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "Berhasil Mendaftarkan Perangkat"; +"hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "Untuk mengakses vault perangkat Anda harus diotorisasi oleh pemilik vault."; +"hubAuthentication.requireAccountInit.alert.title" = "Diperlukan Tindakan"; +"hubAuthentication.requireAccountInit.alert.message" = "Untuk melanjutkan, silakan lengkapi langkah-langkah yang diperlukan di profil pengguna Hub Anda."; +"hubAuthentication.requireAccountInit.alert.actionButton" = "Buka Profil"; + "intents.saveFile.missingFile" = "File yang disediakan tidak valid."; "intents.saveFile.invalidFolder" = "Folder yang disediakan tidak valid."; "intents.saveFile.missingTemporaryFolder" = "Gagal membuat folder sementara."; @@ -213,6 +228,8 @@ "s3Authentication.existingBucket" = "Bucket yang sudah ada"; "s3Authentication.endpoint" = "Endpoint"; "s3Authentication.region" = "Region"; +"s3Authentication.error.invalidCredentials" = "Kredensial tidak valid."; +"s3Authentication.error.invalidEndpoint" = "Endpoint yang diberikan tidak cocok dengan format URL."; "trialStatus.active" = "Aktifkan"; "trialStatus.expired" = "Kadaluarsa"; diff --git a/SharedResources/mr.lproj/Localizable.strings b/SharedResources/mr.lproj/Localizable.strings new file mode 100644 index 000000000..e69de29bb diff --git a/SharedResources/pa.lproj/Localizable.strings b/SharedResources/pa.lproj/Localizable.strings index 093d84b5d..b4c3c3fb1 100644 --- a/SharedResources/pa.lproj/Localizable.strings +++ b/SharedResources/pa.lproj/Localizable.strings @@ -103,6 +103,10 @@ "fileProvider.uploadProgress.connecting" = "…ਕਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"; "fileProvider.uploadProgress.title" = "…ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"; "getFolderIntent.error.noVaultSelected" = "ਕੋਈ ਵਾਲਟ ਨਹੀਂ ਚੁਣਿਆ ਹੈ।"; +"hubAuthentication.deviceRegistration.accountKey.footer.title" = "ਤੁਹਾਡੀ Account Key ਨਵੀਆਂ ਐਪਾਂ ਜਾਂ ਬਰਾਊਜ਼ਰਾਂ ਵਿੱਚ ਲਾਗਇਨ ਕਰਨ ਸਮੇਂ ਚਾਹੀਦੀ ਹੈ। ਇਸ ਨੂੰ ਤੁਹਾਡੇ ਪਰੋਫਾਇਲ ਵਿੱਚ ਲੱਭਿਆ ਜਾ ਸਕਦਾ ਹੈ।"; +"hubAuthentication.requireAccountInit.alert.title" = "ਕਾਰਵਾਈ ਦੀ ਲੋੜ ਹੈ"; +"hubAuthentication.requireAccountInit.alert.message" = "ਜਾਰੀ ਰੱਖਣ ਲਈ ਆਪਣੇ Hub ਵਰਤੋਂਕਾਰ ਪਰੋਫਾਇਲ ਵਿੱਚ ਲੋੜੀਂਦੇ ਪੜਾਅ ਪੂਰੇ ਕਰੋ।"; +"hubAuthentication.requireAccountInit.alert.actionButton" = "ਪ੍ਰੋਫ਼ਾਈਲ ਤੇ ਜਾਓ"; "keepUnlocked.alert.title" = "ਵਾਲਟ ਲਾਕ ਕਰਨਾ ਹੈ?"; "keepUnlocked.alert.confirm" = "ਤਸਦੀਕ ਅਤੇ ਹੁਣੇ ਲਾਕ ਕਰੋ"; diff --git a/SharedResources/pl.lproj/Localizable.strings b/SharedResources/pl.lproj/Localizable.strings index a99e191e2..cb489bbfd 100644 --- a/SharedResources/pl.lproj/Localizable.strings +++ b/SharedResources/pl.lproj/Localizable.strings @@ -123,6 +123,7 @@ "hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "Rejestracja urządzenia powiodła się"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "Aby dostać się do sejfu, Twoje urządzenie musi być autoryzowane przez właściciela sejfu."; "hubAuthentication.requireAccountInit.alert.title" = "Wymagane działanie"; +"hubAuthentication.requireAccountInit.alert.message" = "Aby kontynuować, wykonaj kroki wymagane w profilu użytkownika Hub."; "hubAuthentication.requireAccountInit.alert.actionButton" = "Przejdź do profilu"; "intents.saveFile.missingFile" = "Wskazany plik nie jest prawidłowy."; diff --git a/SharedResources/pt-BR.lproj/Localizable.strings b/SharedResources/pt-BR.lproj/Localizable.strings index 34160fc48..dbf479c11 100644 --- a/SharedResources/pt-BR.lproj/Localizable.strings +++ b/SharedResources/pt-BR.lproj/Localizable.strings @@ -119,8 +119,12 @@ "hubAuthentication.licenseExceeded" = "Sua instância do Cryptomator Hub possui uma licença inválida. Por favor, informe um administrador do Hub para atualizar ou renovar a licença."; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "Nome do dispositivo"; "hubAuthentication.deviceRegistration.deviceName.footer.title" = "Parece ser o primeiro acesso do Hub a partir deste dispositivo. Para identificá-lo para autorização de acesso, você precisa nomear este dispositivo."; +"hubAuthentication.deviceRegistration.accountKey.footer.title" = "Sua Chave de Conta é necessária para acessar a partir de novos aplicativos ou navegadores. Ela pode ser encontrada no seu perfil."; "hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "Dispositivo registrado com sucesso"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "Para acessar o cofre, seu dispositivo precisa ser autorizado pelo proprietário do cofre."; +"hubAuthentication.requireAccountInit.alert.title" = "Ação necessária"; +"hubAuthentication.requireAccountInit.alert.message" = "Para prosseguir, por favor preencha as etapas necessárias no seu perfil de usuário do Hub."; +"hubAuthentication.requireAccountInit.alert.actionButton" = "Ir para o Perfil"; "intents.saveFile.missingFile" = "O arquivo fornecido não é válido."; "intents.saveFile.invalidFolder" = "A pasta fornecida não é válida."; diff --git a/SharedResources/sl.lproj/Localizable.strings b/SharedResources/sl.lproj/Localizable.strings index 3510183c6..696f22d1d 100644 --- a/SharedResources/sl.lproj/Localizable.strings +++ b/SharedResources/sl.lproj/Localizable.strings @@ -1,3 +1,4 @@ +"common.alert.attention.title" = "Pozor"; "common.button.cancel" = "Prekliči"; "common.button.change" = "Spremeni"; "common.button.choose" = "Izberi"; @@ -5,6 +6,7 @@ "common.button.create" = "Ustvari"; "common.button.done" = "Opravljeno"; "common.button.edit" = "Uredi"; +"common.button.enable" = "Omogoči"; "common.button.next" = "Naslednji"; "common.button.ok" = "V redu"; "common.button.refresh" = "Osveži"; @@ -12,7 +14,11 @@ "common.button.retry" = "Poizkusi znova"; "common.cells.url" = "URL naslov"; "common.cells.username" = "Uporabniško ime"; + +"addVault.title" = "Dodaj trezor"; +"addVault.createNewVault.setVaultName.cells.name" = "Ime trezorja"; "addVault.createNewVault.password.confirmPassword.alert.message" = "POMEMBNO: Če pozabite geslo, ni nobene možnosti za obnovitev vaših podatkov."; +"fileProvider.error.unlockButton" = "Odkleni"; "purchase.retry.button" = "Poizkusi znova"; "settings.title" = "Nastavitve"; @@ -23,5 +29,9 @@ "s3Authentication.existingBucket" = "Obstoječ bucket"; "s3Authentication.endpoint" = "Končna točka"; "s3Authentication.region" = "Regija"; + +"unlockVault.button.unlock" = "Odkleni"; "vaultDetail.button.moveVault" = "Premakni"; "vaultDetail.button.renameVault" = "Preimenuj"; + +"webDAVAuthentication.httpConnection.alert.title" = "Uporabi HTTPS?"; diff --git a/SharedResources/uk.lproj/Localizable.strings b/SharedResources/uk.lproj/Localizable.strings index dad5c5a84..f950c0ce4 100644 --- a/SharedResources/uk.lproj/Localizable.strings +++ b/SharedResources/uk.lproj/Localizable.strings @@ -44,21 +44,34 @@ "addVault.createNewVault.setVaultName.cells.name" = "Назва сховища"; "addVault.createNewVault.setVaultName.error.emptyVaultName" = "Назва Vault не може бути порожньою."; "addVault.createNewVault.chooseCloud.header" = "Де Cryptomator має зберігати зашифровані файли вашого сховища?"; +"addVault.createNewVault.password.enterPassword.header" = "Введіть новий пароль."; +"addVault.createNewVault.password.confirmPassword.header" = "Підтвердіть новий пароль."; +"addVault.createNewVault.password.confirmPassword.alert.title" = "Підтвердити пароль?"; "addVault.createNewVault.password.confirmPassword.alert.message" = "ВАЖЛИВО: Якщо ви забудете пароль, то не зможете відновити дані."; +"addVault.createNewVault.password.error.emptyPassword" = "Пароль не може бути порожнім."; +"addVault.createNewVault.password.error.nonMatchingPasswords" = "Паролі не співпадають."; "addVault.createNewVault.progress" = "Створення сховища…"; "addVault.openExistingVault.title" = "Відкрити сховище"; "addVault.openExistingVault.detectedMasterkey.add" = "Додати це сховище"; +"addVault.openExistingVault.downloadVault.progress" = "Завантаження сховища…"; "addVault.openExistingVault.password.footer" = "Введіть пароль для \"%@\"."; "addVault.openExistingVault.progress" = "Додавання сховища…"; "biometryType.faceID" = "Face ID"; "biometryType.touchID" = "Touch ID"; +"changePassword.header.currentPassword.title" = "Введіть поточний пароль."; +"changePassword.header.newPassword.title" = "Введіть новий пароль."; +"changePassword.header.newPasswordConfirmation.title" = "Підтвердіть новий пароль."; "changePassword.progress" = "Зміна пароля…"; +"cloudProvider.error.itemNotFound" = "\"%@\" не знайдено."; + "fileProvider.onboarding.title" = "Вітаємо"; "fileProvider.onboarding.button.openCryptomator" = "Відкрити Cryptomator"; +"fileProvider.error.biometricalAuthCanceled.title" = "Розблокування скасовано"; "fileProvider.error.biometricalAuthWrongPassword.title" = "Невірний пароль"; "fileProvider.error.unlockButton" = "Розблокувати"; +"fileProvider.uploadProgress.connecting" = "Підключення…"; "hubAuthentication.accessNotGranted" = "Ваш пристрій ще не має прав доступу до цього vault. Попросіть власника vault надати їх."; "hubAuthentication.licenseExceeded" = "У вашого Cryptomator Hub недійсна ліцензія. Будь ласка, повідомте адміністратору Hub, що потрібно оновити або продовжити ліцензію."; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "Назва пристрою"; @@ -72,6 +85,8 @@ "onboarding.title" = "Вітаємо"; "onboarding.button.continue" = "Продовжити"; + +"purchase.beginFreeTrial.alert.title" = "Пробний період розблоковано"; "purchase.expiredTrial" = "Пробний період вичерпано."; "purchase.footer.privacyPolicy" = "Політика конфіденційності"; "purchase.footer.termsOfUse" = "Умови користування"; diff --git a/SharedResources/zh-Hans.lproj/Localizable.strings b/SharedResources/zh-Hans.lproj/Localizable.strings index 3b016e7fe..1cbfd61fb 100644 --- a/SharedResources/zh-Hans.lproj/Localizable.strings +++ b/SharedResources/zh-Hans.lproj/Localizable.strings @@ -115,7 +115,7 @@ "getFolderIntent.error.noVaultSelected" = "未选择任何保险库。"; "hubAuthentication.title" = "Hub 保险库"; -"hubAuthentication.accessNotGranted" = "您的设备尚未授权访问此保险库,请联系保险库所有者,"; +"hubAuthentication.accessNotGranted" = "您的设备尚未授权访问此保险库,请联系保险库所有者。"; "hubAuthentication.licenseExceeded" = "此 Cryptomator Hub 实例许可证无效,请联系Hub管理员升级或者续订许可证。"; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "设备名称"; "hubAuthentication.deviceRegistration.deviceName.footer.title" = "这似乎是设备的首次 Hub 访问。为了识别它以进行访问授权,您需要命名此设备"; diff --git a/SharedResources/zh-Hant.lproj/Localizable.strings b/SharedResources/zh-Hant.lproj/Localizable.strings index a396ab7fc..92da4dca3 100644 --- a/SharedResources/zh-Hant.lproj/Localizable.strings +++ b/SharedResources/zh-Hant.lproj/Localizable.strings @@ -22,6 +22,7 @@ "common.button.next" = "繼續"; "common.button.ok" = "確認"; "common.button.refresh" = "重新整理"; +"common.button.register" = "註冊"; "common.button.remove" = "移除"; "common.button.retry" = "重試"; "common.button.signOut" = "登出"; @@ -59,6 +60,7 @@ "addVault.openExistingVault.chooseCloud.header" = "加密檔案庫位於什麼地方?"; "addVault.openExistingVault.detectedMasterkey.text" = "Cryptomator 在此檢測到加密檔案庫「%@」。\n您想把這加密檔案庫加到列表嗎?"; "addVault.openExistingVault.detectedMasterkey.add" = "添加這個加密檔案庫"; +"addVault.openExistingVault.downloadVault.progress" = "正在下載保險庫…"; "addVault.openExistingVault.password.footer" = "輸入 「%@」 的密碼:"; "addVault.openExistingVault.progress" = "正在添加加密檔案庫……"; "addVault.success.info" = "成功添加加密檔案庫“%@”\n現在可以通過文件管理訪問加密檔案庫"; @@ -111,10 +113,18 @@ "getFolderIntent.error.missingPath" = "沒有提供路徑。請提供應返回資料夾的有效路徑。"; "getFolderIntent.error.noVaultSelected" = "未選擇任何加密檔案庫。"; + +"hubAuthentication.title" = "Hub 加密檔案庫"; "hubAuthentication.accessNotGranted" = "您的設備權限尚未允許存取檔案庫,請聯絡檔案庫擁有者"; "hubAuthentication.licenseExceeded" = "此 Cryptomator Hub 實例授權無效,請聯繫管理員升級或續訂授權。"; "hubAuthentication.deviceRegistration.deviceName.cells.name" = "設備名稱"; +"hubAuthentication.deviceRegistration.deviceName.footer.title" = "似乎這是第一次 Hub 訪問此設備。為了辨識它以授權訪問,您需要命名此設備。"; +"hubAuthentication.deviceRegistration.accountKey.footer.title" = "需要您的帳戶金鑰才能從新應用或瀏覽器登入。 可以在你的個人資料中找到它。"; +"hubAuthentication.deviceRegistration.needsAuthorization.alert.title" = "註冊設備成功"; "hubAuthentication.deviceRegistration.needsAuthorization.alert.message" = "想讀取檔案庫,你的設備需得到檔案庫擁有者的授權。"; +"hubAuthentication.requireAccountInit.alert.title" = "需進一步操作"; +"hubAuthentication.requireAccountInit.alert.message" = "請完成您使用者檔案中所需的步驟,以便繼續進行。"; +"hubAuthentication.requireAccountInit.alert.actionButton" = "轉到個人資料"; "intents.saveFile.missingFile" = "提供的檔案無效。"; "intents.saveFile.invalidFolder" = "提供的資料夾無效。"; diff --git a/fastlane/changelog.txt b/fastlane/changelog.txt index f38d2e1d6..6afe6a9f2 100644 --- a/fastlane/changelog.txt +++ b/fastlane/changelog.txt @@ -1,3 +1 @@ -- Added support for Cryptomator Hub (#315, #322, #323, #326, #329, #332, #333) -- New vaults are now created with GCM encryption by default (#288) -- Added Bangla, Filipino, and Hungarian translations \ No newline at end of file +- Fixed "Content Unavailable" error when unlocking vault that was created on macOS in iCloud Drive (#316) \ 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 c020ba9c2..e3ee06575 100644 --- a/fastlane/config/freemium/metadata/de-DE/release_notes.txt +++ b/fastlane/config/freemium/metadata/de-DE/release_notes.txt @@ -1,3 +1 @@ -- Unterstützung für Cryptomator Hub hinzugefügt (#315, #322, #323, #326, #329, #332, #333) -- Neue Tresore werden nun standardmäßig mit GCM-Verschlüsselung erstellt (#288) -- Übersetzungen für Bangla, Filipino und Ungarisch hinzugefügt \ No newline at end of file +- Fehler "Inhalt nicht verfügbar" beim Entsperren eines Tresors, der auf macOS in iCloud Drive erstellt wurde, behoben (#316) \ 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 f38d2e1d6..6afe6a9f2 100644 --- a/fastlane/config/freemium/metadata/en-US/release_notes.txt +++ b/fastlane/config/freemium/metadata/en-US/release_notes.txt @@ -1,3 +1 @@ -- Added support for Cryptomator Hub (#315, #322, #323, #326, #329, #332, #333) -- New vaults are now created with GCM encryption by default (#288) -- Added Bangla, Filipino, and Hungarian translations \ No newline at end of file +- Fixed "Content Unavailable" error when unlocking vault that was created on macOS in iCloud Drive (#316) \ 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 c020ba9c2..e3ee06575 100644 --- a/fastlane/config/premium/metadata/de-DE/release_notes.txt +++ b/fastlane/config/premium/metadata/de-DE/release_notes.txt @@ -1,3 +1 @@ -- Unterstützung für Cryptomator Hub hinzugefügt (#315, #322, #323, #326, #329, #332, #333) -- Neue Tresore werden nun standardmäßig mit GCM-Verschlüsselung erstellt (#288) -- Übersetzungen für Bangla, Filipino und Ungarisch hinzugefügt \ No newline at end of file +- Fehler "Inhalt nicht verfügbar" beim Entsperren eines Tresors, der auf macOS in iCloud Drive erstellt wurde, behoben (#316) \ 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 f38d2e1d6..6afe6a9f2 100644 --- a/fastlane/config/premium/metadata/en-US/release_notes.txt +++ b/fastlane/config/premium/metadata/en-US/release_notes.txt @@ -1,3 +1 @@ -- Added support for Cryptomator Hub (#315, #322, #323, #326, #329, #332, #333) -- New vaults are now created with GCM encryption by default (#288) -- Added Bangla, Filipino, and Hungarian translations \ No newline at end of file +- Fixed "Content Unavailable" error when unlocking vault that was created on macOS in iCloud Drive (#316) \ No newline at end of file