diff --git a/app/src/main/java/com/wirelessalien/zipxtract/activity/MainActivity.kt b/app/src/main/java/com/wirelessalien/zipxtract/activity/MainActivity.kt index 7056026..8973595 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/activity/MainActivity.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/activity/MainActivity.kt @@ -827,7 +827,7 @@ class MainActivity : AppCompatActivity(), FileAdapter.OnItemClickListener, FileA fun startArchiveTarService(file: List, archiveName: String) { progressDialog.show() val intent = Intent(this, ArchiveTarService::class.java).apply { - putExtra(ArchiveTarService.EXTRA_FILES_TO_ARCHIVE, ArrayList(file)) + putStringArrayListExtra(ArchiveTarService.EXTRA_FILES_TO_ARCHIVE, ArrayList(file)) putExtra(ArchiveTarService.EXTRA_ARCHIVE_NAME, archiveName) } ContextCompat.startForegroundService(this, intent) @@ -1059,7 +1059,7 @@ class MainActivity : AppCompatActivity(), FileAdapter.OnItemClickListener, FileA putExtra(ArchiveZipService.EXTRA_IS_ENCRYPTED, isEncrypted) putExtra(ArchiveZipService.EXTRA_ENCRYPTION_METHOD, encryptionMethod) putExtra(ArchiveZipService.EXTRA_AES_STRENGTH, aesStrength) - putExtra(ArchiveZipService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) + putStringArrayListExtra(ArchiveZipService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) } ContextCompat.startForegroundService(this, intent) } @@ -1074,7 +1074,7 @@ class MainActivity : AppCompatActivity(), FileAdapter.OnItemClickListener, FileA putExtra(ArchiveSplitZipService.EXTRA_IS_ENCRYPTED, isEncrypted) putExtra(ArchiveSplitZipService.EXTRA_ENCRYPTION_METHOD, encryptionMethod) putExtra(ArchiveSplitZipService.EXTRA_AES_STRENGTH, aesStrength) - putExtra(ArchiveSplitZipService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) + putStringArrayListExtra(ArchiveSplitZipService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) putExtra(ArchiveSplitZipService.EXTRA_SPLIT_SIZE, splitSize) } @@ -1098,7 +1098,7 @@ class MainActivity : AppCompatActivity(), FileAdapter.OnItemClickListener, FileA putExtra(Archive7zService.EXTRA_COMPRESSION_LEVEL, compressionLevel) putExtra(Archive7zService.EXTRA_SOLID, solid) putExtra(Archive7zService.EXTRA_THREAD_COUNT, threadCount) - putExtra(Archive7zService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) + putStringArrayListExtra(Archive7zService.EXTRA_FILES_TO_ARCHIVE, ArrayList(filesToArchive)) } ContextCompat.startForegroundService(this, intent) } diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/Archive7zService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/Archive7zService.kt index 263cb96..ce6248c 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/Archive7zService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/Archive7zService.kt @@ -32,6 +32,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_COMPLETE import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -78,7 +79,7 @@ class Archive7zService : Service() { val compressionLevel = intent.getIntExtra(EXTRA_COMPRESSION_LEVEL, 1) val solid = intent.getBooleanExtra(EXTRA_SOLID, false) val threadCount = intent.getIntExtra(EXTRA_THREAD_COUNT, 1) - val filesToArchive = intent.getSerializableExtra(EXTRA_FILES_TO_ARCHIVE) as List + val filesToArchive = intent.getStringArrayListExtra(EXTRA_FILES_TO_ARCHIVE) ?: return START_NOT_STICKY if (intent.action == BroadcastConstants.ACTION_ARCHIVE_7Z_CANCEL) { archiveJob?.cancel() @@ -135,9 +136,23 @@ class Archive7zService : Service() { } private fun create7zFile(archiveName: String, password: String?, compressionLevel: Int, solid: Boolean, threadCount: Int, filesToArchive: List) { + if (filesToArchive.isEmpty()) { + val errorMessage = getString(R.string.no_files_to_archive) + showErrorNotification(errorMessage) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, errorMessage)) + stopForegroundService() + return + } + try { val baseDirectory = File(filesToArchive.first()).parentFile?.absolutePath ?: "" - val sevenZFile = File(baseDirectory, "$archiveName.7z") + var sevenZFile = File(baseDirectory, "$archiveName.7z") + var counter = 1 + + while (sevenZFile.exists()) { + sevenZFile = File(baseDirectory, "$archiveName ($counter).7z") + counter++ + } RandomAccessFile(sevenZFile, "rw").use { raf -> val outArchive = SevenZip.openOutArchive7z() @@ -146,7 +161,6 @@ class Archive7zService : Service() { outArchive.setSolid(solid) outArchive.setThreadCount(threadCount) outArchive.setHeaderEncryption(true) - outArchive.isTrace = true outArchive.createArchive( RandomAccessFileOutStream(raf), filesToArchive.size, @@ -164,7 +178,8 @@ class Archive7zService : Service() { } override fun setCompleted(complete: Long) { - val progress = ((complete.toDouble() / filesToArchive.size) * 100).toInt() + val totalSize = filesToArchive.sumOf { File(it).length() } + val progress = ((complete.toDouble() / totalSize) * 100).toInt() startForeground(NOTIFICATION_ID, createNotification(progress)) updateProgress(progress) } @@ -198,16 +213,16 @@ class Archive7zService : Service() { } } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } catch (e: IOException) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } catch (e: OutOfMemoryError) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } } diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveSplitZipService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveSplitZipService.kt index b615959..9cb862c 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveSplitZipService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveSplitZipService.kt @@ -32,6 +32,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_COMPLETE import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -75,12 +76,37 @@ class ArchiveSplitZipService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val archiveName = intent?.getStringExtra(EXTRA_ARCHIVE_NAME) ?: return START_NOT_STICKY val password = intent.getStringExtra(EXTRA_PASSWORD) - val compressionMethod = intent.getSerializableExtra(EXTRA_COMPRESSION_METHOD) as CompressionMethod - val compressionLevel = intent.getSerializableExtra(EXTRA_COMPRESSION_LEVEL) as CompressionLevel + val compressionMethod = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(EXTRA_COMPRESSION_METHOD, CompressionMethod::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(EXTRA_COMPRESSION_METHOD) as? CompressionMethod + } ?: CompressionMethod.STORE + + val compressionLevel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(EXTRA_COMPRESSION_LEVEL, CompressionLevel::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(EXTRA_COMPRESSION_LEVEL) as? CompressionLevel + } ?: CompressionLevel.NO_COMPRESSION + val isEncrypted = intent.getBooleanExtra(EXTRA_IS_ENCRYPTED, false) - val encryptionMethod = intent.getSerializableExtra(EXTRA_ENCRYPTION_METHOD) as EncryptionMethod? - val aesStrength = intent.getSerializableExtra(EXTRA_AES_STRENGTH) as AesKeyStrength? - val filesToArchive = intent.getSerializableExtra(EXTRA_FILES_TO_ARCHIVE) as List + + val encryptionMethod = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(EXTRA_ENCRYPTION_METHOD, EncryptionMethod::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(EXTRA_ENCRYPTION_METHOD) as? EncryptionMethod + } + + val aesStrength = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(EXTRA_AES_STRENGTH, AesKeyStrength::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(EXTRA_AES_STRENGTH) as? AesKeyStrength + } + val filesToArchive = intent.getStringArrayListExtra(EXTRA_FILES_TO_ARCHIVE) ?: return START_NOT_STICKY + val splitSize = intent.getLongExtra(EXTRA_SPLIT_SIZE, 64) if (intent.action == BroadcastConstants.ACTION_ARCHIVE_SPLIT_ZIP_CANCEL) { @@ -148,6 +174,15 @@ class ArchiveSplitZipService : Service() { selectedFiles: List, splitSize: Long ) { + + if (selectedFiles.isEmpty()) { + val errorMessage = getString(R.string.no_files_to_archive) + showErrorNotification(errorMessage) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, errorMessage)) + stopForegroundService() + return + } + try { val zipParameters = ZipParameters().apply { this.compressionMethod = compressionMethod @@ -180,7 +215,7 @@ class ArchiveSplitZipService : Service() { selectedFiles.forEach { filePath -> val file = File(filePath) - val destFile = File(renamedTempDir, file.relativeTo(baseDirectory).path) + val destFile = File(renamedTempDir, file.relativeTo(baseDirectory!!).path) if (file.isDirectory) { destFile.mkdirs() file.copyRecursively(destFile, overwrite = true) @@ -206,27 +241,27 @@ class ArchiveSplitZipService : Service() { } if (progressMonitor.result == ProgressMonitor.Result.SUCCESS) { - showCompletionNotification("$archiveName.zip created successfully") + showCompletionNotification(getString(R.string.zip_creation_success)) sendLocalBroadcast(Intent(ACTION_ARCHIVE_COMPLETE)) } else { showErrorNotification(getString(R.string.zip_creation_failed)) - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${progressMonitor.result}")) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, progressMonitor.result)) } - if (archiveJob?.isCancelled == true) throw ZipException("Extraction cancelled") + if (archiveJob?.isCancelled == true) throw ZipException(getString(R.string.operation_cancelled)) renamedTempDir.deleteRecursively() } catch (e: ZipException) { e.printStackTrace() - showErrorNotification("Archive creation failed: ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) return } } catch (e: Exception) { e.printStackTrace() - showErrorNotification("Archive creation failed: ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } } @@ -242,9 +277,9 @@ class ArchiveSplitZipService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() val notification = NotificationCompat.Builder(this, ARCHIVE_NOTIFICATION_CHANNEL_ID) - .setContentTitle("Archive Creation Failed") + .setContentTitle(getString(R.string.zip_creation_failed)) .setContentText(error) - .setSmallIcon(R.drawable.ic_folder_zip) + .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() @@ -256,7 +291,7 @@ class ArchiveSplitZipService : Service() { stopForegroundService() val notification = NotificationCompat.Builder(this, ARCHIVE_NOTIFICATION_CHANNEL_ID) - .setContentTitle("Archive Creation Complete") + .setContentTitle(getString(R.string.zip_creation_success)) .setContentText(message) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveTarService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveTarService.kt index f3413c1..7f27281 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveTarService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveTarService.kt @@ -33,6 +33,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_CO import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_TAR_CANCEL import com.wirelessalien.zipxtract.constant.BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -69,7 +70,7 @@ class ArchiveTarService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val archiveName = intent?.getStringExtra(EXTRA_ARCHIVE_NAME) ?: return START_NOT_STICKY - val filesToArchive = intent.getSerializableExtra(EXTRA_FILES_TO_ARCHIVE) as List + val filesToArchive = intent.getStringArrayListExtra(EXTRA_FILES_TO_ARCHIVE) ?: return START_NOT_STICKY if (intent.action == ACTION_ARCHIVE_TAR_CANCEL) { archiveJob?.cancel() @@ -126,9 +127,23 @@ class ArchiveTarService : Service() { } private fun createTarFile(archiveName: String, filesToArchive: List) { + + if (filesToArchive.isEmpty()) { + val errorMessage = getString(R.string.no_files_to_archive) + showErrorNotification(errorMessage) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, errorMessage)) + stopForegroundService() + return + } try { val baseDirectory = File(filesToArchive.first()).parentFile?.absolutePath ?: "" val tarFile = File(baseDirectory, "$archiveName.tar") + var counter = 1 + + while (tarFile.exists()) { + tarFile.renameTo(File(baseDirectory, "$archiveName ($counter).tar")) + counter++ + } RandomAccessFile(tarFile, "rw").use { raf -> val outArchive = SevenZip.openOutArchiveTar() @@ -171,16 +186,16 @@ class ArchiveTarService : Service() { } } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } catch (e: IOException) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } catch (e: OutOfMemoryError) { e.printStackTrace() - showErrorNotification(": ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_PROGRESS, ": ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } } diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveZipService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveZipService.kt index 8f29994..eee4c8e 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveZipService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ArchiveZipService.kt @@ -31,6 +31,7 @@ import com.wirelessalien.zipxtract.R import com.wirelessalien.zipxtract.constant.BroadcastConstants import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_COMPLETE import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_ARCHIVE_ERROR +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -51,7 +52,6 @@ class ArchiveZipService : Service() { companion object { const val NOTIFICATION_ID = 871 - const val CHANNEL_ID = "zip_service_channel" const val EXTRA_ARCHIVE_NAME = "archiveName" const val EXTRA_PASSWORD = "password" const val EXTRA_COMPRESSION_METHOD = "compressionMethod" @@ -81,12 +81,37 @@ class ArchiveZipService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { val archiveName = intent?.getStringExtra(EXTRA_ARCHIVE_NAME) ?: return START_NOT_STICKY val password = intent.getStringExtra(EXTRA_PASSWORD) - val compressionMethod = intent.getSerializableExtra(EXTRA_COMPRESSION_METHOD) as CompressionMethod - val compressionLevel = intent.getSerializableExtra(EXTRA_COMPRESSION_LEVEL) as CompressionLevel - val isEncrypted = intent.getBooleanExtra(EXTRA_IS_ENCRYPTED, false) - val encryptionMethod = intent.getSerializableExtra(EXTRA_ENCRYPTION_METHOD) as EncryptionMethod? - val aesStrength = intent.getSerializableExtra(EXTRA_AES_STRENGTH) as AesKeyStrength? - val filesToArchive = intent.getSerializableExtra(EXTRA_FILES_TO_ARCHIVE) as List + val compressionMethod = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_COMPRESSION_METHOD, CompressionMethod::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_COMPRESSION_METHOD) as? CompressionMethod + } ?: CompressionMethod.STORE + + val compressionLevel = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_COMPRESSION_LEVEL, CompressionLevel::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_COMPRESSION_LEVEL) as? CompressionLevel + } ?: CompressionLevel.NO_COMPRESSION + + val isEncrypted = intent.getBooleanExtra(ArchiveSplitZipService.EXTRA_IS_ENCRYPTED, false) + + val encryptionMethod = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_ENCRYPTION_METHOD, EncryptionMethod::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_ENCRYPTION_METHOD) as? EncryptionMethod + } + + val aesStrength = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_AES_STRENGTH, AesKeyStrength::class.java) + } else { + @Suppress("DEPRECATION") + intent.getSerializableExtra(ArchiveSplitZipService.EXTRA_AES_STRENGTH) as? AesKeyStrength + } + + val filesToArchive = intent.getStringArrayListExtra(ArchiveSplitZipService.EXTRA_FILES_TO_ARCHIVE) ?: return START_NOT_STICKY if (intent.action == BroadcastConstants.ACTION_ARCHIVE_ZIP_CANCEL) { archiveJob?.cancel() @@ -111,8 +136,8 @@ class ArchiveZipService : Service() { private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - CHANNEL_ID, - "Zip Service", + BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID, + getString(R.string.compress_archive_notification_name), NotificationManager.IMPORTANCE_LOW ) val notificationManager = getSystemService(NotificationManager::class.java) @@ -121,11 +146,13 @@ class ArchiveZipService : Service() { } private fun createNotification(progress: Int): Notification { - val builder = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Creating Zip Archive") + val builder = NotificationCompat.Builder(this, + BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID + ) + .setContentTitle(getString(R.string.archive_ongoing)) .setSmallIcon(R.drawable.ic_notification_icon) .setProgress(100, progress, progress == 0) - .addAction(R.drawable.ic_round_cancel, "Cancel", createCancelIntent()) + .addAction(R.drawable.ic_round_cancel, getString(R.string.cancel), createCancelIntent()) .setOngoing(true) return builder.build() @@ -145,6 +172,15 @@ class ArchiveZipService : Service() { aesStrength: AesKeyStrength?, selectedFiles: List ) { + + if (selectedFiles.isEmpty()) { + val errorMessage = getString(R.string.no_files_to_archive) + showErrorNotification(errorMessage) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, errorMessage)) + stopForegroundService() + return + } + try { val zipParameters = ZipParameters().apply { this.compressionMethod = compressionMethod @@ -155,7 +191,14 @@ class ArchiveZipService : Service() { } val baseDirectory = File(selectedFiles.first()).parentFile - val outputFile = File(baseDirectory, "$archiveName.zip") + var outputFile = File(baseDirectory, "$archiveName.zip") + var counter = 1 + + while (outputFile.exists()) { + outputFile = File(baseDirectory, "$archiveName ($counter).zip") + counter++ + } + val zipFile = ZipFile(outputFile) if (isEncrypted) { zipFile.setPassword(password?.toCharArray()) @@ -177,7 +220,7 @@ class ArchiveZipService : Service() { selectedFiles.forEach { filePath -> val file = File(filePath) - val destFile = File(renamedTempDir, file.relativeTo(baseDirectory).path) + val destFile = File(renamedTempDir, file.relativeTo(baseDirectory!!).path) if (file.isDirectory) { destFile.mkdirs() file.copyRecursively(destFile, overwrite = true) @@ -203,27 +246,27 @@ class ArchiveZipService : Service() { } if (progressMonitor.result == ProgressMonitor.Result.SUCCESS) { - showCompletionNotification("$archiveName.zip created successfully") + showCompletionNotification() sendLocalBroadcast(Intent(ACTION_ARCHIVE_COMPLETE)) } else { - showErrorNotification("Archive creation failed") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${progressMonitor.result}")) + showErrorNotification(progressMonitor.result.toString()) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, progressMonitor.result.toString())) } - if (archiveJob?.isCancelled == true) throw ZipException("Extraction cancelled") + if (archiveJob?.isCancelled == true) throw ZipException(getString(R.string.operation_cancelled)) renamedTempDir.deleteRecursively() } catch (e: ZipException) { e.printStackTrace() - showErrorNotification("Archive creation failed: ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) return } } catch (e: ZipException) { e.printStackTrace() - showErrorNotification("Archive creation failed: ${e.message}") - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra("error_message", "Archive creation failed: ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } } @@ -238,8 +281,8 @@ class ArchiveZipService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Archive Creation Failed") + val notification = NotificationCompat.Builder(this, BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.zip_creation_failed)) .setContentText(error) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) @@ -249,12 +292,11 @@ class ArchiveZipService : Service() { notificationManager.notify(NOTIFICATION_ID + 1, notification) } - private fun showCompletionNotification(error: String) { + private fun showCompletionNotification() { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Complete") - .setContentText(error) + val notification = NotificationCompat.Builder(this, BroadcastConstants.ARCHIVE_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.zip_creation_success)) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/CompressCsArchiveService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/CompressCsArchiveService.kt index f017a0e..15909fa 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/CompressCsArchiveService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/CompressCsArchiveService.kt @@ -184,16 +184,16 @@ class CompressCsArchiveService : Service() { } catch (e: CompressorException) { e.printStackTrace() - showErrorNotification(e.message ?: getString(R.string.compression_failed)) - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.compression_failed))) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } catch (e: Exception) { e.printStackTrace() showErrorNotification(e.message ?: getString(R.string.compression_failed)) - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.compression_failed))) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } catch (e: IOException) { e.printStackTrace() showErrorNotification(e.message ?: getString(R.string.compression_failed)) - sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.compression_failed))) + sendLocalBroadcast(Intent(ACTION_ARCHIVE_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } finally { stopForegroundService() } diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractArchiveService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractArchiveService.kt index 3f55978..970ed5d 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractArchiveService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractArchiveService.kt @@ -32,6 +32,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_PROGRESS import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACT_CANCEL +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRACTION_NOTIFICATION_CHANNEL_ID import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope @@ -64,7 +65,6 @@ class ExtractArchiveService : Service() { companion object { const val NOTIFICATION_ID = 543 - const val CHANNEL_ID = "ExtractArchiveService" const val EXTRA_FILE_PATH = "file_path" const val EXTRA_PASSWORD = "password" } @@ -119,8 +119,8 @@ class ExtractArchiveService : Service() { private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - CHANNEL_ID, - "Extraction Service", + EXTRACTION_NOTIFICATION_CHANNEL_ID, + getString(R.string.extract_archive_notification_name), NotificationManager.IMPORTANCE_LOW ) val notificationManager = getSystemService(NotificationManager::class.java) @@ -129,12 +129,12 @@ class ExtractArchiveService : Service() { } private fun createNotification(progress: Int): Notification { - val builder = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extracting Archive") + val builder = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_ongoing)) .setSmallIcon(R.drawable.ic_notification_icon) .setProgress(100, progress, progress == 0) .setOngoing(true) - .addAction(R.drawable.ic_round_cancel, "Cancel", createCancelIntent()) // Add cancel button + .addAction(R.drawable.ic_round_cancel, getString(R.string.cancel), createCancelIntent()) return builder.build() } @@ -174,20 +174,21 @@ class ExtractArchiveService : Service() { sendLocalBroadcast(Intent(ACTION_EXTRACTION_COMPLETE)) } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg)) + ) } } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } finally { inStream.close() } } catch (e: Exception) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } } @@ -206,7 +207,7 @@ class ExtractArchiveService : Service() { var counter = 1 while (destinationDir.exists()) { - newFileName = "${baseFileName}_$counter" + newFileName = "$baseFileName ($counter)" destinationDir = File(parentDir, newFileName) counter++ } @@ -226,14 +227,16 @@ class ExtractArchiveService : Service() { Thread.sleep(100) } + if (extractionJob?.isCancelled == true) throw ZipException(getString(R.string.operation_cancelled)) + showCompletionNotification() sendLocalBroadcast(Intent(ACTION_EXTRACTION_COMPLETE)) } catch (e: ZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "ZIP extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR) - .putExtra(EXTRA_ERROR_MESSAGE, e.message ?: "ZIP extraction failed")) + .putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } } @@ -271,7 +274,7 @@ class ExtractArchiveService : Service() { } override fun getStream(p0: Int, p1: ExtractAskMode?): ISequentialOutStream { - if (extractionJob?.isCancelled == true) throw SevenZipException("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw SevenZipException(getString(R.string.operation_cancelled)) val path: String = inArchive.getStringProperty(p0, PropID.PATH) val isDir: Boolean = inArchive.getProperty(p0, PropID.IS_FOLDER) as Boolean @@ -324,8 +327,8 @@ class ExtractArchiveService : Service() { private fun showCompletionNotification() { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Complete") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_success)) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() @@ -336,8 +339,8 @@ class ExtractArchiveService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Failed") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_failed)) .setContentText(error) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractCsArchiveService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractCsArchiveService.kt index 81e4c59..00891c9 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractCsArchiveService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractCsArchiveService.kt @@ -165,7 +165,7 @@ class ExtractCsArchiveService : Service() { var n: Int while (compressorInputStream.read(buffer).also { n = it } != -1) { - if (extractionJob?.isCancelled == true) throw Exception("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw Exception(getString(R.string.operation_cancelled)) outStream.write(buffer, 0, n) bytesRead += n val progress = (bytesRead * 100 / totalBytes).toInt() @@ -180,16 +180,16 @@ class ExtractCsArchiveService : Service() { } catch (e: CompressorException) { e.printStackTrace() - showErrorNotification(e.message ?: getString(R.string.extraction_failed)) - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.extraction_failed))) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } catch (e: Exception) { e.printStackTrace() - showErrorNotification(e.message ?: getString(R.string.extraction_failed)) - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.extraction_failed))) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } catch (e: IOException) { e.printStackTrace() - showErrorNotification(e.message ?: getString(R.string.extraction_failed)) - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.extraction_failed))) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } finally { stopForegroundService() } diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipart7zService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipart7zService.kt index 656e752..77c3afb 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipart7zService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipart7zService.kt @@ -25,7 +25,6 @@ import android.app.Service import android.content.Intent import android.os.Build import android.os.IBinder -import android.util.Log import androidx.core.app.NotificationCompat import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.wirelessalien.zipxtract.ArchiveOpenMultipart7zCallback @@ -34,6 +33,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_PROGRESS import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_MULTI_7Z_EXTRACTION_CANCEL +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRACTION_NOTIFICATION_CHANNEL_ID import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope @@ -63,7 +63,6 @@ class ExtractMultipart7zService : Service() { const val NOTIFICATION_ID = 642 const val EXTRA_FILE_PATH = "file_path" const val EXTRA_PASSWORD = "password" - const val CHANNEL_ID = "extraction_service_channel" } private var password: CharArray? = null @@ -89,7 +88,6 @@ class ExtractMultipart7zService : Service() { if (intent.action == ACTION_MULTI_7Z_EXTRACTION_CANCEL) { extractionJob?.cancel() - Log.d("ExtractRarService", "Extraction cancelled") stopForegroundService() stopSelf() return START_NOT_STICKY @@ -132,8 +130,8 @@ class ExtractMultipart7zService : Service() { private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - CHANNEL_ID, - "Extraction Service", + EXTRACTION_NOTIFICATION_CHANNEL_ID, + getString(R.string.extract_archive_notification_name), NotificationManager.IMPORTANCE_LOW ) val notificationManager = getSystemService(NotificationManager::class.java) @@ -142,12 +140,12 @@ class ExtractMultipart7zService : Service() { } private fun createNotification(progress: Int): Notification { - val builder = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extracting Archive") + val builder = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_ongoing)) .setSmallIcon(R.drawable.ic_notification_icon) .setProgress(100, progress, progress == 0) .setOngoing(true) - .addAction(R.drawable.ic_round_cancel, "Cancel", createCancelIntent()) + .addAction(R.drawable.ic_round_cancel, getString(R.string.cancel), createCancelIntent()) return builder.build() } @@ -165,7 +163,7 @@ class ExtractMultipart7zService : Service() { var counter = 1 while (destinationDir.exists()) { - newFileName = "${baseFileName}_$counter" + newFileName = "$baseFileName ($counter)" destinationDir = File(parentDir, newFileName) counter++ } @@ -178,7 +176,7 @@ class ExtractMultipart7zService : Service() { try { val itemCount = inArchive.numberOfItems for (i in 0 until itemCount) { - if (extractionJob?.isCancelled == true) throw SevenZipException("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw SevenZipException(getString(R.string.operation_cancelled)) inArchive.getProperty(i, PropID.PATH) as String destinationDir.mkdir() @@ -186,9 +184,9 @@ class ExtractMultipart7zService : Service() { inArchive.extract(null, false, ExtractCallback(inArchive, destinationDir)) } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) return } } @@ -196,18 +194,18 @@ class ExtractMultipart7zService : Service() { sendLocalBroadcast(Intent(ACTION_EXTRACTION_COMPLETE)) } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } finally { inArchive.close() archiveOpenVolumeCallback.close() } } catch (e: IOException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } } @@ -236,9 +234,8 @@ class ExtractMultipart7zService : Service() { } override fun getStream(p0: Int, p1: ExtractAskMode?): ISequentialOutStream { - Log.d("ExtractRarService", "Extracting file ${extractionJob?.isCancelled}") - if (extractionJob?.isCancelled == true) throw SevenZipException("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw SevenZipException(getString(R.string.operation_cancelled)) val path: String = inArchive.getStringProperty(p0, PropID.PATH) val isDir: Boolean = inArchive.getProperty(p0, PropID.IS_FOLDER) as Boolean @@ -291,8 +288,8 @@ class ExtractMultipart7zService : Service() { private fun showCompletionNotification() { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Complete") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_success)) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() @@ -303,8 +300,8 @@ class ExtractMultipart7zService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Failed") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_failed)) .setContentText(error) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipartZipService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipartZipService.kt index 77d9c47..26ec1b8 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipartZipService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractMultipartZipService.kt @@ -25,7 +25,6 @@ import android.app.Service import android.content.Intent import android.os.Build import android.os.IBinder -import android.util.Log import androidx.core.app.NotificationCompat import androidx.localbroadcastmanager.content.LocalBroadcastManager import com.wirelessalien.zipxtract.R @@ -33,6 +32,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_PROGRESS import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_MULTI_ZIP_EXTRACTION_CANCEL +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRACTION_NOTIFICATION_CHANNEL_ID import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope @@ -51,8 +51,8 @@ class ExtractMultipartZipService : Service() { const val NOTIFICATION_ID = 869 const val EXTRA_FILE_PATH = "file_path" const val EXTRA_PASSWORD = "password" - const val CHANNEL_ID = "extraction_service_channel" } + private var extractionJob: Job? = null override fun onBind(intent: Intent): IBinder? = null @@ -101,8 +101,8 @@ class ExtractMultipartZipService : Service() { private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - CHANNEL_ID, - "Extraction Service", + EXTRACTION_NOTIFICATION_CHANNEL_ID, + getString(R.string.extract_archive_notification_name), NotificationManager.IMPORTANCE_LOW ) val notificationManager = getSystemService(NotificationManager::class.java) @@ -111,12 +111,12 @@ class ExtractMultipartZipService : Service() { } private fun createNotification(progress: Int): Notification { - val builder = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extracting Archive") + val builder = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_ongoing)) .setSmallIcon(R.drawable.ic_notification_icon) .setProgress(100, progress, progress == 0) .setOngoing(true) - .addAction(R.drawable.ic_round_cancel, "Cancel", createCancelIntent()) + .addAction(R.drawable.ic_round_cancel, getString(R.string.cancel), createCancelIntent()) return builder.build() } @@ -153,7 +153,7 @@ class ExtractMultipartZipService : Service() { var counter = 1 while (extractDir.exists()) { - directoryName = "${file.nameWithoutExtension}_$counter" + directoryName = "${file.nameWithoutExtension} ($counter)" extractDir = File(parentDir, directoryName) counter++ } @@ -171,10 +171,9 @@ class ExtractMultipartZipService : Service() { } if (extractionJob?.isCancelled == true) { - throw ZipException("Extraction cancelled") + throw ZipException(getString(R.string.operation_cancelled)) } - Log.d("ZipExtract", "Extracting: ${header.fileName}") zipFile.extractFile(header, extractDir.absolutePath) extractedEntries++ @@ -186,8 +185,8 @@ class ExtractMultipartZipService : Service() { } catch (e: ZipException) { e.printStackTrace() - showErrorNotification("Extraction failed: ${e.message}") - sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, "Extraction failed: ${e.message}")) + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) + sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra(EXTRA_ERROR_MESSAGE, e.message)) } } @@ -201,8 +200,8 @@ class ExtractMultipartZipService : Service() { private fun showCompletionNotification() { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Complete") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_success)) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() @@ -213,8 +212,8 @@ class ExtractMultipartZipService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Failed") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_failed)) .setContentText(error) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) diff --git a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractRarService.kt b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractRarService.kt index e812572..524ab48 100644 --- a/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractRarService.kt +++ b/app/src/main/java/com/wirelessalien/zipxtract/service/ExtractRarService.kt @@ -33,6 +33,7 @@ import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_ERROR import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_EXTRACTION_PROGRESS import com.wirelessalien.zipxtract.constant.BroadcastConstants.ACTION_RAR_EXTRACTION_CANCEL +import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRACTION_NOTIFICATION_CHANNEL_ID import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_ERROR_MESSAGE import com.wirelessalien.zipxtract.constant.BroadcastConstants.EXTRA_PROGRESS import kotlinx.coroutines.CoroutineScope @@ -61,7 +62,6 @@ class ExtractRarService : Service() { const val NOTIFICATION_ID = 244 const val EXTRA_FILE_PATH = "file_path" const val EXTRA_PASSWORD = "password" - const val CHANNEL_ID = "extraction_service_channel" } @@ -131,8 +131,8 @@ class ExtractRarService : Service() { private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel( - CHANNEL_ID, - "Extraction Service", + EXTRACTION_NOTIFICATION_CHANNEL_ID, + getString(R.string.extract_archive_notification_name), NotificationManager.IMPORTANCE_LOW ) val notificationManager = getSystemService(NotificationManager::class.java) @@ -141,12 +141,12 @@ class ExtractRarService : Service() { } private fun createNotification(progress: Int): Notification { - val builder = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extracting Archive") + val builder = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_ongoing)) .setSmallIcon(R.drawable.ic_notification_icon) .setProgress(100, progress, progress == 0) .setOngoing(true) - .addAction(R.drawable.ic_round_cancel, "Cancel", createCancelIntent()) + .addAction(R.drawable.ic_round_cancel, getString(R.string.cancel), createCancelIntent()) return builder.build() } @@ -164,7 +164,7 @@ class ExtractRarService : Service() { var counter = 1 while (destinationDir.exists()) { - newFileName = "${baseFileName}_$counter" + newFileName = "$baseFileName ($counter)" destinationDir = File(parentDir, newFileName) counter++ } @@ -178,7 +178,7 @@ class ExtractRarService : Service() { try { val itemCount = inArchive.numberOfItems for (i in 0 until itemCount) { - if (extractionJob?.isCancelled == true) throw SevenZipException("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw SevenZipException(getString(R.string.operation_cancelled)) inArchive.getProperty(i, PropID.PATH) as String destinationDir.mkdir() @@ -186,9 +186,9 @@ class ExtractRarService : Service() { inArchive.extract(null, false, ExtractCallback(inArchive, destinationDir)) } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) return } } @@ -196,9 +196,9 @@ class ExtractRarService : Service() { sendLocalBroadcast(Intent(ACTION_EXTRACTION_COMPLETE)) } catch (e: SevenZipException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } finally { inArchive.close() archiveOpenVolumeCallback.close() @@ -206,9 +206,9 @@ class ExtractRarService : Service() { } } catch (e: IOException) { e.printStackTrace() - showErrorNotification(e.message ?: "Extraction failed") + showErrorNotification(e.message ?: getString(R.string.general_error_msg)) sendLocalBroadcast(Intent(ACTION_EXTRACTION_ERROR).putExtra( - EXTRA_ERROR_MESSAGE, e.message ?: "Extraction failed")) + EXTRA_ERROR_MESSAGE, e.message ?: getString(R.string.general_error_msg))) } } @@ -238,7 +238,7 @@ class ExtractRarService : Service() { override fun getStream(p0: Int, p1: ExtractAskMode?): ISequentialOutStream { - if (extractionJob?.isCancelled == true) throw SevenZipException("Extraction cancelled") + if (extractionJob?.isCancelled == true) throw SevenZipException(getString(R.string.general_error_msg)) val path: String = inArchive.getStringProperty(p0, PropID.PATH) val isDir: Boolean = inArchive.getProperty(p0, PropID.IS_FOLDER) as Boolean @@ -291,8 +291,8 @@ class ExtractRarService : Service() { private fun showCompletionNotification() { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Complete") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_success)) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) .build() @@ -303,8 +303,8 @@ class ExtractRarService : Service() { private fun showErrorNotification(error: String) { stopForegroundService() - val notification = NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Extraction Failed") + val notification = NotificationCompat.Builder(this, EXTRACTION_NOTIFICATION_CHANNEL_ID) + .setContentTitle(getString(R.string.extraction_failed)) .setContentText(error) .setSmallIcon(R.drawable.ic_notification_icon) .setAutoCancel(true) diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml new file mode 100644 index 0000000..5081298 --- /dev/null +++ b/app/src/main/res/values-bg/strings.xml @@ -0,0 +1,71 @@ + + + Избрани файлове: %1$d + Извлечи от + Избрана папка: %1$s + Няма Избран Файл + % + Запази Zip в + Компресирай ZIP + Избери + Файл + Файлове + Папка + Дарете + Liberapay + Метод на компресиране + Настройки за компресиране + Файлът е избран успешно + Няма избран файл + Добре + Изходната директория е изчистена + Избраният файл е изчистен + Въведи парола + парола + За извличане на файлове е необходимо разрешение за съхранение + Отвори Настройки + Отказ + Моля, изберете къде да извлечете файловете + Сподели връзка на приложението + Компресирай 7z + Брой нишки + 0 за максимален брой налични нишки + Солидна компресия + Въведи име на архив (по избор) + Разделен размер + Разделен Zip + Надеждно шифроване + По подразбиране е 64kb + Моля, изчакайте... Ако сте избрали големи файлове, може да отнеме няколко минути + Избери файл + Извлечи + Няма избрана директория + Версия: + Няма избран + Избран файл: %1$s + Методът за шифроване по подразбиране за файлове е AES, който осигурява високо ниво на сигурност. Все пак, имайте предвид, че AES шифроването може да отнеме много време, особено на устройства от по-нисък клас.\n\nЗа потребители с по-малко мощни устройства може да се използва алтернатива като ZIP_STANDARD. Имайте предвид обаче, че този метод не предлага същото ниво на сигурност като AES.\n\nАко сигурността е основната ви грижа, силно препоръчваме да използвате AES въпреки по-дългото време за обработка. + Създай + Zip име (без .zip) + Метод на шифроване + Шифроване + изходящZip.zip + Без шифроване + Zip файлът е създаден успешно + Ниво на компресиране + Моля, изберете файлове + Грешка при създаването на zip файл + Моля, изберете изходна директория + Моля, изберете файлове + Невалиден URI на архивен файл + Отвори папка + Копирано в клипборда + Запази + Няма парола + Файлът е извлечен успешно + Грешка при създаването на 7z файл + Моля, изберете файл за извличане + Разрешението е отказано + Неуспешно извличане: + Неуспешно получаване името на архивния файл + 7z файлът е създаден успешно + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 251b238..e7e8764 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -12,7 +12,11 @@ Ausgewählter Ordner: %1$s Ausgewählte Datei geleert Bitte Datei zum Extrahieren auswählen - Die Standardverschlüsselungsmethode für Dateien ist AES, die ein hohes Maß an Sicherheit bietet. Bitte beachten Sie jedoch, dass die AES-Verschlüsselung insbesondere auf Geräten der unteren Preisklasse zeitaufwändig sein kann.\n\nFür Benutzer mit weniger leistungsstarken Geräten kann eine Alternative wie ZIP_STANDARD verwendet werden. Bitte beachten Sie jedoch, dass diese Methode nicht das gleiche Sicherheitsniveau wie AES bietet.\n\nWenn Sicherheit Ihr Hauptanliegen ist, empfehlen wir trotz der längeren Verarbeitungszeit dringend die Verwendung von AES. + Die Standardverschlüsselungsmethode ist AES, welche ein hohes Maß an Sicherheit bietet. Bitte beachten Sie, dass die AES-Verschlüsselung zeitaufwändig sein kann, insbesondere auf Geräten mit geringerer Leistung. +\n +\nFür Benutzer mit leistungsschwachen Geräten kann ZIP_STANDARD als Alternative verwendet werden. Bitte beachten Sie, dass AES ein höheres Maß an Sicherheit liefert. +\n +\nWenn Sicherheit Ihr Hauptanliegen ist, empfehlen wir trotz der längeren Verarbeitungszeit eindringlich die Verwendung von AES. Datei erfolgreich ausgewählt Ausgewählte Dateien: %1$d Verzeichnis @@ -54,9 +58,18 @@ Datei App-Link teilen Password eingeben - Extraktion fehlgeschlagen: + Entpacken fehlgeschlagen: Zip-Datei erfolgreich erstellt 7z-Datei erfolgreich erstellt - Fehler beim Erstellen der 7z-Datei - 7z komprimieren + Erstellen der 7z-Datei fehlgeschlagen + Komprimiere 7z + Anzahl Threads + 0 für maximal verfügbare Threads + Archivnamen eingeben (optional) + Solide Kompression (tar) + 64kb (Standard) + Bitte warten... Die Verarbeitung großer Dateien kann etwas länger dauern + Größe Teilarchiv + Zip aufteilen + Verschlüsselungsstärke \ No newline at end of file diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 65b28f0..e6437ef 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -40,7 +40,11 @@ contraseña Archivo seleccionado borrado Por favor, elija un archivo para extraer - El método de cifrado predeterminado para archivos es AES, que proporciona un alto nivel de seguridad. Sin embargo, tenga en cuenta que el cifrado AES puede llevar mucho tiempo, especialmente en dispositivos de gama baja.\n\nPara usuarios con dispositivos menos potentes, se puede utilizar una alternativa como ZIP_STANDARD. Sin embargo, tenga en cuenta que este método no ofrece el mismo nivel de seguridad que AES.\n\nSi la seguridad es su principal preocupación, le recomendamos encarecidamente utilizar AES a pesar de su mayor tiempo de procesamiento. + El método de cifrado predeterminado para los archivos es AES, que proporciona un alto nivel de seguridad. Sin embargo, ten en cuenta que el cifrado AES puede llevar mucho tiempo, sobre todo en dispositivos de gama baja. +\n +\nPara usuarios con dispositivos menos potentes, se puede utilizar una alternativa como ZIP_STANDARD. Sin embargo, ten en cuenta que este método no ofrece el mismo nivel de seguridad que AES. +\n +\nSi la seguridad es su principal preocupación, le recomendamos encarecidamente que utilice AES a pesar de su mayor tiempo de procesamiento. Fichero seleccionado con éxito outputZip.zip Por favor, seleccione la ruta de salida @@ -64,7 +68,7 @@ Cifrar Compartir el enlace de la aplicación Introduzca la contraseña - Error de extracción: + La extracción ha fallado: El archivo Zip fue creado correctamente Comprimir en 7z Número de hilos @@ -73,4 +77,9 @@ Error al crear el archivo 7z 0 para el máximo de hilos disponibles Compresión sólida + Tamaño partido + Tamaño del zip + Fuerza del cifrado + Por defecto es 64kb + Por favor, espere... Si ha seleccionado archivos de gran tamaño, puede tardar unos instantes \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index e37665c..9fa17e5 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -12,7 +12,7 @@ Fichiers sélectionnés : %1$d Ethereum Dossier - Pas de fichier sélectionné + Aucun fichier sélectionné Niveau de compression Fichuer sélectionné : %1$s Version : @@ -22,7 +22,7 @@ Choisir un fichier Fichiers Sélectionner - Méthode d\'encryptage + Méthode de chiffrement % Tron Extraire @@ -33,14 +33,18 @@ Fichier Bitcoin Cash BNB Smart Chain - Pas de fichier sélectionné + Aucun fichier sélectionné Veuillez choisir où extraire les fichiers Enregistrer Copié dans le presse-papier mot de passe Fichier sélectionné annulé Veuillez choisir un fichier à extraire - La méthode de cryptage par défaut pour les fichiers est AES, qui fournit un niveau élevé de sécurité. Cependant, sachez que le cryptage AES peut prendre du temps, en particulier sur les dispositifs bas de gamme. Pour les utilisateurs avec des appareils moins puissants, une alternative comme Zip_standard peut être utilisée. Cependant, veuillez noter que cette méthode n\'offre pas le même niveau de sécurité que les AES. Si la sécurité est votre principale préoccupation, nous vous recommandons fortement d\'utiliser AES malgré son temps de traitement plus long. + La méthode de chiffrement par défaut est AES, qui offre un haut niveau de sécurité. Cependant, soyez informés que le chiffrement AES peut être lent à s\'effectuer, et plus particulièrement sur les appareils bas de gamme +\n +\nPour les utilisateurs qui possèdent un appareil peu puissant, une alternative comme (ZIP_STANDARD) est envisageable. Notez cependant que cette méthode n\'offre pas le même niveau de sécurité que le chiffrement AES. +\n +\nSi la sécurité fait partie de vos priorités, nous vous recommandons grandement d\'utiliser le chiffrement AES, malgré son processus de travail plus long. Fichiier sélectionné avec succès extrantZip.zip Veuillez choisir le dossier de sortie @@ -66,9 +70,16 @@ Entrez le mot de passe Échec de l\'extraction : Fichier Zip créé avec succès - Fichier 7z créé avec succès - Erreur pendant la création du fichier 7z - Compresser au format 7z - Veuillez patienter… si vous avez sélectionné des fichiers volumineux, cela peut prendre quelques instants - + Archive 7z créée avec succès + Erreur lors de la création de l\'archive 7z + Compresser en 7z + Nombre de fils d\'exécution + 0 pour le numbre maximum de fils disponible + Entrez le nom de l\'archive (facultatif) + Compression compacte + Merci de patienter… Vous avez sélectionné des fichiers lourds, cela peut prendre quelques instants + Zip en plusieurs parties + Valeur par défaut est 64kb + Taille des parties de Zip + Puissance de chiffrement \ No newline at end of file diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml new file mode 100644 index 0000000..e774975 --- /dev/null +++ b/app/src/main/res/values-hi/strings.xml @@ -0,0 +1,75 @@ + + + फाइल सफलतापूर्वक चुनी गई + कोई फाइल चयनित नहीं + फाइलों के लिए तयशुदा कूटलेखन विधि AES है, जो उच्च स्तर की सुरक्षा प्रदान करती है। हालांकि, कृपया ध्यान रखें कि AES कूटलेखन समय लेने वाला हो सकता है, खासकर निचले स्तर के उपकरणों पर। +\n +\nकम शक्तिशाली उपकरण वाले उपयोगकर्ताओं के लिए, ZIP_STANDARD जैसे विकल्प का उपयोग किया जा सकता है। हालांकि, कृपया ध्यान दें कि यह विधि AES के समान सुरक्षा स्तर प्रदान नहीं करती है। +\n +\nयदि सुरक्षा आपकी प्राथमिक चिंता है, तो हम लंबे समय तक प्रसंस्करण समय के बावजूद AES का उपयोग करने की दृढ़ता से अनुशंसा करते हैं। + ठीक है + पासवर्ड दर्ज करें + निष्कर्षण विफल: + कोई पासवर्ड नहीं + फाइल सफलतापूर्वक निकाली गई + ऐप लिंक साझा करें + निर्गत निर्देशिका साफ की गई + चयनित फाइल साफ की गई + पासवर्ड + Zip नाम (बिना .zip) + कूटलेख + outputZip.zip + गैर कूटलेखित + Zip फाइल सफलतापूर्वक बनाई गई + कृपया फाइलें चुनें + Zip फाइल बनाने में त्रुटि + कृपया निर्गत निर्देशिका चुनें + कृपया फाइलें चुनें + फोल्डर खोलें + सहेजें + क्लिपबोर्ड पर कॉपी किया गया + कृपया निष्कर्षण हेतु फाइल चुनें + अनुमति अस्वीकृत + फाइलें निकालने के लिए स्टोरेज अनुमति आवश्यक है + सेटिंग्स खोलें + रद्द करें + कृपया चुनें कि फाइलें कहाँ निष्कर्षित करनी हैं + संग्रह फाइल नाम प्राप्त करने में विफल + अमान्य संग्रह फाइल URI + चयनित फाइलें: %1$d + कोई निर्देशिका चयनित नहीं + % + Zip संपीड़ित करें + फाइल चुनें + निष्कर्षित करें + यहाँ निष्कर्षित करें + अचयनित + चयनित फाइल: %1$s + चयनित फोल्डर: %1$s + कोई फाइल चयनित नहीं + संस्करण: + Zip को इसमें सहेजें + चुनें + फाइल + फाइलें + फोल्डर + दान करें + Liberapay + बनाएं + कूटलेखन विधि + संपीड़न स्तर + संपीड़न विधि + संपीड़न सेटिंग्स + 7z फाइल सफलतापूर्वक बनाई गई + 7z फाइल बनाने में त्रुटि + 7z संपीड़ित करें + थ्रेड गिनती + अधिकतम उपलब्ध थ्रेड के लिए 0 + संग्रह का नाम दर्ज करें (वैकल्पिक) + ठोस संपीड़न + विभाजित आकार + विभाजित Zip + कूटलेखन ताकत + तयशुदा 64kb है + कृपया प्रतीक्षा करें...यदि आपने बड़ी फाइलें चुनी हैं, तो इसमें कुछ क्षण लग सकते हैं + \ No newline at end of file diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml new file mode 100644 index 0000000..4ba12a5 --- /dev/null +++ b/app/src/main/res/values-in/strings.xml @@ -0,0 +1,75 @@ + + + Ekstrak ke + Tidak ada yg dipilh + Berkas yg dipilih: %1$s + Folder yg dipilih: %1$s + Pilih + Berkas + Lokasi Zip + Tidak ada direktori yg dipilih + ZIP Kompresi + Paket + Folder + Donasi + Liberapay + Kompresi Padat + 0 dari maks thread tersedia + 7z Kompresi + Ekstrak + Pilih Berkas + Isikan nama arsip (opsional) + Tidak ada berkas yg dipilih + Paket yg dipilih: %1$d + % + Versi: + Gagal membuat berkas zip + Bawaan di 64kb + Buat + Metode Enkripsi + Level Kompresi + Metode Kompresi + Pengaturan Kompresi + Berhasil Memilih Berkas + Metode enkripsi bawaan adalah AES, dengan keamanan data level tinggi. Namun, AES membutuhkan proses yang memakan waktu, terutama pada gawai kelas bawah. +\n +\nUntuk pengguna dengan gawai dimaksud, pilih metode ZIP_STANDARD. Metode enkripsi ini tidak menyediakan level keamanan yang sama dengan AES. +\n +\nJika keamanan data menjadi pertimbangan, sangat dianjurkan untuk menggunakan AES walaupun memakan waktu lebih. + Tidak memlih berkas + Oke + Direktori tujuan dihapus + Berkas dipilih dihapus + Masukkan Kata Sandi + Kata Sandi + Nama berkas ZIP (tanpa .zip) + Enkripsi + hasilZip.zip + Tidak Terenkripsi + Pilih berkas + Pilih direktori tujuan + Pilih berkas + Buka Folder + Simpan + Berhasil membuat berkas Zip + Salin ke Papan Klip + Pilih berkas untuk diekstraksi + Akses Ditolak + Akses Penyimpanan dibutuhkan untuk ekstraksi berkas + Buka Pengaturan + Batal + Pilih lokasi tujuan ekstraksi berkas + Gagal memperoleh nama arsip + URI Arsip tidak valid + Tidak Ada Kata Sandi + Gagal Ekstraksi: + Berbagi Link Aplikasi + Gagal membuat berkas 7z + Berhasil mengekstrak berkas + Berhasil membuat berkas 7z + Jumlah Thread + Silahkan Tunggu...Jika berkas berukuran besar, akan memakan waktu sebentar + Kekuatan Enkripsi + Ukuran Split + Zip Split + \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 0000000..7ac144e --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1,75 @@ + + + Estrai + File selezionato:%1$s + Cartella selezionata:%1$s + Non selezionato + Versione: + Salva zip in + Comprimi in ZIP + Seleziona + File multipli + Crea + Metodo cifratura + Livello di compressione + Metodo di compressione + Opzioni di compressione + Cartella di destinazione cancellata + password + File zip cancellato correttamente + È richiesto il permesso di accesso all\'archivio per estrarre i file + Apri impostazioni + Annulla + Estrazione fallita: + Senza password + Errore durante la creazione del file 7z + Comprimi in 7z + Compressione solida + Inserisci nome dell\'archivio (facoltativo) + Dimensione da dividere + Dividi zip + Forza cifratura + Predefinito 64kb + Attendere... se hai selezionato file grandi, potrebbe volerci qualche momento + Seleziona file + Estrai in + Nessun file selezionato + File selezionati:%1$d + Nessuna cartella selezionata + % + Dona + File singolo + Cartella + Liberapay + File selezionato correttamente + Nessun file selezionato + Il metodo di cifratura predefinito per i file è AES, che offre un alto livello di sicurezza. Tuttavia, tieni a mente che la cifratura con AES può richiedere molto tempo, soprattutto su dispositivi di bassa gamma. +\n +\nPer gli utenti con dispositivi meno potenti, è possibile utilizzare un\'alternativa come ZIP_STANDARD. Tuttavia, tieni a mente che questo metodo non offre lo stesso livello di sicurezza di AES. +\n +\nSe la sicurezza è la priorità, consigliamo fortemente di usare AES nonostante i tempi di elaborazione più lunghi. + OK + File selezionato cancellato + Inserisci password + Nome del zip (senza .zip) + Cifra + outputZip.zip + Non cifrato + Selezionare i file + Seleziona i file + Salva + Permesso negato + Errore durante la creazione del file zip + Seleziona la cartella d\'uscita + Apri cartella + Copiato negli appunti + Seleziona un file da estrarre + Selezionare dove estrarre i file + Errore durante l\'ottenimento del nome del file dell\'archivio + URI del file dell\'archivio non valido + File estratto correttamente + Condividi link app + File 7z creato correttamente + Numero thread + 0 per il numero massimo di thread + \ No newline at end of file diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 31b9f32..3ba8d49 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -1,7 +1,7 @@ Pomyślnie wybrano plik - Domyślną metodą szyfrowania plików jest AES, który zapewnia wysoki poziom bezpieczeństwa. Należy jednak pamiętać, że szyfrowanie AES może być czasochłonne, szczególnie na urządzeniach z niższej półki.\n\nW przypadku użytkowników ze słabszymi urządzeniami można zastosować alternatywę, taką jak ZIP_STANDARD. Należy jednak pamiętać, że ta metoda nie zapewnia tego samego poziomu bezpieczeństwa co AES.\n\nJeśli bezpieczeństwo jest dla Ciebie najważniejsze, zdecydowanie zalecamy użycie AES pomimo dłuższego czasu przetwarzania. + Szyfrowanie plików metodą AES jest czasochłonne. Jeżeli korzystasz z niższej klasy urządzenia, zalecane jest używanie domyślnej metody (ZIP_STANDARD). Wypakuj Wypakuj do Wybrany folder: %1$s @@ -33,7 +33,7 @@ Skompresuj do ZIP Wybierz, gdzie chcesz wypakować pliki Błędny URI pliku archiwum - Nie udało się wypakować : + Nie udało się wypakować: Brak hasła Plik wypakowany pomyślnie Udostępnij link do aplikacji @@ -55,4 +55,14 @@ Wybierz plik Wybrany plik: %1$s Folder + Pomyślnie stworzono plik 7z + Błąd przy tworzeniu pliku 7z + Kompresuj do pliku 7z + Liczba wątków + 0 dla wszystkich dostępnych wątków + Wprowadź nazwę archiwum (opcjonalnie) + Nie udało się uzyskać nazwy pliku archiwum + Siła szyfrowania + Domyślnie 64kb + Proszę poczekać… Jeżeli wybrano pliki o dużym rozmiarze może to potrwać kilka chwil \ No newline at end of file diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 7974c2a..5e21b52 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -6,7 +6,7 @@ Por favor selecione onde extrair os arquivos Salvar Método de Compressão - Copiado à área de transferência + Copiado para a área de transferência senha Extrair Para Criar @@ -14,7 +14,11 @@ Pasta Selecionada: %1$s Arquivo Selecionado Limpado Por favor selecione um arquivo para extrair - O método de criptografia padrão para arquivos é o AES, que oferece um alto nível de segurança. No entanto, esteja ciente de que a criptografia AES pode ser demorada, especialmente em dispositivos de baixo custo.\n\nPara usuários com dispositivos menos potentes, uma alternativa como ZIP_STANDARD pode ser usada. No entanto, observe que esse método não oferece o mesmo nível de segurança que o AES.\n\nSe a segurança for sua principal preocupação, recomendamos enfaticamente o uso do AES, apesar de seu tempo de processamento mais longo. + O método de criptografia padrão para arquivos é o AES, que oferece um alto nível de segurança. No entanto, esteja ciente de que a criptografia AES pode ser demorada, principalmente em dispositivos de baixa performance. +\n +\nPara usuários com dispositivos menos potentes, é possível usar uma alternativa como o ZIP_STANDARD. No entanto, saiba que esse método não oferece o mesmo nível de segurança que o AES. +\n +\nSe a segurança for sua principal preocupação, recomendamos fortemente o uso do AES, apesar de seu tempo de processamento mais longo. Arquivo Selecionado com Sucesso Arquivos Selecionados: %1$d Pasta @@ -41,22 +45,31 @@ Falha ao pegar o nome do arquivo % Permissão Negada - Diretório de saída limpado + Diretório de destino limpado Erro ao criar arquivo zip Doar - Não Encriptado + Não Criptografado Nenhum Diretório Selecionado Abrir Pasta Arquivo extraído com sucesso Configurações de Compressão Por favor selecione arquivos - Encriptar + Criptografar Arquivo Compartilhar o Link pro Aplicativo Digite a Senha A Extração Falhou: Arquivo Zip criado com sucesso Arquivo 7z criado com sucesso - Erro ao criar arquivo 7z - Comprimir o 7z + Erro ao criar o arquivo 7z + Comprimir 7z + Contagem de Threads + 0 para o máximo de threads disponíveis + Digite o nome do arquivo (opcional) + Compactação sólida + Dividir Zip + Dividir Tamanho + Intensidade da encriptação + O padrão é 64kb + Aguarde... Se você selecionou arquivos grandes, isso pode levar alguns minutos \ No newline at end of file diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 2a086ea..3b62acb 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,26 +1,26 @@ - Ficheiro Selecionado Limpado - Digite a Palavra-passe - ZipDeSaida.zip - Não Encriptado + Ficheiro selecionado limpo + Digite a palavra-passe + Nome.zip + Não cifrado Ficheiro Zip criado com sucesso - Por favor selecione ficheiros - Erro ao criar ficheiro zip - Partilhar a Ligação à App - Selecionar Ficheiro + Selecione os ficheiros + Erro ao criar o ficheiro Zip + Partilhar aplicação + Escolha o ficheiro Extrair - Extrair Para - Não Selecionado - Ficheiro Selecionado: %1$s - Pasta Selecionada: %1$s - Nenhum Ficheiro Selecionado - Ficheiros Selecionados: %1$d - Nenhum Diretório Selecionado + Extrair para + Não selecionado + Ficheiro selecionado: %1$s + Pasta selecionada: %1$s + Nenhum ficheiro selecionado + Ficheiros selecionados: %1$d + Nenhum diretório selecionado % Versão: - Gravar o Zip Para - Comprimir o ZIP + Guardar Zip em + Comprimir ZIP Selecionar Ficheiro Ficheiros @@ -28,35 +28,44 @@ Doar Liberapay Criar - Método de Encriptação - Nível de Compressão - Método de Compressão - Configurações de Compressão - Ficheiro Selecionado com Sucesso + Método de cifra + Nível de compressão + Método de compressão + Definições de compressão + Ficheiro selecionado com sucesso Nenhum ficheiro selecionado - O método de criptografia padrão para arquivos é AES, que fornece um alto nível de segurança. No entanto, esteja ciente de que a criptografia AES pode ser demorada, especialmente em dispositivos de baixo custo.\n\nPara usuários com dispositivos menos potentes, uma alternativa como ZIP_STANDARD pode ser usada. No entanto, observe que este método não oferece o mesmo nível de segurança que o AES.\n\nSe a segurança é sua principal preocupação, recomendamos fortemente o uso do AES, apesar do tempo de processamento mais longo. + O método de criptografia padrão para arquivos é AES, que fornece um alto nível de segurança. No entanto, esteja ciente de que a criptografia AES pode ser demorada, especialmente em dispositivos de baixo custo.\n\nPara usuários com dispositivos menos potentes, uma alternativa como ZIP_STANDARD pode ser usada. No entanto, observe que este método não oferece o mesmo nível de segurança que o AES.\n\nSe a segurança for sua principal preocupação, recomendamos fortemente o uso do AES, apesar do tempo de processamento mais longo. OK - Diretório de saída limpado + Diretório de saída limpo palavra-passe Nome do Zip (sem .zip) - Encriptar - Por favor selecione um diretório como destino - Por favor selecione ficheiros - Abrir Pasta - Gravar - Copiado à área de transferência - Por favor selecione um ficheiro para extrair - Permissão Negada - Permissão de armazenamento é necessária para extrair ficheiros - Abrir Configurações + Cifrar + Selecione o diretório de destino + Selecione os ficheiros + Abrir pasta + Guardar + Copiado para a área de transferência + Selecione o ficheiro a extrair + Permissão recusada + Tem que conceder o acesso ao armazenamento para extrair ficheiros + Abrir definições Cancelar - Por favor selecione onde extrair os ficheiros - Falha ao buscar o nome do ficheiro de arquivo - URI do ficheiro de arquivo inválido - A Extração Falhou: - Sem Palavra-passe + Selecione para onde extrair os ficheiros + Falha ao obter o nome do ficheiro + O URI do ficheiro é inválido + Falha ao extrair: %1$s + Sem palavra-passe Ficheiro extraído com sucesso Ficheiro 7z criado com sucesso - Erro ao criar ficheiro 7z - Comprimir o 7z + Erro ao criar o ficheiro 7z + Escolha 0 para utilizar o número máximo + Compressão sólida + Comprimir para 7z + Número de processos + Indique o nome do ficheiro (opcional) + Tamanho da separação + Por favor aguarde... Se escolheu ficheiros grandes, pode demorar algum tempo + Separar Zip + Nível de cifra + Padrão é 64kb \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml new file mode 100644 index 0000000..bc8a52d --- /dev/null +++ b/app/src/main/res/values-ru/strings.xml @@ -0,0 +1,75 @@ + + + Распаковать + Распаковать в + Не выбрано + Сохранить Zip в + Пожертвовать + Создать + Метод шифрования + Уровень сжатия + Способ сжатия + Настройки сжатия + OK + Целевая папка очищена + Выделенный файл очищен + Введите пароль + Зашифровать + Не зашифровано + Zip-файл создан успешно + Пожалуйста выберите файлы + Ошибка создания файла zip + Пожалуйста выберите целевую папку + Сохранить + Скопировано в буфер обмена + Пожалуйста выберите файл для распаковки + Доступ к хранилищу требуется для извлечения файлов + Пожалуйста выберите куда извлечь файлы + Не удалось получить название файла архива + Неправельный URI файла архива + Поделиться ссылкой на приложение + 7z файл создан успешно + Введите название архива (необязательно) + Разделить по размеру + Разделить Zip + По умолчанию 64kb + Подождите... Если вы выбрали большие файлы, это может занять несколько минут + Выберите файл + Выбранный файл: %1$s + Выбранная папка: %1$s + Нет выбранных файлов + Выбранные файлы: %1$d + Не выбрана папка + Версия: + пароль + Сжать ZIP + Название Zip файла (без .zip) + Пожалуйста выберите файлы + Открыть папку + Разрешение отклонено + Открыть настройки + Выбрать + Папка + Файл + Файлы выбранны + Отмена + Файлы + Нет выбранных файлов + Не удалось извлечь: + Нет пароля + Файл извлеченён успешно + Ошибка создания файла 7z + Сжать в 7z + Количество потоков + 0 для максимально доступных потоков + Стойкость шифрования + Методом шифрования по умолчанию для файлов является AES, который обеспечивает высокий уровень безопасности. Однако имейте в виду, что шифрование AES может быть трудоёмким, особенно на более слабых устройствах. +\n +\nДля пользователей с менее мощными устройствами может использоваться ZIP_STANDARD. Однако, обратите внимание, что этот метод не обеспечивает такого же уровня безопасности, как AES. +\n +\nЕсли безопасность является вашей основной целью, мы настоятельно рекомендуем использовать AES, несмотря на более длительное время обработки. + Liberapay + outputZip.zip + Непрерывный архив + % + \ No newline at end of file diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml new file mode 100644 index 0000000..52350e9 --- /dev/null +++ b/app/src/main/res/values-ta/strings.xml @@ -0,0 +1,71 @@ + + + திறந்த அமைப்புகள் + ரத்துசெய் + கோப்புகளை எங்கு பிரித்தெடுக்க வேண்டும் என்பதைத் தேர்ந்தெடுக்கவும் + காப்பக கோப்பு பெயரைப் பெறுவதில் தோல்வி + கோப்பைத் தேர்ந்தெடுங்கள் + பிரித்தெடுக்கவும் + சிப் அமுக்கவும் + தேர்ந்தெடு + கோப்பு + கோப்புகள் + கோப்பு வெற்றிகரமாக எடுக்கப்பட்டது + பிரித்தெடுக்க + தேர்ந்தெடுக்கப்படவில்லை + தேர்ந்தெடுக்கப்பட்ட கோப்பு: %1$s + தேர்ந்தெடுக்கப்பட்ட கோப்புறை: %1$s + எந்தக் கோப்பும் தேர்வு செய்யப் படவில்லை + தேர்ந்தெடுக்கப்பட்ட கோப்புகள்: %1$d + எந்த கோப்பகமும் தேர்ந்தெடுக்கப்படவில்லை + % + பதிப்பு: + லிபர்பே + சிப்பை சேமிக்கவும் + கோப்புறை + உருவாக்கு + குறியாக்க முறை + சுருக்க நிலை + சுருக்க முறை + சுருக்க அமைப்புகள் + நன்கொடை + எந்தக் கோப்பும் தேர்வு செய்யப் படவில்லை + 7Z கோப்பை உருவாக்கும் பிழை + சுருக்க 7Z + நூல் எண்ணிக்கை + கிடைக்கக்கூடிய அதிகபட்ச நூல்களுக்கு 0 + திட சுருக்க + காப்பகத்தின் பெயரை உள்ளிடவும் (விரும்பினால்) + பிளவு அளவு + பிளவு சிப் + குறியாக்க வலிமை + இயல்புநிலை 64KB + தயவுசெய்து காத்திருங்கள்… நீங்கள் பெரிய கோப்புகளைத் தேர்ந்தெடுத்திருந்தால், அதற்கு சில தருணங்கள் ஆகலாம் + கோப்புகளுக்கான இயல்புநிலை குறியாக்க முறை AES ஆகும், இது உயர் மட்ட பாதுகாப்பை வழங்குகிறது. இருப்பினும், AES குறியாக்கம் நேரத்தை எடுத்துக்கொள்ளும் என்பதை நினைவில் கொள்க, குறிப்பாக குறைந்த-இறுதி சாதனங்களில்.\n\n குறைந்த சக்திவாய்ந்த சாதனங்களைக் கொண்ட பயனர்களுக்கு, zip_standard போன்ற மாற்று பயன்படுத்தப்படலாம். இருப்பினும், இந்த முறை AES இன் அதே அளவிலான பாதுகாப்பை வழங்காது என்பதை நினைவில் கொள்க.\n\n பாதுகாப்பு உங்கள் முதன்மை அக்கறையாக இருந்தால், AES அதன் நீண்ட செயலாக்க நேரம் இருந்தபோதிலும் பயன்படுத்த நாங்கள் கடுமையாகப் பரிந்துரைக்கிறோம். + சரி + வெளியீட்டு அடைவு அழிக்கப்பட்டது + தேர்ந்தெடுக்கப்பட்ட கோப்பு அழிக்கப்பட்டது + கடவுச்சொல்லை உள்ளிடவும் + கடவுச்சொல் + சிப் பெயர் (.zip இல்லாமல்) + குறியாக்க + outputZip.zip + குறியாக்கம் செய்யப்படாதது + சிப் கோப்பு வெற்றிகரமாக உருவாக்கப்பட்டது + கோப்புகளைத் தேர்ந்தெடுக்கவும் + சிப் கோப்பை உருவாக்கும் பிழை + வெளியீட்டு கோப்பகத்தைத் தேர்ந்தெடுக்கவும் + கோப்புகளைத் தேர்ந்தெடுக்கவும் + திறந்த கோப்புறை + சேமி + கிளிப்போர்டுக்கு நகலெடுக்கப்பட்டது + பிரித்தெடுக்க ஒரு கோப்பைத் தேர்ந்தெடுக்கவும் + இசைவு மறுக்கப்பட்டது + கோப்புகளைப் பிரித்தெடுக்க சேமிப்பக இசைவு தேவை + தவறான காப்பக கோப்பு யூரி + பிரித்தெடுத்தல் தோல்வியுற்றது: + கடவுச்சொல் இல்லை + கோப்பு வெற்றிகரமாக பிரித்தெடுக்கப்பட்டது + பயன்பாட்டு இணைப்பைப் பகிரவும் + 7Z கோப்பு வெற்றிகரமாக உருவாக்கப்பட்டது + \ No newline at end of file diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml new file mode 100644 index 0000000..e5ba9f4 --- /dev/null +++ b/app/src/main/res/values-tr/strings.xml @@ -0,0 +1,71 @@ + + + Seçilmedi + Seçili Dosya: %1$s + Dosya Seçilmedi + Seçilen Dosyalar: %1$d + Klasör + Seçili Dizin Yok + % + Sürüm: + Zip Adresini Kaydet + Seçiniz + Dosya + Oluştur + Şifreleme Yöntemi + Sıkıştırma Yöntemi + Seçili dosya yok + Dosyalar için varsayılan şifreleme yöntemi, yüksek düzeyde güvenlik sağlayan AES\'dir. Ancak, AES şifrelemenin özellikle düşük kaliteli cihazlarda zaman alıcı olabileceğini lütfen unutmayın.\n\nDaha az güçlü cihazlara sahip kullanıcılar için ZIP_STANDARD gibi bir alternatif kullanılabilir. Ancak, bu yöntemin AES ile aynı güvenlik seviyesini sunmadığını lütfen unutmayın.\n\nGüvenlik birincil endişenizse, daha uzun işlem süresine rağmen AES kullanmanızı şiddetle tavsiye ederiz. + TAMAM + Parola Giriniz + Lütfen çıktı dizinini seçin + parola + İzin Reddedildi + Şifrelenmemiş + Zip dosyası oluşturulurken hata oluştu + Zip dosyası başarıyla oluşturuldu + Lütfen dosyaları seçin + Klasörü Aç + Lütfen ayıklamak için bir dosya seçin + Dosyaları çıkarmak için depolama izni gereklidir + Arşiv dosyası adı alınamadı + Dosya başarıyla çıkarıldı + Bölünmüş Boyut + Konu Sayısı + Katı Sıkıştırma + Arşiv Adını Girin (İsteğe Bağlı) + Varsayılan değer 64kb + Çıkarmak İçin + Çıkar + Seçilmiş Klasör: %1$s + ZIP Sıkıştır + Dosyalar + Bağış + Liberapay + Sıkıştırma Seviyesi + Sıkıştırma Ayarları + Dosya Başarıyla Seçildi + Çıktı dizini temizlendi + Seçilen Dosya Temizlendi + Zip Adı (.zip olmadan) + Şifreleme + çıktıZip.zip + Lütfen dosyaları seçin + Kaydet + Panoya kopyalandı + Ayarları Aç + İptal + Lütfen dosyaların nereye çıkarılacağını seçin + Geçersiz arşiv dosyası URI + Çıkarma Başarısız: + Parola Yok + Uygulama Bağlantısını Paylaş + 7z dosyası başarıyla oluşturuldu + 7z dosyası oluşturulurken hata oluştu + 7z Sıkıştır + 0 maksimum kullanılabilir dişler için + Bölünmüş Zip + Parolama Gücü + Lütfen Bekleyin...Büyük dosyalar seçtiyseniz, birkaç dakika sürebilir + Dosya Seç + \ No newline at end of file diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml new file mode 100644 index 0000000..c4b04e7 --- /dev/null +++ b/app/src/main/res/values-uk/strings.xml @@ -0,0 +1,75 @@ + + + Не вибрано каталог + % + Зберегти zip до + Рівень стиснення + Вибраний файл очищено + Введіть пароль + Назва zip-файлу (без .zip) + outputZip.zip + Не зашифровано + Виберіть файли + Помилка створення zip-файлу + Виберіть файли + Виберіть файл для розпакування + У дозволі відмовлено + Скасувати + Неправильний URI файлу архіва + Не вдалося видобути: + Файл 7z успішно створено + 0 для максимальної кількості доступних потоків + Цілісне стиснення + Надійність шифрування + Типово – 64kb + Виберіть файл + Розпакувати + Розпакувати до + Не вибрано + Вибрана тека: %1$s + Немає вибраного файлу + Вибраний файл: %1$s + Вибрати + Вибрані файли: %1$d + Стиснути zip + Файл + Версія: + Метод стиснення + Файли + Тека + Пожертвувати + Liberapay + Створити + Налаштування стиснення + Вихідний каталог очищено + Метод шифрування + Файл успішно вибрано + Немає вибраного файлу + Типовий методом шифрування файлів – AES, який забезпечує високий рівень безпеки. Однак, майте на увазі, що шифрування AES може зайняти багато часу, особливо на пристроях нижчого класу. +\n +\nДля користувачів з менш потужними пристроями можна використовувати альтернативу, наприклад, ZIP_STANDARD. Однак зауважте, що цей метод не забезпечує такий самий рівень безпеки, як AES. +\n +\nЯкщо безпека є для вас першочерговим завданням, ми наполегливо рекомендуємо використовувати AES, попри його довший час обробки. + Гаразд + пароль + Zip-файл успішно створено + Зашифрувати + Відкрити теку + Зберегти + Файл успішно розпаковано + Виберіть вихідний каталог + Скопійовано в буфер обміну + Для розпакування файлів потрібен дозвіл на зберігання + Відкрити налаштування + Виберіть, куди розпакувати файли + Не вдалося отримати назву файлу архіва + Немає пароля + Поділитися посиланням на застосунок + Помилка при створенні 7z-файлу + Стиснути в 7z + Кількість потоків + Розмір розділу + Розділити zip + Введіть назву архіва (необов\'язково) + Будь ласка, зачекайте... Якщо ви вибрали великі файли, це може зайняти кілька хвилин + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5c44db6..0e31880 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -12,7 +12,11 @@ 已选目录: %1$s 文件选择已清空 请选择要提取的文件 - 文件的默认加密方法是 AES,它提供了高级别的安全性。 但是,请注意,AES 加密可能非常耗时,尤其是在低端设备上。\n\n对于设备功能较弱的用户,可以使用 ZIP_STANDARD 等替代方案。 但是,请注意,此方法无法提供与 AES 相同级别的安全性。\n\n如果安全性是您最关心的问题,我们强烈建议使用 AES,尽管其处理时间较长。 + 文件的默认加密方法是 AES,它提供了高级别的安全性。但是,请注意,AES 加密可能非常耗时,尤其是在低端设备上。 +\n +\n对于设备功能较弱的用户,可以使用ZIP_STANDARD等替代方案。但是,请注意,此方法不提供与 AES 相同的安全级别。 +\n +\n如果安全性是您最关心的问题,我们强烈建议您使用 AES,尽管它的处理时间较长。 文件选取成功 已选择文件: %1$d 文件夹 @@ -56,7 +60,16 @@ 输入密码 提取失败: Zip 文件创建成功 + 线程数 7z 文件创建成功 + 0 代表最大可用线程 + 输入归档名称(可选) + 固实压缩 创建 7z 文件出错 压缩 7z + 请等一会...如果您选择的是大文件,可能需要一些时间 + 加密强度 + 默认为64KB + Zip分卷 + 分卷大小 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d67ddb5..0200d86 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -55,7 +55,11 @@ 資料夾 Liberapay 檔案挑選成功 - 檔案的預設加密方法是 AES,它提供了高水準的安全性。 但是,請注意,AES 加密可能非常耗時,尤其是在低端設備上。\n\n對於設備功能較弱的用戶,可以使用 ZIP_STANDARD 等替代方案。 但是,請注意,此方法無法提供與 AES 相同等級的安全性。\n\n如果安全性是您最關心的問題,我們強烈建議使用 AES,儘管其處理時間較長。 + 檔案的加密方法預設為 AES,提供高層級安全性。惟 AES 加密或相當耗時,尤其是較低階的裝置。 +\n +\n裝置較遜色的使用者,可改用替代方法如 ZIP_STANDARD。惟請注意,此方法並不提供與 AES 同等的安全性。 +\n +\n若您的首要考慮是安全性,強烈建議使用 AES,雖則處理時間或會較長。 建立 zip 檔案時發生錯誤 請選取檔案 請挑選要解壓縮的檔案 @@ -63,4 +67,9 @@ 取消 7z 檔案建立成功 輸入封存名稱 (選用) + 分割大小 + 分割 Zip + 加密強度 + 預設為 64kb + 請稍候… 若您選取了大型檔案,可能需時較久 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67cbe9b..24ead5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,7 +15,7 @@ ~ You should have received a copy of the GNU General Public License ~ along with this program. If not, see . --> - ZipXtract + ZipXtract Pick File Extract Extract To @@ -27,8 +27,8 @@ No Directory Selected % Version: - Github Icon - Share Icon + Github Icon + Share Icon Save Zip To Compress ZIP Select @@ -36,16 +36,8 @@ Files Folder Donate - Liberapay - Bitcoin - Ethereum - BNB Smart Chain - Polygon - Solana - Monero - Tron - Doge Coin - Bitcoin Cash + Liberapay + Bitcoin Create Encryption Method Compression Level @@ -94,7 +86,7 @@ Split Zip Encryption Strength Default is 64kb - %d %% + %d %% Please Wait…If you have selected large files, it may take a few moments Sort by Name @@ -134,4 +126,6 @@ Order Ascending Descending + Something went wrong + No files were provided \ No newline at end of file