mirror of
https://github.com/sudosylabs/vnidrop.git
synced 2026-08-05 18:39:55 +02:00
Compare commits
4 Commits
8b31c0fe78
...
e22e395efc
| Author | SHA1 | Date | |
|---|---|---|---|
| e22e395efc | |||
| 677c3ce47f | |||
| 20597e6e88 | |||
| 42f569dcf0 |
@@ -1,5 +1,8 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
|
/// Scene identifier for the single main window.
|
||||||
|
private let mainWindowId = "main"
|
||||||
|
|
||||||
/// Native app entry point for iOS, iPadOS, and macOS.
|
/// Native app entry point for iOS, iPadOS, and macOS.
|
||||||
/// Opens `.vnd` invitations via `onOpenURL` and routes them to the receive flow.
|
/// Opens `.vnd` invitations via `onOpenURL` and routes them to the receive flow.
|
||||||
@main
|
@main
|
||||||
@@ -7,11 +10,21 @@ struct VniDropApp: App {
|
|||||||
@StateObject private var externalInvitations = ExternalInvitationController()
|
@StateObject private var externalInvitations = ExternalInvitationController()
|
||||||
|
|
||||||
var body: some Scene {
|
var body: some Scene {
|
||||||
WindowGroup {
|
#if os(macOS)
|
||||||
|
// A single-instance `Window` (not `WindowGroup`): the app must never open a
|
||||||
|
// second window. `Window` also drops the ⌘N "New Window" command.
|
||||||
|
Window(Text(verbatim: "VniDrop"), id: mainWindowId) {
|
||||||
RootView(dependencies: makeAppDependencies(externalInvitations: externalInvitations))
|
RootView(dependencies: makeAppDependencies(externalInvitations: externalInvitations))
|
||||||
.ignoresSafeArea()
|
.ignoresSafeArea()
|
||||||
.onOpenURL(perform: openInvitation)
|
.onOpenURL(perform: openInvitation)
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
WindowGroup(id: mainWindowId) {
|
||||||
|
RootView(dependencies: makeAppDependencies(externalInvitations: externalInvitations))
|
||||||
|
.ignoresSafeArea()
|
||||||
|
.onOpenURL(perform: openInvitation)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Reads a `.vnd` invitation document under a security scope, enforcing the
|
/// Reads a `.vnd` invitation document under a security scope, enforcing the
|
||||||
|
|||||||
@@ -55,7 +55,9 @@ struct SettingsState: Equatable {
|
|||||||
var bugLogPreviewBytes = 0
|
var bugLogPreviewBytes = 0
|
||||||
var storage: StorageBreakdown?
|
var storage: StorageBreakdown?
|
||||||
var isCalculatingStorage = false
|
var isCalculatingStorage = false
|
||||||
|
var storageLoadFailed = false
|
||||||
var isDeletingTransfers = false
|
var isDeletingTransfers = false
|
||||||
|
var isCleaningStorage = false
|
||||||
|
|
||||||
static func == (lhs: SettingsState, rhs: SettingsState) -> Bool {
|
static func == (lhs: SettingsState, rhs: SettingsState) -> Bool {
|
||||||
lhs.selectedSection == rhs.selectedSection && lhs.username == rhs.username
|
lhs.selectedSection == rhs.selectedSection && lhs.username == rhs.username
|
||||||
@@ -71,7 +73,9 @@ struct SettingsState: Equatable {
|
|||||||
&& lhs.bugIncludeLogs == rhs.bugIncludeLogs && lhs.isSubmittingBugReport == rhs.isSubmittingBugReport
|
&& lhs.bugIncludeLogs == rhs.bugIncludeLogs && lhs.isSubmittingBugReport == rhs.isSubmittingBugReport
|
||||||
&& lhs.bugLogPreviewBytes == rhs.bugLogPreviewBytes
|
&& lhs.bugLogPreviewBytes == rhs.bugLogPreviewBytes
|
||||||
&& lhs.storage == rhs.storage && lhs.isCalculatingStorage == rhs.isCalculatingStorage
|
&& lhs.storage == rhs.storage && lhs.isCalculatingStorage == rhs.isCalculatingStorage
|
||||||
|
&& lhs.storageLoadFailed == rhs.storageLoadFailed
|
||||||
&& lhs.isDeletingTransfers == rhs.isDeletingTransfers
|
&& lhs.isDeletingTransfers == rhs.isDeletingTransfers
|
||||||
|
&& lhs.isCleaningStorage == rhs.isCleaningStorage
|
||||||
&& lhs.deviceInfo?.operatingSystem == rhs.deviceInfo?.operatingSystem
|
&& lhs.deviceInfo?.operatingSystem == rhs.deviceInfo?.operatingSystem
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -263,17 +267,28 @@ final class SettingsModel: ObservableObject {
|
|||||||
|
|
||||||
// MARK: - Storage
|
// MARK: - Storage
|
||||||
|
|
||||||
/// Recomputes the on-disk usage breakdown off the main actor.
|
/// Recomputes the on-disk usage breakdown off the main actor. Safe to call
|
||||||
|
/// before the core is ready: it keeps the spinner up and waits for the core to
|
||||||
|
/// finish initializing (it starts asynchronously at launch) rather than bailing.
|
||||||
func loadStorageUsage() {
|
func loadStorageUsage() {
|
||||||
if state.isCalculatingStorage { return }
|
if state.isCalculatingStorage { return }
|
||||||
state.isCalculatingStorage = true
|
state.isCalculatingStorage = true
|
||||||
|
state.storageLoadFailed = false
|
||||||
let tempDir = NSTemporaryDirectory()
|
let tempDir = NSTemporaryDirectory()
|
||||||
Task {
|
Task {
|
||||||
|
// The core initializes asynchronously at launch; poll briefly so opening
|
||||||
|
// Storage early doesn't leave the summary stuck.
|
||||||
|
var attempts = 0
|
||||||
|
while !repository.state.isInitialized && attempts < 100 {
|
||||||
|
try? await Task.sleep(nanoseconds: 100_000_000)
|
||||||
|
attempts += 1
|
||||||
|
}
|
||||||
let coreResult = await repository.storageUsage()
|
let coreResult = await repository.storageUsage()
|
||||||
let artifactsResult = await repository.receivedArtifacts()
|
let artifactsResult = await repository.receivedArtifacts()
|
||||||
guard case .success(let core) = coreResult,
|
guard case .success(let core) = coreResult,
|
||||||
case .success(let artifacts) = artifactsResult else {
|
case .success(let artifacts) = artifactsResult else {
|
||||||
state.isCalculatingStorage = false
|
state.isCalculatingStorage = false
|
||||||
|
state.storageLoadFailed = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let diskSizes = await Task.detached {
|
let diskSizes = await Task.detached {
|
||||||
@@ -315,6 +330,83 @@ final class SettingsModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Reclaims disk space the core's transfer deletion doesn't touch: the app's
|
||||||
|
/// temporary directory (leftover picker/staging copies) and any stray `.Trash`
|
||||||
|
/// folders that accumulate inside app-owned directories. Never touches received
|
||||||
|
/// files, the core database, or user-chosen receive folders.
|
||||||
|
func freeUpSpace() {
|
||||||
|
if state.isCleaningStorage { return }
|
||||||
|
// Purging staging while a transfer is mid-flight could break it.
|
||||||
|
let hasActive = repository.state.transfers.contains {
|
||||||
|
$0.status == .sharing || $0.status == .importing || $0.status == .receiving
|
||||||
|
}
|
||||||
|
if hasActive {
|
||||||
|
messages.tryShow(UiMessage(text: .resource(L10n.Storage.cleanupBusy), tone: .warning))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
state.isCleaningStorage = true
|
||||||
|
let tempDir = NSTemporaryDirectory()
|
||||||
|
let dataDir = environment.defaultCoreDataDir
|
||||||
|
// Only clean the receive folder's trash when it is app-owned (iOS fixed
|
||||||
|
// Documents), never a user-chosen macOS folder like ~/Downloads.
|
||||||
|
let receiveTrashRoot = fileSystemService.supportsCustomReceiveFolders ? nil : state.receiveFolder?.value
|
||||||
|
Task {
|
||||||
|
let freed = await Task.detached {
|
||||||
|
SettingsModel.reclaimJunk(tempDir: tempDir, dataDir: dataDir, receiveTrashRoot: receiveTrashRoot)
|
||||||
|
}.value
|
||||||
|
state.isCleaningStorage = false
|
||||||
|
loadStorageUsage()
|
||||||
|
messages.show(UiMessage(
|
||||||
|
text: .dynamic(L10n.Storage.cleanupFreed(size: formatBytes(freed))),
|
||||||
|
tone: .success
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Deletes temp-directory contents and `.Trash` folders under the given roots,
|
||||||
|
/// returning the number of bytes reclaimed. Runs off the main actor.
|
||||||
|
nonisolated static func reclaimJunk(tempDir: String, dataDir: String, receiveTrashRoot: String?) -> UInt64 {
|
||||||
|
let fm = FileManager.default
|
||||||
|
var freed: UInt64 = 0
|
||||||
|
// Empty the temporary directory.
|
||||||
|
if let entries = try? fm.contentsOfDirectory(atPath: tempDir) {
|
||||||
|
for name in entries {
|
||||||
|
let path = (tempDir as NSString).appendingPathComponent(name)
|
||||||
|
freed += itemSize(path)
|
||||||
|
try? fm.removeItem(atPath: path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Remove stray `.Trash` folders inside app-owned directories.
|
||||||
|
for root in [dataDir, receiveTrashRoot].compactMap({ $0 }) {
|
||||||
|
for trash in trashDirectories(under: root) {
|
||||||
|
freed += directorySize(trash)
|
||||||
|
try? fm.removeItem(atPath: trash)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return freed
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Paths of every directory named `.Trash` under `root` (not descending into them).
|
||||||
|
private nonisolated static func trashDirectories(under root: String) -> [String] {
|
||||||
|
let url = URL(fileURLWithPath: root, isDirectory: true)
|
||||||
|
guard let enumerator = FileManager.default.enumerator(
|
||||||
|
at: url, includingPropertiesForKeys: [.isDirectoryKey]
|
||||||
|
) else { return [] }
|
||||||
|
var result: [String] = []
|
||||||
|
for case let fileURL as URL in enumerator where fileURL.lastPathComponent == ".Trash" {
|
||||||
|
result.append(fileURL.path)
|
||||||
|
enumerator.skipDescendants()
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allocated size of a file or directory (0 if missing).
|
||||||
|
private nonisolated static func itemSize(_ path: String) -> UInt64 {
|
||||||
|
var isDirectory: ObjCBool = false
|
||||||
|
guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) else { return 0 }
|
||||||
|
return isDirectory.boolValue ? directorySize(path) : fileSize(path)
|
||||||
|
}
|
||||||
|
|
||||||
nonisolated static func fileSize(_ path: String) -> UInt64 {
|
nonisolated static func fileSize(_ path: String) -> UInt64 {
|
||||||
let values = try? URL(fileURLWithPath: path).resourceValues(
|
let values = try? URL(fileURLWithPath: path).resourceValues(
|
||||||
forKeys: [.isRegularFileKey, .totalFileAllocatedSizeKey, .fileSizeKey]
|
forKeys: [.isRegularFileKey, .totalFileAllocatedSizeKey, .fileSizeKey]
|
||||||
|
|||||||
@@ -78,44 +78,71 @@ struct StorageSettings: View {
|
|||||||
@ObservedObject var model: SettingsModel
|
@ObservedObject var model: SettingsModel
|
||||||
@State private var showDeleteConfirmation = false
|
@State private var showDeleteConfirmation = false
|
||||||
|
|
||||||
|
private var isBusy: Bool {
|
||||||
|
model.state.isCalculatingStorage || model.state.isCleaningStorage || model.state.isDeletingTransfers
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Section {
|
Section {
|
||||||
if let storage = model.state.storage {
|
usageContent
|
||||||
LabeledContent(String(localized: L10n.Storage.receivedFiles), value: formatBytes(storage.receivedFiles))
|
} header: {
|
||||||
LabeledContent(String(localized: L10n.Storage.transferData), value: formatBytes(storage.transferCache))
|
|
||||||
LabeledContent(String(localized: L10n.Storage.appData), value: formatBytes(storage.appData))
|
|
||||||
LabeledContent(String(localized: L10n.Storage.temporary), value: formatBytes(storage.temporary))
|
|
||||||
LabeledContent(String(localized: L10n.Storage.total)) {
|
|
||||||
Text(formatBytes(storage.total)).fontWeight(.semibold)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
HStack {
|
HStack {
|
||||||
Text(String(localized: L10n.Storage.calculating)).foregroundStyle(.secondary)
|
Text(String(localized: L10n.Storage.usageHeader))
|
||||||
Spacer()
|
Spacer()
|
||||||
ProgressView()
|
if model.state.isCalculatingStorage {
|
||||||
|
ProgressView().controlSize(.small)
|
||||||
|
} else {
|
||||||
|
Button(action: model.loadStorageUsage) {
|
||||||
|
Label(String(localized: L10n.Storage.refresh), systemSymbol: .arrowClockwise)
|
||||||
|
.labelStyle(.iconOnly)
|
||||||
|
}
|
||||||
|
.buttonStyle(.borderless)
|
||||||
|
.disabled(isBusy)
|
||||||
|
.help(String(localized: L10n.Storage.refresh))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} footer: {
|
} footer: {
|
||||||
Text(String(localized: L10n.Storage.footer))
|
Text(String(localized: L10n.Storage.footer))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reclaim reversible junk (temp + trash) — non-destructive to history.
|
||||||
Section {
|
Section {
|
||||||
Button(role: .destructive) {
|
Button(action: model.freeUpSpace) {
|
||||||
|
actionLabel(
|
||||||
|
title: L10n.Storage.freeUpSpace,
|
||||||
|
busyTitle: L10n.Storage.cleaning,
|
||||||
|
isBusy: model.state.isCleaningStorage,
|
||||||
|
symbol: .sparkles,
|
||||||
|
tint: .accentColor
|
||||||
|
)
|
||||||
|
}
|
||||||
|
// `.plain` so pressing the row dims the label instead of flipping it to
|
||||||
|
// the white selection-highlight that the default form button style uses.
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.disabled(isBusy)
|
||||||
|
} footer: {
|
||||||
|
Text(String(localized: L10n.Storage.freeUpSpaceCaption))
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructive: clears transfer history + cached share content.
|
||||||
|
Section {
|
||||||
|
Button {
|
||||||
showDeleteConfirmation = true
|
showDeleteConfirmation = true
|
||||||
} label: {
|
} label: {
|
||||||
HStack {
|
actionLabel(
|
||||||
Text(model.state.isDeletingTransfers
|
title: L10n.Storage.deleteTransfers,
|
||||||
? String(localized: L10n.Storage.deleting)
|
busyTitle: L10n.Storage.deleting,
|
||||||
: String(localized: L10n.Storage.deleteTransfers))
|
isBusy: model.state.isDeletingTransfers,
|
||||||
if model.state.isDeletingTransfers {
|
symbol: .trash,
|
||||||
Spacer()
|
tint: .red
|
||||||
ProgressView()
|
)
|
||||||
}
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.disabled(isBusy)
|
||||||
|
} footer: {
|
||||||
|
Text(String(localized: L10n.Storage.deleteTransfersCaption))
|
||||||
}
|
}
|
||||||
}
|
.task { model.loadStorageUsage() }
|
||||||
.disabled(model.state.isDeletingTransfers)
|
|
||||||
}
|
|
||||||
.onAppear { model.loadStorageUsage() }
|
|
||||||
.confirmationDialog(
|
.confirmationDialog(
|
||||||
Text(String(localized: L10n.Storage.deleteTransfers)),
|
Text(String(localized: L10n.Storage.deleteTransfers)),
|
||||||
isPresented: $showDeleteConfirmation,
|
isPresented: $showDeleteConfirmation,
|
||||||
@@ -129,6 +156,53 @@ struct StorageSettings: View {
|
|||||||
Text(String(localized: L10n.Storage.deleteTransfersDescription))
|
Text(String(localized: L10n.Storage.deleteTransfersDescription))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder
|
||||||
|
private var usageContent: some View {
|
||||||
|
if let storage = model.state.storage {
|
||||||
|
LabeledContent(String(localized: L10n.Storage.receivedFiles), value: formatBytes(storage.receivedFiles))
|
||||||
|
LabeledContent(String(localized: L10n.Storage.transferData), value: formatBytes(storage.transferCache))
|
||||||
|
LabeledContent(String(localized: L10n.Storage.appData), value: formatBytes(storage.appData))
|
||||||
|
LabeledContent(String(localized: L10n.Storage.temporary), value: formatBytes(storage.temporary))
|
||||||
|
LabeledContent(String(localized: L10n.Storage.total)) {
|
||||||
|
Text(formatBytes(storage.total)).fontWeight(.semibold)
|
||||||
|
}
|
||||||
|
} else if model.state.storageLoadFailed {
|
||||||
|
// Genuine failure (core reported an error) — offer a retry.
|
||||||
|
Button(action: model.loadStorageUsage) {
|
||||||
|
Label(String(localized: L10n.Storage.unavailable), systemSymbol: .arrowClockwise)
|
||||||
|
.foregroundStyle(.secondary)
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
} else {
|
||||||
|
// Loading, or waiting for the core to finish starting.
|
||||||
|
HStack {
|
||||||
|
Text(String(localized: L10n.Storage.calculating)).foregroundStyle(.secondary)
|
||||||
|
Spacer()
|
||||||
|
ProgressView().controlSize(.small)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A tinted, full-width button label with a leading symbol and a trailing
|
||||||
|
/// spinner while busy. `.contentShape` keeps the whole row tappable.
|
||||||
|
private func actionLabel(
|
||||||
|
title: String.LocalizationValue,
|
||||||
|
busyTitle: String.LocalizationValue,
|
||||||
|
isBusy: Bool,
|
||||||
|
symbol: SFSymbol,
|
||||||
|
tint: Color
|
||||||
|
) -> some View {
|
||||||
|
HStack {
|
||||||
|
Label(String(localized: isBusy ? busyTitle : title), systemSymbol: symbol)
|
||||||
|
Spacer()
|
||||||
|
if isBusy {
|
||||||
|
ProgressView().controlSize(.small)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.foregroundStyle(tint)
|
||||||
|
.contentShape(Rectangle())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AboutSettings: View {
|
struct AboutSettings: View {
|
||||||
|
|||||||
@@ -20,6 +20,10 @@
|
|||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||||
<key>CFBundleDisplayName</key>
|
<key>CFBundleDisplayName</key>
|
||||||
<string>VniDrop</string>
|
<string>VniDrop</string>
|
||||||
|
<!-- macOS: a single instance only; re-launching activates the running app
|
||||||
|
instead of spawning another copy. -->
|
||||||
|
<key>LSMultipleInstancesProhibited</key>
|
||||||
|
<true/>
|
||||||
<key>CFBundleDocumentTypes</key>
|
<key>CFBundleDocumentTypes</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
@@ -63,6 +67,10 @@
|
|||||||
<string>VniDrop uses the camera to scan transfer QR codes.</string>
|
<string>VniDrop uses the camera to scan transfer QR codes.</string>
|
||||||
<key>NSLocalNetworkUsageDescription</key>
|
<key>NSLocalNetworkUsageDescription</key>
|
||||||
<string>VniDrop needs local network access to send to other local devices if needed.</string>
|
<string>VniDrop needs local network access to send to other local devices if needed.</string>
|
||||||
|
<!-- iPadOS: a single scene only — no second window via Stage Manager / split
|
||||||
|
view. Mirrors the single-window macOS behavior. -->
|
||||||
|
<key>UIApplicationSupportsMultipleScenes</key>
|
||||||
|
<false/>
|
||||||
<key>UIBackgroundModes</key>
|
<key>UIBackgroundModes</key>
|
||||||
<array>
|
<array>
|
||||||
<string>fetch</string>
|
<string>fetch</string>
|
||||||
|
|||||||
@@ -3140,6 +3140,138 @@
|
|||||||
"ru": "Вычисление…"
|
"ru": "Вычисление…"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"storage_cleaning": {
|
||||||
|
"context": "Settings > Storage: free-up-space button while cleanup runs.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Cleaning up…",
|
||||||
|
"fr": "Nettoyage…",
|
||||||
|
"es": "Limpiando…",
|
||||||
|
"it": "Pulizia…",
|
||||||
|
"de": "Wird bereinigt…",
|
||||||
|
"pt": "A limpar…",
|
||||||
|
"pl": "Czyszczenie…",
|
||||||
|
"nl": "Opschonen…",
|
||||||
|
"ru": "Очистка…"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_cleanup_busy": {
|
||||||
|
"context": "Settings > Storage: shown when cleanup is blocked by in-flight transfers.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Finish active transfers before freeing up space",
|
||||||
|
"fr": "Terminez les transferts en cours avant de libérer de l'espace",
|
||||||
|
"es": "Finaliza las transferencias activas antes de liberar espacio",
|
||||||
|
"it": "Completa i trasferimenti attivi prima di liberare spazio",
|
||||||
|
"de": "Beende aktive Übertragungen, bevor du Speicher freigibst",
|
||||||
|
"pt": "Conclui as transferências ativas antes de libertar espaço",
|
||||||
|
"pl": "Zakończ aktywne transfery przed zwolnieniem miejsca",
|
||||||
|
"nl": "Voltooi actieve overdrachten voordat je ruimte vrijmaakt",
|
||||||
|
"ru": "Завершите активные передачи перед освобождением места"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_cleanup_freed": {
|
||||||
|
"context": "Settings > Storage: cleanup success. {size} = amount freed.",
|
||||||
|
"args": [
|
||||||
|
{
|
||||||
|
"name": "size",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"translations": {
|
||||||
|
"en": "Freed {size}",
|
||||||
|
"fr": "{size} libéré",
|
||||||
|
"es": "Se liberó {size}",
|
||||||
|
"it": "Liberati {size}",
|
||||||
|
"de": "{size} freigegeben",
|
||||||
|
"pt": "Libertado {size}",
|
||||||
|
"pl": "Zwolniono {size}",
|
||||||
|
"nl": "{size} vrijgemaakt",
|
||||||
|
"ru": "Освобождено {size}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_delete_transfers_caption": {
|
||||||
|
"context": "Settings > Storage: caption under the destructive delete-all button.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Clears your send and receive history and the app's cached share content. Received files on disk are kept.",
|
||||||
|
"fr": "Efface votre historique d'envois et de réceptions ainsi que le contenu de partage mis en cache par l'app. Les fichiers reçus sur le disque sont conservés.",
|
||||||
|
"es": "Borra tu historial de envíos y recepciones y el contenido compartido en caché de la app. Los archivos recibidos en el disco se conservan.",
|
||||||
|
"it": "Cancella la cronologia di invii e ricezioni e i contenuti di condivisione memorizzati dall'app. I file ricevuti sul disco vengono mantenuti.",
|
||||||
|
"de": "Löscht deinen Sende- und Empfangsverlauf sowie die zwischengespeicherten Freigabeinhalte der App. Empfangene Dateien auf dem Datenträger bleiben erhalten.",
|
||||||
|
"pt": "Limpa o teu histórico de envios e receções e o conteúdo de partilha em cache da app. Os ficheiros recebidos no disco são mantidos.",
|
||||||
|
"pl": "Czyści historię wysyłania i odbierania oraz zapisane w pamięci podręcznej udostępniane treści. Odebrane pliki na dysku zostają zachowane.",
|
||||||
|
"nl": "Wist je verzend- en ontvangstgeschiedenis en de gecachte deelinhoud van de app. Ontvangen bestanden op schijf blijven behouden.",
|
||||||
|
"ru": "Очищает историю отправки и получения и кэшированное содержимое общих ресурсов. Полученные файлы на диске сохраняются."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_free_up_space_caption": {
|
||||||
|
"context": "Settings > Storage: caption under the free-up-space button.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Removes temporary files and leftover trash from earlier transfers. Your transfers and received files are kept.",
|
||||||
|
"fr": "Supprime les fichiers temporaires et les résidus des transferts précédents. Vos transferts et fichiers reçus sont conservés.",
|
||||||
|
"es": "Elimina los archivos temporales y los restos de transferencias anteriores. Tus transferencias y archivos recibidos se conservan.",
|
||||||
|
"it": "Rimuove i file temporanei e i residui dei trasferimenti precedenti. I tuoi trasferimenti e i file ricevuti vengono mantenuti.",
|
||||||
|
"de": "Entfernt temporäre Dateien und Reste früherer Übertragungen. Deine Übertragungen und empfangenen Dateien bleiben erhalten.",
|
||||||
|
"pt": "Remove ficheiros temporários e resíduos de transferências anteriores. As tuas transferências e ficheiros recebidos são mantidos.",
|
||||||
|
"pl": "Usuwa pliki tymczasowe i pozostałości po wcześniejszych transferach. Twoje transfery i odebrane pliki zostają zachowane.",
|
||||||
|
"nl": "Verwijdert tijdelijke bestanden en resten van eerdere overdrachten. Je overdrachten en ontvangen bestanden blijven behouden.",
|
||||||
|
"ru": "Удаляет временные файлы и остатки прошлых передач. Ваши передачи и полученные файлы сохраняются."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_refresh": {
|
||||||
|
"context": "Settings > Storage: label for the button that recalculates usage.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Refresh",
|
||||||
|
"fr": "Actualiser",
|
||||||
|
"es": "Actualizar",
|
||||||
|
"it": "Aggiorna",
|
||||||
|
"de": "Aktualisieren",
|
||||||
|
"pt": "Atualizar",
|
||||||
|
"pl": "Odśwież",
|
||||||
|
"nl": "Vernieuwen",
|
||||||
|
"ru": "Обновить"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_unavailable": {
|
||||||
|
"context": "Settings > Storage: shown when usage couldn't be calculated yet.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Storage usage isn't available yet",
|
||||||
|
"fr": "L'utilisation du stockage n'est pas encore disponible",
|
||||||
|
"es": "El uso de almacenamiento aún no está disponible",
|
||||||
|
"it": "L'utilizzo dello spazio non è ancora disponibile",
|
||||||
|
"de": "Die Speichernutzung ist noch nicht verfügbar",
|
||||||
|
"pt": "A utilização do armazenamento ainda não está disponível",
|
||||||
|
"pl": "Wykorzystanie pamięci nie jest jeszcze dostępne",
|
||||||
|
"nl": "Opslaggebruik is nog niet beschikbaar",
|
||||||
|
"ru": "Данные об использовании хранилища пока недоступны"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_usage_header": {
|
||||||
|
"context": "Settings > Storage: header above the usage breakdown.",
|
||||||
|
"translations": {
|
||||||
|
"en": "On this device",
|
||||||
|
"fr": "Sur cet appareil",
|
||||||
|
"es": "En este dispositivo",
|
||||||
|
"it": "Su questo dispositivo",
|
||||||
|
"de": "Auf diesem Gerät",
|
||||||
|
"pt": "Neste dispositivo",
|
||||||
|
"pl": "Na tym urządzeniu",
|
||||||
|
"nl": "Op dit apparaat",
|
||||||
|
"ru": "На этом устройстве"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage_free_up_space": {
|
||||||
|
"context": "Settings > Storage: button that clears temporary files and stray trash.",
|
||||||
|
"translations": {
|
||||||
|
"en": "Free up space",
|
||||||
|
"fr": "Libérer de l'espace",
|
||||||
|
"es": "Liberar espacio",
|
||||||
|
"it": "Libera spazio",
|
||||||
|
"de": "Speicher freigeben",
|
||||||
|
"pt": "Libertar espaço",
|
||||||
|
"pl": "Zwolnij miejsce",
|
||||||
|
"nl": "Ruimte vrijmaken",
|
||||||
|
"ru": "Освободить место"
|
||||||
|
}
|
||||||
|
},
|
||||||
"storage_delete_transfers": {
|
"storage_delete_transfers": {
|
||||||
"context": "Settings > Storage: button to delete all transfer records.",
|
"context": "Settings > Storage: button to delete all transfer records.",
|
||||||
"translations": {
|
"translations": {
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Wird empfangen</string>
|
<string name="status_receiving">Wird empfangen</string>
|
||||||
<string name="status_stopped">Beendet</string>
|
<string name="status_stopped">Beendet</string>
|
||||||
<string name="storage_calculating">Wird berechnet…</string>
|
<string name="storage_calculating">Wird berechnet…</string>
|
||||||
|
<string name="storage_cleaning">Wird bereinigt…</string>
|
||||||
|
<string name="storage_cleanup_busy">Beende aktive Übertragungen, bevor du Speicher freigibst</string>
|
||||||
|
<string name="storage_cleanup_freed">%1$s freigegeben</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Löscht deinen Sende- und Empfangsverlauf sowie die zwischengespeicherten Freigabeinhalte der App. Empfangene Dateien auf dem Datenträger bleiben erhalten.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Entfernt temporäre Dateien und Reste früherer Übertragungen. Deine Übertragungen und empfangenen Dateien bleiben erhalten.</string>
|
||||||
|
<string name="storage_refresh">Aktualisieren</string>
|
||||||
|
<string name="storage_unavailable">Die Speichernutzung ist noch nicht verfügbar</string>
|
||||||
|
<string name="storage_usage_header">Auf diesem Gerät</string>
|
||||||
|
<string name="storage_free_up_space">Speicher freigeben</string>
|
||||||
<string name="storage_delete_transfers">Alle Übertragungen löschen</string>
|
<string name="storage_delete_transfers">Alle Übertragungen löschen</string>
|
||||||
<string name="storage_delete_transfers_description">Dadurch werden alle Datensätze gesendeter und empfangener Übertragungen aus Ihrem Verlauf gelöscht. Ihre empfangenen Dateien werden nicht gelöscht. Nicht mehr benötigte zwischengespeicherte freigegebene Inhalte werden automatisch bereinigt; dies kann etwas dauern. Dies kann nicht rückgängig gemacht werden.</string>
|
<string name="storage_delete_transfers_description">Dadurch werden alle Datensätze gesendeter und empfangener Übertragungen aus Ihrem Verlauf gelöscht. Ihre empfangenen Dateien werden nicht gelöscht. Nicht mehr benötigte zwischengespeicherte freigegebene Inhalte werden automatisch bereinigt; dies kann etwas dauern. Dies kann nicht rückgängig gemacht werden.</string>
|
||||||
<string name="storage_app_data">App-Daten</string>
|
<string name="storage_app_data">App-Daten</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Recibiendo</string>
|
<string name="status_receiving">Recibiendo</string>
|
||||||
<string name="status_stopped">Detenido</string>
|
<string name="status_stopped">Detenido</string>
|
||||||
<string name="storage_calculating">Calculando…</string>
|
<string name="storage_calculating">Calculando…</string>
|
||||||
|
<string name="storage_cleaning">Limpiando…</string>
|
||||||
|
<string name="storage_cleanup_busy">Finaliza las transferencias activas antes de liberar espacio</string>
|
||||||
|
<string name="storage_cleanup_freed">Se liberó %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Borra tu historial de envíos y recepciones y el contenido compartido en caché de la app. Los archivos recibidos en el disco se conservan.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Elimina los archivos temporales y los restos de transferencias anteriores. Tus transferencias y archivos recibidos se conservan.</string>
|
||||||
|
<string name="storage_refresh">Actualizar</string>
|
||||||
|
<string name="storage_unavailable">El uso de almacenamiento aún no está disponible</string>
|
||||||
|
<string name="storage_usage_header">En este dispositivo</string>
|
||||||
|
<string name="storage_free_up_space">Liberar espacio</string>
|
||||||
<string name="storage_delete_transfers">Eliminar todas las transferencias</string>
|
<string name="storage_delete_transfers">Eliminar todas las transferencias</string>
|
||||||
<string name="storage_delete_transfers_description">Esto borra de su historial todos los registros de transferencias enviadas y recibidas. Sus archivos recibidos no se eliminan. El contenido compartido en caché que ya no se necesita se recupera automáticamente, lo que puede tardar un poco. Esto no se puede deshacer.</string>
|
<string name="storage_delete_transfers_description">Esto borra de su historial todos los registros de transferencias enviadas y recibidas. Sus archivos recibidos no se eliminan. El contenido compartido en caché que ya no se necesita se recupera automáticamente, lo que puede tardar un poco. Esto no se puede deshacer.</string>
|
||||||
<string name="storage_app_data">Datos de la aplicación</string>
|
<string name="storage_app_data">Datos de la aplicación</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Réception</string>
|
<string name="status_receiving">Réception</string>
|
||||||
<string name="status_stopped">Arrêté</string>
|
<string name="status_stopped">Arrêté</string>
|
||||||
<string name="storage_calculating">Calcul…</string>
|
<string name="storage_calculating">Calcul…</string>
|
||||||
|
<string name="storage_cleaning">Nettoyage…</string>
|
||||||
|
<string name="storage_cleanup_busy">Terminez les transferts en cours avant de libérer de l\'espace</string>
|
||||||
|
<string name="storage_cleanup_freed">%1$s libéré</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Efface votre historique d\'envois et de réceptions ainsi que le contenu de partage mis en cache par l\'app. Les fichiers reçus sur le disque sont conservés.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Supprime les fichiers temporaires et les résidus des transferts précédents. Vos transferts et fichiers reçus sont conservés.</string>
|
||||||
|
<string name="storage_refresh">Actualiser</string>
|
||||||
|
<string name="storage_unavailable">L\'utilisation du stockage n\'est pas encore disponible</string>
|
||||||
|
<string name="storage_usage_header">Sur cet appareil</string>
|
||||||
|
<string name="storage_free_up_space">Libérer de l\'espace</string>
|
||||||
<string name="storage_delete_transfers">Supprimer tous les transferts</string>
|
<string name="storage_delete_transfers">Supprimer tous les transferts</string>
|
||||||
<string name="storage_delete_transfers_description">Cela efface de votre historique tous les enregistrements de transferts envoyés et reçus. Vos fichiers reçus ne sont pas supprimés. Le contenu partagé mis en cache qui n’est plus nécessaire est récupéré automatiquement, ce qui peut prendre un peu de temps. Cette action est irréversible.</string>
|
<string name="storage_delete_transfers_description">Cela efface de votre historique tous les enregistrements de transferts envoyés et reçus. Vos fichiers reçus ne sont pas supprimés. Le contenu partagé mis en cache qui n’est plus nécessaire est récupéré automatiquement, ce qui peut prendre un peu de temps. Cette action est irréversible.</string>
|
||||||
<string name="storage_app_data">Données de l’app</string>
|
<string name="storage_app_data">Données de l’app</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Ricezione</string>
|
<string name="status_receiving">Ricezione</string>
|
||||||
<string name="status_stopped">Interrotto</string>
|
<string name="status_stopped">Interrotto</string>
|
||||||
<string name="storage_calculating">Calcolo…</string>
|
<string name="storage_calculating">Calcolo…</string>
|
||||||
|
<string name="storage_cleaning">Pulizia…</string>
|
||||||
|
<string name="storage_cleanup_busy">Completa i trasferimenti attivi prima di liberare spazio</string>
|
||||||
|
<string name="storage_cleanup_freed">Liberati %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Cancella la cronologia di invii e ricezioni e i contenuti di condivisione memorizzati dall\'app. I file ricevuti sul disco vengono mantenuti.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Rimuove i file temporanei e i residui dei trasferimenti precedenti. I tuoi trasferimenti e i file ricevuti vengono mantenuti.</string>
|
||||||
|
<string name="storage_refresh">Aggiorna</string>
|
||||||
|
<string name="storage_unavailable">L\'utilizzo dello spazio non è ancora disponibile</string>
|
||||||
|
<string name="storage_usage_header">Su questo dispositivo</string>
|
||||||
|
<string name="storage_free_up_space">Libera spazio</string>
|
||||||
<string name="storage_delete_transfers">Elimina tutti i trasferimenti</string>
|
<string name="storage_delete_transfers">Elimina tutti i trasferimenti</string>
|
||||||
<string name="storage_delete_transfers_description">Questo cancella dalla cronologia tutti i record dei trasferimenti inviati e ricevuti. I file ricevuti non vengono eliminati. Il contenuto condiviso nella cache che non serve più viene recuperato automaticamente, operazione che può richiedere un po’ di tempo. Questa azione non può essere annullata.</string>
|
<string name="storage_delete_transfers_description">Questo cancella dalla cronologia tutti i record dei trasferimenti inviati e ricevuti. I file ricevuti non vengono eliminati. Il contenuto condiviso nella cache che non serve più viene recuperato automaticamente, operazione che può richiedere un po’ di tempo. Questa azione non può essere annullata.</string>
|
||||||
<string name="storage_app_data">Dati dell’app</string>
|
<string name="storage_app_data">Dati dell’app</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Ontvangen</string>
|
<string name="status_receiving">Ontvangen</string>
|
||||||
<string name="status_stopped">Gestopt</string>
|
<string name="status_stopped">Gestopt</string>
|
||||||
<string name="storage_calculating">Berekenen…</string>
|
<string name="storage_calculating">Berekenen…</string>
|
||||||
|
<string name="storage_cleaning">Opschonen…</string>
|
||||||
|
<string name="storage_cleanup_busy">Voltooi actieve overdrachten voordat je ruimte vrijmaakt</string>
|
||||||
|
<string name="storage_cleanup_freed">%1$s vrijgemaakt</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Wist je verzend- en ontvangstgeschiedenis en de gecachte deelinhoud van de app. Ontvangen bestanden op schijf blijven behouden.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Verwijdert tijdelijke bestanden en resten van eerdere overdrachten. Je overdrachten en ontvangen bestanden blijven behouden.</string>
|
||||||
|
<string name="storage_refresh">Vernieuwen</string>
|
||||||
|
<string name="storage_unavailable">Opslaggebruik is nog niet beschikbaar</string>
|
||||||
|
<string name="storage_usage_header">Op dit apparaat</string>
|
||||||
|
<string name="storage_free_up_space">Ruimte vrijmaken</string>
|
||||||
<string name="storage_delete_transfers">Alle overdrachten verwijderen</string>
|
<string name="storage_delete_transfers">Alle overdrachten verwijderen</string>
|
||||||
<string name="storage_delete_transfers_description">Hiermee worden alle records van verzonden en ontvangen overdrachten uit uw geschiedenis gewist. Uw ontvangen bestanden worden niet verwijderd. Gedeelde inhoud in de cache die niet meer nodig is, wordt automatisch opgeruimd; dit kan enige tijd duren. Dit kan niet ongedaan worden gemaakt.</string>
|
<string name="storage_delete_transfers_description">Hiermee worden alle records van verzonden en ontvangen overdrachten uit uw geschiedenis gewist. Uw ontvangen bestanden worden niet verwijderd. Gedeelde inhoud in de cache die niet meer nodig is, wordt automatisch opgeruimd; dit kan enige tijd duren. Dit kan niet ongedaan worden gemaakt.</string>
|
||||||
<string name="storage_app_data">Appgegevens</string>
|
<string name="storage_app_data">Appgegevens</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Odbieranie</string>
|
<string name="status_receiving">Odbieranie</string>
|
||||||
<string name="status_stopped">Zatrzymany</string>
|
<string name="status_stopped">Zatrzymany</string>
|
||||||
<string name="storage_calculating">Obliczanie…</string>
|
<string name="storage_calculating">Obliczanie…</string>
|
||||||
|
<string name="storage_cleaning">Czyszczenie…</string>
|
||||||
|
<string name="storage_cleanup_busy">Zakończ aktywne transfery przed zwolnieniem miejsca</string>
|
||||||
|
<string name="storage_cleanup_freed">Zwolniono %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Czyści historię wysyłania i odbierania oraz zapisane w pamięci podręcznej udostępniane treści. Odebrane pliki na dysku zostają zachowane.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Usuwa pliki tymczasowe i pozostałości po wcześniejszych transferach. Twoje transfery i odebrane pliki zostają zachowane.</string>
|
||||||
|
<string name="storage_refresh">Odśwież</string>
|
||||||
|
<string name="storage_unavailable">Wykorzystanie pamięci nie jest jeszcze dostępne</string>
|
||||||
|
<string name="storage_usage_header">Na tym urządzeniu</string>
|
||||||
|
<string name="storage_free_up_space">Zwolnij miejsce</string>
|
||||||
<string name="storage_delete_transfers">Usuń wszystkie transfery</string>
|
<string name="storage_delete_transfers">Usuń wszystkie transfery</string>
|
||||||
<string name="storage_delete_transfers_description">Spowoduje to usunięcie z historii wszystkich rekordów wysłanych i odebranych transferów. Odebrane pliki nie zostaną usunięte. Niepotrzebna już zawartość udostępniona w pamięci podręcznej jest odzyskiwana automatycznie, co może chwilę potrwać. Tej operacji nie można cofnąć.</string>
|
<string name="storage_delete_transfers_description">Spowoduje to usunięcie z historii wszystkich rekordów wysłanych i odebranych transferów. Odebrane pliki nie zostaną usunięte. Niepotrzebna już zawartość udostępniona w pamięci podręcznej jest odzyskiwana automatycznie, co może chwilę potrwać. Tej operacji nie można cofnąć.</string>
|
||||||
<string name="storage_app_data">Dane aplikacji</string>
|
<string name="storage_app_data">Dane aplikacji</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">A receber</string>
|
<string name="status_receiving">A receber</string>
|
||||||
<string name="status_stopped">Parada</string>
|
<string name="status_stopped">Parada</string>
|
||||||
<string name="storage_calculating">A calcular…</string>
|
<string name="storage_calculating">A calcular…</string>
|
||||||
|
<string name="storage_cleaning">A limpar…</string>
|
||||||
|
<string name="storage_cleanup_busy">Conclui as transferências ativas antes de libertar espaço</string>
|
||||||
|
<string name="storage_cleanup_freed">Libertado %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Limpa o teu histórico de envios e receções e o conteúdo de partilha em cache da app. Os ficheiros recebidos no disco são mantidos.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Remove ficheiros temporários e resíduos de transferências anteriores. As tuas transferências e ficheiros recebidos são mantidos.</string>
|
||||||
|
<string name="storage_refresh">Atualizar</string>
|
||||||
|
<string name="storage_unavailable">A utilização do armazenamento ainda não está disponível</string>
|
||||||
|
<string name="storage_usage_header">Neste dispositivo</string>
|
||||||
|
<string name="storage_free_up_space">Libertar espaço</string>
|
||||||
<string name="storage_delete_transfers">Eliminar todas as transferências</string>
|
<string name="storage_delete_transfers">Eliminar todas as transferências</string>
|
||||||
<string name="storage_delete_transfers_description">Isto elimina do histórico todos os registos de transferências enviadas e recebidas. Os ficheiros recebidos não são eliminados. O conteúdo partilhado em cache que já não é necessário é recuperado automaticamente, o que pode demorar algum tempo. Esta ação não pode ser anulada.</string>
|
<string name="storage_delete_transfers_description">Isto elimina do histórico todos os registos de transferências enviadas e recebidas. Os ficheiros recebidos não são eliminados. O conteúdo partilhado em cache que já não é necessário é recuperado automaticamente, o que pode demorar algum tempo. Esta ação não pode ser anulada.</string>
|
||||||
<string name="storage_app_data">Dados da aplicação</string>
|
<string name="storage_app_data">Dados da aplicação</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Получение</string>
|
<string name="status_receiving">Получение</string>
|
||||||
<string name="status_stopped">Остановлено</string>
|
<string name="status_stopped">Остановлено</string>
|
||||||
<string name="storage_calculating">Вычисление…</string>
|
<string name="storage_calculating">Вычисление…</string>
|
||||||
|
<string name="storage_cleaning">Очистка…</string>
|
||||||
|
<string name="storage_cleanup_busy">Завершите активные передачи перед освобождением места</string>
|
||||||
|
<string name="storage_cleanup_freed">Освобождено %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Очищает историю отправки и получения и кэшированное содержимое общих ресурсов. Полученные файлы на диске сохраняются.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Удаляет временные файлы и остатки прошлых передач. Ваши передачи и полученные файлы сохраняются.</string>
|
||||||
|
<string name="storage_refresh">Обновить</string>
|
||||||
|
<string name="storage_unavailable">Данные об использовании хранилища пока недоступны</string>
|
||||||
|
<string name="storage_usage_header">На этом устройстве</string>
|
||||||
|
<string name="storage_free_up_space">Освободить место</string>
|
||||||
<string name="storage_delete_transfers">Удалить все передачи</string>
|
<string name="storage_delete_transfers">Удалить все передачи</string>
|
||||||
<string name="storage_delete_transfers_description">Это удалит из истории все записи об отправленных и полученных передачах. Полученные файлы не удаляются. Кэшированное общее содержимое, которое больше не требуется, освобождается автоматически; это может занять некоторое время. Это действие нельзя отменить.</string>
|
<string name="storage_delete_transfers_description">Это удалит из истории все записи об отправленных и полученных передачах. Полученные файлы не удаляются. Кэшированное общее содержимое, которое больше не требуется, освобождается автоматически; это может занять некоторое время. Это действие нельзя отменить.</string>
|
||||||
<string name="storage_app_data">Данные приложения</string>
|
<string name="storage_app_data">Данные приложения</string>
|
||||||
|
|||||||
@@ -203,6 +203,15 @@
|
|||||||
<string name="status_receiving">Receiving</string>
|
<string name="status_receiving">Receiving</string>
|
||||||
<string name="status_stopped">Stopped</string>
|
<string name="status_stopped">Stopped</string>
|
||||||
<string name="storage_calculating">Calculating…</string>
|
<string name="storage_calculating">Calculating…</string>
|
||||||
|
<string name="storage_cleaning">Cleaning up…</string>
|
||||||
|
<string name="storage_cleanup_busy">Finish active transfers before freeing up space</string>
|
||||||
|
<string name="storage_cleanup_freed">Freed %1$s</string>
|
||||||
|
<string name="storage_delete_transfers_caption">Clears your send and receive history and the app\'s cached share content. Received files on disk are kept.</string>
|
||||||
|
<string name="storage_free_up_space_caption">Removes temporary files and leftover trash from earlier transfers. Your transfers and received files are kept.</string>
|
||||||
|
<string name="storage_refresh">Refresh</string>
|
||||||
|
<string name="storage_unavailable">Storage usage isn\'t available yet</string>
|
||||||
|
<string name="storage_usage_header">On this device</string>
|
||||||
|
<string name="storage_free_up_space">Free up space</string>
|
||||||
<string name="storage_delete_transfers">Delete all transfers</string>
|
<string name="storage_delete_transfers">Delete all transfers</string>
|
||||||
<string name="storage_delete_transfers_description">This clears all sent and received transfer records from your history. Your received files are not deleted. Cached shared content that is no longer needed is reclaimed automatically, which may take a little time. This can’t be undone.</string>
|
<string name="storage_delete_transfers_description">This clears all sent and received transfer records from your history. Your received files are not deleted. Cached shared content that is no longer needed is reclaimed automatically, which may take a little time. This can’t be undone.</string>
|
||||||
<string name="storage_app_data">App data</string>
|
<string name="storage_app_data">App data</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user